/ Hex Artifact Content
Login

Artifact 7b65a9fd7475c0dd9603d2c733311692efe48157:


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 52 65 74 75 72 6e 20 74 68 65 20 53 51 4c  * Return the SQL
06e0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
06f0: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
0700: 65 6d 65 6e 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63  ement.*/.const c
0710: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 71 6c  har *sqlite3_sql
0720: 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70  (sqlite3_stmt *p
0730: 53 74 6d 74 29 7b 0a 20 20 56 64 62 65 20 2a 70  Stmt){.  Vdbe *p
0740: 20 3d 20 28 56 64 62 65 20 2a 29 70 53 74 6d 74   = (Vdbe *)pStmt
0750: 3b 0a 20 20 72 65 74 75 72 6e 20 70 20 3f 20 70  ;.  return p ? p
0760: 2d 3e 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->zSql : 0;.}../
0770: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
0780: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
0790: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
07a0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
07b0: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
07c0: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
07d0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
07e0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
07f0: 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b 0a 20 20  .  tmp = *pA;.  
0800: 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70 42  *pA = *pB;.  *pB
0810: 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20 3d   = tmp;.  pTmp =
0820: 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 41   pA->pNext;.  pA
0830: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70 4e  ->pNext = pB->pN
0840: 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78 74  ext;.  pB->pNext
0850: 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70 20   = pTmp;.  pTmp 
0860: 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20 70  = pA->pPrev;.  p
0870: 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e 70  A->pPrev = pB->p
0880: 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72 65  Prev;.  pB->pPre
0890: 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d 70  v = pTmp;.  zTmp
08a0: 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70   = pA->zSql;.  p
08b0: 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a 53  A->zSql = pB->zS
08c0: 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20 3d  ql;.  pB->zSql =
08d0: 20 7a 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73 50   zTmp;.  pB->isP
08e0: 72 65 70 61 72 65 56 32 20 3d 20 70 41 2d 3e 69  repareV2 = pA->i
08f0: 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f  sPrepareV2;.}../
0900: 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20  *.** Resize the 
0910: 56 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73  Vdbe.aOp array s
0920: 6f 20 74 68 61 74 20 69 74 20 69 73 20 61 74 20  o that it is at 
0930: 6c 65 61 73 74 20 6e 4f 70 20 65 6c 65 6d 65 6e  least nOp elemen
0940: 74 73 20 6c 61 72 67 65 72 20 0a 2a 2a 20 74 68  ts larger .** th
0950: 61 6e 20 69 74 73 20 63 75 72 72 65 6e 74 20 73  an its current s
0960: 69 7a 65 2e 20 6e 4f 70 20 69 73 20 67 75 61 72  ize. nOp is guar
0970: 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 65 73  anteed to be les
0980: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a  s than or equal.
0990: 2a 2a 20 74 6f 20 31 30 32 34 2f 73 69 7a 65 6f  ** to 1024/sizeo
09a0: 66 28 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f(Op)..**.** If 
09b0: 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79  an out-of-memory
09c0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
09d0: 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74 68 65  ile resizing the
09e0: 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a   array, return.*
09f0: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20  * SQLITE_NOMEM. 
0a00: 49 6e 20 74 68 69 73 20 63 61 73 65 20 56 64 62  In this case Vdb
0a10: 65 2e 61 4f 70 20 61 6e 64 20 50 61 72 73 65 2e  e.aOp and Parse.
0a20: 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20  nOpAlloc remain 
0a30: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 28 74  .** unchanged (t
0a40: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 61  his is so that a
0a50: 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61  ny opcodes alrea
0a60: 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e  dy allocated can
0a70: 20 62 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74 6c   be .** correctl
0a80: 79 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 61 6c  y deallocated al
0a90: 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72 65 73  ong with the res
0aa0: 74 20 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a  t of the Vdbe)..
0ab0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 72  */.static int gr
0ac0: 6f 77 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a  owOpArray(Vdbe *
0ad0: 76 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 56  v, int nOp){.  V
0ae0: 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 50  dbeOp *pNew;.  P
0af0: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
0b00: 72 73 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53  rse;..  /* The S
0b10: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
0b20: 4f 43 5f 53 54 52 45 53 53 20 63 6f 6d 70 69 6c  OC_STRESS compil
0b30: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
0b40: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 66 6f 72   designed to for
0b50: 63 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 66 72 65  ce.  ** more fre
0b60: 71 75 65 6e 74 20 72 65 61 6c 6c 6f 63 73 20 61  quent reallocs a
0b70: 6e 64 20 68 65 6e 63 65 20 70 72 6f 76 69 64 65  nd hence provide
0b80: 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74   more opportunit
0b90: 69 65 73 20 66 6f 72 20 0a 20 20 2a 2a 20 73 69  ies for .  ** si
0ba0: 6d 75 6c 61 74 65 64 20 4f 4f 4d 20 66 61 75 6c  mulated OOM faul
0bb0: 74 73 2e 20 20 53 51 4c 49 54 45 5f 54 45 53 54  ts.  SQLITE_TEST
0bc0: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20  _REALLOC_STRESS 
0bd0: 69 73 20 67 65 6e 65 72 61 6c 6c 79 20 75 73 65  is generally use
0be0: 64 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 65  d.  ** during te
0bf0: 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 57 69 74  sting only.  Wit
0c00: 68 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  h SQLITE_TEST_RE
0c10: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 67 72 6f  ALLOC_STRESS gro
0c20: 77 20 74 68 65 20 6f 70 20 61 72 72 61 79 0a 20  w the op array. 
0c30: 20 2a 2a 20 62 79 20 74 68 65 20 6d 69 6e 69 6d   ** by the minim
0c40: 75 6d 2a 20 61 6d 6f 75 6e 74 20 72 65 71 75 69  um* amount requi
0c50: 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 73 69  red until the si
0c60: 7a 65 20 72 65 61 63 68 65 73 20 35 31 32 2e 20  ze reaches 512. 
0c70: 20 4e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65   Normal.  ** ope
0c80: 72 61 74 69 6f 6e 20 28 77 69 74 68 6f 75 74 20  ration (without 
0c90: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
0ca0: 4c 4f 43 5f 53 54 52 45 53 53 29 20 69 73 20 74  LOC_STRESS) is t
0cb0: 6f 20 64 6f 75 62 6c 65 20 74 68 65 20 63 75 72  o double the cur
0cc0: 72 65 6e 74 0a 20 20 2a 2a 20 73 69 7a 65 20 6f  rent.  ** size o
0cd0: 66 20 74 68 65 20 6f 70 20 61 72 72 61 79 20 6f  f the op array o
0ce0: 72 20 61 64 64 20 31 4b 42 20 6f 66 20 73 70 61  r add 1KB of spa
0cf0: 63 65 2c 20 77 68 69 63 68 65 76 65 72 20 69 73  ce, whichever is
0d00: 20 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66   smaller. */.#if
0d10: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 5f  def SQLITE_TEST_
0d20: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 0a 20  REALLOC_STRESS. 
0d30: 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d 3e   int nNew = (p->
0d40: 6e 4f 70 41 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20  nOpAlloc>=512 ? 
0d50: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20  p->nOpAlloc*2 : 
0d60: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29  p->nOpAlloc+nOp)
0d70: 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 6e 4e  ;.#else.  int nN
0d80: 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f  ew = (p->nOpAllo
0d90: 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a  c ? p->nOpAlloc*
0da0: 32 20 3a 20 28 69 6e 74 29 28 31 30 32 34 2f 73  2 : (int)(1024/s
0db0: 69 7a 65 6f 66 28 4f 70 29 29 29 3b 0a 20 20 55  izeof(Op)));.  U
0dc0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
0dd0: 6e 4f 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nOp);.#endif..  
0de0: 61 73 73 65 72 74 28 20 6e 4f 70 3c 3d 28 31 30  assert( nOp<=(10
0df0: 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29 20 29  24/sizeof(Op)) )
0e00: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77  ;.  assert( nNew
0e10: 3e 3d 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e  >=(p->nOpAlloc+n
0e20: 4f 70 29 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20  Op) );.  pNew = 
0e30: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
0e40: 28 70 2d 3e 64 62 2c 20 76 2d 3e 61 4f 70 2c 20  (p->db, v->aOp, 
0e50: 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29  nNew*sizeof(Op))
0e60: 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ;.  if( pNew ){.
0e70: 20 20 20 20 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63      p->szOpAlloc
0e80: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
0e90: 6f 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e  ocSize(p->db, pN
0ea0: 65 77 29 3b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41  ew);.    p->nOpA
0eb0: 6c 6c 6f 63 20 3d 20 70 2d 3e 73 7a 4f 70 41 6c  lloc = p->szOpAl
0ec0: 6c 6f 63 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a  loc/sizeof(Op);.
0ed0: 20 20 20 20 76 2d 3e 61 4f 70 20 3d 20 70 4e 65      v->aOp = pNe
0ee0: 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  w;.  }.  return 
0ef0: 28 70 4e 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f  (pNew ? SQLITE_O
0f00: 4b 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  K : SQLITE_NOMEM
0f10: 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  );.}..#ifdef SQL
0f20: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69  ITE_DEBUG./* Thi
0f30: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73  s routine is jus
0f40: 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70  t a convenient p
0f50: 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 62 72  lace to set a br
0f60: 65 61 6b 70 6f 69 6e 74 20 74 68 61 74 20 77 69  eakpoint that wi
0f70: 6c 6c 0a 2a 2a 20 66 69 72 65 20 61 66 74 65 72  ll.** fire after
0f80: 20 65 61 63 68 20 6f 70 63 6f 64 65 20 69 73 20   each opcode is 
0f90: 69 6e 73 65 72 74 65 64 20 61 6e 64 20 64 69 73  inserted and dis
0fa0: 70 6c 61 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20  played using.** 
0fb0: 22 50 52 41 47 4d 41 20 76 64 62 65 5f 61 64 64  "PRAGMA vdbe_add
0fc0: 6f 70 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a  optrace=on"..*/.
0fd0: 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74  static void test
0fe0: 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e  _addop_breakpoin
0ff0: 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  t(void){.  stati
1000: 63 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e  c int n = 0;.  n
1010: 2b 2b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ++;.}.#endif../*
1020: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 69 6e  .** Add a new in
1030: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65  struction to the
1040: 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72 75 63   list of instruc
1050: 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20 69 6e  tions current in
1060: 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52   the.** VDBE.  R
1070: 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73  eturn the addres
1080: 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73  s of the new ins
1090: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  truction..**.** 
10a0: 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a  Parameters:.**.*
10b0: 2a 20 20 20 20 70 20 20 20 20 20 20 20 20 20 20  *    p          
10c0: 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20       Pointer to 
10d0: 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20  the VDBE.**.**  
10e0: 20 20 6f 70 20 20 20 20 20 20 20 20 20 20 20 20    op            
10f0: 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66 6f 72    The opcode for
1100: 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   this instructio
1110: 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70  n.**.**    p1, p
1120: 32 2c 20 70 33 20 20 20 20 20 20 4f 70 65 72 61  2, p3      Opera
1130: 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  nds.**.** Use th
1140: 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  e sqlite3VdbeRes
1150: 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 6e 63  olveLabel() func
1160: 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20 61  tion to fix an a
1170: 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68  ddress and.** th
1180: 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  e sqlite3VdbeCha
1190: 6e 67 65 50 34 28 29 20 66 75 6e 63 74 69 6f 6e  ngeP4() function
11a0: 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76   to change the v
11b0: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 0a 2a  alue of the P4.*
11c0: 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 73 74  * operand..*/.st
11d0: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
11e0: 4c 49 4e 45 20 69 6e 74 20 67 72 6f 77 4f 70 33  LINE int growOp3
11f0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
1200: 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32  , int p1, int p2
1210: 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20 61 73 73  , int p3){.  ass
1220: 65 72 74 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e  ert( p->pParse->
1230: 6e 4f 70 41 6c 6c 6f 63 3c 3d 70 2d 3e 6e 4f 70  nOpAlloc<=p->nOp
1240: 20 29 3b 0a 20 20 69 66 28 20 67 72 6f 77 4f 70   );.  if( growOp
1250: 41 72 72 61 79 28 70 2c 20 31 29 20 29 20 72 65  Array(p, 1) ) re
1260: 74 75 72 6e 20 31 3b 0a 20 20 61 73 73 65 72 74  turn 1;.  assert
1270: 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70  ( p->pParse->nOp
1280: 41 6c 6c 6f 63 3e 70 2d 3e 6e 4f 70 20 29 3b 0a  Alloc>p->nOp );.
1290: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
12a0: 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70  VdbeAddOp3(p, op
12b0: 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 7d  , p1, p2, p3);.}
12c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
12d0: 41 64 64 4f 70 33 28 56 64 62 65 20 2a 70 2c 20  AddOp3(Vdbe *p, 
12e0: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20  int op, int p1, 
12f0: 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b  int p2, int p3){
1300: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65  .  int i;.  Vdbe
1310: 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20  Op *pOp;..  i = 
1320: 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74  p->nOp;.  assert
1330: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
1340: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
1350: 20 61 73 73 65 72 74 28 20 6f 70 3e 30 20 26 26   assert( op>0 &&
1360: 20 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66   op<0xff );.  if
1370: 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70  ( p->pParse->nOp
1380: 41 6c 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20  Alloc<=i ){.    
1390: 72 65 74 75 72 6e 20 67 72 6f 77 4f 70 33 28 70  return growOp3(p
13a0: 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33  , op, p1, p2, p3
13b0: 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b  );.  }.  p->nOp+
13c0: 2b 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61  +;.  pOp = &p->a
13d0: 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70  Op[i];.  pOp->op
13e0: 63 6f 64 65 20 3d 20 28 75 38 29 6f 70 3b 0a 20  code = (u8)op;. 
13f0: 20 70 4f 70 2d 3e 70 35 20 3d 20 30 3b 0a 20 20   pOp->p5 = 0;.  
1400: 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20  pOp->p1 = p1;.  
1410: 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20  pOp->p2 = p2;.  
1420: 70 4f 70 2d 3e 70 33 20 3d 20 70 33 3b 0a 20 20  pOp->p3 = p3;.  
1430: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  pOp->p4.p = 0;. 
1440: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
1450: 34 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66 64 65  4_NOTUSED;.#ifde
1460: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1470: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
1480: 0a 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  .  pOp->zComment
1490: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 0;.#endif.#if
14a0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
14b0: 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c  .  if( p->db->fl
14c0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
14d0: 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20  eAddopTrace ){. 
14e0: 20 20 20 69 6e 74 20 6a 6a 2c 20 6b 6b 3b 0a 20     int jj, kk;. 
14f0: 20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65     Parse *pParse
1500: 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20   = p->pParse;.  
1510: 20 20 66 6f 72 28 6a 6a 3d 6b 6b 3d 30 3b 20 6a    for(jj=kk=0; j
1520: 6a 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  j<SQLITE_N_COLCA
1530: 43 48 45 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20  CHE; jj++){.    
1540: 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
1550: 68 65 20 2a 78 20 3d 20 70 50 61 72 73 65 2d 3e  he *x = pParse->
1560: 61 43 6f 6c 43 61 63 68 65 20 2b 20 6a 6a 3b 0a  aColCache + jj;.
1570: 20 20 20 20 20 20 69 66 28 20 78 2d 3e 69 4c 65        if( x->iLe
1580: 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43 61 63  vel>pParse->iCac
1590: 68 65 4c 65 76 65 6c 20 7c 7c 20 78 2d 3e 69 52  heLevel || x->iR
15a0: 65 67 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  eg==0 ) continue
15b0: 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22  ;.      printf("
15c0: 20 72 5b 25 64 5d 3d 7b 25 64 3a 25 64 7d 22 2c   r[%d]={%d:%d}",
15d0: 20 78 2d 3e 69 52 65 67 2c 20 78 2d 3e 69 54 61   x->iReg, x->iTa
15e0: 62 6c 65 2c 20 78 2d 3e 69 43 6f 6c 75 6d 6e 29  ble, x->iColumn)
15f0: 3b 0a 20 20 20 20 20 20 6b 6b 2b 2b 3b 0a 20 20  ;.      kk++;.  
1600: 20 20 7d 0a 20 20 20 20 69 66 28 20 6b 6b 20 29    }.    if( kk )
1610: 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20   printf("\n");. 
1620: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
1630: 69 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e  intOp(0, i, &p->
1640: 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 74 65 73  aOp[i]);.    tes
1650: 74 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69  t_addop_breakpoi
1660: 6e 74 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  nt();.  }.#endif
1670: 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
1680: 46 49 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c  FILE.  pOp->cycl
1690: 65 73 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63  es = 0;.  pOp->c
16a0: 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23  nt = 0;.#endif.#
16b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42  ifdef SQLITE_VDB
16c0: 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 70 4f 70  E_COVERAGE.  pOp
16d0: 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 30 3b 0a  ->iSrcLine = 0;.
16e0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
16f0: 69 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  i;.}.int sqlite3
1700: 56 64 62 65 41 64 64 4f 70 30 28 56 64 62 65 20  VdbeAddOp0(Vdbe 
1710: 2a 70 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72  *p, int op){.  r
1720: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1730: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30  eAddOp3(p, op, 0
1740: 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73  , 0, 0);.}.int s
1750: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
1760: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
1770: 2c 20 69 6e 74 20 70 31 29 7b 0a 20 20 72 65 74  , int p1){.  ret
1780: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41  urn sqlite3VdbeA
1790: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
17a0: 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71   0, 0);.}.int sq
17b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17c0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  Vdbe *p, int op,
17d0: 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29   int p1, int p2)
17e0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
17f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
1800: 6f 70 2c 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a  op, p1, p2, 0);.
1810: 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  }../* Generate c
1820: 6f 64 65 20 66 6f 72 20 61 6e 20 75 6e 63 6f 6e  ode for an uncon
1830: 64 69 74 69 6f 6e 61 6c 20 6a 75 6d 70 20 74 6f  ditional jump to
1840: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 44 65   instruction iDe
1850: 73 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  st.*/.int sqlite
1860: 33 56 64 62 65 47 6f 74 6f 28 56 64 62 65 20 2a  3VdbeGoto(Vdbe *
1870: 70 2c 20 69 6e 74 20 69 44 65 73 74 29 7b 0a 20  p, int iDest){. 
1880: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1890: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f  dbeAddOp3(p, OP_
18a0: 47 6f 74 6f 2c 20 30 2c 20 69 44 65 73 74 2c 20  Goto, 0, iDest, 
18b0: 30 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61  0);.}../* Genera
18c0: 74 65 20 63 6f 64 65 20 74 6f 20 63 61 75 73 65  te code to cause
18d0: 20 74 68 65 20 73 74 72 69 6e 67 20 7a 53 74 72   the string zStr
18e0: 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 69 6e   to be loaded in
18f0: 74 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69  to.** register i
1900: 44 65 73 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Dest.*/.int sqli
1910: 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
1920: 67 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  g(Vdbe *p, int i
1930: 44 65 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  Dest, const char
1940: 20 2a 7a 53 74 72 29 7b 0a 20 20 72 65 74 75 72   *zStr){.  retur
1950: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  n sqlite3VdbeAdd
1960: 4f 70 34 28 70 2c 20 4f 50 5f 53 74 72 69 6e 67  Op4(p, OP_String
1970: 38 2c 20 30 2c 20 69 44 65 73 74 2c 20 30 2c 20  8, 0, iDest, 0, 
1980: 7a 53 74 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  zStr, 0);.}../*.
1990: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
19a0: 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a 65   that initialize
19b0: 73 20 6d 75 6c 74 69 70 6c 65 20 72 65 67 69 73  s multiple regis
19c0: 74 65 72 73 20 74 6f 20 73 74 72 69 6e 67 20 6f  ters to string o
19d0: 72 20 69 6e 74 65 67 65 72 0a 2a 2a 20 63 6f 6e  r integer.** con
19e0: 73 74 61 6e 74 73 2e 20 20 54 68 65 20 72 65 67  stants.  The reg
19f0: 69 73 74 65 72 73 20 62 65 67 69 6e 20 77 69 74  isters begin wit
1a00: 68 20 69 44 65 73 74 20 61 6e 64 20 69 6e 63 72  h iDest and incr
1a10: 65 61 73 65 20 63 6f 6e 73 65 63 75 74 69 76 65  ease consecutive
1a20: 6c 79 2e 0a 2a 2a 20 4f 6e 65 20 72 65 67 69 73  ly..** One regis
1a30: 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ter is initializ
1a40: 65 64 20 66 6f 72 20 65 61 63 68 20 63 68 61 72  ed for each char
1a50: 61 63 67 74 65 72 20 69 6e 20 7a 54 79 70 65 73  acgter in zTypes
1a60: 5b 5d 2e 20 20 46 6f 72 20 65 61 63 68 0a 2a 2a  [].  For each.**
1a70: 20 22 73 22 20 63 68 61 72 61 63 74 65 72 20 69   "s" character i
1a80: 6e 20 7a 54 79 70 65 73 5b 5d 2c 20 74 68 65 20  n zTypes[], the 
1a90: 72 65 67 69 73 74 65 72 20 69 73 20 61 20 73 74  register is a st
1aa0: 72 69 6e 67 20 69 66 20 74 68 65 20 61 72 67 75  ring if the argu
1ab0: 6d 65 6e 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 4e  ment is.** not N
1ac0: 55 4c 4c 2c 20 6f 72 20 4f 50 5f 4e 75 6c 6c 20  ULL, or OP_Null 
1ad0: 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  if the value is 
1ae0: 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20  a null pointer. 
1af0: 20 46 6f 72 20 65 61 63 68 20 22 69 22 20 63 68   For each "i" ch
1b00: 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 7a 54  aracter.** in zT
1b10: 79 70 65 73 5b 5d 2c 20 74 68 65 20 72 65 67 69  ypes[], the regi
1b20: 73 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69  ster is initiali
1b30: 7a 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  zed to an intege
1b40: 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
1b50: 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28  e3VdbeMultiLoad(
1b60: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65  Vdbe *p, int iDe
1b70: 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  st, const char *
1b80: 7a 54 79 70 65 73 2c 20 2e 2e 2e 29 7b 0a 20 20  zTypes, ...){.  
1b90: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e  va_list ap;.  in
1ba0: 74 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20  t i;.  char c;. 
1bb0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 54   va_start(ap, zT
1bc0: 79 70 65 73 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ypes);.  for(i=0
1bd0: 3b 20 28 63 20 3d 20 7a 54 79 70 65 73 5b 69 5d  ; (c = zTypes[i]
1be0: 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  )!=0; i++){.    
1bf0: 69 66 28 20 63 3d 3d 27 73 27 20 29 7b 0a 20 20  if( c=='s' ){.  
1c00: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1c10: 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63  z = va_arg(ap, c
1c20: 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20  onst char*);.   
1c30: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71     int addr = sq
1c40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1c50: 70 2c 20 7a 3d 3d 30 20 3f 20 4f 50 5f 4e 75 6c  p, z==0 ? OP_Nul
1c60: 6c 20 3a 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  l : OP_String8, 
1c70: 30 2c 20 69 44 65 73 74 2b 2b 29 3b 0a 20 20 20  0, iDest++);.   
1c80: 20 20 20 69 66 28 20 7a 20 29 20 73 71 6c 69 74     if( z ) sqlit
1c90: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 70  e3VdbeChangeP4(p
1ca0: 2c 20 61 64 64 72 2c 20 7a 2c 20 30 29 3b 0a 20  , addr, z, 0);. 
1cb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cc0: 61 73 73 65 72 74 28 20 63 3d 3d 27 69 27 20 29  assert( c=='i' )
1cd0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1ce0: 64 62 65 41 64 64 4f 70 32 28 70 2c 20 4f 50 5f  dbeAddOp2(p, OP_
1cf0: 49 6e 74 65 67 65 72 2c 20 76 61 5f 61 72 67 28  Integer, va_arg(
1d00: 61 70 2c 20 69 6e 74 29 2c 20 69 44 65 73 74 2b  ap, int), iDest+
1d10: 2b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  +);.    }.  }.  
1d20: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f  va_end(ap);.}../
1d30: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f  *.** Add an opco
1d40: 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73  de that includes
1d50: 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73   the p4 value as
1d60: 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69   a pointer..*/.i
1d70: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
1d80: 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a 70 2c  dOp4(.  Vdbe *p,
1d90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1da0: 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f  dd the opcode to
1db0: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
1dc0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
1dd0: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63    /* The new opc
1de0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c  ode */.  int p1,
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e00: 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a  The P1 operand *
1e10: 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20  /.  int p2,     
1e20: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1e30: 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  2 operand */.  i
1e40: 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20  nt p3,          
1e50: 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65     /* The P3 ope
1e60: 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rand */.  const 
1e70: 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a  char *zP4,    /*
1e80: 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   The P4 operand 
1e90: 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20  */.  int p4type 
1ea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f           /* P4 o
1eb0: 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29  perand type */.)
1ec0: 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73  {.  int addr = s
1ed0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1ee0: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
1ef0: 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  p3);.  sqlite3Vd
1f00: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64  beChangeP4(p, ad
1f10: 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70 65 29  dr, zP4, p4type)
1f20: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ;.  return addr;
1f30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
1f40: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63   opcode that inc
1f50: 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c  ludes the p4 val
1f60: 75 65 20 77 69 74 68 20 61 20 50 34 5f 49 4e 54  ue with a P4_INT
1f70: 36 34 20 6f 72 0a 2a 2a 20 50 34 5f 52 45 41 4c  64 or.** P4_REAL
1f80: 20 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   type..*/.int sq
1f90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44  lite3VdbeAddOp4D
1fa0: 75 70 38 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  up8(.  Vdbe *p, 
1fb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
1fc0: 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20  d the opcode to 
1fd0: 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74  this VM */.  int
1fe0: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
1ff0: 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f   /* The new opco
2000: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20  de */.  int p1, 
2010: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2020: 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f  he P1 operand */
2030: 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20  .  int p2,      
2040: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32         /* The P2
2050: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
2060: 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20  t p3,           
2070: 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72    /* The P3 oper
2080: 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  and */.  const u
2090: 38 20 2a 7a 50 34 2c 20 20 20 20 20 20 2f 2a 20  8 *zP4,      /* 
20a0: 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a  The P4 operand *
20b0: 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20 20  /.  int p4type  
20c0: 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70          /* P4 op
20d0: 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b  erand type */.){
20e0: 0a 20 20 63 68 61 72 20 2a 70 34 63 6f 70 79 20  .  char *p4copy 
20f0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
2100: 63 52 61 77 28 73 71 6c 69 74 65 33 56 64 62 65  cRaw(sqlite3Vdbe
2110: 44 62 28 70 29 2c 20 38 29 3b 0a 20 20 69 66 28  Db(p), 8);.  if(
2120: 20 70 34 63 6f 70 79 20 29 20 6d 65 6d 63 70 79   p4copy ) memcpy
2130: 28 70 34 63 6f 70 79 2c 20 7a 50 34 2c 20 38 29  (p4copy, zP4, 8)
2140: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
2150: 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c 20  e3VdbeAddOp4(p, 
2160: 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 2c 20  op, p1, p2, p3, 
2170: 70 34 63 6f 70 79 2c 20 70 34 74 79 70 65 29 3b  p4copy, p4type);
2180: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
2190: 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 20   OP_ParseSchema 
21a0: 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f  opcode.  This ro
21b0: 75 74 69 6e 65 20 69 73 20 62 72 6f 6b 65 6e 20  utine is broken 
21c0: 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69  out from.** sqli
21d0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 29 20  te3VdbeAddOp4() 
21e0: 73 69 6e 63 65 20 69 74 20 6e 65 65 64 73 20 74  since it needs t
21f0: 6f 20 61 6c 73 6f 20 6e 65 65 64 73 20 74 6f 20  o also needs to 
2200: 6d 61 72 6b 20 61 6c 6c 20 62 74 72 65 65 73 0a  mark all btrees.
2210: 2a 2a 20 61 73 20 68 61 76 69 6e 67 20 62 65 65  ** as having bee
2220: 6e 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  n used..**.** Th
2230: 65 20 7a 57 68 65 72 65 20 73 74 72 69 6e 67 20  e zWhere string 
2240: 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f  must have been o
2250: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
2260: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
2270: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
2280: 69 6c 6c 20 74 61 6b 65 20 6f 77 6e 65 72 73 68  ill take ownersh
2290: 69 70 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61  ip of the alloca
22a0: 74 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76  ted memory..*/.v
22b0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 41  oid sqlite3VdbeA
22c0: 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28  ddParseSchemaOp(
22d0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 62  Vdbe *p, int iDb
22e0: 2c 20 63 68 61 72 20 2a 7a 57 68 65 72 65 29 7b  , char *zWhere){
22f0: 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20  .  int j;.  int 
2300: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
2310: 62 65 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f 50  beAddOp3(p, OP_P
2320: 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c  arseSchema, iDb,
2330: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
2340: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c  3VdbeChangeP4(p,
2350: 20 61 64 64 72 2c 20 7a 57 68 65 72 65 2c 20 50   addr, zWhere, P
2360: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f  4_DYNAMIC);.  fo
2370: 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e  r(j=0; j<p->db->
2380: 6e 44 62 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65  nDb; j++) sqlite
2390: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 70  3VdbeUsesBtree(p
23a0: 2c 20 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  , j);.}../*.** A
23b0: 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61  dd an opcode tha
23c0: 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70  t includes the p
23d0: 34 20 76 61 6c 75 65 20 61 73 20 61 6e 20 69 6e  4 value as an in
23e0: 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  teger..*/.int sq
23f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
2400: 6e 74 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  nt(.  Vdbe *p,  
2410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
2420: 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74   the opcode to t
2430: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
2440: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
2450: 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64  /* The new opcod
2460: 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20  e */.  int p1,  
2470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2480: 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P1 operand */.
2490: 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20    int p2,       
24a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20        /* The P2 
24b0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
24c0: 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20   p3,            
24d0: 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61   /* The P3 opera
24e0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20  nd */.  int p4  
24f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2500: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 61 73  he P4 operand as
2510: 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29   an integer */.)
2520: 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73  {.  int addr = s
2530: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2540: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
2550: 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  p3);.  sqlite3Vd
2560: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64  beChangeP4(p, ad
2570: 64 72 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54  dr, SQLITE_INT_T
2580: 4f 5f 50 54 52 28 70 34 29 2c 20 50 34 5f 49 4e  O_PTR(p4), P4_IN
2590: 54 33 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  T32);.  return a
25a0: 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  ddr;.}../*.** Cr
25b0: 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f  eate a new symbo
25c0: 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e  lic label for an
25d0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
25e0: 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 0a  t has yet to be.
25f0: 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20 73  ** coded.  The s
2600: 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73  ymbolic label is
2610: 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e   really just a n
2620: 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 20  egative number. 
2630: 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61   The.** label ca
2640: 6e 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65  n be used as the
2650: 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e 20   P2 value of an 
2660: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65  operation.  Late
2670: 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c  r, when.** the l
2680: 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65 64  abel is resolved
2690: 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 61   to a specific a
26a0: 64 64 72 65 73 73 2c 20 74 68 65 20 56 44 42 45  ddress, the VDBE
26b0: 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68   will scan.** th
26c0: 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61 74  rough its operat
26d0: 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68 61  ion list and cha
26e0: 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f  nge all values o
26f0: 66 20 50 32 20 77 68 69 63 68 20 6d 61 74 63 68  f P2 which match
2700: 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 6e  .** the label in
2710: 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20  to the resolved 
2720: 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  address..**.** T
2730: 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74 68  he VDBE knows th
2740: 61 74 20 61 20 50 32 20 76 61 6c 75 65 20 69 73  at a P2 value is
2750: 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73 65   a label because
2760: 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61   labels are.** a
2770: 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65 20 61  lways negative a
2780: 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61 72 65  nd P2 values are
2790: 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20 6e   suppose to be n
27a0: 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20  on-negative..** 
27b0: 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69 76  Hence, a negativ
27c0: 65 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20  e P2 value is a 
27d0: 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73 20 79  label that has y
27e0: 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76 65  et to be resolve
27f0: 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73  d..**.** Zero is
2800: 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d   returned if a m
2810: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
2820: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
2830: 65 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 65 20  eMakeLabel(Vdbe 
2840: 2a 76 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20  *v){.  Parse *p 
2850: 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  = v->pParse;.  i
2860: 6e 74 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c  nt i = p->nLabel
2870: 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 76 2d  ++;.  assert( v-
2880: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
2890: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
28a0: 20 28 69 20 26 20 28 69 2d 31 29 29 3d 3d 30 20   (i & (i-1))==0 
28b0: 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c  ){.    p->aLabel
28c0: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
28d0: 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c  locOrFree(p->db,
28e0: 20 70 2d 3e 61 4c 61 62 65 6c 2c 20 0a 20 20 20   p->aLabel, .   
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2910: 20 20 20 20 28 69 2a 32 2b 31 29 2a 73 69 7a 65      (i*2+1)*size
2920: 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29  of(p->aLabel[0])
2930: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
2940: 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d  aLabel ){.    p-
2950: 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b  >aLabel[i] = -1;
2960: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 41 44  .  }.  return AD
2970: 44 52 28 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  DR(i);.}../*.** 
2980: 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78  Resolve label "x
2990: 22 20 74 6f 20 62 65 20 74 68 65 20 61 64 64 72  " to be the addr
29a0: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
29b0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a  instruction to.*
29c0: 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20  * be inserted.  
29d0: 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 78  The parameter "x
29e0: 22 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  " must have been
29f0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
2a00: 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74  * a prior call t
2a10: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  o sqlite3VdbeMak
2a20: 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69  eLabel()..*/.voi
2a30: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  d sqlite3VdbeRes
2a40: 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a  olveLabel(Vdbe *
2a50: 76 2c 20 69 6e 74 20 78 29 7b 0a 20 20 50 61 72  v, int x){.  Par
2a60: 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73  se *p = v->pPars
2a70: 65 3b 0a 20 20 69 6e 74 20 6a 20 3d 20 41 44 44  e;.  int j = ADD
2a80: 52 28 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  R(x);.  assert( 
2a90: 76 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  v->magic==VDBE_M
2aa0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
2ab0: 73 73 65 72 74 28 20 6a 3c 70 2d 3e 6e 4c 61 62  ssert( j<p->nLab
2ac0: 65 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  el );.  assert( 
2ad0: 6a 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  j>=0 );.  if( p-
2ae0: 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70  >aLabel ){.    p
2af0: 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76 2d  ->aLabel[j] = v-
2b00: 3e 6e 4f 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  >nOp;.  }.  p->i
2b10: 46 69 78 65 64 4f 70 20 3d 20 76 2d 3e 6e 4f 70  FixedOp = v->nOp
2b20: 20 2d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d   - 1;.}../*.** M
2b30: 61 72 6b 20 74 68 65 20 56 44 42 45 20 61 73 20  ark the VDBE as 
2b40: 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c  one that can onl
2b50: 79 20 62 65 20 72 75 6e 20 6f 6e 65 20 74 69 6d  y be run one tim
2b60: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
2b70: 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63  e3VdbeRunOnlyOnc
2b80: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d  e(Vdbe *p){.  p-
2b90: 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 31  >runOnlyOnce = 1
2ba0: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
2bb0: 54 45 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c 69  TE_DEBUG /* sqli
2bc0: 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72  te3AssertMayAbor
2bd0: 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f 2a  t() logic */../*
2be0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
2bf0: 67 20 74 79 70 65 20 61 6e 64 20 66 75 6e 63 74  g type and funct
2c00: 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f 20  ion are used to 
2c10: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
2c20: 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 69  all opcodes.** i
2c30: 6e 20 61 20 56 64 62 65 20 6d 61 69 6e 20 70 72  n a Vdbe main pr
2c40: 6f 67 72 61 6d 20 61 6e 64 20 65 61 63 68 20 6f  ogram and each o
2c50: 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61  f the sub-progra
2c60: 6d 73 20 28 74 72 69 67 67 65 72 73 29 20 69 74  ms (triggers) it
2c70: 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20   may .** invoke 
2c80: 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 69  directly or indi
2c90: 72 65 63 74 6c 79 2e 20 49 74 20 73 68 6f 75 6c  rectly. It shoul
2ca0: 64 20 62 65 20 75 73 65 64 20 61 73 20 66 6f 6c  d be used as fol
2cb0: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70  lows:.**.**   Op
2cc0: 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62 65   *pOp;.**   Vdbe
2cd0: 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 2a 2a  OpIter sIter;.**
2ce0: 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26 73 49  .**   memset(&sI
2cf0: 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ter, 0, sizeof(s
2d00: 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49 74  Iter));.**   sIt
2d10: 65 72 2e 76 20 3d 20 76 3b 20 20 20 20 20 20 20  er.v = v;       
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d30: 20 20 20 20 20 2f 2f 20 76 20 69 73 20 6f 66 20       // v is of 
2d40: 74 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20 20  type Vdbe* .**  
2d50: 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f   while( (pOp = o
2d60: 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65 72  pIterNext(&sIter
2d70: 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20  )) ){.**     // 
2d80: 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 74  Do something wit
2d90: 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a 20  h pOp.**   }.** 
2da0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2db0: 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53  v->db, sIter.apS
2dc0: 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70 65  ub);.** .*/.type
2dd0: 64 65 66 20 73 74 72 75 63 74 20 56 64 62 65 4f  def struct VdbeO
2de0: 70 49 74 65 72 20 56 64 62 65 4f 70 49 74 65 72  pIter VdbeOpIter
2df0: 3b 0a 73 74 72 75 63 74 20 56 64 62 65 4f 70 49  ;.struct VdbeOpI
2e00: 74 65 72 20 7b 0a 20 20 56 64 62 65 20 2a 76 3b  ter {.  Vdbe *v;
2e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e20: 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 69 74     /* Vdbe to it
2e30: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68  erate through th
2e40: 65 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f 0a  e opcodes of */.
2e50: 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61    SubProgram **a
2e60: 70 53 75 62 3b 20 20 20 20 20 20 20 20 2f 2a 20  pSub;        /* 
2e70: 41 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67  Array of subprog
2e80: 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  rams */.  int nS
2e90: 75 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ub;             
2ea0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2eb0: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 70 53  f entries in apS
2ec0: 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64 64  ub */.  int iAdd
2ed0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
2ee0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
2ef0: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
2f00: 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  n to return */. 
2f10: 20 69 6e 74 20 69 53 75 62 3b 20 20 20 20 20 20   int iSub;      
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
2f30: 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c   = main program,
2f40: 20 31 20 3d 20 66 69 72 73 74 20 73 75 62 2d 70   1 = first sub-p
2f50: 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a 7d  rogram etc. */.}
2f60: 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f 70 49  ;.static Op *opI
2f70: 74 65 72 4e 65 78 74 28 56 64 62 65 4f 70 49 74  terNext(VdbeOpIt
2f80: 65 72 20 2a 70 29 7b 0a 20 20 56 64 62 65 20 2a  er *p){.  Vdbe *
2f90: 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20 2a  v = p->v;.  Op *
2fa0: 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a  pRet = 0;.  Op *
2fb0: 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b 0a  aOp;.  int nOp;.
2fc0: 0a 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3c 3d  .  if( p->iSub<=
2fd0: 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20 20  p->nSub ){..    
2fe0: 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20 29  if( p->iSub==0 )
2ff0: 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 76 2d  {.      aOp = v-
3000: 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20  >aOp;.      nOp 
3010: 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 65  = v->nOp;.    }e
3020: 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d  lse{.      aOp =
3030: 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75   p->apSub[p->iSu
3040: 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20 20  b-1]->aOp;.     
3050: 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b   nOp = p->apSub[
3060: 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70 3b  p->iSub-1]->nOp;
3070: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
3080: 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70 20  t( p->iAddr<nOp 
3090: 29 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d 20 26  );..    pRet = &
30a0: 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a 20  aOp[p->iAddr];. 
30b0: 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a 20     p->iAddr++;. 
30c0: 20 20 20 69 66 28 20 70 2d 3e 69 41 64 64 72 3d     if( p->iAddr=
30d0: 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 70 2d  =nOp ){.      p-
30e0: 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20 70  >iSub++;.      p
30f0: 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20 20 20  ->iAddr = 0;.   
3100: 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 70 52   }.  .    if( pR
3110: 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53  et->p4type==P4_S
3120: 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20  UBPROGRAM ){.   
3130: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28     int nByte = (
3140: 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f  p->nSub+1)*sizeo
3150: 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a  f(SubProgram*);.
3160: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
3170: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d     for(j=0; j<p-
3180: 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nSub; j++){.   
3190: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 70 53 75       if( p->apSu
31a0: 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e 70  b[j]==pRet->p4.p
31b0: 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b  Program ) break;
31c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
31d0: 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29 7b  f( j==p->nSub ){
31e0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75  .        p->apSu
31f0: 62 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  b = sqlite3DbRea
3200: 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64 62  llocOrFree(v->db
3210: 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79 74  , p->apSub, nByt
3220: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
3230: 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20 20  !p->apSub ){.   
3240: 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b         pRet = 0;
3250: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
3260: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53            p->apS
3270: 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d 20  ub[p->nSub++] = 
3280: 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61  pRet->p4.pProgra
3290: 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  m;.        }.   
32a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
32b0: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
32c0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66  ../*.** Check if
32d0: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 73 74 6f   the program sto
32e0: 72 65 64 20 69 6e 20 74 68 65 20 56 4d 20 61 73  red in the VM as
32f0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50  sociated with pP
3300: 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72 6f  arse may.** thro
3310: 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65 70  w an ABORT excep
3320: 74 69 6f 6e 20 28 63 61 75 73 69 6e 67 20 74 68  tion (causing th
3330: 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74  e statement, but
3340: 20 6e 6f 74 20 65 6e 74 69 72 65 20 74 72 61 6e   not entire tran
3350: 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65  saction.** to be
3360: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 20 54   rolled back). T
3370: 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  his condition is
3380: 20 74 72 75 65 20 69 66 20 74 68 65 20 6d 61 69   true if the mai
3390: 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20 61 6e 79  n program or any
33a0: 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72 61 6d 73  .** sub-programs
33b0: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6f 66   contains any of
33c0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
33d0: 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61  **.**   *  OP_Ha
33e0: 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54  lt with P1=SQLIT
33f0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64  E_CONSTRAINT and
3400: 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a   P2=OE_Abort..**
3410: 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 49 66 4e     *  OP_HaltIfN
3420: 75 6c 6c 20 77 69 74 68 20 50 31 3d 53 51 4c 49  ull with P1=SQLI
3430: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e  TE_CONSTRAINT an
3440: 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a  d P2=OE_Abort..*
3450: 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f  *   *  OP_Destro
3460: 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70  y.**   *  OP_VUp
3470: 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  date.**   *  OP_
3480: 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20 20  VRename.**   *  
3490: 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 77 69 74  OP_FkCounter wit
34a0: 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65 64 69 61  h P2==0 (immedia
34b0: 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  te foreign key c
34c0: 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a 20 20 20  onstraint).**   
34d0: 2a 20 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c  *  OP_CreateTabl
34e0: 65 20 61 6e 64 20 4f 50 5f 49 6e 69 74 43 6f 72  e and OP_InitCor
34f0: 6f 75 74 69 6e 65 20 28 66 6f 72 20 43 52 45 41  outine (for CREA
3500: 54 45 20 54 41 42 4c 45 20 41 53 20 53 45 4c 45  TE TABLE AS SELE
3510: 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  CT ...).**.** Th
3520: 65 6e 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  en check that th
3530: 65 20 76 61 6c 75 65 20 6f 66 20 50 61 72 73 65  e value of Parse
3540: 2e 6d 61 79 41 62 6f 72 74 20 69 73 20 74 72 75  .mayAbort is tru
3550: 65 20 69 66 20 61 6e 0a 2a 2a 20 41 42 4f 52 54  e if an.** ABORT
3560: 20 6d 61 79 20 62 65 20 74 68 72 6f 77 6e 2c 20   may be thrown, 
3570: 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  or false otherwi
3580: 73 65 2e 20 52 65 74 75 72 6e 20 74 72 75 65 20  se. Return true 
3590: 69 66 20 69 74 20 64 6f 65 73 0a 2a 2a 20 6d 61  if it does.** ma
35a0: 74 63 68 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  tch, or false ot
35b0: 68 65 72 77 69 73 65 2e 20 54 68 69 73 20 66 75  herwise. This fu
35c0: 6e 63 74 69 6f 6e 20 69 73 20 69 6e 74 65 6e 64  nction is intend
35d0: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 61 73  ed to be used as
35e0: 0a 2a 2a 20 70 61 72 74 20 6f 66 20 61 6e 20 61  .** part of an a
35f0: 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 20  ssert statement 
3600: 69 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e  in the compiler.
3610: 20 53 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a   Similar to:.**.
3620: 2a 2a 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  **   assert( sql
3630: 69 74 65 33 56 64 62 65 41 73 73 65 72 74 4d 61  ite3VdbeAssertMa
3640: 79 41 62 6f 72 74 28 70 50 61 72 73 65 2d 3e 70  yAbort(pParse->p
3650: 56 64 62 65 2c 20 70 50 61 72 73 65 2d 3e 6d 61  Vdbe, pParse->ma
3660: 79 41 62 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69 6e  yAbort) );.*/.in
3670: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73  t sqlite3VdbeAss
3680: 65 72 74 4d 61 79 41 62 6f 72 74 28 56 64 62 65  ertMayAbort(Vdbe
3690: 20 2a 76 2c 20 69 6e 74 20 6d 61 79 41 62 6f 72   *v, int mayAbor
36a0: 74 29 7b 0a 20 20 69 6e 74 20 68 61 73 41 62 6f  t){.  int hasAbo
36b0: 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61  rt = 0;.  int ha
36c0: 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 30 3b 0a  sFkCounter = 0;.
36d0: 20 20 69 6e 74 20 68 61 73 43 72 65 61 74 65 54    int hasCreateT
36e0: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  able = 0;.  int 
36f0: 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  hasInitCoroutine
3700: 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b   = 0;.  Op *pOp;
3710: 0a 20 20 56 64 62 65 4f 70 49 74 65 72 20 73 49  .  VdbeOpIter sI
3720: 74 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  ter;.  memset(&s
3730: 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
3740: 73 49 74 65 72 29 29 3b 0a 20 20 73 49 74 65 72  sIter));.  sIter
3750: 2e 76 20 3d 20 76 3b 0a 0a 20 20 77 68 69 6c 65  .v = v;..  while
3760: 28 20 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e  ( (pOp = opIterN
3770: 65 78 74 28 26 73 49 74 65 72 29 29 21 3d 30 20  ext(&sIter))!=0 
3780: 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 63 6f 64  ){.    int opcod
3790: 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b  e = pOp->opcode;
37a0: 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d  .    if( opcode=
37b0: 3d 4f 50 5f 44 65 73 74 72 6f 79 20 7c 7c 20 6f  =OP_Destroy || o
37c0: 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74  pcode==OP_VUpdat
37d0: 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f  e || opcode==OP_
37e0: 56 52 65 6e 61 6d 65 20 0a 20 20 20 20 20 7c 7c  VRename .     ||
37f0: 20 28 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61   ((opcode==OP_Ha
3800: 6c 74 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  lt || opcode==OP
3810: 5f 48 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20  _HaltIfNull) .  
3820: 20 20 20 20 26 26 20 28 28 70 4f 70 2d 3e 70 31      && ((pOp->p1
3830: 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43  &0xff)==SQLITE_C
3840: 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70  ONSTRAINT && pOp
3850: 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29  ->p2==OE_Abort))
3860: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 68 61  .    ){.      ha
3870: 73 41 62 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20  sAbort = 1;.    
3880: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3890: 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f     if( opcode==O
38a0: 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20 29 20  P_CreateTable ) 
38b0: 68 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 3d  hasCreateTable =
38c0: 20 31 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f   1;.    if( opco
38d0: 64 65 3d 3d 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  de==OP_InitCorou
38e0: 74 69 6e 65 20 29 20 68 61 73 49 6e 69 74 43 6f  tine ) hasInitCo
38f0: 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 23 69 66  routine = 1;.#if
3900: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3910: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20  _FOREIGN_KEY.   
3920: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
3930: 46 6b 43 6f 75 6e 74 65 72 20 26 26 20 70 4f 70  FkCounter && pOp
3940: 2d 3e 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1==0 && pOp->
3950: 70 32 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 68  p2==1 ){.      h
3960: 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 31 3b  asFkCounter = 1;
3970: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
3980: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
3990: 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61  e(v->db, sIter.a
39a0: 70 53 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74  pSub);..  /* Ret
39b0: 75 72 6e 20 74 72 75 65 20 69 66 20 68 61 73 41  urn true if hasA
39c0: 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20  bort==mayAbort. 
39d0: 4f 72 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  Or if a malloc f
39e0: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e  ailure occurred.
39f0: 0a 20 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20  .  ** If malloc 
3a00: 66 61 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  failed, then the
3a10: 20 77 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62   while() loop ab
3a20: 6f 76 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  ove may not have
3a30: 20 69 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74   iterated.  ** t
3a40: 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64  hrough all opcod
3a50: 65 73 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20  es and hasAbort 
3a60: 6d 61 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72  may be set incor
3a70: 72 65 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20  rectly. Return. 
3a80: 20 2a 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69   ** true for thi
3a90: 73 20 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e  s case to preven
3aa0: 74 20 74 68 65 20 61 73 73 65 72 74 28 29 20 69  t the assert() i
3ab0: 6e 20 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72  n the callers fr
3ac0: 61 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61  ame.  ** from fa
3ad0: 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74  iling.  */.  ret
3ae0: 75 72 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c  urn ( v->db->mal
3af0: 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73  locFailed || has
3b00: 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20  Abort==mayAbort 
3b10: 7c 7c 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 0a  || hasFkCounter.
3b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
3b30: 20 28 68 61 73 43 72 65 61 74 65 54 61 62 6c 65   (hasCreateTable
3b40: 20 26 26 20 68 61 73 49 6e 69 74 43 6f 72 6f 75   && hasInitCorou
3b50: 74 69 6e 65 29 20 29 3b 0a 7d 0a 23 65 6e 64 69  tine) );.}.#endi
3b60: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
3b70: 47 20 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41  G - the sqlite3A
3b80: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20  ssertMayAbort() 
3b90: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a  function */../*.
3ba0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3bb0: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
3bc0: 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65  all opcodes have
3bd0: 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 20   been inserted. 
3be0: 20 49 74 20 6c 6f 6f 70 73 0a 2a 2a 20 74 68 72   It loops.** thr
3bf0: 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 6f 70 63  ough all the opc
3c00: 6f 64 65 73 20 61 6e 64 20 66 69 78 65 73 20 75  odes and fixes u
3c10: 70 20 73 6f 6d 65 20 64 65 74 61 69 6c 73 2e 0a  p some details..
3c20: 2a 2a 0a 2a 2a 20 28 31 29 20 46 6f 72 20 65 61  **.** (1) For ea
3c30: 63 68 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74  ch jump instruct
3c40: 69 6f 6e 20 77 69 74 68 20 61 20 6e 65 67 61 74  ion with a negat
3c50: 69 76 65 20 50 32 20 76 61 6c 75 65 20 28 61 20  ive P2 value (a 
3c60: 6c 61 62 65 6c 29 0a 2a 2a 20 20 20 20 20 72 65  label).**     re
3c70: 73 6f 6c 76 65 20 74 68 65 20 50 32 20 76 61 6c  solve the P2 val
3c80: 75 65 20 74 6f 20 61 6e 20 61 63 74 75 61 6c 20  ue to an actual 
3c90: 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 28  address..**.** (
3ca0: 32 29 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6d  2) Compute the m
3cb0: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
3cc0: 20 61 72 67 75 6d 65 6e 74 73 20 75 73 65 64 20   arguments used 
3cd0: 62 79 20 61 6e 79 20 53 51 4c 20 66 75 6e 63 74  by any SQL funct
3ce0: 69 6f 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 73  ion.**     and s
3cf0: 74 6f 72 65 20 74 68 61 74 20 76 61 6c 75 65 20  tore that value 
3d00: 69 6e 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  in *pMaxFuncArgs
3d10: 2e 0a 2a 2a 0a 2a 2a 20 28 33 29 20 55 70 64 61  ..**.** (3) Upda
3d20: 74 65 20 74 68 65 20 56 64 62 65 2e 72 65 61 64  te the Vdbe.read
3d30: 4f 6e 6c 79 20 61 6e 64 20 56 64 62 65 2e 62 49  Only and Vdbe.bI
3d40: 73 52 65 61 64 65 72 20 66 6c 61 67 73 20 74 6f  sReader flags to
3d50: 20 61 63 63 75 72 61 74 65 6c 79 0a 2a 2a 20 20   accurately.**  
3d60: 20 20 20 69 6e 64 69 63 61 74 65 20 77 68 61 74     indicate what
3d70: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
3d80: 61 74 65 6d 65 6e 74 20 61 63 74 75 61 6c 6c 79  atement actually
3d90: 20 64 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 34 29   does..**.** (4)
3da0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
3db0: 70 34 2e 78 41 64 76 61 6e 63 65 20 70 6f 69 6e  p4.xAdvance poin
3dc0: 74 65 72 20 6f 6e 20 6f 70 63 6f 64 65 73 20 74  ter on opcodes t
3dd0: 68 61 74 20 75 73 65 20 69 74 2e 0a 2a 2a 0a 2a  hat use it..**.*
3de0: 2a 20 28 35 29 20 52 65 63 6c 61 69 6d 20 74 68  * (5) Reclaim th
3df0: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
3e00: 65 64 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 6c  ed for storing l
3e10: 61 62 65 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  abels..*/.static
3e20: 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32 56   void resolveP2V
3e30: 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20 69  alues(Vdbe *p, i
3e40: 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  nt *pMaxFuncArgs
3e50: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
3e60: 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a 70 4d  t nMaxArgs = *pM
3e70: 61 78 46 75 6e 63 41 72 67 73 3b 0a 20 20 4f 70  axFuncArgs;.  Op
3e80: 20 2a 70 4f 70 3b 0a 20 20 50 61 72 73 65 20 2a   *pOp;.  Parse *
3e90: 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72  pParse = p->pPar
3ea0: 73 65 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65  se;.  int *aLabe
3eb0: 6c 20 3d 20 70 50 61 72 73 65 2d 3e 61 4c 61 62  l = pParse->aLab
3ec0: 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e 6c  el;.  p->readOnl
3ed0: 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 62 49 73 52  y = 1;.  p->bIsR
3ee0: 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 66 6f 72  eader = 0;.  for
3ef0: 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70  (pOp=p->aOp, i=p
3f00: 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69  ->nOp-1; i>=0; i
3f10: 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  --, pOp++){.    
3f20: 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d  u8 opcode = pOp-
3f30: 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 2f 2a  >opcode;..    /*
3f40: 20 4e 4f 54 45 3a 20 42 65 20 73 75 72 65 20 74   NOTE: Be sure t
3f50: 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70 63 6f 64  o update mkopcod
3f60: 65 68 2e 61 77 6b 20 77 68 65 6e 20 61 64 64 69  eh.awk when addi
3f70: 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e 67 0a 20  ng or removing. 
3f80: 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72 6f 6d     ** cases from
3f90: 20 74 68 69 73 20 73 77 69 74 63 68 21 20 2a 2f   this switch! */
3fa0: 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70 63  .    switch( opc
3fb0: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ode ){.      cas
3fc0: 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  e OP_Transaction
3fd0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
3fe0: 70 4f 70 2d 3e 70 32 21 3d 30 20 29 20 70 2d 3e  pOp->p2!=0 ) p->
3ff0: 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20  readOnly = 0;.  
4000: 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20 74 68        /* fall th
4010: 72 75 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  ru */.      }.  
4020: 20 20 20 20 63 61 73 65 20 4f 50 5f 41 75 74 6f      case OP_Auto
4030: 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20 20 63 61  Commit:.      ca
4040: 73 65 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 3a  se OP_Savepoint:
4050: 20 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 62 49   {.        p->bI
4060: 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20  sReader = 1;.   
4070: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4080: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
4090: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
40a0: 20 20 63 61 73 65 20 4f 50 5f 43 68 65 63 6b 70    case OP_Checkp
40b0: 6f 69 6e 74 3a 0a 23 65 6e 64 69 66 0a 20 20 20  oint:.#endif.   
40c0: 20 20 20 63 61 73 65 20 4f 50 5f 56 61 63 75 75     case OP_Vacuu
40d0: 6d 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  m:.      case OP
40e0: 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b 0a  _JournalMode: {.
40f0: 20 20 20 20 20 20 20 20 70 2d 3e 72 65 61 64 4f          p->readO
4100: 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nly = 0;.       
4110: 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20   p->bIsReader = 
4120: 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  1;.        break
4130: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
4140: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
4150: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
4160: 20 63 61 73 65 20 4f 50 5f 56 55 70 64 61 74 65   case OP_VUpdate
4170: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
4180: 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73  pOp->p2>nMaxArgs
4190: 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f   ) nMaxArgs = pO
41a0: 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 62  p->p2;.        b
41b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
41c0: 20 20 20 20 63 61 73 65 20 4f 50 5f 56 46 69 6c      case OP_VFil
41d0: 74 65 72 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  ter: {.        i
41e0: 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 61 73  nt n;.        as
41f0: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d 20 69  sert( p->nOp - i
4200: 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20 20 20   >= 3 );.       
4210: 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d   assert( pOp[-1]
4220: 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65  .opcode==OP_Inte
4230: 67 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20 6e  ger );.        n
4240: 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20   = pOp[-1].p1;. 
4250: 20 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61         if( n>nMa
4260: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73  xArgs ) nMaxArgs
4270: 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 62 72   = n;.        br
4280: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  eak;.      }.#en
4290: 64 69 66 0a 20 20 20 20 20 20 63 61 73 65 20 4f  dif.      case O
42a0: 50 5f 4e 65 78 74 3a 0a 20 20 20 20 20 20 63 61  P_Next:.      ca
42b0: 73 65 20 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e  se OP_NextIfOpen
42c0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  :.      case OP_
42d0: 53 6f 72 74 65 72 4e 65 78 74 3a 20 7b 0a 20 20  SorterNext: {.  
42e0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41        pOp->p4.xA
42f0: 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74 65 33  dvance = sqlite3
4300: 42 74 72 65 65 4e 65 78 74 3b 0a 20 20 20 20 20  BtreeNext;.     
4310: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
4320: 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20   P4_ADVANCE;.   
4330: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4340: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f    }.      case O
4350: 50 5f 50 72 65 76 3a 0a 20 20 20 20 20 20 63 61  P_Prev:.      ca
4360: 73 65 20 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e  se OP_PrevIfOpen
4370: 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  : {.        pOp-
4380: 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73  >p4.xAdvance = s
4390: 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
43a0: 6f 75 73 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ous;.        pOp
43b0: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44  ->p4type = P4_AD
43c0: 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 62  VANCE;.        b
43d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
43e0: 20 20 7d 0a 0a 20 20 20 20 70 4f 70 2d 3e 6f 70    }..    pOp->op
43f0: 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33 4f  flags = sqlite3O
4400: 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 6f 70  pcodeProperty[op
4410: 63 6f 64 65 5d 3b 0a 20 20 20 20 69 66 28 20 28  code];.    if( (
4420: 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f  pOp->opflags & O
4430: 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26  PFLG_JUMP)!=0 &&
4440: 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20   pOp->p2<0 ){.  
4450: 20 20 20 20 61 73 73 65 72 74 28 20 41 44 44 52      assert( ADDR
4460: 28 70 4f 70 2d 3e 70 32 29 3c 70 50 61 72 73 65  (pOp->p2)<pParse
4470: 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20  ->nLabel );.    
4480: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62    pOp->p2 = aLab
4490: 65 6c 5b 41 44 44 52 28 70 4f 70 2d 3e 70 32 29  el[ADDR(pOp->p2)
44a0: 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  ];.    }.  }.  s
44b0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
44c0: 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 4c 61 62  db, pParse->aLab
44d0: 65 6c 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61  el);.  pParse->a
44e0: 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 70 50 61  Label = 0;.  pPa
44f0: 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 3d 20 30 3b  rse->nLabel = 0;
4500: 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  .  *pMaxFuncArgs
4510: 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 20 20 61   = nMaxArgs;.  a
4520: 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61  ssert( p->bIsRea
4530: 64 65 72 21 3d 30 20 7c 7c 20 44 62 4d 61 73 6b  der!=0 || DbMask
4540: 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65  AllZero(p->btree
4550: 4d 61 73 6b 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Mask) );.}../*.*
4560: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64  * Return the add
4570: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
4580: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
4590: 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a  be inserted..*/.
45a0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
45b0: 75 72 72 65 6e 74 41 64 64 72 28 56 64 62 65 20  urrentAddr(Vdbe 
45c0: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
45d0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
45e0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65  GIC_INIT );.  re
45f0: 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a  turn p->nOp;.}..
4600: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
4610: 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f  ion returns a po
4620: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72 72  inter to the arr
4630: 61 79 20 6f 66 20 6f 70 63 6f 64 65 73 20 61 73  ay of opcodes as
4640: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
4650: 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64   the Vdbe passed
4660: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
4670: 67 75 6d 65 6e 74 2e 20 49 74 20 69 73 20 74 68  gument. It is th
4680: 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e  e callers respon
4690: 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61  sibility.** to a
46a0: 72 72 61 6e 67 65 20 66 6f 72 20 74 68 65 20 72  rrange for the r
46b0: 65 74 75 72 6e 65 64 20 61 72 72 61 79 20 74 6f  eturned array to
46c0: 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   be eventually f
46d0: 72 65 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a  reed using the .
46e0: 2a 2a 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  ** vdbeFreeOpArr
46f0: 61 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ay() function..*
4700: 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75  *.** Before retu
4710: 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20  rning, *pnOp is 
4720: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
4730: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
4740: 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  the returned.** 
4750: 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e  array. Also, *pn
4760: 4d 61 78 41 72 67 20 69 73 20 73 65 74 20 74 6f  MaxArg is set to
4770: 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 69   the larger of i
4780: 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  ts current value
4790: 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d   and .** the num
47a0: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
47b0: 6e 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67  n the Vdbe.apArg
47c0: 5b 5d 20 61 72 72 61 79 20 72 65 71 75 69 72 65  [] array require
47d0: 64 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  d to execute the
47e0: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 70 72   .** returned pr
47f0: 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70  ogram..*/.VdbeOp
4800: 20 2a 73 71 6c 69 74 65 33 56 64 62 65 54 61 6b   *sqlite3VdbeTak
4810: 65 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 70  eOpArray(Vdbe *p
4820: 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74  , int *pnOp, int
4830: 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56   *pnMaxArg){.  V
4840: 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e  dbeOp *aOp = p->
4850: 61 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61  aOp;.  assert( a
4860: 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61  Op && !p->db->ma
4870: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20  llocFailed );.. 
4880: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 73   /* Check that s
4890: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
48a0: 72 65 65 28 29 20 77 61 73 20 6e 6f 74 20 63 61  ree() was not ca
48b0: 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 56 4d 20  lled on this VM 
48c0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d  */.  assert( DbM
48d0: 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74  askAllZero(p->bt
48e0: 72 65 65 4d 61 73 6b 29 20 29 3b 0a 0a 20 20 72  reeMask) );..  r
48f0: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70  esolveP2Values(p
4900: 2c 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a  , pnMaxArg);.  *
4910: 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20  pnOp = p->nOp;. 
4920: 20 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72   p->aOp = 0;.  r
4930: 65 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a  eturn aOp;.}../*
4940: 0a 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20  .** Add a whole 
4950: 6c 69 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f  list of operatio
4960: 6e 73 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74  ns to the operat
4970: 69 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75  ion stack.  Retu
4980: 72 6e 20 74 68 65 0a 2a 2a 20 61 64 64 72 65 73  rn the.** addres
4990: 73 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  s of the first o
49a0: 70 65 72 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a  peration added..
49b0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
49c0: 62 65 41 64 64 4f 70 4c 69 73 74 28 56 64 62 65  beAddOpList(Vdbe
49d0: 20 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64   *p, int nOp, Vd
49e0: 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a  beOpList const *
49f0: 61 4f 70 2c 20 69 6e 74 20 69 4c 69 6e 65 6e 6f  aOp, int iLineno
4a00: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 69  ){.  int addr, i
4a10: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74  ;.  VdbeOp *pOut
4a20: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 70 3e  ;.  assert( nOp>
4a30: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
4a40: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
4a50: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
4a60: 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e  ( p->nOp + nOp >
4a70: 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41   p->pParse->nOpA
4a80: 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41 72  lloc && growOpAr
4a90: 72 61 79 28 70 2c 20 6e 4f 70 29 20 29 7b 0a 20  ray(p, nOp) ){. 
4aa0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
4ab0: 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70  .  addr = p->nOp
4ac0: 3b 0a 20 20 70 4f 75 74 20 3d 20 26 70 2d 3e 61  ;.  pOut = &p->a
4ad0: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 6f 72 28  Op[addr];.  for(
4ae0: 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c  i=0; i<nOp; i++,
4af0: 20 61 4f 70 2b 2b 2c 20 70 4f 75 74 2b 2b 29 7b   aOp++, pOut++){
4b00: 0a 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64  .    pOut->opcod
4b10: 65 20 3d 20 61 4f 70 2d 3e 6f 70 63 6f 64 65 3b  e = aOp->opcode;
4b20: 0a 20 20 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20  .    pOut->p1 = 
4b30: 61 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 70 4f 75  aOp->p1;.    pOu
4b40: 74 2d 3e 70 32 20 3d 20 61 4f 70 2d 3e 70 32 3b  t->p2 = aOp->p2;
4b50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 4f 70  .    assert( aOp
4b60: 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20 20 70  ->p2>=0 );.    p
4b70: 4f 75 74 2d 3e 70 33 20 3d 20 61 4f 70 2d 3e 70  Out->p3 = aOp->p
4b80: 33 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 74  3;.    pOut->p4t
4b90: 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44  ype = P4_NOTUSED
4ba0: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70  ;.    pOut->p4.p
4bb0: 20 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e   = 0;.    pOut->
4bc0: 70 35 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  p5 = 0;.#ifdef S
4bd0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50  QLITE_ENABLE_EXP
4be0: 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20  LAIN_COMMENTS.  
4bf0: 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74    pOut->zComment
4c00: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 0;.#endif.#if
4c10: 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f  def SQLITE_VDBE_
4c20: 43 4f 56 45 52 41 47 45 0a 20 20 20 20 70 4f 75  COVERAGE.    pOu
4c30: 74 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c  t->iSrcLine = iL
4c40: 69 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20  ineno+i;.#else. 
4c50: 20 20 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f     (void)iLineno
4c60: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
4c70: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
4c80: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67   if( p->db->flag
4c90: 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
4ca0: 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
4cb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
4cc0: 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c  intOp(0, i+addr,
4cd0: 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d   &p->aOp[i+addr]
4ce0: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
4cf0: 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20    }.  p->nOp += 
4d00: 6e 4f 70 3b 0a 20 20 72 65 74 75 72 6e 20 61 64  nOp;.  return ad
4d10: 64 72 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  dr;.}..#if defin
4d20: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
4d30: 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
4d40: 29 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65  )./*.** Add an e
4d50: 6e 74 72 79 20 74 6f 20 74 68 65 20 61 72 72 61  ntry to the arra
4d60: 79 20 6f 66 20 63 6f 75 6e 74 65 72 73 20 6d 61  y of counters ma
4d70: 6e 61 67 65 64 20 62 79 20 73 71 6c 69 74 65 33  naged by sqlite3
4d80: 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73  _stmt_scanstatus
4d90: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
4da0: 74 65 33 56 64 62 65 53 63 61 6e 53 74 61 74 75  te3VdbeScanStatu
4db0: 73 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  s(.  Vdbe *p,   
4dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4dd0: 20 20 20 20 20 2f 2a 20 56 4d 20 74 6f 20 61 64       /* VM to ad
4de0: 64 20 73 63 61 6e 73 74 61 74 75 73 28 29 20 74  d scanstatus() t
4df0: 6f 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45  o */.  int addrE
4e00: 78 70 6c 61 69 6e 2c 20 20 20 20 20 20 20 20 20  xplain,         
4e10: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
4e20: 73 20 6f 66 20 4f 50 5f 45 78 70 6c 61 69 6e 20  s of OP_Explain 
4e30: 28 6f 72 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20  (or 0) */.  int 
4e40: 61 64 64 72 4c 6f 6f 70 2c 20 20 20 20 20 20 20  addrLoop,       
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
4e60: 64 64 72 65 73 73 20 6f 66 20 6c 6f 6f 70 20 63  ddress of loop c
4e70: 6f 75 6e 74 65 72 20 2a 2f 20 0a 20 20 69 6e 74  ounter */ .  int
4e80: 20 61 64 64 72 56 69 73 69 74 2c 20 20 20 20 20   addrVisit,     
4e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4ea0: 41 64 64 72 65 73 73 20 6f 66 20 72 6f 77 73 20  Address of rows 
4eb0: 76 69 73 69 74 65 64 20 63 6f 75 6e 74 65 72 20  visited counter 
4ec0: 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 45 73 74  */.  LogEst nEst
4ed0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4ee0: 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65       /* Estimate
4ef0: 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  d number of outp
4f00: 75 74 20 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6e  ut rows */.  con
4f10: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
4f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4f30: 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 6f 72  Name of table or
4f40: 20 69 6e 64 65 78 20 62 65 69 6e 67 20 73 63 61   index being sca
4f50: 6e 6e 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  nned */.){.  int
4f60: 20 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 63   nByte = (p->nSc
4f70: 61 6e 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28 53  an+1) * sizeof(S
4f80: 63 61 6e 53 74 61 74 75 73 29 3b 0a 20 20 53 63  canStatus);.  Sc
4f90: 61 6e 53 74 61 74 75 73 20 2a 61 4e 65 77 3b 0a  anStatus *aNew;.
4fa0: 20 20 61 4e 65 77 20 3d 20 28 53 63 61 6e 53 74    aNew = (ScanSt
4fb0: 61 74 75 73 2a 29 73 71 6c 69 74 65 33 44 62 52  atus*)sqlite3DbR
4fc0: 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d  ealloc(p->db, p-
4fd0: 3e 61 53 63 61 6e 2c 20 6e 42 79 74 65 29 3b 0a  >aScan, nByte);.
4fe0: 20 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20    if( aNew ){.  
4ff0: 20 20 53 63 61 6e 53 74 61 74 75 73 20 2a 70 4e    ScanStatus *pN
5000: 65 77 20 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e 53  ew = &aNew[p->nS
5010: 63 61 6e 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65 77  can++];.    pNew
5020: 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20  ->addrExplain = 
5030: 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20  addrExplain;.   
5040: 20 70 4e 65 77 2d 3e 61 64 64 72 4c 6f 6f 70 20   pNew->addrLoop 
5050: 3d 20 61 64 64 72 4c 6f 6f 70 3b 0a 20 20 20 20  = addrLoop;.    
5060: 70 4e 65 77 2d 3e 61 64 64 72 56 69 73 69 74 20  pNew->addrVisit 
5070: 3d 20 61 64 64 72 56 69 73 69 74 3b 0a 20 20 20  = addrVisit;.   
5080: 20 70 4e 65 77 2d 3e 6e 45 73 74 20 3d 20 6e 45   pNew->nEst = nE
5090: 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4e  st;.    pNew->zN
50a0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
50b0: 74 72 44 75 70 28 70 2d 3e 64 62 2c 20 7a 4e 61  trDup(p->db, zNa
50c0: 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 61 53 63 61  me);.    p->aSca
50d0: 6e 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a  n = aNew;.  }.}.
50e0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43  #endif.../*.** C
50f0: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
5100: 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 2c 20 6f  of the opcode, o
5110: 72 20 50 31 2c 20 50 32 2c 20 50 33 2c 20 6f 72  r P1, P2, P3, or
5120: 20 50 35 20 6f 70 65 72 61 6e 64 73 0a 2a 2a 20   P5 operands.** 
5130: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
5140: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
5150: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
5160: 68 61 6e 67 65 4f 70 63 6f 64 65 28 56 64 62 65  hangeOpcode(Vdbe
5170: 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 75   *p, u32 addr, u
5180: 38 20 69 4e 65 77 4f 70 63 6f 64 65 29 7b 0a 20  8 iNewOpcode){. 
5190: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
51a0: 70 28 70 2c 61 64 64 72 29 2d 3e 6f 70 63 6f 64  p(p,addr)->opcod
51b0: 65 20 3d 20 69 4e 65 77 4f 70 63 6f 64 65 3b 0a  e = iNewOpcode;.
51c0: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
51d0: 62 65 43 68 61 6e 67 65 50 31 28 56 64 62 65 20  beChangeP1(Vdbe 
51e0: 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e  *p, u32 addr, in
51f0: 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65  t val){.  sqlite
5200: 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64  3VdbeGetOp(p,add
5210: 72 29 2d 3e 70 31 20 3d 20 76 61 6c 3b 0a 7d 0a  r)->p1 = val;.}.
5220: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
5230: 43 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70  ChangeP2(Vdbe *p
5240: 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20  , u32 addr, int 
5250: 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  val){.  sqlite3V
5260: 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29  dbeGetOp(p,addr)
5270: 2d 3e 70 32 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f  ->p2 = val;.}.vo
5280: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
5290: 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20  angeP3(Vdbe *p, 
52a0: 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61  u32 addr, int va
52b0: 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  l){.  sqlite3Vdb
52c0: 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e  eGetOp(p,addr)->
52d0: 70 33 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64  p3 = val;.}.void
52e0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
52f0: 67 65 50 35 28 56 64 62 65 20 2a 70 2c 20 75 38  geP5(Vdbe *p, u8
5300: 20 70 35 29 7b 0a 20 20 73 71 6c 69 74 65 33 56   p5){.  sqlite3V
5310: 64 62 65 47 65 74 4f 70 28 70 2c 2d 31 29 2d 3e  dbeGetOp(p,-1)->
5320: 70 35 20 3d 20 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a  p5 = p5;.}../*.*
5330: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 50 32 20  * Change the P2 
5340: 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72  operand of instr
5350: 75 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74  uction addr so t
5360: 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
5370: 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73 20  .** the address 
5380: 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  of the next inst
5390: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f  ruction to be co
53a0: 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ded..*/.void sql
53b0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
53c0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
53d0: 64 72 29 7b 0a 20 20 70 2d 3e 70 50 61 72 73 65  dr){.  p->pParse
53e0: 2d 3e 69 46 69 78 65 64 4f 70 20 3d 20 70 2d 3e  ->iFixedOp = p->
53f0: 6e 4f 70 20 2d 20 31 3b 0a 20 20 73 71 6c 69 74  nOp - 1;.  sqlit
5400: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70  e3VdbeChangeP2(p
5410: 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b  , addr, p->nOp);
5420: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
5430: 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20  e input FuncDef 
5440: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68  structure is eph
5450: 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65  emeral, then fre
5460: 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65  e it.  If.** the
5470: 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20   FuncDef is not 
5480: 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64  ephermal, then d
5490: 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74  o nothing..*/.st
54a0: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70  atic void freeEp
54b0: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
54c0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e  sqlite3 *db, Fun
54d0: 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69  cDef *pDef){.  i
54e0: 66 28 20 41 4c 57 41 59 53 28 70 44 65 66 29 20  f( ALWAYS(pDef) 
54f0: 26 26 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c  && (pDef->funcFl
5500: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
5510: 43 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20  C_EPHEM)!=0 ){. 
5520: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
5530: 28 64 62 2c 20 70 44 65 66 29 3b 0a 20 20 7d 0a  (db, pDef);.  }.
5540: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  }..static void v
5550: 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73  dbeFreeOpArray(s
5560: 71 6c 69 74 65 33 20 2a 2c 20 4f 70 20 2a 2c 20  qlite3 *, Op *, 
5570: 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  int);../*.** Del
5580: 65 74 65 20 61 20 50 34 20 76 61 6c 75 65 20 69  ete a P4 value i
5590: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a  f necessary..*/.
55a0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
55b0: 50 34 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  P4(sqlite3 *db, 
55c0: 69 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64  int p4type, void
55d0: 20 2a 70 34 29 7b 0a 20 20 69 66 28 20 70 34 20   *p4){.  if( p4 
55e0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  ){.    assert( d
55f0: 62 20 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28  b );.    switch(
5600: 20 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 20   p4type ){.     
5610: 20 63 61 73 65 20 50 34 5f 46 55 4e 43 43 54 58   case P4_FUNCCTX
5620: 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65  : {.        free
5630: 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f  EphemeralFunctio
5640: 6e 28 64 62 2c 20 28 28 73 71 6c 69 74 65 33 5f  n(db, ((sqlite3_
5650: 63 6f 6e 74 65 78 74 2a 29 70 34 29 2d 3e 70 46  context*)p4)->pF
5660: 75 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  unc);.        /*
5670: 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e   Fall through in
5680: 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73 65  to the next case
5690: 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
56a0: 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a    case P4_REAL:.
56b0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e        case P4_IN
56c0: 54 36 34 3a 0a 20 20 20 20 20 20 63 61 73 65 20  T64:.      case 
56d0: 50 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20  P4_DYNAMIC:.    
56e0: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52    case P4_INTARR
56f0: 41 59 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  AY: {.        sq
5700: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5710: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
5720: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
5730: 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46    case P4_KEYINF
5740: 4f 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  O: {.        if(
5750: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
5760: 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4b 65  d==0 ) sqlite3Ke
5770: 79 49 6e 66 6f 55 6e 72 65 66 28 28 4b 65 79 49  yInfoUnref((KeyI
5780: 6e 66 6f 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  nfo*)p4);.      
5790: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
57a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
57b0: 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e  NABLE_CURSOR_HIN
57c0: 54 53 0a 20 20 20 20 20 20 63 61 73 65 20 50 34  TS.      case P4
57d0: 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 20  _EXPR: {.       
57e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
57f0: 74 65 28 64 62 2c 20 28 45 78 70 72 2a 29 70 34  te(db, (Expr*)p4
5800: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
5810: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
5820: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d  .      case P4_M
5830: 50 52 49 4e 54 46 3a 20 7b 0a 20 20 20 20 20 20  PRINTF: {.      
5840: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
5850: 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69  sFreed==0 ) sqli
5860: 74 65 33 5f 66 72 65 65 28 70 34 29 3b 0a 20 20  te3_free(p4);.  
5870: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5880: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
5890: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P4_FUNCDEF: {.  
58a0: 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65        freeEpheme
58b0: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ralFunction(db, 
58c0: 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20  (FuncDef*)p4);. 
58d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
58e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
58f0: 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20   P4_MEM: {.     
5900: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
5910: 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20  esFreed==0 ){.  
5920: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5930: 61 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65  alueFree((sqlite
5940: 33 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20  3_value*)p4);.  
5950: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5960: 20 20 20 20 20 20 20 4d 65 6d 20 2a 70 20 3d 20         Mem *p = 
5970: 28 4d 65 6d 2a 29 70 34 3b 0a 20 20 20 20 20 20  (Mem*)p4;.      
5980: 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c      if( p->szMal
5990: 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 44 62 46  loc ) sqlite3DbF
59a0: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c  ree(db, p->zMall
59b0: 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  oc);.          s
59c0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
59d0: 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   p);.        }. 
59e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
59f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
5a00: 20 50 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20   P4_VTAB : {.   
5a10: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42       if( db->pnB
5a20: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73  ytesFreed==0 ) s
5a30: 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b  qlite3VtabUnlock
5a40: 28 28 56 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a  ((VTable *)p4);.
5a50: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5a60: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5a70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
5a80: 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  he space allocat
5a90: 65 64 20 66 6f 72 20 61 4f 70 20 61 6e 64 20 61  ed for aOp and a
5aa0: 6e 79 20 70 34 20 76 61 6c 75 65 73 20 61 6c 6c  ny p4 values all
5ab0: 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 0a 2a  ocated for the.*
5ac0: 2a 20 6f 70 63 6f 64 65 73 20 63 6f 6e 74 61 69  * opcodes contai
5ad0: 6e 65 64 20 77 69 74 68 69 6e 2e 20 49 66 20 61  ned within. If a
5ae0: 4f 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69  Op is not NULL i
5af0: 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  t is assumed to 
5b00: 63 6f 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20  contain .** nOp 
5b10: 65 6e 74 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61  entries. .*/.sta
5b20: 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65  tic void vdbeFre
5b30: 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33  eOpArray(sqlite3
5b40: 20 2a 64 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69   *db, Op *aOp, i
5b50: 6e 74 20 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61  nt nOp){.  if( a
5b60: 4f 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f  Op ){.    Op *pO
5b70: 70 3b 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 61  p;.    for(pOp=a
5b80: 4f 70 3b 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70  Op; pOp<&aOp[nOp
5b90: 5d 3b 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20  ]; pOp++){.     
5ba0: 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d   freeP4(db, pOp-
5bb0: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34  >p4type, pOp->p4
5bc0: 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  .p);.#ifdef SQLI
5bd0: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
5be0: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20  N_COMMENTS.     
5bf0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
5c00: 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  b, pOp->zComment
5c10: 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a 20  );.#endif     . 
5c20: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
5c30: 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 4f 70  e3DbFree(db, aOp
5c40: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b  );.}../*.** Link
5c50: 20 74 68 65 20 53 75 62 50 72 6f 67 72 61 6d 20   the SubProgram 
5c60: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
5c70: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
5c80: 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65 20 6c 69  ment into the li
5c90: 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74 20 61 74 20  nked.** list at 
5ca0: 56 64 62 65 2e 70 53 75 62 50 72 6f 67 72 61 6d  Vdbe.pSubProgram
5cb0: 2e 20 54 68 69 73 20 6c 69 73 74 20 69 73 20 75  . This list is u
5cc0: 73 65 64 20 74 6f 20 64 65 6c 65 74 65 20 61 6c  sed to delete al
5cd0: 6c 20 73 75 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a  l sub-program.**
5ce0: 20 6f 62 6a 65 63 74 73 20 77 68 65 6e 20 74 68   objects when th
5cf0: 65 20 56 4d 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  e VM is no longe
5d00: 72 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 76  r required..*/.v
5d10: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c  oid sqlite3VdbeL
5d20: 69 6e 6b 53 75 62 50 72 6f 67 72 61 6d 28 56 64  inkSubProgram(Vd
5d30: 62 65 20 2a 70 56 64 62 65 2c 20 53 75 62 50 72  be *pVdbe, SubPr
5d40: 6f 67 72 61 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e  ogram *p){.  p->
5d50: 70 4e 65 78 74 20 3d 20 70 56 64 62 65 2d 3e 70  pNext = pVdbe->p
5d60: 50 72 6f 67 72 61 6d 3b 0a 20 20 70 56 64 62 65  Program;.  pVdbe
5d70: 2d 3e 70 50 72 6f 67 72 61 6d 20 3d 20 70 3b 0a  ->pProgram = p;.
5d80: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
5d90: 74 68 65 20 6f 70 63 6f 64 65 20 61 74 20 61 64  the opcode at ad
5da0: 64 72 20 69 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a  dr into OP_Noop.
5db0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
5dc0: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
5dd0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
5de0: 72 29 7b 0a 20 20 69 66 28 20 61 64 64 72 3c 70  r){.  if( addr<p
5df0: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 56 64 62  ->nOp ){.    Vdb
5e00: 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61  eOp *pOp = &p->a
5e10: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 73 71  Op[addr];.    sq
5e20: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
5e30: 62 3b 0a 20 20 20 20 66 72 65 65 50 34 28 64 62  b;.    freeP4(db
5e40: 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70  , pOp->p4type, p
5e50: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 6d  Op->p4.p);.    m
5e60: 65 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20 73 69  emset(pOp, 0, si
5e70: 7a 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20  zeof(pOp[0]));. 
5e80: 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
5e90: 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 0a 7d 0a   OP_Noop;.  }.}.
5ea0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 61  ./*.** If the la
5eb0: 73 74 20 6f 70 63 6f 64 65 20 69 73 20 22 6f 70  st opcode is "op
5ec0: 22 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20  " and it is not 
5ed0: 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  a jump destinati
5ee0: 6f 6e 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 6d 6f  on,.** then remo
5ef0: 76 65 20 69 74 2e 20 20 52 65 74 75 72 6e 20 74  ve it.  Return t
5f00: 72 75 65 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20  rue if and only 
5f10: 69 66 20 61 6e 20 6f 70 63 6f 64 65 20 77 61 73  if an opcode was
5f20: 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74   removed..*/.int
5f30: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
5f40: 74 65 50 72 69 6f 72 4f 70 63 6f 64 65 28 56 64  tePriorOpcode(Vd
5f50: 62 65 20 2a 70 2c 20 75 38 20 6f 70 29 7b 0a 20  be *p, u8 op){. 
5f60: 20 69 66 28 20 28 70 2d 3e 6e 4f 70 2d 31 29 3e   if( (p->nOp-1)>
5f70: 28 70 2d 3e 70 50 61 72 73 65 2d 3e 69 46 69 78  (p->pParse->iFix
5f80: 65 64 4f 70 29 20 26 26 20 70 2d 3e 61 4f 70 5b  edOp) && p->aOp[
5f90: 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65  p->nOp-1].opcode
5fa0: 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  ==op ){.    sqli
5fb0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
5fc0: 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70 2d 31 29  oop(p, p->nOp-1)
5fd0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
5fe0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
5ff0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 0;.  }.}../*
6000: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
6010: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f  alue of the P4 o
6020: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
6030: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
6040: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
6050: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65  ne is useful whe
6060: 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61  n a large progra
6070: 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d  m is loaded from
6080: 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72   a.** static arr
6090: 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ay using sqlite3
60a0: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75  VdbeAddOpList bu
60b0: 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b  t we want to mak
60c0: 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72  e a.** few minor
60d0: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
60e0: 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49  program..**.** I
60f0: 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20  f n>=0 then the 
6100: 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79  P4 operand is dy
6110: 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74  namic, meaning t
6120: 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a  hat a copy of.**
6130: 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d   the string is m
6140: 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ade into memory 
6150: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
6160: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
6170: 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d  ** A value of n=
6180: 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79  =0 means copy by
6190: 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f  tes of zP4 up to
61a0: 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74   and including t
61b0: 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c  he.** first null
61c0: 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74   byte.  If n>0 t
61d0: 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74  hen copy n+1 byt
61e0: 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 20 0a 2a  es of zP4..** .*
61f0: 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f  * Other values o
6200: 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20  f n (P4_STATIC, 
6210: 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29  P4_COLLSEQ etc.)
6220: 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a   indicate that z
6230: 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20  P4 points.** to 
6240: 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75  a string or stru
6250: 63 74 75 72 65 20 74 68 61 74 20 69 73 20 67 75  cture that is gu
6260: 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73  aranteed to exis
6270: 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69  t for the lifeti
6280: 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62  me of.** the Vdb
6290: 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65  e. In these case
62a0: 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f  s we can just co
62b0: 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a  py the pointer..
62c0: 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20  **.** If addr<0 
62d0: 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f  then change P4 o
62e0: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
62f0: 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73  tly inserted ins
6300: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
6310: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
6320: 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69  ngeP4(Vdbe *p, i
6330: 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63  nt addr, const c
6340: 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29  har *zP4, int n)
6350: 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73  {.  Op *pOp;.  s
6360: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73  qlite3 *db;.  as
6370: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
6380: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
6390: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
63a0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
63b0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d  );.  if( p->aOp=
63c0: 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
63d0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66  Failed ){.    if
63e0: 28 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 7b 0a  ( n!=P4_VTAB ){.
63f0: 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c        freeP4(db,
6400: 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61   n, (void*)*(cha
6410: 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 7d  r**)&zP4);.    }
6420: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
6430: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
6440: 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  p>0 );.  assert(
6450: 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a   addr<p->nOp );.
6460: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
6470: 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f      addr = p->nO
6480: 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70  p - 1;.  }.  pOp
6490: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
64a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
64b0: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4e 4f 54 55  >p4type==P4_NOTU
64c0: 53 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f  SED.       || pO
64d0: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e  p->p4type==P4_IN
64e0: 54 33 32 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f  T32.       || pO
64f0: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4b 45  p->p4type==P4_KE
6500: 59 49 4e 46 4f 20 29 3b 0a 20 20 66 72 65 65 50  YINFO );.  freeP
6510: 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70  4(db, pOp->p4typ
6520: 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20  e, pOp->p4.p);. 
6530: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a   pOp->p4.p = 0;.
6540: 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33    if( n==P4_INT3
6550: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65  2 ){.    /* Note
6560: 3a 20 74 68 69 73 20 63 61 73 74 20 69 73 20 73  : this cast is s
6570: 61 66 65 2c 20 62 65 63 61 75 73 65 20 74 68 65  afe, because the
6580: 20 6f 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69   origin data poi
6590: 6e 74 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20  nt was an int.  
65a0: 20 20 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61    ** that was ca
65b0: 73 74 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63  st to a (const c
65c0: 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70  har *). */.    p
65d0: 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54  Op->p4.i = SQLIT
65e0: 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34  E_PTR_TO_INT(zP4
65f0: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  );.    pOp->p4ty
6600: 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20  pe = P4_INT32;. 
6610: 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 34 3d 3d   }else if( zP4==
6620: 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  0 ){.    pOp->p4
6630: 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d  .p = 0;.    pOp-
6640: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54  >p4type = P4_NOT
6650: 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  USED;.  }else if
6660: 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20  ( n==P4_KEYINFO 
6670: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  ){.    pOp->p4.p
6680: 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20   = (void*)zP4;. 
6690: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
66a0: 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 23 69 66   P4_KEYINFO;.#if
66b0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
66c0: 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20  E_CURSOR_HINTS. 
66d0: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34   }else if( n==P4
66e0: 5f 45 58 50 52 20 29 7b 0a 20 20 20 20 2f 2a 20  _EXPR ){.    /* 
66f0: 52 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 66  Responsibility f
6700: 6f 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  or deleting the 
6710: 45 78 70 72 20 74 72 65 65 20 69 73 20 68 61 6e  Expr tree is han
6720: 64 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a  ded over to the.
6730: 20 20 20 20 2a 2a 20 56 44 42 45 20 62 79 20 74      ** VDBE by t
6740: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  his operation.  
6750: 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  The caller shoul
6760: 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 69  d have already i
6770: 6e 76 6f 6b 65 64 0a 20 20 20 20 2a 2a 20 73 71  nvoked.    ** sq
6780: 6c 69 74 65 33 45 78 70 72 44 75 70 28 29 20 6f  lite3ExprDup() o
6790: 72 20 77 68 61 74 65 76 65 72 20 6f 74 68 65 72  r whatever other
67a0: 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 65 64   routine is need
67b0: 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 0a 20 20  ed to make a .  
67c0: 20 20 2a 2a 20 70 72 69 76 61 74 65 20 63 6f 70    ** private cop
67d0: 79 20 6f 66 20 74 68 65 20 74 72 65 65 2e 20 2a  y of the tree. *
67e0: 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 45  /.    pOp->p4.pE
67f0: 78 70 72 20 3d 20 28 45 78 70 72 2a 29 7a 50 34  xpr = (Expr*)zP4
6800: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
6810: 65 20 3d 20 50 34 5f 45 58 50 52 3b 0a 23 65 6e  e = P4_EXPR;.#en
6820: 64 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  dif.  }else if( 
6830: 6e 3d 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20 20  n==P4_VTAB ){.  
6840: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76    pOp->p4.p = (v
6850: 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f  oid*)zP4;.    pO
6860: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 56  p->p4type = P4_V
6870: 54 41 42 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  TAB;.    sqlite3
6880: 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c 65  VtabLock((VTable
6890: 20 2a 29 7a 50 34 29 3b 0a 20 20 20 20 61 73 73   *)zP4);.    ass
68a0: 65 72 74 28 20 28 28 56 54 61 62 6c 65 20 2a 29  ert( ((VTable *)
68b0: 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62 20  zP4)->db==p->db 
68c0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  );.  }else if( n
68d0: 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70  <0 ){.    pOp->p
68e0: 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34  4.p = (void*)zP4
68f0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
6900: 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72  e = (signed char
6910: 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  )n;.  }else{.   
6920: 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20   if( n==0 ) n = 
6930: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
6940: 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  zP4);.    pOp->p
6950: 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 53  4.z = sqlite3DbS
6960: 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50  trNDup(p->db, zP
6970: 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  4, n);.    pOp->
6980: 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41  p4type = P4_DYNA
6990: 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  MIC;.  }.}../*.*
69a0: 2a 20 53 65 74 20 74 68 65 20 50 34 20 6f 6e 20  * Set the P4 on 
69b0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
69c0: 79 20 61 64 64 65 64 20 6f 70 63 6f 64 65 20 74  y added opcode t
69d0: 6f 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 66 6f  o the KeyInfo fo
69e0: 72 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 67  r the.** index g
69f0: 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  iven..*/.void sq
6a00: 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65  lite3VdbeSetP4Ke
6a10: 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61  yInfo(Parse *pPa
6a20: 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78  rse, Index *pIdx
6a30: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
6a40: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
6a50: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
6a60: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d    assert( pIdx!=
6a70: 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  0 );.  sqlite3Vd
6a80: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
6a90: 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  , (char*)sqlite3
6aa0: 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70  KeyInfoOfIndex(p
6ab0: 50 61 72 73 65 2c 20 70 49 64 78 29 2c 0a 20 20  Parse, pIdx),.  
6ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ad0: 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b      P4_KEYINFO);
6ae0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
6af0: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
6b00: 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20  _COMMENTS./*.** 
6b10: 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65  Change the comme
6b20: 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
6b30: 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e  ecently coded in
6b40: 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a  struction.  Or.*
6b50: 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70  * insert a No-op
6b60: 20 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d   and add the com
6b70: 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77  ment to that new
6b80: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54   instruction.  T
6b90: 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65  his.** makes the
6ba0: 20 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20   code easier to 
6bb0: 72 65 61 64 20 64 75 72 69 6e 67 20 64 65 62 75  read during debu
6bc0: 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20  gging.  None of 
6bd0: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20  this happens.** 
6be0: 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20  in a production 
6bf0: 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  build..*/.static
6c00: 20 76 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65   void vdbeVComme
6c10: 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  nt(Vdbe *p, cons
6c20: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
6c30: 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20   va_list ap){.  
6c40: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
6c50: 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b   || p->aOp==0 );
6c60: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f  .  assert( p->aO
6c70: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70  p==0 || p->aOp[p
6c80: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
6c90: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  t==0 || p->db->m
6ca0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
6cb0: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20   if( p->nOp ){. 
6cc0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f     assert( p->aO
6cd0: 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  p );.    sqlite3
6ce0: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  DbFree(p->db, p-
6cf0: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
6d00: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d  Comment);.    p-
6d10: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
6d20: 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65  Comment = sqlite
6d30: 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c  3VMPrintf(p->db,
6d40: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
6d50: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
6d60: 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62  3VdbeComment(Vdb
6d70: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
6d80: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
6d90: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
6da0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61   if( p ){.    va
6db0: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
6dc0: 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f  at);.    vdbeVCo
6dd0: 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74  mment(p, zFormat
6de0: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e  , ap);.    va_en
6df0: 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  d(ap);.  }.}.voi
6e00: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f  d sqlite3VdbeNoo
6e10: 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70  pComment(Vdbe *p
6e20: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
6e30: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
6e40: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28  a_list ap;.  if(
6e50: 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   p ){.    sqlite
6e60: 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f  3VdbeAddOp0(p, O
6e70: 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f  P_Noop);.    va_
6e80: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
6e90: 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d  t);.    vdbeVCom
6ea0: 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c  ment(p, zFormat,
6eb0: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64   ap);.    va_end
6ec0: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  (ap);.  }.}.#end
6ed0: 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f  if  /* NDEBUG */
6ee0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
6ef0: 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a  VDBE_COVERAGE./*
6f00: 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75  .** Set the valu
6f10: 65 20 69 66 20 74 68 65 20 69 53 72 63 4c 69 6e  e if the iSrcLin
6f20: 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20  e field for the 
6f30: 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 64 65 64  previously coded
6f40: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
6f50: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6f60: 65 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56  eSetLineNumber(V
6f70: 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e  dbe *v, int iLin
6f80: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e){.  sqlite3Vdb
6f90: 65 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53  eGetOp(v,-1)->iS
6fa0: 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a  rcLine = iLine;.
6fb0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
6fc0: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
6fd0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
6fe0: 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72  n the opcode for
6ff0: 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73   a given address
7000: 2e 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73  .  If the addres
7010: 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a  s is -1, then.**
7020: 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74   return the most
7030: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
7040: 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  ed opcode..**.**
7050: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
7060: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61  ocation error ha
7070: 73 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72  s occurred prior
7080: 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   to the calling 
7090: 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  of this.** routi
70a0: 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74  ne, then a point
70b0: 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64  er to a dummy Vd
70c0: 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74  beOp will be ret
70d0: 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63  urned.  That opc
70e0: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62  ode.** is readab
70f0: 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61  le but not writa
7100: 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69  ble, though it i
7110: 73 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74  s cast to a writ
7120: 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54  able value..** T
7130: 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64  he return of a d
7140: 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f  ummy opcode allo
7150: 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63  ws the call to c
7160: 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e  ontinue function
7170: 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 6e 20  ing.** after an 
7180: 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75  OOM fault withou
7190: 74 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63  t having to chec
71a0: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
71b0: 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20  return from .** 
71c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
71d0: 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
71e0: 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68    But because th
71f0: 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69  e dummy.opcode i
7200: 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69  s 0,.** dummy wi
7210: 6c 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74  ll never be writ
7220: 74 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73  ten to.  This is
7230: 20 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64   verified by cod
7240: 65 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64  e inspection and
7250: 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77  .** by running w
7260: 69 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f  ith Valgrind..*/
7270: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33  .VdbeOp *sqlite3
7280: 56 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a  VdbeGetOp(Vdbe *
7290: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
72a0: 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69 65 73  /* C89 specifies
72b0: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61   that the consta
72c0: 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20  nt "dummy" will 
72d0: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  be initialized t
72e0: 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73  o all.  ** zeros
72f0: 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72 72 65  , which is corre
7300: 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61  ct.  MSVC genera
7310: 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e  tes a warning, n
7320: 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a  evertheless. */.
7330: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
7340: 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72  dummy;  /* Ignor
7350: 65 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69  e the MSVC warni
7360: 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74  ng about no init
7370: 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73  ializer */.  ass
7380: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
7390: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
73a0: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
73b0: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
73c0: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61  nOp - 1;.  }.  a
73d0: 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20  ssert( (addr>=0 
73e0: 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20  && addr<p->nOp) 
73f0: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
7400: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
7410: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
7420: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
7430: 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d  n (VdbeOp*)&dumm
7440: 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
7450: 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61  return &p->aOp[a
7460: 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  ddr];.  }.}..#if
7470: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
7480: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
7490: 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52  OMMENTS)./*.** R
74a0: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
74b0: 20 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f   value for one o
74c0: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73  f the parameters
74d0: 20 74 6f 20 74 68 65 20 6f 70 63 6f 64 65 20 70   to the opcode p
74e0: 4f 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  Op.** determined
74f0: 20 62 79 20 63 68 61 72 61 63 74 65 72 20 63 2e   by character c.
7500: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
7510: 72 61 6e 73 6c 61 74 65 50 28 63 68 61 72 20 63  ranslateP(char c
7520: 2c 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29  , const Op *pOp)
7530: 7b 0a 20 20 69 66 28 20 63 3d 3d 27 31 27 20 29  {.  if( c=='1' )
7540: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b   return pOp->p1;
7550: 0a 20 20 69 66 28 20 63 3d 3d 27 32 27 20 29 20  .  if( c=='2' ) 
7560: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a  return pOp->p2;.
7570: 20 20 69 66 28 20 63 3d 3d 27 33 27 20 29 20 72    if( c=='3' ) r
7580: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20  eturn pOp->p3;. 
7590: 20 69 66 28 20 63 3d 3d 27 34 27 20 29 20 72 65   if( c=='4' ) re
75a0: 74 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a  turn pOp->p4.i;.
75b0: 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35    return pOp->p5
75c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
75d0: 74 65 20 61 20 73 74 72 69 6e 67 20 66 6f 72 20  te a string for 
75e0: 74 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69  the "comment" fi
75f0: 65 6c 64 20 6f 66 20 61 20 56 44 42 45 20 6f 70  eld of a VDBE op
7600: 63 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a  code listing..**
7610: 0a 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73 69 73  .** The Synopsis
7620: 3a 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65  : field in comme
7630: 6e 74 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e  nts in the vdbe.
7640: 63 20 73 6f 75 72 63 65 20 66 69 6c 65 20 67 65  c source file ge
7650: 74 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20  ts converted.** 
7660: 74 6f 20 61 6e 20 65 78 74 72 61 20 73 74 72 69  to an extra stri
7670: 6e 67 20 74 68 61 74 20 69 73 20 61 70 70 65 6e  ng that is appen
7680: 64 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74  ded to the sqlit
7690: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20  e3OpcodeName(). 
76a0: 20 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e   In the.** absen
76b0: 63 65 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d  ce of other comm
76c0: 65 6e 74 73 2c 20 74 68 69 73 20 73 79 6e 6f 70  ents, this synop
76d0: 73 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20  sis becomes the 
76e0: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f  comment on the o
76f0: 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74  pcode..** Some t
7700: 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72  ranslation occur
7710: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22  s:.**.**       "
7720: 50 58 22 20 20 20 20 20 20 2d 3e 20 20 22 72 5b  PX"      ->  "r[
7730: 58 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22 50 58  X]".**       "PX
7740: 40 50 59 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e  @PY"   ->  "r[X.
7750: 2e 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b  .X+Y-1]"  or "r[
7760: 78 5d 22 20 69 66 20 79 20 69 73 20 30 20 6f 72  x]" if y is 0 or
7770: 20 31 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40   1.**       "PX@
7780: 50 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e  PY+1" ->  "r[X..
7790: 58 2b 59 5d 22 20 20 20 20 6f 72 20 22 72 5b 78  X+Y]"    or "r[x
77a0: 5d 22 20 69 66 20 79 20 69 73 20 30 0a 2a 2a 20  ]" if y is 0.** 
77b0: 20 20 20 20 20 20 22 50 59 2e 2e 50 59 22 20 20        "PY..PY"  
77c0: 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20  ->  "r[X..Y]"   
77d0: 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20     or "r[x]" if 
77e0: 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69  y<=x.*/.static i
77f0: 6e 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e  nt displayCommen
7800: 74 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70  t(.  const Op *p
7810: 4f 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  Op,     /* The o
7820: 70 63 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d  pcode to be comm
7830: 65 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ented */.  const
7840: 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a   char *zP4,   /*
7850: 20 50 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61   Previously obta
7860: 69 6e 65 64 20 76 61 6c 75 65 20 66 6f 72 20 50  ined value for P
7870: 34 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65  4 */.  char *zTe
7880: 6d 70 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69  mp,       /* Wri
7890: 74 65 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  te result here *
78a0: 2f 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20 20 20  /.  int nTemp   
78b0: 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
78c0: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65  available in zTe
78d0: 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  mp[] */.){.  con
78e0: 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65  st char *zOpName
78f0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
7900: 7a 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74  zSynopsis;.  int
7910: 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20   nOpName;.  int 
7920: 69 69 2c 20 6a 6a 3b 0a 20 20 7a 4f 70 4e 61 6d  ii, jj;.  zOpNam
7930: 65 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  e = sqlite3Opcod
7940: 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64  eName(pOp->opcod
7950: 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d 20  e);.  nOpName = 
7960: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
7970: 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  zOpName);.  if( 
7980: 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b  zOpName[nOpName+
7990: 31 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 65  1] ){.    int se
79a0: 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 63  enCom = 0;.    c
79b0: 68 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e 6f  har c;.    zSyno
79c0: 70 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b  psis = zOpName +
79d0: 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a 20  = nOpName + 1;. 
79e0: 20 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20     for(ii=jj=0; 
79f0: 6a 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28 63  jj<nTemp-1 && (c
7a00: 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d   = zSynopsis[ii]
7a10: 29 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  )!=0; ii++){.   
7a20: 20 20 20 69 66 28 20 63 3d 3d 27 50 27 20 29 7b     if( c=='P' ){
7a30: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 53 79  .        c = zSy
7a40: 6e 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20  nopsis[++ii];.  
7a50: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 34 27        if( c=='4'
7a60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
7a70: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
7a80: 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a  Temp-jj, zTemp+j
7a90: 6a 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a 20  j, "%s", zP4);. 
7aa0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
7ab0: 20 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20 20   c=='X' ){.     
7ac0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
7ad0: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20  rintf(nTemp-jj, 
7ae0: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20  zTemp+jj, "%s", 
7af0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a  pOp->zComment);.
7b00: 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 43 6f            seenCo
7b10: 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  m = 1;.        }
7b20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
7b30: 69 6e 74 20 76 31 20 3d 20 74 72 61 6e 73 6c 61  int v1 = transla
7b40: 74 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20 20  teP(c, pOp);.   
7b50: 20 20 20 20 20 20 20 69 6e 74 20 76 32 3b 0a 20         int v2;. 
7b60: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7b70: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d  _snprintf(nTemp-
7b80: 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25  jj, zTemp+jj, "%
7b90: 64 22 2c 20 76 31 29 3b 0a 20 20 20 20 20 20 20  d", v1);.       
7ba0: 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a     if( strncmp(z
7bb0: 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22  Synopsis+ii+1, "
7bc0: 40 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20 20  @P", 2)==0 ){.  
7bd0: 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20            ii += 
7be0: 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  3;.            j
7bf0: 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  j += sqlite3Strl
7c00: 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a  en30(zTemp+jj);.
7c10: 20 20 20 20 20 20 20 20 20 20 20 20 76 32 20 3d              v2 =
7c20: 20 74 72 61 6e 73 6c 61 74 65 50 28 7a 53 79 6e   translateP(zSyn
7c30: 6f 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29 3b  opsis[ii], pOp);
7c40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
7c50: 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73   strncmp(zSynops
7c60: 69 73 2b 69 69 2b 31 2c 22 2b 31 22 2c 32 29 3d  is+ii+1,"+1",2)=
7c70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
7c80: 20 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20 20      ii += 2;.   
7c90: 20 20 20 20 20 20 20 20 20 20 20 76 32 2b 2b 3b             v2++;
7ca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
7cb0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76             if( v
7cc0: 32 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  2>1 ){.         
7cd0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
7ce0: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20  rintf(nTemp-jj, 
7cf0: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22  zTemp+jj, "..%d"
7d00: 2c 20 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20 20  , v1+v2-1);.    
7d10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7d20: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
7d30: 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b  rncmp(zSynopsis+
7d40: 69 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34 29  ii+1, "..P3", 4)
7d50: 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d  ==0 && pOp->p3==
7d60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
7d70: 20 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20   ii += 4;.      
7d80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
7d90: 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71          jj += sq
7da0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
7db0: 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 7d  emp+jj);.      }
7dc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54  else{.        zT
7dd0: 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20  emp[jj++] = c;. 
7de0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
7df0: 20 69 66 28 20 21 73 65 65 6e 43 6f 6d 20 26 26   if( !seenCom &&
7e00: 20 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20 70   jj<nTemp-5 && p
7e10: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a  Op->zComment ){.
7e20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
7e30: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
7e40: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73   zTemp+jj, "; %s
7e50: 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  ", pOp->zComment
7e60: 29 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73  );.      jj += s
7e70: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
7e80: 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a  Temp+jj);.    }.
7e90: 20 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d 70      if( jj<nTemp
7ea0: 20 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30   ) zTemp[jj] = 0
7eb0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f  ;.  }else if( pO
7ec0: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20  p->zComment ){. 
7ed0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
7ee0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
7ef0: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f  , "%s", pOp->zCo
7f00: 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20 3d  mment);.    jj =
7f10: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
7f20: 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65  (zTemp);.  }else
7f30: 7b 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d  {.    zTemp[0] =
7f40: 20 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b 0a   0;.    jj = 0;.
7f50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a 3b    }.  return jj;
7f60: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
7f70: 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69  ITE_DEBUG */..#i
7f80: 66 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50  f VDBE_DISPLAY_P
7f90: 34 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  4 && defined(SQL
7fa0: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
7fb0: 52 5f 48 49 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 54  R_HINTS)./*.** T
7fc0: 72 61 6e 73 6c 61 74 65 20 74 68 65 20 50 34 2e  ranslate the P4.
7fd0: 70 45 78 70 72 20 76 61 6c 75 65 20 66 6f 72 20  pExpr value for 
7fe0: 61 6e 20 4f 50 5f 43 75 72 73 6f 72 48 69 6e 74  an OP_CursorHint
7ff0: 20 6f 70 63 6f 64 65 20 69 6e 74 6f 20 74 65 78   opcode into tex
8000: 74 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 65  t.** that can be
8010: 20 64 69 73 70 6c 61 79 65 64 20 69 6e 20 74 68   displayed in th
8020: 65 20 50 34 20 63 6f 6c 75 6d 6e 20 6f 66 20 45  e P4 column of E
8030: 58 50 4c 41 49 4e 20 6f 75 74 70 75 74 2e 0a 2a  XPLAIN output..*
8040: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69 73  /.static int dis
8050: 70 6c 61 79 50 34 45 78 70 72 28 69 6e 74 20 6e  playP4Expr(int n
8060: 54 65 6d 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d  Temp, char *zTem
8070: 70 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  p, Expr *pExpr){
8080: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8090: 4f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 3b  Op = 0;.  int n;
80a0: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
80b0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
80c0: 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20   TK_STRING:.    
80d0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
80e0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
80f0: 20 22 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e   "%Q", pExpr->u.
8100: 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62  zToken);.      b
8110: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8120: 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 20  K_INTEGER:.     
8130: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
8140: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
8150: 22 25 64 22 2c 20 70 45 78 70 72 2d 3e 75 2e 69  "%d", pExpr->u.i
8160: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72  Value);.      br
8170: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8180: 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 73 71 6c  _NULL:.      sql
8190: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
81a0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 4e 55 4c  emp, zTemp, "NUL
81b0: 4c 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  L");.      break
81c0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  ;.    case TK_RE
81d0: 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  GISTER: {.      
81e0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
81f0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
8200: 72 5b 25 64 5d 22 2c 20 70 45 78 70 72 2d 3e 69  r[%d]", pExpr->i
8210: 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72  Table);.      br
8220: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
8230: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
8240: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
8250: 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
8260: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
8270: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
8280: 54 65 6d 70 2c 20 22 72 6f 77 69 64 22 29 3b 0a  Temp, "rowid");.
8290: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
82a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
82b0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
82c0: 6d 70 2c 20 22 63 25 64 22 2c 20 28 69 6e 74 29  mp, "c%d", (int)
82d0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
82e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
82f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
8300: 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20  case TK_LT:     
8310: 20 7a 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20 20   zOp = "LT";    
8320: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8330: 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 4f  e TK_LE:      zO
8340: 70 20 3d 20 22 4c 45 22 3b 20 20 20 20 20 20 62  p = "LE";      b
8350: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8360: 4b 5f 47 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_GT:      zOp =
8370: 20 22 47 54 22 3b 20 20 20 20 20 20 62 72 65 61   "GT";      brea
8380: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  k;.    case TK_G
8390: 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 47  E:      zOp = "G
83a0: 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  E";      break;.
83b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20      case TK_NE: 
83c0: 20 20 20 20 20 7a 4f 70 20 3d 20 22 4e 45 22 3b       zOp = "NE";
83d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
83e0: 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20   case TK_EQ:    
83f0: 20 20 7a 4f 70 20 3d 20 22 45 51 22 3b 20 20 20    zOp = "EQ";   
8400: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8410: 73 65 20 54 4b 5f 49 53 3a 20 20 20 20 20 20 7a  se TK_IS:      z
8420: 4f 70 20 3d 20 22 49 53 22 3b 20 20 20 20 20 20  Op = "IS";      
8430: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8440: 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 7a 4f 70 20  TK_ISNOT:   zOp 
8450: 3d 20 22 49 53 4e 4f 54 22 3b 20 20 20 62 72 65  = "ISNOT";   bre
8460: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8470: 41 4e 44 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22  AND:     zOp = "
8480: 41 4e 44 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  AND";     break;
8490: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
84a0: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4f 52 22        zOp = "OR"
84b0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
84c0: 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20    case TK_PLUS: 
84d0: 20 20 20 7a 4f 70 20 3d 20 22 41 44 44 22 3b 20     zOp = "ADD"; 
84e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
84f0: 61 73 65 20 54 4b 5f 53 54 41 52 3a 20 20 20 20  ase TK_STAR:    
8500: 7a 4f 70 20 3d 20 22 4d 55 4c 22 3b 20 20 20 20  zOp = "MUL";    
8510: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8520: 20 54 4b 5f 4d 49 4e 55 53 3a 20 20 20 7a 4f 70   TK_MINUS:   zOp
8530: 20 3d 20 22 53 55 42 22 3b 20 20 20 20 20 62 72   = "SUB";     br
8540: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8550: 5f 52 45 4d 3a 20 20 20 20 20 7a 4f 70 20 3d 20  _REM:     zOp = 
8560: 22 52 45 4d 22 3b 20 20 20 20 20 62 72 65 61 6b  "REM";     break
8570: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  ;.    case TK_BI
8580: 54 41 4e 44 3a 20 20 7a 4f 70 20 3d 20 22 42 49  TAND:  zOp = "BI
8590: 54 41 4e 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20  TAND";  break;. 
85a0: 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52     case TK_BITOR
85b0: 3a 20 20 20 7a 4f 70 20 3d 20 22 42 49 54 4f 52  :   zOp = "BITOR
85c0: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
85d0: 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20  case TK_SLASH:  
85e0: 20 7a 4f 70 20 3d 20 22 44 49 56 22 3b 20 20 20   zOp = "DIV";   
85f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8600: 65 20 54 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 4f  e TK_LSHIFT:  zO
8610: 70 20 3d 20 22 4c 53 48 49 46 54 22 3b 20 20 62  p = "LSHIFT";  b
8620: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8630: 4b 5f 52 53 48 49 46 54 3a 20 20 7a 4f 70 20 3d  K_RSHIFT:  zOp =
8640: 20 22 52 53 48 49 46 54 22 3b 20 20 62 72 65 61   "RSHIFT";  brea
8650: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  k;.    case TK_C
8660: 4f 4e 43 41 54 3a 20 20 7a 4f 70 20 3d 20 22 43  ONCAT:  zOp = "C
8670: 4f 4e 43 41 54 22 3b 20 20 62 72 65 61 6b 3b 0a  ONCAT";  break;.
8680: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e      case TK_UMIN
8690: 55 53 3a 20 20 7a 4f 70 20 3d 20 22 4d 49 4e 55  US:  zOp = "MINU
86a0: 53 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  S";   break;.   
86b0: 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20   case TK_UPLUS: 
86c0: 20 20 7a 4f 70 20 3d 20 22 50 4c 55 53 22 3b 20    zOp = "PLUS"; 
86d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
86e0: 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 7a  se TK_BITNOT:  z
86f0: 4f 70 20 3d 20 22 42 49 54 4e 4f 54 22 3b 20 20  Op = "BITNOT";  
8700: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8710: 54 4b 5f 4e 4f 54 3a 20 20 20 20 20 7a 4f 70 20  TK_NOT:     zOp 
8720: 3d 20 22 4e 4f 54 22 3b 20 20 20 20 20 62 72 65  = "NOT";     bre
8730: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8740: 49 53 4e 55 4c 4c 3a 20 20 7a 4f 70 20 3d 20 22  ISNULL:  zOp = "
8750: 49 53 4e 55 4c 4c 22 3b 20 20 62 72 65 61 6b 3b  ISNULL";  break;
8760: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
8770: 4e 55 4c 4c 3a 20 7a 4f 70 20 3d 20 22 4e 4f 54  NULL: zOp = "NOT
8780: 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a 20  NULL"; break;.. 
8790: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
87a0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
87b0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
87c0: 20 22 25 73 22 2c 20 22 65 78 70 72 22 29 3b 0a   "%s", "expr");.
87d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
87e0: 0a 0a 20 20 69 66 28 20 7a 4f 70 20 29 7b 0a 20  ..  if( zOp ){. 
87f0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
8800: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
8810: 2c 20 22 25 73 28 22 2c 20 7a 4f 70 29 3b 0a 20  , "%s(", zOp);. 
8820: 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74     n = sqlite3St
8830: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20  rlen30(zTemp);. 
8840: 20 20 20 6e 20 2b 3d 20 64 69 73 70 6c 61 79 50     n += displayP
8850: 34 45 78 70 72 28 6e 54 65 6d 70 2d 6e 2c 20 7a  4Expr(nTemp-n, z
8860: 54 65 6d 70 2b 6e 2c 20 70 45 78 70 72 2d 3e 70  Temp+n, pExpr->p
8870: 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 6e  Left);.    if( n
8880: 3c 6e 54 65 6d 70 2d 31 20 26 26 20 70 45 78 70  <nTemp-1 && pExp
8890: 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20  r->pRight ){.   
88a0: 20 20 20 7a 54 65 6d 70 5b 6e 2b 2b 5d 20 3d 20     zTemp[n++] = 
88b0: 27 2c 27 3b 0a 20 20 20 20 20 20 6e 20 2b 3d 20  ',';.      n += 
88c0: 64 69 73 70 6c 61 79 50 34 45 78 70 72 28 6e 54  displayP4Expr(nT
88d0: 65 6d 70 2d 6e 2c 20 7a 54 65 6d 70 2b 6e 2c 20  emp-n, zTemp+n, 
88e0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
88f0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
8900: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
8910: 2d 6e 2c 20 7a 54 65 6d 70 2b 6e 2c 20 22 29 22  -n, zTemp+n, ")"
8920: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
8930: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
8940: 7a 54 65 6d 70 29 3b 0a 7d 0a 23 65 6e 64 69 66  zTemp);.}.#endif
8950: 20 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c 41 59   /* VDBE_DISPLAY
8960: 5f 50 34 20 26 26 20 64 65 66 69 6e 65 64 28 53  _P4 && defined(S
8970: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
8980: 53 4f 52 5f 48 49 4e 54 53 29 20 2a 2f 0a 0a 0a  SOR_HINTS) */...
8990: 23 69 66 20 56 44 42 45 5f 44 49 53 50 4c 41 59  #if VDBE_DISPLAY
89a0: 5f 50 34 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  _P4./*.** Comput
89b0: 65 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  e a string that 
89c0: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 50 34  describes the P4
89d0: 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
89e0: 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65  n opcode..** Use
89f0: 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72   zTemp for any r
8a00: 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72  equired temporar
8a10: 79 20 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a  y buffer space..
8a20: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
8a30: 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f  displayP4(Op *pO
8a40: 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20  p, char *zTemp, 
8a50: 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68  int nTemp){.  ch
8a60: 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b  ar *zP4 = zTemp;
8a70: 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d 70  .  assert( nTemp
8a80: 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74 63 68  >=20 );.  switch
8a90: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b  ( pOp->p4type ){
8aa0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59  .    case P4_KEY
8ab0: 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e  INFO: {.      in
8ac0: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65  t i, j;.      Ke
8ad0: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
8ae0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e  = pOp->p4.pKeyIn
8af0: 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  fo;.      assert
8b00: 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
8b10: 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20  tOrder!=0 );.   
8b20: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
8b30: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
8b40: 2c 20 22 6b 28 25 64 22 2c 20 70 4b 65 79 49 6e  , "k(%d", pKeyIn
8b50: 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20  fo->nField);.   
8b60: 20 20 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74     i = sqlite3St
8b70: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20  rlen30(zTemp);. 
8b80: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
8b90: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
8ba0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
8bb0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
8bc0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
8bd0: 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  [j];.        con
8be0: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d  st char *zColl =
8bf0: 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e   pColl ? pColl->
8c00: 7a 4e 61 6d 65 20 3a 20 22 6e 69 6c 22 3b 0a 20  zName : "nil";. 
8c10: 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73         int n = s
8c20: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
8c30: 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  Coll);.        i
8c40: 66 28 20 6e 3d 3d 36 20 26 26 20 6d 65 6d 63 6d  f( n==6 && memcm
8c50: 70 28 7a 43 6f 6c 6c 2c 22 42 49 4e 41 52 59 22  p(zColl,"BINARY"
8c60: 2c 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,6)==0 ){.      
8c70: 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 22 42 22 3b      zColl = "B";
8c80: 0a 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 31  .          n = 1
8c90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8ca0: 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d      if( i+n>nTem
8cb0: 70 2d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20  p-7 ){.         
8cc0: 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69   memcpy(&zTemp[i
8cd0: 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20  ],",...",4);.   
8ce0: 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20         i += 4;. 
8cf0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
8d00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8d10: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
8d20: 2c 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ,';.        if( 
8d30: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
8d40: 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20  rder[j] ){.     
8d50: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
8d60: 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 7d  = '-';.        }
8d70: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
8d80: 26 7a 54 65 6d 70 5b 69 5d 2c 20 7a 43 6f 6c 6c  &zTemp[i], zColl
8d90: 2c 20 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , n+1);.        
8da0: 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a  i += n;.      }.
8db0: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
8dc0: 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54   = ')';.      zT
8dd0: 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[i] = 0;.    
8de0: 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d    assert( i<nTem
8df0: 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p );.      break
8e00: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
8e10: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
8e20: 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20 63 61  SOR_HINTS.    ca
8e30: 73 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20  se P4_EXPR: {.  
8e40: 20 20 20 20 64 69 73 70 6c 61 79 50 34 45 78 70      displayP4Exp
8e50: 72 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  r(nTemp, zTemp, 
8e60: 70 4f 70 2d 3e 70 34 2e 70 45 78 70 72 29 3b 0a  pOp->p4.pExpr);.
8e70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8e80: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
8e90: 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b  se P4_COLLSEQ: {
8ea0: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
8eb0: 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e  pColl = pOp->p4.
8ec0: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c  pColl;.      sql
8ed0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
8ee0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 28 25 2e  emp, zTemp, "(%.
8ef0: 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e  20s)", pColl->zN
8f00: 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ame);.      brea
8f10: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
8f20: 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a  e P4_FUNCDEF: {.
8f30: 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
8f40: 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46  Def = pOp->p4.pF
8f50: 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  unc;.      sqlit
8f60: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
8f70: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 25 64  p, zTemp, "%s(%d
8f80: 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c  )", pDef->zName,
8f90: 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20   pDef->nArg);.  
8fa0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8fb0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
8fc0: 45 42 55 47 0a 20 20 20 20 63 61 73 65 20 50 34  EBUG.    case P4
8fd0: 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20  _FUNCCTX: {.    
8fe0: 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20    FuncDef *pDef 
8ff0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78 2d 3e  = pOp->p4.pCtx->
9000: 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c  pFunc;.      sql
9010: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
9020: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28  emp, zTemp, "%s(
9030: 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d  %d)", pDef->zNam
9040: 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a  e, pDef->nArg);.
9050: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9060: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
9070: 73 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20  se P4_INT64: {. 
9080: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
9090: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
90a0: 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70  mp, "%lld", *pOp
90b0: 2d 3e 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20  ->p4.pI64);.    
90c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
90d0: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32     case P4_INT32
90e0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
90f0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
9100: 2c 20 7a 54 65 6d 70 2c 20 22 25 64 22 2c 20 70  , zTemp, "%d", p
9110: 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20  Op->p4.i);.     
9120: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9130: 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 20    case P4_REAL: 
9140: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
9150: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
9160: 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20  zTemp, "%.16g", 
9170: 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b  *pOp->p4.pReal);
9180: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9190: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
91a0: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d  MEM: {.      Mem
91b0: 20 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34   *pMem = pOp->p4
91c0: 2e 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28  .pMem;.      if(
91d0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
91e0: 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20  EM_Str ){.      
91f0: 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b    zP4 = pMem->z;
9200: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
9210: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
9220: 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20  EM_Int ){.      
9230: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
9240: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
9250: 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75   "%lld", pMem->u
9260: 2e 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .i);.      }else
9270: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
9280: 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20   & MEM_Real ){. 
9290: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
92a0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
92b0: 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 70  Temp, "%.16g", p
92c0: 4d 65 6d 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20  Mem->u.r);.     
92d0: 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d   }else if( pMem-
92e0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
92f0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
9300: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
9310: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 4e 55 4c  emp, zTemp, "NUL
9320: 4c 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  L");.      }else
9330: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
9340: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
9350: 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20  MEM_Blob );.    
9360: 20 20 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62      zP4 = "(blob
9370: 29 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  )";.      }.    
9380: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
9390: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
93a0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
93b0: 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42      case P4_VTAB
93c0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
93d0: 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20  3_vtab *pVtab = 
93e0: 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70  pOp->p4.pVtab->p
93f0: 56 74 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69  Vtab;.      sqli
9400: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
9410: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 76 74 61 62  mp, zTemp, "vtab
9420: 3a 25 70 22 2c 20 70 56 74 61 62 29 3b 0a 20 20  :%p", pVtab);.  
9430: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9440: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
9450: 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a   P4_INTARRAY: {.
9460: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
9470: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
9480: 65 6d 70 2c 20 22 69 6e 74 61 72 72 61 79 22 29  emp, "intarray")
9490: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
94a0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
94b0: 5f 53 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20  _SUBPROGRAM: {. 
94c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
94d0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
94e0: 6d 70 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a  mp, "program");.
94f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9500: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 41   }.    case P4_A
9510: 44 56 41 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20  DVANCE: {.      
9520: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20  zTemp[0] = 0;.  
9530: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9540: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
9550: 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d        zP4 = pOp-
9560: 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28  >p4.z;.      if(
9570: 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20   zP4==0 ){.     
9580: 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a     zP4 = zTemp;.
9590: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d          zTemp[0]
95a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
95b0: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
95c0: 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65  ( zP4!=0 );.  re
95d0: 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64  turn zP4;.}.#end
95e0: 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c  if /* VDBE_DISPL
95f0: 41 59 5f 50 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  AY_P4 */../*.** 
9600: 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56  Declare to the V
9610: 64 62 65 20 74 68 61 74 20 74 68 65 20 42 54 72  dbe that the BTr
9620: 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d  ee object at db-
9630: 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e  >aDb[i] is used.
9640: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70 61  .**.** The prepa
9650: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6e  red statements n
9660: 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e 20 61  eed to know in a
9670: 64 76 61 6e 63 65 20 74 68 65 20 63 6f 6d 70 6c  dvance the compl
9680: 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20 61 74  ete set of.** at
9690: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
96a0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
96b0: 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20 74 68  e.  A mask of th
96c0: 65 73 65 20 64 61 74 61 62 61 73 65 73 0a 2a 2a  ese databases.**
96d0: 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 69   is maintained i
96e0: 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2e 20  n p->btreeMask. 
96f0: 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b   The p->lockMask
9700: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 75   value is the su
9710: 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62 74  bset of.** p->bt
9720: 72 65 65 4d 61 73 6b 20 6f 66 20 64 61 74 61 62  reeMask of datab
9730: 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 72  ases that will r
9740: 65 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e 0a 2a  equire a lock..*
9750: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
9760: 62 65 55 73 65 73 42 74 72 65 65 28 56 64 62 65  beUsesBtree(Vdbe
9770: 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61   *p, int i){.  a
9780: 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
9790: 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69  <p->db->nDb && i
97a0: 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 79 44 62  <(int)sizeof(yDb
97b0: 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73  Mask)*8 );.  ass
97c0: 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a 65  ert( i<(int)size
97d0: 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29  of(p->btreeMask)
97e0: 2a 38 20 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65  *8 );.  DbMaskSe
97f0: 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20  t(p->btreeMask, 
9800: 69 29 3b 0a 20 20 69 66 28 20 69 21 3d 31 20 26  i);.  if( i!=1 &
9810: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 68  & sqlite3BtreeSh
9820: 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e 61 44  arable(p->db->aD
9830: 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20  b[i].pBt) ){.   
9840: 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 6c 6f   DbMaskSet(p->lo
9850: 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 7d 0a  ckMask, i);.  }.
9860: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
9870: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
9880: 45 44 5f 43 41 43 48 45 29 0a 2f 2a 0a 2a 2a 20  ED_CACHE)./*.** 
9890: 49 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d  If SQLite is com
98a0: 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f 72 74  piled to support
98b0: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
98c0: 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74 68 72  de and to be thr
98d0: 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73  eadsafe,.** this
98e0: 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e 73   routine obtains
98f0: 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63   the mutex assoc
9900: 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20  iated with each 
9910: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
9920: 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62  re.** that may b
9930: 65 20 61 63 63 65 73 73 65 64 20 62 79 20 74 68  e accessed by th
9940: 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61  e VM passed as a
9950: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64  n argument. In d
9960: 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a  oing so it also.
9970: 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74 53 68  ** sets the BtSh
9980: 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f  ared.db member o
9990: 66 20 65 61 63 68 20 6f 66 20 74 68 65 20 42 74  f each of the Bt
99a0: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
99b0: 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74  s, ensuring.** t
99c0: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  hat the correct 
99d0: 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
99e0: 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64  lback is invoked
99f0: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
9a00: 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73  .** If SQLite is
9a10: 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20   not threadsafe 
9a20: 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f 72 74  but does support
9a30: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
9a40: 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69  de, then.** sqli
9a50: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 20  te3BtreeEnter() 
9a60: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65  is invoked to se
9a70: 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64  t the BtShared.d
9a80: 62 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f  b variables.** o
9a90: 66 20 61 6c 6c 20 6f 66 20 42 74 53 68 61 72 65  f all of BtShare
9aa0: 64 20 73 74 72 75 63 74 75 72 65 73 20 61 63 63  d structures acc
9ab0: 65 73 73 69 62 6c 65 20 76 69 61 20 74 68 65 20  essible via the 
9ac0: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
9ad0: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77  .** associated w
9ae0: 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a  ith the VM..**.*
9af0: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e  * If SQLite is n
9b00: 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 61 6e  ot threadsafe an
9b10: 64 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  d does not suppo
9b20: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  rt shared-cache 
9b30: 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75  mode, this.** fu
9b40: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
9b50: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e  p..**.** The p->
9b60: 62 74 72 65 65 4d 61 73 6b 20 66 69 65 6c 64 20  btreeMask field 
9b70: 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20  is a bitmask of 
9b80: 61 6c 6c 20 62 74 72 65 65 73 20 74 68 61 74 20  all btrees that 
9b90: 74 68 65 20 70 72 65 70 61 72 65 64 20 0a 2a 2a  the prepared .**
9ba0: 20 73 74 61 74 65 6d 65 6e 74 20 70 20 77 69 6c   statement p wil
9bb0: 6c 20 65 76 65 72 20 75 73 65 2e 20 20 4c 65 74  l ever use.  Let
9bc0: 20 4e 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72   N be the number
9bd0: 20 6f 66 20 62 69 74 73 20 69 6e 20 70 2d 3e 62   of bits in p->b
9be0: 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72  treeMask.** corr
9bf0: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72  esponding to btr
9c00: 65 65 73 20 74 68 61 74 20 75 73 65 20 73 68 61  ees that use sha
9c10: 72 65 64 20 63 61 63 68 65 2e 20 20 54 68 65 6e  red cache.  Then
9c20: 20 74 68 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a   the runtime of.
9c30: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
9c40: 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20  is N*N.  But as 
9c50: 4e 20 69 73 20 72 61 72 65 6c 79 20 6d 6f 72 65  N is rarely more
9c60: 20 74 68 61 6e 20 31 2c 20 74 68 69 73 20 73 68   than 1, this sh
9c70: 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61  ould not.** be a
9c80: 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69   problem..*/.voi
9c90: 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74  d sqlite3VdbeEnt
9ca0: 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  er(Vdbe *p){.  i
9cb0: 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt i;.  sqlite3 
9cc0: 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a  *db;.  Db *aDb;.
9cd0: 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28    int nDb;.  if(
9ce0: 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70   DbMaskAllZero(p
9cf0: 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65  ->lockMask) ) re
9d00: 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f  turn;  /* The co
9d10: 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64  mmon case */.  d
9d20: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62  b = p->db;.  aDb
9d30: 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44   = db->aDb;.  nD
9d40: 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66  b = db->nDb;.  f
9d50: 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69  or(i=0; i<nDb; i
9d60: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d  ++){.    if( i!=
9d70: 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28  1 && DbMaskTest(
9d80: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26  p->lockMask,i) &
9d90: 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e  & ALWAYS(aDb[i].
9da0: 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  pBt!=0) ){.     
9db0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
9dc0: 65 72 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a  er(aDb[i].pBt);.
9dd0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
9de0: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
9df0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
9e00: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51  RED_CACHE) && SQ
9e10: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
9e20: 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61  0./*.** Unlock a
9e30: 6c 6c 20 6f 66 20 74 68 65 20 62 74 72 65 65 73  ll of the btrees
9e40: 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b   previously lock
9e50: 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20  ed by a call to 
9e60: 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
9e70: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  ()..*/.static SQ
9e80: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
9e90: 69 64 20 76 64 62 65 4c 65 61 76 65 28 56 64 62  id vdbeLeave(Vdb
9ea0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
9eb0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
9ec0: 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20   Db *aDb;.  int 
9ed0: 6e 44 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  nDb;.  db = p->d
9ee0: 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61  b;.  aDb = db->a
9ef0: 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e  Db;.  nDb = db->
9f00: 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  nDb;.  for(i=0; 
9f10: 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<nDb; i++){.   
9f20: 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d   if( i!=1 && DbM
9f30: 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d  askTest(p->lockM
9f40: 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53  ask,i) && ALWAYS
9f50: 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20  (aDb[i].pBt!=0) 
9f60: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9f70: 42 74 72 65 65 4c 65 61 76 65 28 61 44 62 5b 69  BtreeLeave(aDb[i
9f80: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  ].pBt);.    }.  
9f90: 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
9fa0: 56 64 62 65 4c 65 61 76 65 28 56 64 62 65 20 2a  VdbeLeave(Vdbe *
9fb0: 70 29 7b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b  p){.  if( DbMask
9fc0: 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d  AllZero(p->lockM
9fd0: 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20  ask) ) return;  
9fe0: 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
9ff0: 73 65 20 2a 2f 0a 20 20 76 64 62 65 4c 65 61 76  se */.  vdbeLeav
a000: 65 28 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  e(p);.}.#endif..
a010: 23 69 66 20 64 65 66 69 6e 65 64 28 56 44 42 45  #if defined(VDBE
a020: 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66  _PROFILE) || def
a030: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
a040: 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  G)./*.** Print a
a050: 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20   single opcode. 
a060: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
a070: 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67   used for debugg
a080: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69  ing only..*/.voi
a090: 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  d sqlite3VdbePri
a0a0: 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c  ntOp(FILE *pOut,
a0b0: 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70   int pc, Op *pOp
a0c0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a  ){.  char *zP4;.
a0d0: 20 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b    char zPtr[50];
a0e0: 0a 20 20 63 68 61 72 20 7a 43 6f 6d 5b 31 30 30  .  char zCom[100
a0f0: 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ];.  static cons
a100: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31  t char *zFormat1
a110: 20 3d 20 22 25 34 64 20 25 2d 31 33 73 20 25 34   = "%4d %-13s %4
a120: 64 20 25 34 64 20 25 34 64 20 25 2d 31 33 73 20  d %4d %4d %-13s 
a130: 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66  %.2X %s\n";.  if
a140: 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74  ( pOut==0 ) pOut
a150: 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34   = stdout;.  zP4
a160: 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70   = displayP4(pOp
a170: 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a  , zPtr, sizeof(z
a180: 50 74 72 29 29 3b 0a 23 69 66 64 65 66 20 53 51  Ptr));.#ifdef SQ
a190: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
a1a0: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 64  AIN_COMMENTS.  d
a1b0: 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f  isplayComment(pO
a1c0: 70 2c 20 7a 50 34 2c 20 7a 43 6f 6d 2c 20 73 69  p, zP4, zCom, si
a1d0: 7a 65 6f 66 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c  zeof(zCom));.#el
a1e0: 73 65 0a 20 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30  se.  zCom[0] = 0
a1f0: 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 4e 42  ;.#endif.  /* NB
a200: 3a 20 20 54 68 65 20 73 71 6c 69 74 65 33 4f 70  :  The sqlite3Op
a210: 63 6f 64 65 4e 61 6d 65 28 29 20 66 75 6e 63 74  codeName() funct
a220: 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
a230: 65 64 20 62 79 20 63 6f 64 65 20 63 72 65 61 74  ed by code creat
a240: 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6d  ed.  ** by the m
a250: 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 61 6e 64  kopcodeh.awk and
a260: 20 6d 6b 6f 70 63 6f 64 65 63 2e 61 77 6b 20 73   mkopcodec.awk s
a270: 63 72 69 70 74 73 20 77 68 69 63 68 20 65 78 74  cripts which ext
a280: 72 61 63 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e  ract the.  ** in
a290: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
a2a0: 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65  he vdbe.c source
a2b0: 20 74 65 78 74 20 2a 2f 0a 20 20 66 70 72 69 6e   text */.  fprin
a2c0: 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74  tf(pOut, zFormat
a2d0: 31 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71  1, pc, .      sq
a2e0: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
a2f0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f  pOp->opcode), pO
a300: 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20  p->p1, pOp->p2, 
a310: 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f  pOp->p3, zP4, pO
a320: 70 2d 3e 70 35 2c 0a 20 20 20 20 20 20 7a 43 6f  p->p5,.      zCo
a330: 6d 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68 28  m.  );.  fflush(
a340: 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  pOut);.}.#endif.
a350: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
a360: 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d  n array of N Mem
a370: 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61   elements.*/.sta
a380: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
a390: 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c  MemArray(Mem *p,
a3a0: 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70   int N){.  if( p
a3b0: 20 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d   && N ){.    Mem
a3c0: 20 2a 70 45 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a   *pEnd = &p[N];.
a3d0: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
a3e0: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20  = p->db;.    u8 
a3f0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20  malloc_failed = 
a400: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a410: 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e  ;.    if( db->pn
a420: 42 79 74 65 73 46 72 65 65 64 20 29 7b 0a 20 20  BytesFreed ){.  
a430: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
a440: 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20  if( p->szMalloc 
a450: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
a460: 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b  db, p->zMalloc);
a470: 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 28  .      }while( (
a480: 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20  ++p)<pEnd );.   
a490: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
a4a0: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 61  .    do{.      a
a4b0: 73 73 65 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d  ssert( (&p[1])==
a4c0: 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d  pEnd || p[0].db=
a4d0: 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20  =p[1].db );.    
a4e0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
a4f0: 33 56 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76  3VdbeCheckMemInv
a500: 61 72 69 61 6e 74 73 28 70 29 20 29 3b 0a 0a 20  ariants(p) );.. 
a510: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f       /* This blo
a520: 63 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20  ck is really an 
a530: 69 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e 20  inlined version 
a540: 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  of sqlite3VdbeMe
a550: 6d 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20 20  mRelease().     
a560: 20 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20 61   ** that takes a
a570: 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20  dvantage of the 
a580: 66 61 63 74 20 74 68 61 74 20 74 68 65 20 6d 65  fact that the me
a590: 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65 20  mory cell value 
a5a0: 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 69  is .      ** bei
a5b0: 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  ng set to NULL a
a5c0: 66 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20 61  fter releasing a
a5d0: 6e 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f 75  ny dynamic resou
a5e0: 72 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  rces..      **. 
a5f0: 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73 74       ** The just
a600: 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64 75  ification for du
a610: 70 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20 69  plicating code i
a620: 73 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e 67  s that according
a630: 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 61   to .      ** ca
a640: 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63 61  llgrind, this ca
a650: 75 73 65 73 20 61 20 63 65 72 74 61 69 6e 20 74  uses a certain t
a660: 65 73 74 20 63 61 73 65 20 74 6f 20 68 69 74 20  est case to hit 
a670: 74 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20 20  the CPU 4.7 .   
a680: 20 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65     ** percent le
a690: 73 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20 67  ss (x86 linux, g
a6a0: 63 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32  cc version 4.1.2
a6b0: 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20 0a  , -O6) than if .
a6c0: 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
a6d0: 4d 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65 72  MemRelease() wer
a6e0: 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65  e called from he
a6f0: 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74 68  re. With -O2, th
a700: 69 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a  is jumps.      *
a710: 2a 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e 74  * to 6.6 percent
a720: 2e 20 54 68 65 20 74 65 73 74 20 63 61 73 65 20  . The test case 
a730: 69 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30 30  is inserting 100
a740: 30 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74 61  0 rows into a ta
a750: 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77 69  ble .      ** wi
a760: 74 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75 73  th no indexes us
a770: 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72 65  ing a single pre
a780: 70 61 72 65 64 20 49 4e 53 45 52 54 20 73 74 61  pared INSERT sta
a790: 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a  tement, bind() .
a7a0: 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73        ** and res
a7b0: 65 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61 72  et(). Inserts ar
a7c0: 65 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20 61  e grouped into a
a7d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
a7e0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 65 73      */.      tes
a7f0: 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20  tcase( p->flags 
a800: 26 20 4d 45 4d 5f 41 67 67 20 29 3b 0a 20 20 20  & MEM_Agg );.   
a810: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
a820: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20  flags & MEM_Dyn 
a830: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
a840: 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45  e( p->flags & ME
a850: 4d 5f 46 72 61 6d 65 20 29 3b 0a 20 20 20 20 20  M_Frame );.     
a860: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c   testcase( p->fl
a870: 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74  ags & MEM_RowSet
a880: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   );.      if( p-
a890: 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c  >flags&(MEM_Agg|
a8a0: 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d  MEM_Dyn|MEM_Fram
a8b0: 65 7c 4d 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b  e|MEM_RowSet) ){
a8c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a8d0: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
a8e0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
a8f0: 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29  f( p->szMalloc )
a900: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
a910: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
a920: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20  Malloc);.       
a930: 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30   p->szMalloc = 0
a940: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
a950: 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f   p->flags = MEM_
a960: 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 7d  Undefined;.    }
a970: 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e  while( (++p)<pEn
a980: 64 20 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c  d );.    db->mal
a990: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c  locFailed = mall
a9a0: 6f 63 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d  oc_failed;.  }.}
a9b0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
a9c0: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
a9d0: 74 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e  t and its conten
a9e0: 74 73 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62  ts. VdbeFrame ob
a9f0: 6a 65 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  jects are.** all
aa00: 6f 63 61 74 65 64 20 62 79 20 74 68 65 20 4f 50  ocated by the OP
aa10: 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20  _Program opcode 
aa20: 69 6e 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  in sqlite3VdbeEx
aa30: 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ec()..*/.void sq
aa40: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65  lite3VdbeFrameDe
aa50: 6c 65 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a  lete(VdbeFrame *
aa60: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d  p){.  int i;.  M
aa70: 65 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46  em *aMem = VdbeF
aa80: 72 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64  rameMem(p);.  Vd
aa90: 62 65 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72  beCursor **apCsr
aaa0: 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a   = (VdbeCursor *
aab0: 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c  *)&aMem[p->nChil
aac0: 64 4d 65 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  dMem];.  for(i=0
aad0: 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72  ; i<p->nChildCsr
aae0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
aaf0: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
ab00: 72 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d  r(p->v, apCsr[i]
ab10: 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  );.  }.  release
ab20: 4d 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20 70  MemArray(aMem, p
ab30: 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20  ->nChildMem);.  
ab40: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
ab50: 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23  >v->db, p);.}..#
ab60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ab70: 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a  IT_EXPLAIN./*.**
ab80: 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20   Give a listing 
ab90: 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69  of the program i
aba0: 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  n the virtual ma
abb0: 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  chine..**.** The
abc0: 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68   interface is th
abd0: 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65  e same as sqlite
abe0: 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 75  3VdbeExec().  Bu
abf0: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  t instead of.** 
ac00: 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65  running the code
ac10: 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65  , it invokes the
ac20: 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66   callback once f
ac30: 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  or each instruct
ac40: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61  ion..** This fea
ac50: 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20  ture is used to 
ac60: 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41  implement "EXPLA
ac70: 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  IN"..**.** When 
ac80: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65  p->explain==1, e
ac90: 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ach instruction 
aca0: 69 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65 6e  is listed.  When
acb0: 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  .** p->explain==
acc0: 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61  2, only OP_Expla
acd0: 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  in instructions 
ace0: 61 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20 74  are listed and t
acf0: 68 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77  hese.** are show
ad00: 6e 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74  n in a different
ad10: 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70   format.  p->exp
ad20: 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64 20  lain==2 is used 
ad30: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20  to implement.** 
ad40: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
ad50: 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  AN..**.** When p
ad60: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69  ->explain==1, fi
ad70: 72 73 74 20 74 68 65 20 6d 61 69 6e 20 70 72 6f  rst the main pro
ad80: 67 72 61 6d 20 69 73 20 6c 69 73 74 65 64 2c 20  gram is listed, 
ad90: 74 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20  then each of.** 
ada0: 74 68 65 20 74 72 69 67 67 65 72 20 73 75 62 70  the trigger subp
adb0: 72 6f 67 72 61 6d 73 20 61 72 65 20 6c 69 73 74  rograms are list
adc0: 65 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a  ed one by one..*
add0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
ade0: 65 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70  eList(.  Vdbe *p
adf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae00: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a     /* The VDBE *
ae10: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b  /.){.  int nRow;
ae20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
ae40: 74 6f 70 20 77 68 65 6e 20 72 6f 77 20 63 6f 75  top when row cou
ae50: 6e 74 20 72 65 61 63 68 65 73 20 74 68 69 73 20  nt reaches this 
ae60: 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20  */.  int nSub = 
ae70: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
ae80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
ae90: 62 65 72 20 6f 66 20 73 75 62 2d 76 64 62 65 73  ber of sub-vdbes
aea0: 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a   seen so far */.
aeb0: 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61    SubProgram **a
aec0: 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  pSub = 0;       
aed0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
aee0: 6f 66 20 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a  of sub-vdbes */.
aef0: 20 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b    Mem *pSub = 0;
af00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af10: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
af20: 20 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79   cell hold array
af30: 20 6f 66 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a   of subprogs */.
af40: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
af50: 70 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20  p->db;          
af60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
af70: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
af80: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  n */.  int i;   
af90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
afb0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
afc0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
afd0: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
afe0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
aff0: 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  code */.  Mem *p
b000: 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31  Mem = &p->aMem[1
b010: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
b020: 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f 66 20 72  * First Mem of r
b030: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20  esult set */..  
b040: 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61  assert( p->expla
b050: 69 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  in );.  assert( 
b060: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
b070: 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73  AGIC_RUN );.  as
b080: 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
b090: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
b0a0: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20  =SQLITE_BUSY || 
b0b0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
b0c0: 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65  MEM );..  /* Eve
b0d0: 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70  n though this op
b0e0: 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73  code does not us
b0f0: 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67  e dynamic string
b100: 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72  s for.  ** the r
b110: 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f  esult, result co
b120: 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65  lumns may become
b130: 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20   dynamic if the 
b140: 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20  user calls.  ** 
b150: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
b160: 65 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67  ext16(), causing
b170: 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74   a translation t
b180: 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e  o UTF-16 encodin
b190: 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73  g..  */.  releas
b1a0: 65 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20  eMemArray(pMem, 
b1b0: 38 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74  8);.  p->pResult
b1c0: 53 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Set = 0;..  if( 
b1d0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
b1e0: 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  MEM ){.    /* Th
b1f0: 69 73 20 68 61 70 70 65 6e 73 20 69 66 20 61 20  is happens if a 
b200: 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20  malloc() inside 
b210: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
b220: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20  3_column_text() 
b230: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
b240: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28  3_column_text16(
b250: 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20  ) failed.  */.  
b260: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
b270: 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ed = 1;.    retu
b280: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
b290: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  .  }..  /* When 
b2a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  the number of ou
b2b0: 74 70 75 74 20 72 6f 77 73 20 72 65 61 63 68 65  tput rows reache
b2c0: 73 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65 61  s nRow, that mea
b2d0: 6e 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74  ns the.  ** list
b2e0: 69 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65 64  ing has finished
b2f0: 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 74 65   and sqlite3_ste
b300: 70 28 29 20 73 68 6f 75 6c 64 20 72 65 74 75 72  p() should retur
b310: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20  n SQLITE_DONE.. 
b320: 20 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68 65 20   ** nRow is the 
b330: 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  sum of the numbe
b340: 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
b350: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70   main program, p
b360: 6c 75 73 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d  lus.  ** the sum
b370: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
b380: 66 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72  f rows in all tr
b390: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
b3a0: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20  s encountered.  
b3b0: 2a 2a 20 73 6f 20 66 61 72 2e 20 20 54 68 65 20  ** so far.  The 
b3c0: 6e 52 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c 20  nRow value will 
b3d0: 69 6e 63 72 65 61 73 65 20 61 73 20 6e 65 77 20  increase as new 
b3e0: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
b3f0: 61 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63  ams are.  ** enc
b400: 6f 75 6e 74 65 72 65 64 2c 20 62 75 74 20 70 2d  ountered, but p-
b410: 3e 70 63 20 77 69 6c 6c 20 65 76 65 6e 74 75 61  >pc will eventua
b420: 6c 6c 79 20 63 61 74 63 68 20 75 70 20 74 6f 20  lly catch up to 
b430: 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f  nRow..  */.  nRo
b440: 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66  w = p->nOp;.  if
b450: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20  ( p->explain==1 
b460: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69  ){.    /* The fi
b470: 72 73 74 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c  rst 8 memory cel
b480: 6c 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20  ls are used for 
b490: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
b4a0: 20 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20 20   So we will.    
b4b0: 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68  ** commandeer th
b4c0: 65 20 39 74 68 20 63 65 6c 6c 20 74 6f 20 75 73  e 9th cell to us
b4d0: 65 20 61 73 20 73 74 6f 72 61 67 65 20 66 6f 72  e as storage for
b4e0: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69   an array of poi
b4f0: 6e 74 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20  nters.    ** to 
b500: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
b510: 61 6d 73 2e 20 20 54 68 65 20 56 44 42 45 20 69  ams.  The VDBE i
b520: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
b530: 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 39 0a  have at least 9.
b540: 20 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a      ** cells.  *
b550: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
b560: 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70  >nMem>9 );.    p
b570: 53 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39  Sub = &p->aMem[9
b580: 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  ];.    if( pSub-
b590: 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20  >flags&MEM_Blob 
b5a0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74  ){.      /* On t
b5b0: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
b5c0: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c   sqlite3_step(),
b5d0: 20 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20   pSub will hold 
b5e0: 61 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20  a NULL.  It is. 
b5f0: 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69       ** initiali
b600: 7a 65 64 20 74 6f 20 61 20 42 4c 4f 42 20 62 79  zed to a BLOB by
b610: 20 74 68 65 20 50 34 5f 53 55 42 50 52 4f 47 52   the P4_SUBPROGR
b620: 41 4d 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f  AM processing lo
b630: 67 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20  gic below */.   
b640: 20 20 20 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e     nSub = pSub->
b650: 6e 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b  n/sizeof(Vdbe*);
b660: 0a 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28  .      apSub = (
b670: 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53  SubProgram **)pS
b680: 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20  ub->z;.    }.   
b690: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
b6a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52  ; i++){.      nR
b6b0: 6f 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e  ow += apSub[i]->
b6c0: 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  nOp;.    }.  }..
b6d0: 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d    do{.    i = p-
b6e0: 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28  >pc++;.  }while(
b6f0: 20 69 3c 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78   i<nRow && p->ex
b700: 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61  plain==2 && p->a
b710: 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50  Op[i].opcode!=OP
b720: 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66  _Explain );.  if
b730: 28 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20  ( i>=nRow ){.   
b740: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
b750: 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  OK;.    rc = SQL
b760: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73  ITE_DONE;.  }els
b770: 65 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49  e if( db->u1.isI
b780: 6e 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20  nterrupted ){.  
b790: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
b7a0: 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20  _INTERRUPT;.    
b7b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
b7c0: 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  R;.    sqlite3Vd
b7d0: 62 65 45 72 72 6f 72 28 70 2c 20 73 71 6c 69 74  beError(p, sqlit
b7e0: 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29  e3ErrStr(p->rc))
b7f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
b800: 68 61 72 20 2a 7a 50 34 3b 0a 20 20 20 20 4f 70  har *zP4;.    Op
b810: 20 2a 70 4f 70 3b 0a 20 20 20 20 69 66 28 20 69   *pOp;.    if( i
b820: 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20  <p->nOp ){.     
b830: 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c   /* The output l
b840: 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d  ine number is sm
b850: 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20  all enough that 
b860: 77 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20  we are still in 
b870: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69  the.      ** mai
b880: 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20  n program. */.  
b890: 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f      pOp = &p->aO
b8a0: 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  p[i];.    }else{
b8b0: 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65  .      /* We are
b8c0: 20 63 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69   currently listi
b8d0: 6e 67 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20  ng subprograms. 
b8e0: 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63   Figure out whic
b8f0: 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20  h one and.      
b900: 2a 2a 20 70 69 63 6b 20 75 70 20 74 68 65 20 61  ** pick up the a
b910: 70 70 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64  ppropriate opcod
b920: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  e. */.      int 
b930: 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d  j;.      i -= p-
b940: 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28  >nOp;.      for(
b950: 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d  j=0; i>=apSub[j]
b960: 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nOp; j++){.   
b970: 20 20 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b       i -= apSub[
b980: 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d  j]->nOp;.      }
b990: 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70  .      pOp = &ap
b9a0: 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a  Sub[j]->aOp[i];.
b9b0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
b9c0: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20  >explain==1 ){. 
b9d0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
b9e0: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
b9f0: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b    pMem->u.i = i;
ba00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba20: 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74  /* Program count
ba30: 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
ba40: 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d 65  ++;.  .      pMe
ba50: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
ba60: 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45  tatic|MEM_Str|ME
ba70: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d  M_Term;.      pM
ba80: 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73  em->z = (char*)s
ba90: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
baa0: 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f  (pOp->opcode); /
bab0: 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  * Opcode */.    
bac0: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
bad0: 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d  z!=0 );.      pM
bae0: 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53  em->n = sqlite3S
baf0: 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29  trlen30(pMem->z)
bb00: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ;.      pMem->en
bb10: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
bb20: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  .      pMem++;..
bb30: 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e        /* When an
bb40: 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f   OP_Program opco
bb50: 64 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 20  de is encounter 
bb60: 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65  (the only opcode
bb70: 20 74 68 61 74 20 68 61 73 0a 20 20 20 20 20 20   that has.      
bb80: 2a 2a 20 61 20 50 34 5f 53 55 42 50 52 4f 47 52  ** a P4_SUBPROGR
bb90: 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20 65 78  AM argument), ex
bba0: 70 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66  pand the size of
bbb0: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 73 75   the array of su
bbc0: 62 70 72 6f 67 72 61 6d 73 0a 20 20 20 20 20 20  bprograms.      
bbd0: 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d  ** kept in p->aM
bbe0: 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20  em[9].z to hold 
bbf0: 74 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d 20  the new program 
bc00: 2d 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20  - assuming this 
bc10: 73 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20 20  subprogram.     
bc20: 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65   ** has not alre
bc30: 61 64 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20  ady been seen.. 
bc40: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
bc50: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
bc60: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a  4_SUBPROGRAM ){.
bc70: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74          int nByt
bc80: 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a  e = (nSub+1)*siz
bc90: 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29  eof(SubProgram*)
bca0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b  ;.        int j;
bcb0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
bcc0: 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a  ; j<nSub; j++){.
bcd0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 70            if( ap
bce0: 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e  Sub[j]==pOp->p4.
bcf0: 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b  pProgram ) break
bd00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
bd10: 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20      if( j==nSub 
bd20: 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71  && SQLITE_OK==sq
bd30: 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77  lite3VdbeMemGrow
bd40: 28 70 53 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53  (pSub, nByte, nS
bd50: 75 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  ub!=0) ){.      
bd60: 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62      apSub = (Sub
bd70: 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d  Program **)pSub-
bd80: 3e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70  >z;.          ap
bd90: 53 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f  Sub[nSub++] = pO
bda0: 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a  p->p4.pProgram;.
bdb0: 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e            pSub->
bdc0: 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f  flags |= MEM_Blo
bdd0: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 75  b;.          pSu
bde0: 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65  b->n = nSub*size
bdf0: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b  of(SubProgram*);
be00: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
be10: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d   }.    }..    pM
be20: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
be30: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  Int;.    pMem->u
be40: 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20  .i = pOp->p1;   
be50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be60: 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a         /* P1 */.
be70: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
be80: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
be90: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
bea0: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b  ->u.i = pOp->p2;
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bec0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20            /* P2 
bed0: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  */.    pMem++;..
bee0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
bef0: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
bf00: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
bf10: 70 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p3;             
bf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bf30: 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b  P3 */.    pMem++
bf40: 3b 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ;..    if( sqlit
bf50: 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e  e3VdbeMemClearAn
bf60: 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 31 30  dResize(pMem, 10
bf70: 30 29 20 29 7b 20 2f 2a 20 50 34 20 2a 2f 0a 20  0) ){ /* P4 */. 
bf80: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
bf90: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
bfa0: 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
bfb0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
bfc0: 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66     }.    pMem->f
bfd0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d  lags = MEM_Str|M
bfe0: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 50 34  EM_Term;.    zP4
bff0: 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70   = displayP4(pOp
c000: 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 70 4d 65 6d 2d  , pMem->z, pMem-
c010: 3e 73 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  >szMalloc);.    
c020: 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a  if( zP4!=pMem->z
c030: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c040: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70  3VdbeMemSetStr(p
c050: 4d 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20 53 51  Mem, zP4, -1, SQ
c060: 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20  LITE_UTF8, 0);. 
c070: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c080: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21  assert( pMem->z!
c090: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  =0 );.      pMem
c0a0: 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ->n = sqlite3Str
c0b0: 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  len30(pMem->z);.
c0c0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
c0d0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
c0e0: 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b     }.    pMem++;
c0f0: 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70  ..    if( p->exp
c100: 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20  lain==1 ){.     
c110: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
c120: 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a  MemClearAndResiz
c130: 65 28 70 4d 65 6d 2c 20 34 29 20 29 7b 0a 20 20  e(pMem, 4) ){.  
c140: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
c150: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
c160: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  d );.        ret
c170: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
c180: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c190: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
c1a0: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
c1b0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
c1c0: 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  2;.      sqlite3
c1d0: 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65  _snprintf(3, pMe
c1e0: 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f  m->z, "%.2x", pO
c1f0: 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20  p->p5);   /* P5 
c200: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  */.      pMem->e
c210: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
c220: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ;.      pMem++;.
c230: 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45    .#ifdef SQLITE
c240: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
c250: 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 69  COMMENTS.      i
c260: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
c270: 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28  mClearAndResize(
c280: 70 4d 65 6d 2c 20 35 30 30 29 20 29 7b 0a 20 20  pMem, 500) ){.  
c290: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
c2a0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
c2b0: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  d );.        ret
c2c0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
c2d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c2e0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
c2f0: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
c300: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
c310: 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70  displayComment(p
c320: 4f 70 2c 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a  Op, zP4, pMem->z
c330: 2c 20 35 30 30 29 3b 0a 20 20 20 20 20 20 70 4d  , 500);.      pM
c340: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
c350: 5f 55 54 46 38 3b 0a 23 65 6c 73 65 0a 20 20 20  _UTF8;.#else.   
c360: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
c370: 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20   MEM_Null;      
c380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c390: 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 23   /* Comment */.#
c3a0: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
c3b0: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d   p->nResColumn =
c3c0: 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61   8 - 4*(p->expla
c3d0: 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 70 52  in-1);.    p->pR
c3e0: 65 73 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61  esultSet = &p->a
c3f0: 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 72  Mem[1];.    p->r
c400: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
c410: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
c420: 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OW;.  }.  return
c430: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
c440: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
c450: 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20  LAIN */..#ifdef 
c460: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
c470: 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c  ** Print the SQL
c480: 20 74 68 61 74 20 77 61 73 20 75 73 65 64 20 74   that was used t
c490: 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56 44 42  o generate a VDB
c4a0: 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f  E program..*/.vo
c4b0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  id sqlite3VdbePr
c4c0: 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b  intSql(Vdbe *p){
c4d0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
c4e0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a   = 0;.  if( p->z
c4f0: 53 71 6c 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70  Sql ){.    z = p
c500: 2d 3e 7a 53 71 6c 3b 0a 20 20 7d 65 6c 73 65 20  ->zSql;.  }else 
c510: 69 66 28 20 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b  if( p->nOp>=1 ){
c520: 0a 20 20 20 20 63 6f 6e 73 74 20 56 64 62 65 4f  .    const VdbeO
c530: 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  p *pOp = &p->aOp
c540: 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 4f 70  [0];.    if( pOp
c550: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69  ->opcode==OP_Ini
c560: 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d  t && pOp->p4.z!=
c570: 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 70  0 ){.      z = p
c580: 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20  Op->p4.z;.      
c590: 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73  while( sqlite3Is
c5a0: 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b  space(*z) ) z++;
c5b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
c5c0: 20 7a 20 29 20 70 72 69 6e 74 66 28 22 53 51 4c   z ) printf("SQL
c5d0: 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d  : [%s]\n", z);.}
c5e0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
c5f0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
c600: 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69  T_TRACE) && defi
c610: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
c620: 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a  E_IOTRACE)./*.**
c630: 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43   Print an IOTRAC
c640: 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e  E message showin
c650: 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a  g SQL content..*
c660: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
c670: 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62  beIOTraceSql(Vdb
c680: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70  e *p){.  int nOp
c690: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62   = p->nOp;.  Vdb
c6a0: 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20  eOp *pOp;.  if( 
c6b0: 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d  sqlite3IoTrace==
c6c0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
c6d0: 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e  ( nOp<1 ) return
c6e0: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
c6f0: 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d  p[0];.  if( pOp-
c700: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74  >opcode==OP_Init
c710: 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30   && pOp->p4.z!=0
c720: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   ){.    int i, j
c730: 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30  ;.    char z[100
c740: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0];.    sqlite3_
c750: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
c760: 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70  z), z, "%s", pOp
c770: 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72  ->p4.z);.    for
c780: 28 69 3d 30 3b 20 73 71 6c 69 74 65 33 49 73 73  (i=0; sqlite3Iss
c790: 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29  pace(z[i]); i++)
c7a0: 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  {}.    for(j=0; 
c7b0: 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
c7c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 73    if( sqlite3Iss
c7d0: 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20  pace(z[i]) ){.  
c7e0: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d        if( z[i-1]
c7f0: 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20  !=' ' ){.       
c800: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b     z[j++] = ' ';
c810: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c820: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c830: 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20  z[j++] = z[i];. 
c840: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
c850: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73   z[j] = 0;.    s
c860: 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28 22 53  qlite3IoTrace("S
c870: 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20  QL %s\n", z);.  
c880: 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53  }.}.#endif /* !S
c890: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
c8a0: 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
c8b0: 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a  E_IOTRACE */../*
c8c0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61  .** Allocate spa
c8d0: 63 65 20 66 72 6f 6d 20 61 20 66 69 78 65 64 20  ce from a fixed 
c8e0: 73 69 7a 65 20 62 75 66 66 65 72 20 61 6e 64 20  size buffer and 
c8f0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
c900: 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73 70 61 63   to.** that spac
c910: 65 2e 20 20 49 66 20 69 6e 73 75 66 66 69 63 69  e.  If insuffici
c920: 65 6e 74 20 73 70 61 63 65 20 69 73 20 61 76 61  ent space is ava
c930: 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 4e  ilable, return N
c940: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ULL..**.** The p
c950: 42 75 66 20 70 61 72 61 6d 65 74 65 72 20 69 73  Buf parameter is
c960: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c   the initial val
c970: 75 65 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20  ue of a pointer 
c980: 77 68 69 63 68 20 77 69 6c 6c 0a 2a 2a 20 72 65  which will.** re
c990: 63 65 69 76 65 20 74 68 65 20 6e 65 77 20 6d 65  ceive the new me
c9a0: 6d 6f 72 79 2e 20 20 70 42 75 66 20 69 73 20 6e  mory.  pBuf is n
c9b0: 6f 72 6d 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20 49  ormally NULL.  I
c9c0: 66 20 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a  f pBuf is not.**
c9d0: 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20   NULL, it means 
c9e0: 74 68 61 74 20 6d 65 6d 6f 72 79 20 73 70 61 63  that memory spac
c9f0: 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
ca00: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  en allocated and
ca10: 20 74 68 61 74 0a 2a 2a 20 74 68 69 73 20 72 6f   that.** this ro
ca20: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74  utine should not
ca30: 20 61 6c 6c 6f 63 61 74 65 20 61 6e 79 20 6e 65   allocate any ne
ca40: 77 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20  w memory.  When 
ca50: 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e  pBuf is not.** N
ca60: 55 4c 4c 20 73 69 6d 70 6c 79 20 72 65 74 75 72  ULL simply retur
ca70: 6e 20 70 42 75 66 2e 20 20 4f 6e 6c 79 20 61 6c  n pBuf.  Only al
ca80: 6c 6f 63 61 74 65 20 6e 65 77 20 6d 65 6d 6f 72  locate new memor
ca90: 79 20 73 70 61 63 65 20 77 68 65 6e 20 70 42 75  y space when pBu
caa0: 66 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  f.** is NULL..**
cab0: 0a 2a 2a 20 6e 42 79 74 65 20 69 73 20 74 68 65  .** nByte is the
cac0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
cad0: 20 6f 66 20 73 70 61 63 65 20 6e 65 65 64 65 64   of space needed
cae0: 2e 0a 2a 2a 0a 2a 2a 20 70 46 72 6f 6d 20 70 6f  ..**.** pFrom po
caf0: 69 6e 74 73 20 74 6f 20 2a 70 6e 46 72 6f 6d 20  ints to *pnFrom 
cb00: 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62  bytes of availab
cb10: 6c 65 20 73 70 61 63 65 2e 20 20 4e 65 77 20 73  le space.  New s
cb20: 70 61 63 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  pace is allocate
cb30: 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 65 6e  d.** from the en
cb40: 64 20 6f 66 20 74 68 65 20 70 46 72 6f 6d 20 62  d of the pFrom b
cb50: 75 66 66 65 72 20 61 6e 64 20 2a 70 6e 46 72 6f  uffer and *pnFro
cb60: 6d 20 69 73 20 64 65 63 72 65 6d 65 6e 74 65 64  m is decremented
cb70: 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 4e 65 65 64 65  ..**.** *pnNeede
cb80: 64 20 69 73 20 61 20 63 6f 75 6e 74 65 72 20 6f  d is a counter o
cb90: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
cba0: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74  bytes of space t
cbb0: 68 61 74 20 68 61 76 65 20 66 61 69 6c 65 64 0a  hat have failed.
cbc0: 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2e 20  ** to allocate. 
cbd0: 20 49 66 20 74 68 65 72 65 20 69 73 20 69 6e 73   If there is ins
cbe0: 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
cbf0: 69 6e 20 70 46 72 6f 6d 20 74 6f 20 73 61 74 69  in pFrom to sati
cc00: 73 66 79 20 74 68 65 0a 2a 2a 20 72 65 71 75 65  sfy the.** reque
cc10: 73 74 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65  st, then increme
cc20: 6e 74 20 2a 70 6e 4e 65 65 64 65 64 20 62 79 20  nt *pnNeeded by 
cc30: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68  the amount of th
cc40: 65 20 72 65 71 75 65 73 74 2e 0a 2a 2f 0a 73 74  e request..*/.st
cc50: 61 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63  atic void *alloc
cc60: 53 70 61 63 65 28 0a 20 20 76 6f 69 64 20 2a 70  Space(.  void *p
cc70: 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Buf,          /*
cc80: 20 57 68 65 72 65 20 72 65 74 75 72 6e 20 70 6f   Where return po
cc90: 69 6e 74 65 72 20 77 69 6c 6c 20 62 65 20 73 74  inter will be st
cca0: 6f 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ored */.  int nB
ccb0: 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  yte,           /
ccc0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
ccd0: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
cce0: 0a 20 20 75 38 20 2a 70 46 72 6f 6d 2c 20 20 20  .  u8 *pFrom,   
ccf0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
cd00: 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  y available for 
cd10: 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  allocation */.  
cd20: 69 6e 74 20 2a 70 6e 46 72 6f 6d 2c 20 20 20 20  int *pnFrom,    
cd30: 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
cd40: 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  Space available 
cd50: 61 74 20 70 46 72 6f 6d 20 2a 2f 0a 20 20 69 6e  at pFrom */.  in
cd60: 74 20 2a 70 6e 4e 65 65 64 65 64 20 20 20 20 20  t *pnNeeded     
cd70: 20 20 20 2f 2a 20 49 66 20 61 6c 6c 6f 63 61 74     /* If allocat
cd80: 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6d 61  ion cannot be ma
cd90: 64 65 2c 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70  de, increment *p
cda0: 6e 42 79 74 65 20 2a 2f 0a 29 7b 0a 20 20 61 73  nByte */.){.  as
cdb0: 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
cdc0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 46 72 6f 6d  _ALIGNMENT(pFrom
cdd0: 29 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66 3d  ) );.  if( pBuf=
cde0: 3d 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20  =0 ){.    nByte 
cdf0: 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b  = ROUND8(nByte);
ce00: 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 3c  .    if( nByte <
ce10: 3d 20 2a 70 6e 46 72 6f 6d 20 29 7b 0a 20 20 20  = *pnFrom ){.   
ce20: 20 20 20 2a 70 6e 46 72 6f 6d 20 2d 3d 20 6e 42     *pnFrom -= nB
ce30: 79 74 65 3b 0a 20 20 20 20 20 20 70 42 75 66 20  yte;.      pBuf 
ce40: 3d 20 26 70 46 72 6f 6d 5b 2a 70 6e 46 72 6f 6d  = &pFrom[*pnFrom
ce50: 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
ce60: 20 20 20 20 2a 70 6e 4e 65 65 64 65 64 20 2b 3d      *pnNeeded +=
ce70: 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a 20 20   nByte;.    }.  
ce80: 7d 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  }.  assert( EIGH
ce90: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
cea0: 28 70 42 75 66 29 20 29 3b 0a 20 20 72 65 74 75  (pBuf) );.  retu
ceb0: 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pBuf;.}../*.*
cec0: 2a 20 52 65 77 69 6e 64 20 74 68 65 20 56 44 42  * Rewind the VDB
ced0: 45 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65  E back to the be
cee0: 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72 65 70 61  ginning in prepa
cef0: 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75  ration for.** ru
cf00: 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69  nning it..*/.voi
cf10: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77  d sqlite3VdbeRew
cf20: 69 6e 64 28 56 64 62 65 20 2a 70 29 7b 0a 23 69  ind(Vdbe *p){.#i
cf30: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
cf40: 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
cf50: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
cf60: 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66  .  int i;.#endif
cf70: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
cf80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
cf90: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
cfa0: 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20  C_INIT );..  /* 
cfb0: 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  There should be 
cfc0: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63  at least one opc
cfd0: 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ode..  */.  asse
cfe0: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
cff0: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61  .  /* Set the ma
d000: 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49  gic to VDBE_MAGI
d010: 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74  C_RUN sooner rat
d020: 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20  her than later. 
d030: 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  */.  p->magic = 
d040: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a  VDBE_MAGIC_RUN;.
d050: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
d060: 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 31 3b 20  EBUG.  for(i=1; 
d070: 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b  i<p->nMem; i++){
d080: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
d090: 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64  aMem[i].db==p->d
d0a0: 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  b );.  }.#endif.
d0b0: 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20    p->pc = -1;.  
d0c0: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
d0d0: 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74  K;.  p->errorAct
d0e0: 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ion = OE_Abort;.
d0f0: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
d100: 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70  E_MAGIC_RUN;.  p
d110: 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
d120: 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31   p->cacheCtr = 1
d130: 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46  ;.  p->minWriteF
d140: 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b  ileFormat = 255;
d150: 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  .  p->iStatement
d160: 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f   = 0;.  p->nFkCo
d170: 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69  nstraint = 0;.#i
d180: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
d190: 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  E.  for(i=0; i<p
d1a0: 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
d1b0: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d   p->aOp[i].cnt =
d1c0: 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69   0;.    p->aOp[i
d1d0: 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20  ].cycles = 0;.  
d1e0: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
d1f0: 2a 20 50 72 65 70 61 72 65 20 61 20 76 69 72 74  * Prepare a virt
d200: 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20  ual machine for 
d210: 65 78 65 63 75 74 69 6f 6e 20 66 6f 72 20 74 68  execution for th
d220: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 66 74  e first time aft
d230: 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 74  er.** creating t
d240: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
d250: 6e 65 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76  ne.  This involv
d260: 65 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a  es things such.*
d270: 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * as allocating 
d280: 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 69 6e  registers and in
d290: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70  itializing the p
d2a0: 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a  rogram counter..
d2b0: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56 44 42  ** After the VDB
d2c0: 45 20 68 61 73 20 62 65 20 70 72 65 70 70 65 64  E has be prepped
d2d0: 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78 65 63  , it can be exec
d2e0: 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d  uted by one or m
d2f0: 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  ore.** calls to 
d300: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
d310: 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ).  .**.** This 
d320: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
d330: 63 61 6c 6c 65 64 20 65 78 61 63 74 6c 79 20 6f  called exactly o
d340: 6e 63 65 20 6f 6e 20 65 61 63 68 20 76 69 72 74  nce on each virt
d350: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20  ual machine..** 
d360: 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  After this routi
d370: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  ne is called the
d380: 20 56 4d 20 68 61 73 20 62 65 65 6e 20 22 70 61   VM has been "pa
d390: 63 6b 61 67 65 64 22 20 61 6e 64 20 69 73 20 72  ckaged" and is r
d3a0: 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20  eady.** to run. 
d3b0: 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
d3c0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 66  ine is called, f
d3d0: 75 72 74 68 65 72 20 63 61 6c 6c 73 20 74 6f 20  urther calls to 
d3e0: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41  .** sqlite3VdbeA
d3f0: 64 64 4f 70 28 29 20 66 75 6e 63 74 69 6f 6e 73  ddOp() functions
d400: 20 61 72 65 20 70 72 6f 68 69 62 69 74 65 64 2e   are prohibited.
d410: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64    This routine d
d420: 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74 68  isconnects.** th
d430: 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20  e Vdbe from the 
d440: 50 61 72 73 65 20 6f 62 6a 65 63 74 20 74 68 61  Parse object tha
d450: 74 20 68 65 6c 70 65 64 20 67 65 6e 65 72 61 74  t helped generat
d460: 65 20 69 74 20 73 6f 20 74 68 61 74 20 74 68 65  e it so that the
d470: 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 62 65 63  .** the Vdbe bec
d480: 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70 65 6e 64  omes an independ
d490: 65 6e 74 20 65 6e 74 69 74 79 20 61 6e 64 20 74  ent entity and t
d4a0: 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20  he Parse object 
d4b0: 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73 74 72 6f  can be.** destro
d4c0: 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  yed..**.** Use t
d4d0: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  he sqlite3VdbeRe
d4e0: 77 69 6e 64 28 29 20 70 72 6f 63 65 64 75 72 65  wind() procedure
d4f0: 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20 76 69   to restore a vi
d500: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 61  rtual machine ba
d510: 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20 69 6e 69  ck.** to its ini
d520: 74 69 61 6c 20 73 74 61 74 65 20 61 66 74 65 72  tial state after
d530: 20 69 74 20 68 61 73 20 62 65 65 6e 20 72 75 6e   it has been run
d540: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d550: 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a  3VdbeMakeReady(.
d560: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
d570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d580: 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a   /* The VDBE */.
d590: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
d5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5b0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
d5c0: 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ext */.){.  sqli
d5d0: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
d5e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
d5f0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
d600: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  ction */.  int n
d610: 56 61 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Var;            
d620: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
d630: 62 65 72 20 6f 66 20 70 61 72 61 6d 65 74 65 72  ber of parameter
d640: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b  s */.  int nMem;
d650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d660: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
d670: 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20 72 65 67  of VM memory reg
d680: 69 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  isters */.  int 
d690: 6e 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20  nCursor;        
d6a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
d6b0: 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20  mber of cursors 
d6c0: 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e  required */.  in
d6d0: 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20 20 20  t nArg;         
d6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d6f0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
d700: 6e 74 73 20 69 6e 20 73 75 62 70 72 6f 67 72 61  nts in subprogra
d710: 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6e 63  ms */.  int nOnc
d720: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
d730: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
d740: 20 6f 66 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74   of OP_Once inst
d750: 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  ructions */.  in
d760: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
d770: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d780: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
d790: 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20    int nFree;    
d7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7b0: 20 2f 2a 20 41 76 61 69 6c 61 62 6c 65 20 66 72   /* Available fr
d7c0: 65 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 75 38  ee space */.  u8
d7d0: 20 2a 7a 43 73 72 3b 20 20 20 20 20 20 20 20 20   *zCsr;         
d7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d7f0: 4d 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65  Memory available
d800: 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   for allocation 
d810: 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  */.  int nByte; 
d820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d830: 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75 63 68 20      /* How much 
d840: 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 69 73 20  extra memory is 
d850: 6e 65 65 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73  needed */..  ass
d860: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
d870: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
d880: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
d890: 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rse!=0 );.  asse
d8a0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
d8b0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
d8c0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
d8d0: 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20 29 3b 0a  e==p->pParse );.
d8e0: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
d8f0: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
d900: 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20  ocFailed==0 );. 
d910: 20 6e 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e   nVar = pParse->
d920: 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70  nVar;.  nMem = p
d930: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e  Parse->nMem;.  n
d940: 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
d950: 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20  >nTab;.  nArg = 
d960: 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b  pParse->nMaxArg;
d970: 0a 20 20 6e 4f 6e 63 65 20 3d 20 70 50 61 72 73  .  nOnce = pPars
d980: 65 2d 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20  e->nOnce;.  if( 
d990: 6e 4f 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e 63 65  nOnce==0 ) nOnce
d9a0: 20 3d 20 31 3b 20 2f 2a 20 45 6e 73 75 72 65 20   = 1; /* Ensure 
d9b0: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 79 74  at least one byt
d9c0: 65 20 69 6e 20 70 2d 3e 61 4f 6e 63 65 46 6c 61  e in p->aOnceFla
d9d0: 67 5b 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 46  g[] */.  .  /* F
d9e0: 6f 72 20 65 61 63 68 20 63 75 72 73 6f 72 20 72  or each cursor r
d9f0: 65 71 75 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c  equired, also al
da00: 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f 72 79 20  locate a memory 
da10: 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a  cell. Memory.  *
da20: 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d  * cells (nMem+1-
da30: 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20  nCursor)..nMem, 
da40: 69 6e 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20  inclusive, will 
da50: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 62 79  never be used by
da60: 0a 20 20 2a 2a 20 74 68 65 20 76 64 62 65 20 70  .  ** the vdbe p
da70: 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65 61 64 20  rogram. Instead 
da80: 74 68 65 79 20 61 72 65 20 75 73 65 64 20 74 6f  they are used to
da90: 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
daa0: 66 6f 72 0a 20 20 2a 2a 20 56 64 62 65 43 75 72  for.  ** VdbeCur
dab0: 73 6f 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72  sor/BtCursor str
dac0: 75 63 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f  uctures. The blo
dad0: 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f  b of memory asso
dae0: 63 69 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a  ciated with .  *
daf0: 2a 20 63 75 72 73 6f 72 20 30 20 69 73 20 73 74  * cursor 0 is st
db00: 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63  ored in memory c
db10: 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79  ell nMem. Memory
db20: 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20   cell (nMem-1). 
db30: 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62   ** stores the b
db40: 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73  lob of memory as
db50: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
db60: 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a  rsor 1, etc..  *
db70: 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  *.  ** See also:
db80: 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28   allocateCursor(
db90: 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b  )..  */.  nMem +
dba0: 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a  = nCursor;..  /*
dbb0: 20 7a 43 73 72 20 77 69 6c 6c 20 69 6e 69 74 69   zCsr will initi
dbc0: 61 6c 6c 79 20 70 6f 69 6e 74 20 74 6f 20 6e 46  ally point to nF
dbd0: 72 65 65 20 62 79 74 65 73 20 6f 66 20 75 6e 75  ree bytes of unu
dbe0: 73 65 64 20 73 70 61 63 65 20 61 74 20 74 68 65  sed space at the
dbf0: 0a 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  .  ** end of the
dc00: 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2c 20 70   opcode array, p
dc10: 2d 3e 61 4f 70 2e 20 20 54 68 65 20 63 6f 6d 70  ->aOp.  The comp
dc20: 75 74 61 74 69 6f 6e 20 6f 66 20 6e 46 72 65 65  utation of nFree
dc30: 20 69 73 0a 20 20 2a 2a 20 63 6f 6e 73 65 72 76   is.  ** conserv
dc40: 61 74 69 76 65 20 2d 20 69 74 20 6d 69 67 68 74  ative - it might
dc50: 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   be smaller than
dc60: 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72   the true number
dc70: 20 6f 66 20 66 72 65 65 0a 20 20 2a 2a 20 62 79   of free.  ** by
dc80: 74 65 73 2c 20 62 75 74 20 6e 65 76 65 72 20 6c  tes, but never l
dc90: 61 72 67 65 72 2e 20 20 6e 46 72 65 65 20 6d 75  arger.  nFree mu
dca0: 73 74 20 62 65 20 61 20 6d 75 6c 74 69 70 6c 65  st be a multiple
dcb0: 20 6f 66 20 38 20 2d 20 69 74 20 69 73 0a 20 20   of 8 - it is.  
dcc0: 2a 2a 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20  ** rounded down 
dcd0: 69 66 20 69 73 20 6e 6f 74 2e 0a 20 20 2a 2f 0a  if is not..  */.
dce0: 20 20 6e 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a    n = ROUND8(siz
dcf0: 65 6f 66 28 4f 70 29 2a 70 2d 3e 6e 4f 70 29 3b  eof(Op)*p->nOp);
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dd10: 20 42 79 74 65 73 20 6f 66 20 6f 70 63 6f 64 65   Bytes of opcode
dd20: 20 73 70 61 63 65 20 75 73 65 64 20 2a 2f 0a 20   space used */. 
dd30: 20 7a 43 73 72 20 3d 20 26 28 28 75 38 2a 29 70   zCsr = &((u8*)p
dd40: 2d 3e 61 4f 70 29 5b 6e 5d 3b 20 20 20 20 20 20  ->aOp)[n];      
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dd60: 55 6e 75 73 65 64 20 6f 70 63 6f 64 65 20 73 70  Unused opcode sp
dd70: 61 63 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ace */.  assert(
dd80: 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
dd90: 4e 4d 45 4e 54 28 7a 43 73 72 29 20 29 3b 0a 20  NMENT(zCsr) );. 
dda0: 20 6e 46 72 65 65 20 3d 20 52 4f 55 4e 44 44 4f   nFree = ROUNDDO
ddb0: 57 4e 38 28 70 50 61 72 73 65 2d 3e 73 7a 4f 70  WN8(pParse->szOp
ddc0: 41 6c 6c 6f 63 20 2d 20 6e 29 3b 20 20 2f 2a 20  Alloc - n);  /* 
ddd0: 42 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20  Bytes of unused 
dde0: 73 70 61 63 65 20 2a 2f 0a 20 20 61 73 73 65 72  space */.  asser
ddf0: 74 28 20 6e 46 72 65 65 3e 3d 30 20 29 3b 0a 20  t( nFree>=0 );. 
de00: 20 69 66 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a   if( nFree>0 ){.
de10: 20 20 20 20 6d 65 6d 73 65 74 28 7a 43 73 72 2c      memset(zCsr,
de20: 20 30 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20   0, nFree);.    
de30: 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
de40: 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 26 7a 43  TE_ALIGNMENT(&zC
de50: 73 72 5b 6e 46 72 65 65 5d 29 20 29 3b 0a 20 20  sr[nFree]) );.  
de60: 7d 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61  }..  resolveP2Va
de70: 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a  lues(p, &nArg);.
de80: 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75    p->usesStmtJou
de90: 72 6e 61 6c 20 3d 20 28 75 38 29 28 70 50 61 72  rnal = (u8)(pPar
dea0: 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65  se->isMultiWrite
deb0: 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61 79 41   && pParse->mayA
dec0: 62 6f 72 74 29 3b 0a 20 20 69 66 28 20 70 50 61  bort);.  if( pPa
ded0: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20  rse->explain && 
dee0: 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 6e  nMem<10 ){.    n
def0: 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20  Mem = 10;.  }.  
df00: 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a  p->expired = 0;.
df10: 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20  .  p->expired = 
df20: 30 3b 0a 20 20 0a 20 20 2f 2a 20 4d 65 6d 6f 72  0;.  .  /* Memor
df30: 79 20 66 6f 72 20 72 65 67 69 73 74 65 72 73 2c  y for registers,
df40: 20 70 61 72 61 6d 65 74 65 72 73 2c 20 63 75 72   parameters, cur
df50: 73 6f 72 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c  sor, etc, is all
df60: 6f 63 61 74 65 64 20 69 6e 20 74 77 6f 0a 20 20  ocated in two.  
df70: 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f 6e 20 74  ** passes.  On t
df80: 68 65 20 66 69 72 73 74 20 70 61 73 73 2c 20 77  he first pass, w
df90: 65 20 74 72 79 20 74 6f 20 72 65 75 73 65 20 75  e try to reuse u
dfa0: 6e 75 73 65 64 20 73 70 61 63 65 20 61 74 20 74  nused space at t
dfb0: 68 65 20 0a 20 20 2a 2a 20 65 6e 64 20 6f 66 20  he .  ** end of 
dfc0: 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79  the opcode array
dfd0: 2e 20 20 49 66 20 77 65 20 61 72 65 20 75 6e 61  .  If we are una
dfe0: 62 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20 61  ble to satisfy a
dff0: 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 72  ll memory.  ** r
e000: 65 71 75 69 72 65 6d 65 6e 74 73 20 62 79 20 72  equirements by r
e010: 65 75 73 69 6e 67 20 74 68 65 20 6f 70 63 6f 64  eusing the opcod
e020: 65 20 61 72 72 61 79 20 74 61 69 6c 2c 20 74 68  e array tail, th
e030: 65 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20  en the second.  
e040: 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20 66 69 6c  ** pass will fil
e050: 6c 20 69 6e 20 74 68 65 20 72 65 73 74 20 75 73  l in the rest us
e060: 69 6e 67 20 61 20 66 72 65 73 68 20 61 6c 6c 6f  ing a fresh allo
e070: 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20  cation.  .  **. 
e080: 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70 61 73   ** This two-pas
e090: 73 20 61 70 70 72 6f 61 63 68 20 74 68 61 74 20  s approach that 
e0a0: 72 65 75 73 65 73 20 61 73 20 6d 75 63 68 20 6d  reuses as much m
e0b0: 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c  emory as possibl
e0c0: 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20  e from.  ** the 
e0d0: 6c 65 66 74 6f 76 65 72 20 73 70 61 63 65 20 61  leftover space a
e0e0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
e0f0: 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20 63 61   opcode array ca
e100: 6e 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a  n significantly.
e110: 20 20 2a 2a 20 72 65 64 75 63 65 20 74 68 65 20    ** reduce the 
e120: 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79  amount of memory
e130: 20 68 65 6c 64 20 62 79 20 61 20 70 72 65 70 61   held by a prepa
e140: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  red statement.. 
e150: 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20 20 20 6e   */.  do {.    n
e160: 42 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d  Byte = 0;.    p-
e170: 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61  >aMem = allocSpa
e180: 63 65 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d  ce(p->aMem, nMem
e190: 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 7a 43  *sizeof(Mem), zC
e1a0: 73 72 2c 20 26 6e 46 72 65 65 2c 20 26 6e 42 79  sr, &nFree, &nBy
e1b0: 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 56 61 72  te);.    p->aVar
e1c0: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d   = allocSpace(p-
e1d0: 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65  >aVar, nVar*size
e1e0: 6f 66 28 4d 65 6d 29 2c 20 7a 43 73 72 2c 20 26  of(Mem), zCsr, &
e1f0: 6e 46 72 65 65 2c 20 26 6e 42 79 74 65 29 3b 0a  nFree, &nByte);.
e200: 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 61      p->apArg = a
e210: 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70 41  llocSpace(p->apA
e220: 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28  rg, nArg*sizeof(
e230: 4d 65 6d 2a 29 2c 20 7a 43 73 72 2c 20 26 6e 46  Mem*), zCsr, &nF
e240: 72 65 65 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  ree, &nByte);.  
e250: 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20 61 6c 6c    p->azVar = all
e260: 6f 63 53 70 61 63 65 28 70 2d 3e 61 7a 56 61 72  ocSpace(p->azVar
e270: 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63 68  , nVar*sizeof(ch
e280: 61 72 2a 29 2c 20 7a 43 73 72 2c 20 26 6e 46 72  ar*), zCsr, &nFr
e290: 65 65 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  ee, &nByte);.   
e2a0: 20 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f   p->apCsr = allo
e2b0: 63 53 70 61 63 65 28 70 2d 3e 61 70 43 73 72 2c  cSpace(p->apCsr,
e2c0: 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28   nCursor*sizeof(
e2d0: 56 64 62 65 43 75 72 73 6f 72 2a 29 2c 0a 20 20  VdbeCursor*),.  
e2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2f0: 20 20 20 20 20 20 20 20 7a 43 73 72 2c 20 26 6e          zCsr, &n
e300: 46 72 65 65 2c 20 26 6e 42 79 74 65 29 3b 0a 20  Free, &nByte);. 
e310: 20 20 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20     p->aOnceFlag 
e320: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
e330: 61 4f 6e 63 65 46 6c 61 67 2c 20 6e 4f 6e 63 65  aOnceFlag, nOnce
e340: 2c 20 7a 43 73 72 2c 20 26 6e 46 72 65 65 2c 20  , zCsr, &nFree, 
e350: 26 6e 42 79 74 65 29 3b 0a 23 69 66 64 65 66 20  &nByte);.#ifdef 
e360: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
e370: 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20  MT_SCANSTATUS.  
e380: 20 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20 61 6c    p->anExec = al
e390: 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 6e 45 78  locSpace(p->anEx
e3a0: 65 63 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f  ec, p->nOp*sizeo
e3b0: 66 28 69 36 34 29 2c 20 7a 43 73 72 2c 20 26 6e  f(i64), zCsr, &n
e3c0: 46 72 65 65 2c 20 26 6e 42 79 74 65 29 3b 0a 23  Free, &nByte);.#
e3d0: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 6e 42  endif.    if( nB
e3e0: 79 74 65 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  yte ){.      p->
e3f0: 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44  pFree = sqlite3D
e400: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
e410: 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20  nByte);.    }.  
e420: 20 20 7a 43 73 72 20 3d 20 70 2d 3e 70 46 72 65    zCsr = p->pFre
e430: 65 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 6e  e;.    nFree = n
e440: 42 79 74 65 3b 0a 20 20 7d 77 68 69 6c 65 28 20  Byte;.  }while( 
e450: 6e 42 79 74 65 20 26 26 20 21 64 62 2d 3e 6d 61  nByte && !db->ma
e460: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20  llocFailed );.. 
e470: 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43   p->nCursor = nC
e480: 75 72 73 6f 72 3b 0a 20 20 70 2d 3e 6e 4f 6e 63  ursor;.  p->nOnc
e490: 65 46 6c 61 67 20 3d 20 6e 4f 6e 63 65 3b 0a 20  eFlag = nOnce;. 
e4a0: 20 69 66 28 20 70 2d 3e 61 56 61 72 20 29 7b 0a   if( p->aVar ){.
e4b0: 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 28 79      p->nVar = (y
e4c0: 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20 20 20 66  nVar)nVar;.    f
e4d0: 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20  or(n=0; n<nVar; 
e4e0: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  n++){.      p->a
e4f0: 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d  Var[n].flags = M
e500: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 70  EM_Null;.      p
e510: 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d 20 64  ->aVar[n].db = d
e520: 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  b;.    }.  }.  i
e530: 66 28 20 70 2d 3e 61 7a 56 61 72 20 26 26 20 70  f( p->azVar && p
e540: 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3e 30 20 29  Parse->nzVar>0 )
e550: 7b 0a 20 20 20 20 70 2d 3e 6e 7a 56 61 72 20 3d  {.    p->nzVar =
e560: 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3b 0a   pParse->nzVar;.
e570: 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61 7a      memcpy(p->az
e580: 56 61 72 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56  Var, pParse->azV
e590: 61 72 2c 20 70 2d 3e 6e 7a 56 61 72 2a 73 69 7a  ar, p->nzVar*siz
e5a0: 65 6f 66 28 70 2d 3e 61 7a 56 61 72 5b 30 5d 29  eof(p->azVar[0])
e5b0: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50  );.    memset(pP
e5c0: 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 30 2c 20  arse->azVar, 0, 
e5d0: 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 2a 73 69  pParse->nzVar*si
e5e0: 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 7a 56  zeof(pParse->azV
e5f0: 61 72 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69  ar[0]));.  }.  i
e600: 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20  f( p->aMem ){.  
e610: 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20    p->aMem--;    
e620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e630: 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65 73    /* aMem[] goes
e640: 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f   from 1..nMem */
e650: 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e  .    p->nMem = n
e660: 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mem;            
e670: 20 20 20 20 20 2f 2a 20 20 20 20 20 20 20 6e 6f       /*       no
e680: 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31  t from 0..nMem-1
e690: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6e 3d 31 3b   */.    for(n=1;
e6a0: 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a   n<=nMem; n++){.
e6b0: 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d        p->aMem[n]
e6c0: 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64  .flags = MEM_Und
e6d0: 65 66 69 6e 65 64 3b 0a 20 20 20 20 20 20 70 2d  efined;.      p-
e6e0: 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62  >aMem[n].db = db
e6f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d  ;.    }.  }.  p-
e700: 3e 65 78 70 6c 61 69 6e 20 3d 20 70 50 61 72 73  >explain = pPars
e710: 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a 20 20 73 71  e->explain;.  sq
e720: 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28  lite3VdbeRewind(
e730: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  p);.}../*.** Clo
e740: 73 65 20 61 20 56 44 42 45 20 63 75 72 73 6f 72  se a VDBE cursor
e750: 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c   and release all
e760: 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 74   the resources t
e770: 68 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68  hat cursor .** h
e780: 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a  appens to hold..
e790: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
e7a0: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 56 64  dbeFreeCursor(Vd
e7b0: 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72 73 6f  be *p, VdbeCurso
e7c0: 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70  r *pCx){.  if( p
e7d0: 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  Cx==0 ){.    ret
e7e0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
e7f0: 74 28 20 70 43 78 2d 3e 70 42 74 3d 3d 30 20 7c  t( pCx->pBt==0 |
e800: 7c 20 70 43 78 2d 3e 65 43 75 72 54 79 70 65 3d  | pCx->eCurType=
e810: 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
e820: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 43 78 2d  ;.  switch( pCx-
e830: 3e 65 43 75 72 54 79 70 65 20 29 7b 0a 20 20 20  >eCurType ){.   
e840: 20 63 61 73 65 20 43 55 52 54 59 50 45 5f 53 4f   case CURTYPE_SO
e850: 52 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71  RTER: {.      sq
e860: 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 43  lite3VdbeSorterC
e870: 6c 6f 73 65 28 70 2d 3e 64 62 2c 20 70 43 78 29  lose(p->db, pCx)
e880: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
e890: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 43 55     }.    case CU
e8a0: 52 54 59 50 45 5f 42 54 52 45 45 3a 20 7b 0a 20  RTYPE_BTREE: {. 
e8b0: 20 20 20 20 20 69 66 28 20 70 43 78 2d 3e 70 42       if( pCx->pB
e8c0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
e8d0: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70  ite3BtreeClose(p
e8e0: 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20  Cx->pBt);.      
e8f0: 20 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70 43    /* The pCx->pC
e900: 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c  ursor will be cl
e910: 6f 73 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ose automaticall
e920: 79 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2c  y, if it exists,
e930: 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   by.        ** t
e940: 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a  he call above. *
e950: 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /.      }else{. 
e960: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
e970: 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d  Cx->uc.pCursor!=
e980: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 );.        sql
e990: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
e9a0: 72 73 6f 72 28 70 43 78 2d 3e 75 63 2e 70 43 75  rsor(pCx->uc.pCu
e9b0: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rsor);.      }. 
e9c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e9d0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
e9e0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
e9f0: 4c 45 0a 20 20 20 20 63 61 73 65 20 43 55 52 54  LE.    case CURT
ea00: 59 50 45 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20  YPE_VTAB: {.    
ea10: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
ea20: 75 72 73 6f 72 20 2a 70 56 43 75 72 20 3d 20 70  ursor *pVCur = p
ea30: 43 78 2d 3e 75 63 2e 70 56 43 75 72 3b 0a 20 20  Cx->uc.pVCur;.  
ea40: 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65      const sqlite
ea50: 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c  3_module *pModul
ea60: 65 20 3d 20 70 56 43 75 72 2d 3e 70 56 74 61 62  e = pVCur->pVtab
ea70: 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 20  ->pModule;.     
ea80: 20 61 73 73 65 72 74 28 20 70 56 43 75 72 2d 3e   assert( pVCur->
ea90: 70 56 74 61 62 2d 3e 6e 52 65 66 3e 30 20 29 3b  pVtab->nRef>0 );
eaa0: 0a 20 20 20 20 20 20 70 56 43 75 72 2d 3e 70 56  .      pVCur->pV
eab0: 74 61 62 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  tab->nRef--;.   
eac0: 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f     pModule->xClo
ead0: 73 65 28 70 56 43 75 72 29 3b 0a 20 20 20 20 20  se(pVCur);.     
eae0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
eaf0: 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ndif.  }.}../*.*
eb00: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73  * Close all curs
eb10: 6f 72 73 20 69 6e 20 74 68 65 20 63 75 72 72 65  ors in the curre
eb20: 6e 74 20 66 72 61 6d 65 2e 0a 2a 2f 0a 73 74 61  nt frame..*/.sta
eb30: 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 43 75  tic void closeCu
eb40: 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 56 64 62  rsorsInFrame(Vdb
eb50: 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  e *p){.  if( p->
eb60: 61 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e 74  apCsr ){.    int
eb70: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
eb80: 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69   i<p->nCursor; i
eb90: 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64 62 65 43  ++){.      VdbeC
eba0: 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61  ursor *pC = p->a
ebb0: 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69  pCsr[i];.      i
ebc0: 66 28 20 70 43 20 29 7b 0a 20 20 20 20 20 20 20  f( pC ){.       
ebd0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
ebe0: 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20  Cursor(p, pC);. 
ebf0: 20 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b         p->apCsr[
ec00: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  i] = 0;.      }.
ec10: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
ec20: 2a 2a 20 43 6f 70 79 20 74 68 65 20 76 61 6c 75  ** Copy the valu
ec30: 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  es stored in the
ec40: 20 56 64 62 65 46 72 61 6d 65 20 73 74 72 75 63   VdbeFrame struc
ec50: 74 75 72 65 20 74 6f 20 69 74 73 20 56 64 62 65  ture to its Vdbe
ec60: 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65  . This.** is use
ec70: 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  d, for example, 
ec80: 77 68 65 6e 20 61 20 74 72 69 67 67 65 72 20 73  when a trigger s
ec90: 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 68 61  ub-program is ha
eca0: 6c 74 65 64 20 74 6f 20 72 65 73 74 6f 72 65 0a  lted to restore.
ecb0: 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68  ** control to th
ecc0: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a  e main program..
ecd0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
ece0: 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 56  beFrameRestore(V
ecf0: 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
ed00: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
ed10: 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 63 6c 6f 73  Frame->v;.  clos
ed20: 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28  eCursorsInFrame(
ed30: 76 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  v);.#ifdef SQLIT
ed40: 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
ed50: 41 4e 53 54 41 54 55 53 0a 20 20 76 2d 3e 61 6e  ANSTATUS.  v->an
ed60: 45 78 65 63 20 3d 20 70 46 72 61 6d 65 2d 3e 61  Exec = pFrame->a
ed70: 6e 45 78 65 63 3b 0a 23 65 6e 64 69 66 0a 20 20  nExec;.#endif.  
ed80: 76 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20 70  v->aOnceFlag = p
ed90: 46 72 61 6d 65 2d 3e 61 4f 6e 63 65 46 6c 61 67  Frame->aOnceFlag
eda0: 3b 0a 20 20 76 2d 3e 6e 4f 6e 63 65 46 6c 61 67  ;.  v->nOnceFlag
edb0: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 6e 63 65   = pFrame->nOnce
edc0: 46 6c 61 67 3b 0a 20 20 76 2d 3e 61 4f 70 20 3d  Flag;.  v->aOp =
edd0: 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20   pFrame->aOp;.  
ede0: 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d  v->nOp = pFrame-
edf0: 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20  >nOp;.  v->aMem 
ee00: 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a  = pFrame->aMem;.
ee10: 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61    v->nMem = pFra
ee20: 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61  me->nMem;.  v->a
ee30: 70 43 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61  pCsr = pFrame->a
ee40: 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73  pCsr;.  v->nCurs
ee50: 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75  or = pFrame->nCu
ee60: 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c  rsor;.  v->db->l
ee70: 61 73 74 52 6f 77 69 64 20 3d 20 70 46 72 61 6d  astRowid = pFram
ee80: 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20  e->lastRowid;.  
ee90: 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72  v->nChange = pFr
eea0: 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20  ame->nChange;.  
eeb0: 76 2d 3e 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d  v->db->nChange =
eec0: 20 70 46 72 61 6d 65 2d 3e 6e 44 62 43 68 61 6e   pFrame->nDbChan
eed0: 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 72  ge;.  return pFr
eee0: 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  ame->pc;.}../*.*
eef0: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73  * Close all curs
ef00: 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  ors..**.** Also 
ef10: 72 65 6c 65 61 73 65 20 61 6e 79 20 64 79 6e 61  release any dyna
ef20: 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20  mic memory held 
ef30: 62 79 20 74 68 65 20 56 4d 20 69 6e 20 74 68 65  by the VM in the
ef40: 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72   Vdbe.aMem memor
ef50: 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79  y .** cell array
ef60: 2e 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73  . This is necess
ef70: 61 72 79 20 61 73 20 74 68 65 20 6d 65 6d 6f 72  ary as the memor
ef80: 79 20 63 65 6c 6c 20 61 72 72 61 79 20 6d 61 79  y cell array may
ef90: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e   contain.** poin
efa0: 74 65 72 73 20 74 6f 20 56 64 62 65 46 72 61 6d  ters to VdbeFram
efb0: 65 20 6f 62 6a 65 63 74 73 2c 20 77 68 69 63 68  e objects, which
efc0: 20 6d 61 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e   may in turn con
efd0: 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f  tain pointers to
efe0: 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 73  .** open cursors
eff0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
f000: 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
f010: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28  (Vdbe *p){.  if(
f020: 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20   p->pFrame ){.  
f030: 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72    VdbeFrame *pFr
f040: 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72  ame;.    for(pFr
f050: 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70  ame=p->pFrame; p
f060: 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20  Frame->pParent; 
f070: 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70  pFrame=pFrame->p
f080: 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c  Parent);.    sql
f090: 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73  ite3VdbeFrameRes
f0a0: 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20  tore(pFrame);.  
f0b0: 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b    p->pFrame = 0;
f0c0: 0a 20 20 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d  .    p->nFrame =
f0d0: 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
f0e0: 28 20 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30 20 29  ( p->nFrame==0 )
f0f0: 3b 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f 72 73  ;.  closeCursors
f100: 49 6e 46 72 61 6d 65 28 70 29 3b 0a 20 20 69 66  InFrame(p);.  if
f110: 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20  ( p->aMem ){.   
f120: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
f130: 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d  (&p->aMem[1], p-
f140: 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68  >nMem);.  }.  wh
f150: 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d  ile( p->pDelFram
f160: 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61  e ){.    VdbeFra
f170: 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44  me *pDel = p->pD
f180: 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e  elFrame;.    p->
f190: 70 44 65 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c  pDelFrame = pDel
f1a0: 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73  ->pParent;.    s
f1b0: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44  qlite3VdbeFrameD
f1c0: 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d  elete(pDel);.  }
f1d0: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e  ..  /* Delete an
f1e0: 79 20 61 75 78 64 61 74 61 20 61 6c 6c 6f 63 61  y auxdata alloca
f1f0: 74 69 6f 6e 73 20 6d 61 64 65 20 62 79 20 74 68  tions made by th
f200: 65 20 56 4d 20 2a 2f 0a 20 20 69 66 28 20 70 2d  e VM */.  if( p-
f210: 3e 70 41 75 78 44 61 74 61 20 29 20 73 71 6c 69  >pAuxData ) sqli
f220: 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78  te3VdbeDeleteAux
f230: 44 61 74 61 28 70 2c 20 2d 31 2c 20 30 29 3b 0a  Data(p, -1, 0);.
f240: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 41 75    assert( p->pAu
f250: 78 44 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f  xData==0 );.}../
f260: 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68  *.** Clean up th
f270: 65 20 56 4d 20 61 66 74 65 72 20 61 20 73 69 6e  e VM after a sin
f280: 67 6c 65 20 72 75 6e 2e 0a 2a 2f 0a 73 74 61 74  gle run..*/.stat
f290: 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28  ic void Cleanup(
f2a0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
f2b0: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
f2c0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
f2d0: 44 45 42 55 47 0a 20 20 2f 2a 20 45 78 65 63 75  DEBUG.  /* Execu
f2e0: 74 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74  te assert() stat
f2f0: 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65  ements to ensure
f300: 20 74 68 61 74 20 74 68 65 20 56 64 62 65 2e 61   that the Vdbe.a
f310: 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a  pCsr[] and .  **
f320: 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20 61 72 72   Vdbe.aMem[] arr
f330: 61 79 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  ays have already
f340: 20 62 65 65 6e 20 63 6c 65 61 6e 65 64 20 75 70   been cleaned up
f350: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20  .  */.  int i;. 
f360: 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 20   if( p->apCsr ) 
f370: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
f380: 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73 65  ursor; i++) asse
f390: 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3d  rt( p->apCsr[i]=
f3a0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  =0 );.  if( p->a
f3b0: 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Mem ){.    for(i
f3c0: 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20  =1; i<=p->nMem; 
f3d0: 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e  i++) assert( p->
f3e0: 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d  aMem[i].flags==M
f3f0: 45 4d 5f 55 6e 64 65 66 69 6e 65 64 20 29 3b 0a  EM_Undefined );.
f400: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71    }.#endif..  sq
f410: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
f420: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  p->zErrMsg);.  p
f430: 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
f440: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
f450: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
f460: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
f470: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68  esult columns th
f480: 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
f490: 6e 65 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a  ned by this SQL.
f4a0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  ** statement. Th
f4b0: 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74  is is now set at
f4c0: 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72   compile time, r
f4d0: 61 74 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e  ather than durin
f4e0: 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f  g.** execution o
f4f0: 66 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  f the vdbe progr
f500: 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74  am so that sqlit
f510: 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
f520: 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c  ) can.** be call
f530: 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61  ed on an SQL sta
f540: 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71  tement before sq
f550: 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f  lite3_step()..*/
f560: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
f570: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65  eSetNumCols(Vdbe
f580: 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c   *p, int nResCol
f590: 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f  umn){.  Mem *pCo
f5a0: 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a  lName;.  int n;.
f5b0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
f5c0: 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65 61 73  p->db;..  releas
f5d0: 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  eMemArray(p->aCo
f5e0: 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f  lName, p->nResCo
f5f0: 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b  lumn*COLNAME_N);
f600: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
f610: 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  (db, p->aColName
f620: 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c  );.  n = nResCol
f630: 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20  umn*COLNAME_N;. 
f640: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d   p->nResColumn =
f650: 20 28 75 31 36 29 6e 52 65 73 43 6f 6c 75 6d 6e   (u16)nResColumn
f660: 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20  ;.  p->aColName 
f670: 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65  = pColName = (Me
f680: 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  m*)sqlite3DbMall
f690: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
f6a0: 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66  f(Mem)*n );.  if
f6b0: 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30  ( p->aColName==0
f6c0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69   ) return;.  whi
f6d0: 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20  le( n-- > 0 ){. 
f6e0: 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61     pColName->fla
f6f0: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
f700: 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20     pColName->db 
f710: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 70 43 6f  = p->db;.    pCo
f720: 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a  lName++;.  }.}..
f730: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61  /*.** Set the na
f740: 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27 74 68  me of the idx'th
f750: 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65   column to be re
f760: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 51  turned by the SQ
f770: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  L statement..** 
f780: 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61 20  zName must be a 
f790: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c  pointer to a nul
f7a0: 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69   terminated stri
f7b0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ng..**.** This c
f7c0: 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 65  all must be made
f7d0: 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
f7e0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
f7f0: 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20  umCols()..**.** 
f800: 54 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65  The final parame
f810: 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20  ter, xDel, must 
f820: 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  be one of SQLITE
f830: 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45  _DYNAMIC, SQLITE
f840: 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51  _STATIC.** or SQ
f850: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20  LITE_TRANSIENT. 
f860: 49 66 20 69 74 20 69 73 20 53 51 4c 49 54 45 5f  If it is SQLITE_
f870: 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 74 68  DYNAMIC, then th
f880: 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
f890: 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20  .** to by zName 
f8a0: 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 62 79  will be freed by
f8b0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29   sqlite3DbFree()
f8c0: 20 77 68 65 6e 20 74 68 65 20 76 64 62 65 20 69   when the vdbe i
f8d0: 73 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a  s destroyed..*/.
f8e0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53  int sqlite3VdbeS
f8f0: 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62  etColName(.  Vdb
f900: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
f910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f920: 20 56 64 62 65 20 62 65 69 6e 67 20 63 6f 6e 66   Vdbe being conf
f930: 69 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  igured */.  int 
f940: 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  idx,            
f950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f960: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
f970: 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f  zName applies to
f980: 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c 20 20   */.  int var,  
f990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9a0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
f9b0: 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63   the COLNAME_* c
f9c0: 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f  onstants */.  co
f9d0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
f9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f9f0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66  * Pointer to buf
fa00: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e  fer containing n
fa10: 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ame */.  void (*
fa20: 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 20 20 20  xDel)(void*)    
fa30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
fa40: 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73  ory management s
fa50: 74 72 61 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d  trategy for zNam
fa60: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
fa70: 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d  ;.  Mem *pColNam
fa80: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  e;.  assert( idx
fa90: 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29  <p->nResColumn )
faa0: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61 72 3c  ;.  assert( var<
fab0: 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69  COLNAME_N );.  i
fac0: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
fad0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 61 73  Failed ){.    as
fae0: 73 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20  sert( !zName || 
faf0: 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e  xDel!=SQLITE_DYN
fb00: 41 4d 49 43 20 29 3b 0a 20 20 20 20 72 65 74 75  AMIC );.    retu
fb10: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
fb20: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
fb30: 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b  ->aColName!=0 );
fb40: 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28  .  pColName = &(
fb50: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b  p->aColName[idx+
fb60: 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  var*p->nResColum
fb70: 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  n]);.  rc = sqli
fb80: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
fb90: 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65  (pColName, zName
fba0: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
fbb0: 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73 73 65  8, xDel);.  asse
fbc0: 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e  rt( rc!=0 || !zN
fbd0: 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65  ame || (pColName
fbe0: 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d  ->flags&MEM_Term
fbf0: 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )!=0 );.  return
fc00: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20   rc;.}../*.** A 
fc10: 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
fc20: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72  ansaction may or
fc30: 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74 69   may not be acti
fc40: 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  ve on database h
fc50: 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20  andle.** db. If 
fc60: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
fc70: 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20   active, commit 
fc80: 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  it. If there is 
fc90: 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73  a.** write-trans
fca0: 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20  action spanning 
fcb0: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61  more than one da
fcc0: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
fcd0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b  s routine.** tak
fce0: 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 20 6d  es care of the m
fcf0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72  aster journal tr
fd00: 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  ickery..*/.stati
fd10: 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74  c int vdbeCommit
fd20: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64  (sqlite3 *db, Vd
fd30: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
fd40: 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20  .  int nTrans = 
fd50: 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  0;  /* Number of
fd60: 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20   databases with 
fd70: 61 6e 20 61 63 74 69 76 65 20 77 72 69 74 65 2d  an active write-
fd80: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
fd90: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
fda0: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58  _OK;.  int needX
fdb0: 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66  commit = 0;..#if
fdc0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fdd0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f  VIRTUALTABLE.  /
fde0: 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70 74 69  * With this opti
fdf0: 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61 62 53  on, sqlite3VtabS
fe00: 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e 65 64  ync() is defined
fe10: 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a 20   to be simply . 
fe20: 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f   ** SQLITE_OK so
fe30: 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20   p is not used. 
fe40: 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50  .  */.  UNUSED_P
fe50: 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e  ARAMETER(p);.#en
fe60: 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65  dif..  /* Before
fe70: 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
fe80: 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78  else, call the x
fe90: 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20  Sync() callback 
fea0: 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72  for any.  ** vir
feb0: 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c  tual module tabl
fec0: 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68  es written in th
fed0: 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  is transaction. 
fee0: 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a  This has to.  **
fef0: 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   be done before 
ff00: 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74  determining whet
ff10: 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  her a master jou
ff20: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20  rnal file is .  
ff30: 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73 20  ** required, as 
ff40: 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62  an xSync() callb
ff50: 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61  ack may add an a
ff60: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
ff70: 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61  .  ** to the tra
ff80: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  nsaction..  */. 
ff90: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
ffa0: 62 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a 0a 20  bSync(db, p);.. 
ffb0: 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65   /* This loop de
ffc0: 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20  termines (a) if 
ffd0: 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  the commit hook 
ffe0: 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65  should be invoke
fff0: 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68  d and.  ** (b) h
10000 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65  ow many database
10010 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e   files have open
10020 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
10030 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69  ons, not .  ** i
10040 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d  ncluding the tem
10050 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29 20  p database. (b) 
10060 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63  is important bec
10070 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61  ause if more tha
10080 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61  n .  ** one data
10090 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e  base file has an
100a0 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
100b0 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65  saction, a maste
100c0 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  r journal.  ** f
100d0 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ile is required 
100e0 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f  for an atomic co
100f0 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  mmit..  */ .  fo
10100 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
10110 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
10120 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74  b; i++){ .    Bt
10130 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
10140 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
10150 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
10160 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
10170 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d  .      needXcomm
10180 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  it = 1;.      if
10190 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b  ( i!=1 ) nTrans+
101a0 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  +;.      sqlite3
101b0 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b  BtreeEnter(pBt);
101c0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
101d0 74 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76  te3PagerExclusiv
101e0 65 4c 6f 63 6b 28 73 71 6c 69 74 65 33 42 74 72  eLock(sqlite3Btr
101f0 65 65 50 61 67 65 72 28 70 42 74 29 29 3b 0a 20  eePager(pBt));. 
10200 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
10210 65 4c 65 61 76 65 28 70 42 74 29 3b 0a 20 20 20  eLeave(pBt);.   
10220 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21   }.  }.  if( rc!
10230 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10240 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
10250 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
10260 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72  are any write-tr
10270 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c  ansactions at al
10280 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f  l, invoke the co
10290 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69  mmit hook */.  i
102a0 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26  f( needXcommit &
102b0 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c  & db->xCommitCal
102c0 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 72 63 20  lback ){.    rc 
102d0 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c  = db->xCommitCal
102e0 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69  lback(db->pCommi
102f0 74 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 72  tArg);.    if( r
10300 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
10310 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
10320 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a  INT_COMMITHOOK;.
10330 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
10340 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20  The simple case 
10350 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  - no more than o
10360 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
10370 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74   (not counting t
10380 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74  he.  ** TEMP dat
10390 61 62 61 73 65 29 20 68 61 73 20 61 20 74 72 61  abase) has a tra
103a0 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e  nsaction active.
103b0 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e     There is no n
103c0 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  eed for the.  **
103d0 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e   master-journal.
103e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
103f0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
10400 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  f sqlite3BtreeGe
10410 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61  tFilename() is a
10420 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a   zero length.  *
10430 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61  * string, it mea
10440 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ns the main data
10450 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a  base is :memory:
10460 20 6f 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e   or a temp file.
10470 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20    In .  ** that 
10480 63 61 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73  case we do not s
10490 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75  upport atomic mu
104a0 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73  lti-file commits
104b0 2c 20 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20  , so use the .  
104c0 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74  ** simple case t
104d0 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20  hen too..  */.  
104e0 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
104f0 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 42 74  rlen30(sqlite3Bt
10500 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64  reeGetFilename(d
10510 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a  b->aDb[0].pBt)).
10520 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a     || nTrans<=1.
10530 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30    ){.    for(i=0
10540 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
10550 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
10560 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
10570 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
10580 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
10590 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
105a0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
105b0 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
105c0 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  pBt, 0);.      }
105d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
105e0 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c  o the commit onl
105f0 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73  y if all databas
10600 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  es successfully 
10610 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31  complete phase 1
10620 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65  . .    ** If one
10630 20 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d   of the BtreeCom
10640 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61  mitPhaseOne() ca
10650 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20  lls fails, this 
10660 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20  indicates an.   
10670 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69   ** IO error whi
10680 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74  le deleting or t
10690 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72  runcating a jour
106a0 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20  nal file. It is 
106b0 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a  unlikely,.    **
106c0 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65   but could happe
106d0 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  n. In this case 
106e0 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69  abandon processi
106f0 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ng and return th
10700 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a  e error..    */.
10710 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
10720 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
10730 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
10740 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
10750 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
10760 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
10770 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
10780 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
10790 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20  itPhaseTwo(pBt, 
107a0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
107b0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
107c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
107d0 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d   sqlite3VtabComm
107e0 69 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  it(db);.    }.  
107f0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70  }..  /* The comp
10800 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65 72 65  lex case - There
10810 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65   is a multi-file
10820 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
10830 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20  on active..  ** 
10840 54 68 69 73 20 72 65 71 75 69 72 65 73 20 61 20  This requires a 
10850 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
10860 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68  ile to ensure th
10870 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
10880 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20  .  ** committed 
10890 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 2a 2f  atomically..  */
108a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
108b0 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c  OMIT_DISKIO.  el
108c0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
108d0 76 66 73 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e  vfs *pVfs = db->
108e0 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e 65  pVfs;.    int ne
108f0 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
10900 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20  char *zMaster = 
10910 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d  0;   /* File-nam
10920 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72  e for the master
10930 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20   journal */.    
10940 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69  char const *zMai
10950 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42  nFile = sqlite3B
10960 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
10970 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b  db->aDb[0].pBt);
10980 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .    sqlite3_fil
10990 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a  e *pMaster = 0;.
109a0 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
109b0 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b   0;.    int res;
109c0 0a 20 20 20 20 69 6e 74 20 72 65 74 72 79 43 6f  .    int retryCo
109d0 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  unt = 0;.    int
109e0 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20   nMainFile;..   
109f0 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73   /* Select a mas
10a00 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
10a10 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61   name */.    nMa
10a20 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  inFile = sqlite3
10a30 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69  Strlen30(zMainFi
10a40 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72  le);.    zMaster
10a50 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
10a60 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58  f(db, "%s-mjXXXX
10a70 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69  XX9XXz", zMainFi
10a80 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61  le);.    if( zMa
10a90 73 74 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  ster==0 ) return
10aa0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
10ab0 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75 33     do {.      u3
10ac0 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20 20  2 iRandom;.     
10ad0 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 20   if( retryCount 
10ae0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
10af0 65 74 72 79 43 6f 75 6e 74 3e 31 30 30 20 29 7b  etryCount>100 ){
10b00 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10b10 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55  e3_log(SQLITE_FU
10b20 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65 3a 20  LL, "MJ delete: 
10b30 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  %s", zMaster);. 
10b40 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10b50 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
10b60 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
10b70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10b80 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
10b90 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a  etryCount==1 ){.
10ba0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10bb0 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c  3_log(SQLITE_FUL
10bc0 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20  L, "MJ collide: 
10bd0 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  %s", zMaster);. 
10be0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
10bf0 0a 20 20 20 20 20 20 72 65 74 72 79 43 6f 75 6e  .      retryCoun
10c00 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t++;.      sqlit
10c10 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
10c20 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26  zeof(iRandom), &
10c30 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20  iRandom);.      
10c40 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
10c50 28 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b 6e 4d  (13, &zMaster[nM
10c60 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30  ainFile], "-mj%0
10c70 36 58 39 25 30 32 58 22 2c 0a 20 20 20 20 20 20  6X9%02X",.      
10c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c90 20 20 20 20 20 20 20 20 20 28 69 52 61 6e 64 6f           (iRando
10ca0 6d 3e 3e 38 29 26 30 78 66 66 66 66 66 66 2c 20  m>>8)&0xffffff, 
10cb0 69 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b 0a 20  iRandom&0xff);. 
10cc0 20 20 20 20 20 2f 2a 20 54 68 65 20 61 6e 74 69       /* The anti
10cd0 70 65 6e 75 6c 74 69 6d 61 74 65 20 63 68 61 72  penultimate char
10ce0 61 63 74 65 72 20 6f 66 20 74 68 65 20 6d 61 73  acter of the mas
10cf0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
10d00 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62   must.      ** b
10d10 65 20 22 39 22 20 74 6f 20 61 76 6f 69 64 20 6e  e "9" to avoid n
10d20 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77  ame collisions w
10d30 68 65 6e 20 75 73 69 6e 67 20 38 2b 33 20 66 69  hen using 8+3 fi
10d40 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20  lenames. */.    
10d50 20 20 61 73 73 65 72 74 28 20 7a 4d 61 73 74 65    assert( zMaste
10d60 72 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  r[sqlite3Strlen3
10d70 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d 3d 27  0(zMaster)-3]=='
10d80 39 27 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  9' );.      sqli
10d90 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 7a  te3FileSuffix3(z
10da0 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73 74 65  MainFile, zMaste
10db0 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  r);.      rc = s
10dc0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
10dd0 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51  Vfs, zMaster, SQ
10de0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
10df0 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d  TS, &res);.    }
10e00 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
10e10 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a 20  E_OK && res );. 
10e20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
10e30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
10e40 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   Open the master
10e50 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20   journal. */.   
10e60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
10e70 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73  sOpenMalloc(pVfs
10e80 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 73  , zMaster, &pMas
10e90 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ter, .          
10ea0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
10eb0 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
10ec0 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20  N_CREATE|.      
10ed0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
10ee0 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45  EXCLUSIVE|SQLITE
10ef0 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
10f00 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b  RNAL, 0.      );
10f10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
10f20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
10f30 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
10f40 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
10f50 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
10f60 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f  c;.    }. .    /
10f70 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65  * Write the name
10f80 20 6f 66 20 65 61 63 68 20 64 61 74 61 62 61 73   of each databas
10f90 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72  e file in the tr
10fa0 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74  ansaction into t
10fb0 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61  he new.    ** ma
10fc0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
10fd0 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  e. If an error o
10fe0 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f  ccurs at this po
10ff0 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a  int close.    **
11000 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
11010 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
11020 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64  ile. All the ind
11030 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20  ividual journal 
11040 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69  files.    ** sti
11050 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61  ll have 'null' a
11060 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
11070 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f  rnal pointer, so
11080 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a   they will roll.
11090 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65      ** back inde
110a0 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66  pendently if a f
110b0 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20  ailure occurs.. 
110c0 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
110d0 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
110e0 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
110f0 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
11100 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
11110 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
11120 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  nTrans(pBt) ){. 
11130 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73         char cons
11140 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74  t *zFile = sqlit
11150 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61  e3BtreeGetJourna
11160 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20  lname(pBt);.    
11170 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30      if( zFile==0
11180 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   ){.          co
11190 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f  ntinue;  /* Igno
111a0 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65 6d  re TEMP and :mem
111b0 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73 20 2a  ory: databases *
111c0 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  /.        }.    
111d0 20 20 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c      assert( zFil
111e0 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20  e[0]!=0 );.     
111f0 20 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63     if( !needSync
11200 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65   && !sqlite3Btre
11210 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42  eSyncDisabled(pB
11220 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
11230 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
11240 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11250 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
11260 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69  ite(pMaster, zFi
11270 6c 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  le, sqlite3Strle
11280 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66  n30(zFile)+1, of
11290 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f  fset);.        o
112a0 66 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33  ffset += sqlite3
112b0 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b  Strlen30(zFile)+
112c0 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  1;.        if( r
112d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
112e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
112f0 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
11300 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
11310 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
11320 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
11330 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  0);.          sq
11340 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
11350 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
11360 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
11370 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11380 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
11390 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ync the master j
113a0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
113b0 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e  the IOCAP_SEQUEN
113c0 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20  TIAL device.    
113d0 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  ** flag is set t
113e0 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
113f0 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
11400 69 66 28 20 6e 65 65 64 53 79 6e 63 20 0a 20 20  if( needSync .  
11410 20 20 20 26 26 20 30 3d 3d 28 73 71 6c 69 74 65     && 0==(sqlite
11420 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
11430 65 72 69 73 74 69 63 73 28 70 4d 61 73 74 65 72  eristics(pMaster
11440 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  )&SQLITE_IOCAP_S
11450 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 20 20 20  EQUENTIAL).     
11460 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  && SQLITE_OK!=(r
11470 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
11480 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  c(pMaster, SQLIT
11490 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a  E_SYNC_NORMAL)).
114a0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c      ){.      sql
114b0 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
114c0 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  pMaster);.      
114d0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
114e0 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
114f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11500 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
11510 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
11520 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
11530 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65   /* Sync all the
11540 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76   db files involv
11550 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61  ed in the transa
11560 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20  ction. The same 
11570 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73  call.    ** sets
11580 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
11590 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65  nal pointer in e
115a0 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  ach individual j
115b0 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a  ournal. If.    *
115c0 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * an error occur
115d0 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64  s here, do not d
115e0 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
115f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
11600 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
11610 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73  the error occurs
11620 20 64 75 72 69 6e 67 20 74 68 65 20 66 69 72 73   during the firs
11630 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  t call to.    **
11640 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
11650 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c 20 74  mitPhaseOne(), t
11660 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 20 63  hen there is a c
11670 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 0a 20  hance that the. 
11680 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75     ** master jou
11690 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62  rnal file will b
116a0 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20  e orphaned. But 
116b0 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65  we cannot delete
116c0 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63   it,.    ** in c
116d0 61 73 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ase the master j
116e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
116f0 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74   was written int
11700 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
11710 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65    ** file before
11720 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f 63 63   the failure occ
11730 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  urred..    */.  
11740 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
11750 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
11760 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
11770 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
11780 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
11790 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
117a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
117b0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
117c0 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a  tPhaseOne(pBt, z
117d0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 7d  Master);.      }
117e0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
117f0 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d  e3OsCloseFree(pM
11800 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65  aster);.    asse
11810 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42  rt( rc!=SQLITE_B
11820 55 53 59 20 29 3b 0a 20 20 20 20 69 66 28 20 72  USY );.    if( r
11830 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
11840 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
11850 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
11860 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
11870 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
11880 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   Delete the mast
11890 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
118a0 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68   This commits th
118b0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  e transaction. A
118c0 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e  fter.    ** doin
118d0 67 20 74 68 69 73 20 74 68 65 20 64 69 72 65 63  g this the direc
118e0 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20 61  tory is synced a
118f0 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20  gain before any 
11900 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a  individual.    *
11910 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69  * transaction fi
11920 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e  les are deleted.
11930 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
11940 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
11950 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
11960 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 73  needSync);.    s
11970 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
11980 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a   zMaster);.    z
11990 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
119a0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
119b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
119c0 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c  ..    /* All fil
119d0 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69  es and directori
119e0 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  es have already 
119f0 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20  been synced, so 
11a00 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
11a10 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71    ** calls to sq
11a20 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
11a30 50 68 61 73 65 54 77 6f 28 29 20 61 72 65 20 6f  PhaseTwo() are o
11a40 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65  nly closing file
11a50 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c  s and.    ** del
11a60 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74  eting or truncat
11a70 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66  ing journals. If
11a80 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
11a90 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20 20  wrong while.    
11aa0 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65  ** this is happe
11ab0 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72 65  ning we don't re
11ac0 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20 69  ally care. The i
11ad0 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 0a  ntegrity of the.
11ae0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
11af0 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67 75  on is already gu
11b00 61 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73 6f  aranteed, but so
11b10 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27 20  me stray 'cold' 
11b20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20  journals.    ** 
11b30 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72 6f  may be lying aro
11b40 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20 61  und. Returning a
11b50 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e  n error code won
11b60 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73 2e  't help matters.
11b70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73 61  .    */.    disa
11b80 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
11b90 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73  _errors();.    s
11ba0 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
11bb0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66  nMalloc();.    f
11bc0 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
11bd0 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
11be0 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
11bf0 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
11c00 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
11c10 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
11c20 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
11c30 28 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  (pBt, 1);.      
11c40 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
11c50 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
11c60 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65  oc();.    enable
11c70 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
11c80 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c  rors();..    sql
11c90 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64  ite3VtabCommit(d
11ca0 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
11cb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11cc0 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  /* .** This rout
11cd0 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74 20  ine checks that 
11ce0 74 68 65 20 73 71 6c 69 74 65 33 2e 6e 56 64 62  the sqlite3.nVdb
11cf0 65 41 63 74 69 76 65 20 63 6f 75 6e 74 20 76 61  eActive count va
11d00 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65  riable.** matche
11d10 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
11d20 76 64 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69  vdbe's in the li
11d30 73 74 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65  st sqlite3.pVdbe
11d40 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72   that are.** cur
11d50 72 65 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41  rently active. A
11d60 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c  n assertion fail
11d70 73 20 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75  s if the two cou
11d80 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  nts do not match
11d90 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20  ..** This is an 
11da0 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68  internal self-ch
11db0 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73  eck only - it is
11dc0 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61   not an essentia
11dd0 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20  l processing.** 
11de0 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  step..**.** This
11df0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e   is a no-op if N
11e00 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64  DEBUG is defined
11e10 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
11e20 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20  BUG.static void 
11e30 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
11e40 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  nt(sqlite3 *db){
11e50 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e  .  Vdbe *p;.  in
11e60 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74  t cnt = 0;.  int
11e70 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20 20 69   nWrite = 0;.  i
11e80 6e 74 20 6e 52 65 61 64 20 3d 20 30 3b 0a 20 20  nt nRead = 0;.  
11e90 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20  p = db->pVdbe;. 
11ea0 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
11eb0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 6d   if( sqlite3_stm
11ec0 74 5f 62 75 73 79 28 28 73 71 6c 69 74 65 33 5f  t_busy((sqlite3_
11ed0 73 74 6d 74 2a 29 70 29 20 29 7b 0a 20 20 20 20  stmt*)p) ){.    
11ee0 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69    cnt++;.      i
11ef0 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d  f( p->readOnly==
11f00 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20  0 ) nWrite++;.  
11f10 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65      if( p->bIsRe
11f20 61 64 65 72 20 29 20 6e 52 65 61 64 2b 2b 3b 0a  ader ) nRead++;.
11f30 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d      }.    p = p-
11f40 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73  >pNext;.  }.  as
11f50 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e  sert( cnt==db->n
11f60 56 64 62 65 41 63 74 69 76 65 20 29 3b 0a 20 20  VdbeActive );.  
11f70 61 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d  assert( nWrite==
11f80 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29  db->nVdbeWrite )
11f90 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 61  ;.  assert( nRea
11fa0 64 3d 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64  d==db->nVdbeRead
11fb0 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66   );.}.#else.#def
11fc0 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65 56  ine checkActiveV
11fd0 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66  dbeCnt(x).#endif
11fe0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56  ../*.** If the V
11ff0 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dbe passed as th
12000 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
12010 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74 65 6d   opened a statem
12020 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent-transaction,
12030 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77  .** close it now
12040 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d  . Argument eOp m
12050 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53 41  ust be either SA
12060 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
12070 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54   or.** SAVEPOINT
12080 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 69 74 20  _RELEASE. If it 
12090 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  is SAVEPOINT_ROL
120a0 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 68 65 20  LBACK, then the 
120b0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61  statement.** tra
120c0 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
120d0 65 64 20 62 61 63 6b 2e 20 49 66 20 65 4f 70 20  ed back. If eOp 
120e0 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  is SAVEPOINT_REL
120f0 45 41 53 45 2c 20 74 68 65 6e 20 74 68 65 20 0a  EASE, then the .
12100 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  ** statement tra
12110 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
12120 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  itted..**.** If 
12130 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
12140 72 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f  rs, an SQLITE_IO
12150 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f  ERR_XXX error co
12160 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
12170 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 53 51  .** Otherwise SQ
12180 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
12190 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
121a0 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a  Statement(Vdbe *
121b0 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73  p, int eOp){.  s
121c0 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20 64 62  qlite3 *const db
121d0 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20   = p->db;.  int 
121e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
121f0 0a 20 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61  .  /* If p->iSta
12200 74 65 6d 65 6e 74 20 69 73 20 67 72 65 61 74 65  tement is greate
12210 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  r than zero, the
12220 6e 20 74 68 69 73 20 56 64 62 65 20 6f 70 65 6e  n this Vdbe open
12230 65 64 20 61 20 0a 20 20 2a 2a 20 73 74 61 74 65  ed a .  ** state
12240 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
12250 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
12260 63 6c 6f 73 65 64 20 68 65 72 65 2e 20 54 68 65  closed here. The
12270 20 6f 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a   only exception.
12280 20 20 2a 2a 20 69 73 20 74 68 61 74 20 61 6e 20    ** is that an 
12290 49 4f 20 65 72 72 6f 72 20 6d 61 79 20 68 61 76  IO error may hav
122a0 65 20 6f 63 63 75 72 72 65 64 2c 20 63 61 75 73  e occurred, caus
122b0 69 6e 67 20 61 6e 20 65 6d 65 72 67 65 6e 63 79  ing an emergency
122c0 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20   rollback..  ** 
122d0 49 6e 20 74 68 69 73 20 63 61 73 65 20 28 64 62  In this case (db
122e0 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29  ->nStatement==0)
122f0 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e  , and there is n
12300 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20  othing to do..  
12310 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 74  */.  if( db->nSt
12320 61 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53  atement && p->iS
12330 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  tatement ){.    
12340 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74  int i;.    const
12350 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20   int iSavepoint 
12360 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d  = p->iStatement-
12370 31 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  1;..    assert( 
12380 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
12390 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d  OLLBACK || eOp==
123a0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
123b0 45 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  E);.    assert( 
123c0 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30  db->nStatement>0
123d0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
123e0 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28  p->iStatement==(
123f0 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64  db->nStatement+d
12400 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29  b->nSavepoint) )
12410 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
12420 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
12430 20 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 20   .      int rc2 
12440 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
12450 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
12460 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
12470 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
12480 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70  .        if( eOp
12490 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
124a0 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  BACK ){.        
124b0 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42    rc2 = sqlite3B
124c0 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42  treeSavepoint(pB
124d0 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  t, SAVEPOINT_ROL
124e0 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e  LBACK, iSavepoin
124f0 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
12500 20 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53        if( rc2==S
12510 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12520 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69        rc2 = sqli
12530 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
12540 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54  t(pBt, SAVEPOINT
12550 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70  _RELEASE, iSavep
12560 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  oint);.        }
12570 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
12580 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12590 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32          rc = rc2
125a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
125b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 62    }.    }.    db
125c0 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a  ->nStatement--;.
125d0 20 20 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e      p->iStatemen
125e0 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  t = 0;..    if( 
125f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
12600 0a 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d  .      if( eOp==
12610 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
12620 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  CK ){.        rc
12630 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61   = sqlite3VtabSa
12640 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45  vepoint(db, SAVE
12650 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
12660 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
12670 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
12680 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
12690 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
126a0 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e  ite3VtabSavepoin
126b0 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f  t(db, SAVEPOINT_
126c0 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f  RELEASE, iSavepo
126d0 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  int);.      }.  
126e0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
126f0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
12700 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  nsaction is bein
12710 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61  g rolled back, a
12720 6c 73 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20  lso restore the 
12730 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
12740 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65   handles deferre
12750 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75  d constraint cou
12760 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c 75  nter to the valu
12770 65 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a 20  e it had when . 
12780 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d     ** the statem
12790 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
127a0 77 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a  was opened.  */.
127b0 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56      if( eOp==SAV
127c0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
127d0 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65  ){.      db->nDe
127e0 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e  ferredCons = p->
127f0 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20  nStmtDefCons;.  
12800 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
12810 64 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53  dImmCons = p->nS
12820 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20  tmtDefImmCons;. 
12830 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
12840 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
12850 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
12860 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72  called when a tr
12870 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64  ansaction opened
12880 20 62 79 20 74 68 65 20 64 61 74 61 62 61 73 65   by the database
12890 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f   .** handle asso
128a0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
128b0 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  VM passed as an 
128c0 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62 6f 75  argument is abou
128d0 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d  t to be .** comm
128e0 69 74 74 65 64 2e 20 49 66 20 74 68 65 72 65 20  itted. If there 
128f0 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
12900 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e  deferred foreign
12910 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a   key constraint.
12920 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72  ** violations, r
12930 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
12940 4f 52 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  OR. Otherwise, S
12950 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
12960 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
12970 73 74 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c  standing FK viol
12980 61 74 69 6f 6e 73 20 61 6e 64 20 74 68 69 73 20  ations and this 
12990 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
129a0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f   .** SQLITE_ERRO
129b0 52 2c 20 73 65 74 20 74 68 65 20 72 65 73 75 6c  R, set the resul
129c0 74 20 6f 66 20 74 68 65 20 56 4d 20 74 6f 20 53  t of the VM to S
129d0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
129e0 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a 20 61  _FOREIGNKEY.** a
129f0 6e 64 20 77 72 69 74 65 20 61 6e 20 65 72 72 6f  nd write an erro
12a00 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69 74 2e  r message to it.
12a10 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c   Then return SQL
12a20 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69  ITE_ERROR..*/.#i
12a30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12a40 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69 6e  T_FOREIGN_KEY.in
12a50 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  t sqlite3VdbeChe
12a60 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20 69 6e  ckFk(Vdbe *p, in
12a70 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20 20 73  t deferred){.  s
12a80 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
12a90 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66 65 72  db;.  if( (defer
12aa0 72 65 64 20 26 26 20 28 64 62 2d 3e 6e 44 65 66  red && (db->nDef
12ab0 65 72 72 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e 44  erredCons+db->nD
12ac0 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 29 3e  eferredImmCons)>
12ad0 30 29 20 0a 20 20 20 7c 7c 20 28 21 64 65 66 65  0) .   || (!defe
12ae0 72 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f  rred && p->nFkCo
12af0 6e 73 74 72 61 69 6e 74 3e 30 29 20 0a 20 20 29  nstraint>0) .  )
12b00 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
12b10 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
12b20 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20  FOREIGNKEY;.    
12b30 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d  p->errorAction =
12b40 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73   OE_Abort;.    s
12b50 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28  qlite3VdbeError(
12b60 70 2c 20 22 46 4f 52 45 49 47 4e 20 4b 45 59 20  p, "FOREIGN KEY 
12b70 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
12b80 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  d");.    return 
12b90 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
12ba0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
12bb0 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
12bc0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
12bd0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  ne is called the
12be0 20 77 68 65 6e 20 61 20 56 44 42 45 20 74 72 69   when a VDBE tri
12bf0 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20  es to halt.  If 
12c00 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20  the VDBE.** has 
12c10 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64  made changes and
12c20 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69   is in autocommi
12c30 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d  t mode, then com
12c40 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61  mit those.** cha
12c50 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c  nges.  If a roll
12c60 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20  back is needed, 
12c70 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c  then do the roll
12c80 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  back..**.** This
12c90 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
12ca0 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65  only way to move
12cb0 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20   the state of a 
12cc0 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54  VM from.** SQLIT
12cd0 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53  E_MAGIC_RUN to S
12ce0 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54  QLITE_MAGIC_HALT
12cf0 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65 73  .  It is harmles
12d00 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69  s to.** call thi
12d10 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20 69  s on a VM that i
12d20 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  s in the SQLITE_
12d30 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74 65  MAGIC_HALT state
12d40 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
12d50 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49  n error code.  I
12d60 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75  f the commit cou
12d70 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20  ld not complete 
12d80 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f  because of.** lo
12d90 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72  ck contention, r
12da0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
12db0 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55  Y.  If SQLITE_BU
12dc0 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  SY is returned, 
12dd0 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20  it.** means the 
12de0 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61  close did not ha
12df0 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74  ppen and needs t
12e00 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a  o be repeated..*
12e10 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
12e20 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a  eHalt(Vdbe *p){.
12e30 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
12e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e50 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74 6f    /* Used to sto
12e60 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65 74  re transient ret
12e70 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20 73  urn codes */.  s
12e80 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
12e90 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66  db;..  /* This f
12ea0 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  unction contains
12eb0 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20   the logic that 
12ec0 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20  determines if a 
12ed0 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a  statement or.  *
12ee0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  * transaction wi
12ef0 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20  ll be committed 
12f00 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  or rolled back a
12f10 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  s a result of th
12f20 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e  e.  ** execution
12f30 20 6f 66 20 74 68 69 73 20 76 69 72 74 75 61 6c   of this virtual
12f40 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a   machine. .  **.
12f50 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74    ** If any of t
12f60 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72  he following err
12f70 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a  ors occur:.  **.
12f80 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
12f90 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53  NOMEM.  **     S
12fa0 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a  QLITE_IOERR.  **
12fb0 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c       SQLITE_FULL
12fc0 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
12fd0 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a  _INTERRUPT.  **.
12fe0 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e    ** Then the in
12ff0 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67  ternal cache mig
13000 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66  ht have been lef
13010 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73  t in an inconsis
13020 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e  tent.  ** state.
13030 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c    We need to rol
13040 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d  lback the statem
13050 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent transaction,
13060 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a   if there is.  *
13070 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f  * one, or the co
13080 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69  mplete transacti
13090 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  on if there is n
130a0 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  o statement tran
130b0 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20  saction..  */.. 
130c0 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
130d0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
130e0 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
130f0 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OMEM;.  }.  if( 
13100 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 29 20 6d  p->aOnceFlag ) m
13110 65 6d 73 65 74 28 70 2d 3e 61 4f 6e 63 65 46 6c  emset(p->aOnceFl
13120 61 67 2c 20 30 2c 20 70 2d 3e 6e 4f 6e 63 65 46  ag, 0, p->nOnceF
13130 6c 61 67 29 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c  lag);.  closeAll
13140 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20 69 66  Cursors(p);.  if
13150 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45  ( p->magic!=VDBE
13160 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20  _MAGIC_RUN ){.  
13170 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13180 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b 41  OK;.  }.  checkA
13190 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
131a0 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69  ;..  /* No commi
131b0 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65  t or rollback ne
131c0 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f 67  eded if the prog
131d0 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65  ram never starte
131e0 64 20 6f 72 20 69 66 20 74 68 65 0a 20 20 2a 2a  d or if the.  **
131f0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 64   SQL statement d
13200 6f 65 73 20 6e 6f 74 20 72 65 61 64 20 6f 72 20  oes not read or 
13210 77 72 69 74 65 20 61 20 64 61 74 61 62 61 73 65  write a database
13220 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28   file.  */.  if(
13230 20 70 2d 3e 70 63 3e 3d 30 20 26 26 20 70 2d 3e   p->pc>=0 && p->
13240 62 49 73 52 65 61 64 65 72 20 29 7b 0a 20 20 20  bIsReader ){.   
13250 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50   int mrc;   /* P
13260 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64  rimary error cod
13270 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a  e from p->rc */.
13280 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d 65      int eStateme
13290 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ntOp = 0;.    in
132a0 74 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72  t isSpecialError
132b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
132c0 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61  Set to true if a
132d0 20 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f 72   'special' error
132e0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b   */..    /* Lock
132f0 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64   all btrees used
13300 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e   by the statemen
13310 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  t */.    sqlite3
13320 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20  VdbeEnter(p);.. 
13330 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
13340 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  one of the speci
13350 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20  al errors */.   
13360 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30   mrc = p->rc & 0
13370 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65 63 69  xff;.    isSpeci
13380 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53  alError = mrc==S
13390 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d  QLITE_NOMEM || m
133a0 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
133b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
133c0 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51        || mrc==SQ
133d0 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c  LITE_INTERRUPT |
133e0 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55  | mrc==SQLITE_FU
133f0 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70  LL;.    if( isSp
13400 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20  ecialError ){.  
13410 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75      /* If the qu
13420 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c  ery was read-onl
13430 79 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20  y and the error 
13440 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 49  code is SQLITE_I
13450 4e 54 45 52 52 55 50 54 2c 20 0a 20 20 20 20 20  NTERRUPT, .     
13460 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20   ** no rollback 
13470 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20 4f 74  is necessary. Ot
13480 68 65 72 77 69 73 65 2c 20 61 74 20 6c 65 61 73  herwise, at leas
13490 74 20 61 20 73 61 76 65 70 6f 69 6e 74 20 0a 20  t a savepoint . 
134a0 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
134b0 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c  ion must be roll
134c0 65 64 20 62 61 63 6b 20 74 6f 20 72 65 73 74 6f  ed back to resto
134d0 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
134e0 74 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63  to a .      ** c
134f0 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e  onsistent state.
13500 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
13510 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65 20 73  ** Even if the s
13520 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65 61 64  tatement is read
13530 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d 70  -only, it is imp
13540 6f 72 74 61 6e 74 20 74 6f 20 70 65 72 66 6f 72  ortant to perfor
13550 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 74 61  m.      ** a sta
13560 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73 61  tement or transa
13570 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f  ction rollback o
13580 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65  peration. If the
13590 20 65 72 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a   error .      **
135a0 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
135b0 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a  writing to the j
135c0 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75 72  ournal, sub-jour
135d0 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73 65 0a  nal or database.
135e0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73        ** file as
135f0 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66 66 6f   part of an effo
13600 72 74 20 74 6f 20 66 72 65 65 20 75 70 20 63 61  rt to free up ca
13610 63 68 65 20 73 70 61 63 65 20 28 73 65 65 20 66  che space (see f
13620 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  unction.      **
13630 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20 69   pagerStress() i
13640 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68 65 20  n pager.c), the 
13650 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65 71 75  rollback is requ
13660 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20  ired to restore 
13670 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 61  .      ** the pa
13680 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69 73 74  ger to a consist
13690 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20  ent state..     
136a0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70   */.      if( !p
136b0 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72  ->readOnly || mr
136c0 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  c!=SQLITE_INTERR
136d0 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69  UPT ){.        i
136e0 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f  f( (mrc==SQLITE_
136f0 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51  NOMEM || mrc==SQ
13700 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d  LITE_FULL) && p-
13710 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c  >usesStmtJournal
13720 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53   ){.          eS
13730 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56  tatementOp = SAV
13740 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b  EPOINT_ROLLBACK;
13750 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
13760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
13770 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72 6f  are forced to ro
13780 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74 69  ll back the acti
13790 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ve transaction. 
137a0 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20  Before doing.   
137b0 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62         ** so, ab
137c0 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73 74  ort any other st
137d0 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68 61  atements this ha
137e0 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 68  ndle currently h
137f0 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20  as active..     
13800 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
13810 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
13820 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
13830 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b  ABORT_ROLLBACK);
13840 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
13850 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
13860 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  s(db);.         
13870 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
13880 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 1;.          p
13890 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
138a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
138b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
138c0 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61  heck for immedia
138d0 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 76  te foreign key v
138e0 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20  iolations. */.  
138f0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
13900 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
13910 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
13920 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Fk(p, 0);.    }.
13930 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
13940 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
13950 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 69  g is set and thi
13960 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63  s is the only ac
13970 74 69 76 65 20 77 72 69 74 65 72 20 0a 20 20 20  tive writer .   
13980 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65 20   ** VM, then we 
13990 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d  do either a comm
139a0 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f  it or rollback o
139b0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  f the current tr
139c0 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20  ansaction. .    
139d0 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20  **.    ** Note: 
139e0 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20  This block also 
139f0 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74  runs if one of t
13a00 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72  he special error
13a10 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a  s handled .    *
13a20 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75  * above has occu
13a30 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rred. .    */.  
13a40 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56 74    if( !sqlite3Vt
13a50 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20  abInSync(db) .  
13a60 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f     && db->autoCo
13a70 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64 62  mmit .     && db
13a80 2d 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d 28 70  ->nVdbeWrite==(p
13a90 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a  ->readOnly==0) .
13aa0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28      ){.      if(
13ab0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
13ac0 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63  K || (p->errorAc
13ad0 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26  tion==OE_Fail &&
13ae0 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72   !isSpecialError
13af0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
13b00 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  = sqlite3VdbeChe
13b10 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20  ckFk(p, 1);.    
13b20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
13b30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
13b40 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e     if( NEVER(p->
13b50 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  readOnly) ){.   
13b60 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13b70 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  VdbeLeave(p);.  
13b80 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
13b90 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
13ba0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
13bb0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
13bc0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
13bd0 49 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20 20  IGNKEY;.        
13be0 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 20  }else{ .        
13bf0 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f    /* The auto-co
13c00 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 75  mmit flag is tru
13c10 65 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f 67  e, the vdbe prog
13c20 72 61 6d 20 77 61 73 20 73 75 63 63 65 73 73 66  ram was successf
13c30 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ul .          **
13c40 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46   or hit an 'OR F
13c50 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20  AIL' constraint 
13c60 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f  and there are no
13c70 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67   deferred foreig
13c80 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b  n.          ** k
13c90 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  ey constraints t
13ca0 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72  o hold up the tr
13cb0 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20  ansaction. This 
13cc0 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a  means a commit .
13cd0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20            ** is 
13ce0 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
13cf0 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65         rc = vdbe
13d00 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20  Commit(db, p);. 
13d10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13d20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13d30 42 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64 4f  BUSY && p->readO
13d40 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nly ){.         
13d50 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
13d60 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
13d70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
13d80 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  SY;.        }els
13d90 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45  e if( rc!=SQLITE
13da0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
13db0 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
13dc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
13dd0 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
13de0 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20  LITE_OK);.      
13df0 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
13e00 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
13e10 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  e{.          db-
13e20 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d  >nDeferredCons =
13e30 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62   0;.          db
13e40 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f  ->nDeferredImmCo
13e50 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ns = 0;.        
13e60 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
13e70 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b  SQLITE_DeferFKs;
13e80 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
13e90 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c  e3CommitInternal
13ea0 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20  Changes(db);.   
13eb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
13ec0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
13ed0 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
13ee0 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  b, SQLITE_OK);. 
13ef0 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67         p->nChang
13f00 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
13f10 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d       db->nStatem
13f20 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ent = 0;.    }el
13f30 73 65 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e  se if( eStatemen
13f40 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tOp==0 ){.      
13f50 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
13f60 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72  E_OK || p->error
13f70 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20  Action==OE_Fail 
13f80 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74  ){.        eStat
13f90 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f  ementOp = SAVEPO
13fa0 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20  INT_RELEASE;.   
13fb0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
13fc0 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
13fd0 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Abort ){.       
13fe0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
13ff0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
14000 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  CK;.      }else{
14010 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14020 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
14030 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
14040 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  LBACK);.        
14050 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
14060 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  points(db);.    
14070 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
14080 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  it = 1;.        
14090 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
140a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
140b0 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74 61 74  .    /* If eStat
140c0 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a  ementOp is non-z
140d0 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74 61 74  ero, then a stat
140e0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
140f0 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a  n needs to.    *
14100 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f  * be committed o
14110 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43  r rolled back. C
14120 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 43  all sqlite3VdbeC
14130 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20  loseStatement() 
14140 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e  to.    ** do so.
14150 20 49 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   If this operati
14160 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  on returns an er
14170 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63 75 72  ror, and the cur
14180 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a 20  rent statement. 
14190 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65     ** error code
141a0 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72   is SQLITE_OK or
141b0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
141c0 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65  NT, then promote
141d0 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72   the.    ** curr
141e0 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 65 72  ent statement er
141f0 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f  ror code..    */
14200 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d  .    if( eStatem
14210 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20 20 72  entOp ){.      r
14220 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  c = sqlite3VdbeC
14230 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c  loseStatement(p,
14240 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a   eStatementOp);.
14250 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
14260 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
14270 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
14280 28 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53 51  (p->rc&0xff)==SQ
14290 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
142a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
142b0 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20  rc = rc;.       
142c0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
142d0 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
142e0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a  ;.          p->z
142f0 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
14300 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
14310 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
14320 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52  (db, SQLITE_ABOR
14330 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20  T_ROLLBACK);.   
14340 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73       sqlite3Clos
14350 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
14360 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74  .        db->aut
14370 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
14380 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
14390 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
143a0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
143b0 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45  this was an INSE
143c0 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45  RT, UPDATE or DE
143d0 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73 74 61 74  LETE and no stat
143e0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
143f0 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65  n.    ** has bee
14400 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75  n rolled back, u
14410 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61  pdate the databa
14420 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68  se connection ch
14430 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20  ange-counter. . 
14440 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
14450 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a  >changeCntOn ){.
14460 20 20 20 20 20 20 69 66 28 20 65 53 74 61 74 65        if( eState
14470 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e  mentOp!=SAVEPOIN
14480 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
14490 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
144a0 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20  eSetChanges(db, 
144b0 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20  p->nChange);.   
144c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
144d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
144e0 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a  Changes(db, 0);.
144f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
14500 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
14510 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65    }..    /* Rele
14520 61 73 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f  ase the locks */
14530 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14540 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20  Leave(p);.  }.. 
14550 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63 63   /* We have succ
14560 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20  essfully halted 
14570 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56  and closed the V
14580 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73 20  M.  Record this 
14590 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  fact. */.  if( p
145a0 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64  ->pc>=0 ){.    d
145b0 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 2d 2d  b->nVdbeActive--
145c0 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65  ;.    if( !p->re
145d0 61 64 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e 56 64  adOnly ) db->nVd
145e0 62 65 57 72 69 74 65 2d 2d 3b 0a 20 20 20 20 69  beWrite--;.    i
145f0 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  f( p->bIsReader 
14600 29 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d  ) db->nVdbeRead-
14610 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  -;.    assert( d
14620 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 3d  b->nVdbeActive>=
14630 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b  db->nVdbeRead );
14640 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
14650 3e 6e 56 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e  >nVdbeRead>=db->
14660 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20  nVdbeWrite );.  
14670 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56    assert( db->nV
14680 64 62 65 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20  dbeWrite>=0 );. 
14690 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20   }.  p->magic = 
146a0 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b  VDBE_MAGIC_HALT;
146b0 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  .  checkActiveVd
146c0 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28  beCnt(db);.  if(
146d0 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
146e0 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72  iled ){.    p->r
146f0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
14700 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
14710 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66  he auto-commit f
14720 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 74 72  lag is set to tr
14730 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63  ue, then any loc
14740 6b 73 20 74 68 61 74 20 77 65 72 65 20 68 65 6c  ks that were hel
14750 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63  d.  ** by connec
14760 74 69 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77  tion db have now
14770 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20   been released. 
14780 43 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e  Call sqlite3Conn
14790 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29  ectionUnlocked()
147a0 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65   .  ** to invoke
147b0 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e   any required un
147c0 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c  lock-notify call
147d0 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  backs..  */.  if
147e0 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  ( db->autoCommit
147f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
14800 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65  onnectionUnlocke
14810 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  d(db);.  }..  as
14820 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41  sert( db->nVdbeA
14830 63 74 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61  ctive>0 || db->a
14840 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20  utoCommit==0 || 
14850 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d  db->nStatement==
14860 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  0 );.  return (p
14870 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ->rc==SQLITE_BUS
14880 59 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20  Y ? SQLITE_BUSY 
14890 3a 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a  : SQLITE_OK);.}.
148a0 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42  ../*.** Each VDB
148b0 45 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75  E holds the resu
148c0 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  lt of the most r
148d0 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74  ecent sqlite3_st
148e0 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20  ep() call.** in 
148f0 70 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75  p->rc.  This rou
14900 74 69 6e 65 20 73 65 74 73 20 74 68 61 74 20 72  tine sets that r
14910 65 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51  esult back to SQ
14920 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64  LITE_OK..*/.void
14930 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
14940 74 53 74 65 70 52 65 73 75 6c 74 28 56 64 62 65  tStepResult(Vdbe
14950 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20   *p){.  p->rc = 
14960 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
14970 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 65 72 72  .** Copy the err
14980 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f  or code and erro
14990 72 20 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e 67  r message belong
149a0 69 6e 67 20 74 6f 20 74 68 65 20 56 44 42 45 20  ing to the VDBE 
149b0 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65  passed.** as the
149c0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
149d0 74 6f 20 69 74 73 20 64 61 74 61 62 61 73 65 20  to its database 
149e0 68 61 6e 64 6c 65 20 28 73 6f 20 74 68 61 74 20  handle (so that 
149f0 74 68 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a  they will be .**
14a00 20 72 65 74 75 72 6e 65 64 20 62 79 20 63 61 6c   returned by cal
14a10 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 72  ls to sqlite3_er
14a20 72 63 6f 64 65 28 29 20 61 6e 64 20 73 71 6c 69  rcode() and sqli
14a30 74 65 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a  te3_errmsg())..*
14a40 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
14a50 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61  on does not clea
14a60 72 20 74 68 65 20 56 44 42 45 20 65 72 72 6f 72  r the VDBE error
14a70 20 63 6f 64 65 20 6f 72 20 6d 65 73 73 61 67 65   code or message
14a80 2c 20 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73  , just.** copies
14a90 20 74 68 65 6d 20 74 6f 20 74 68 65 20 64 61 74   them to the dat
14aa0 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f  abase handle..*/
14ab0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
14ac0 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28 56 64  TransferError(Vd
14ad0 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
14ae0 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
14af0 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b   int rc = p->rc;
14b00 0a 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73  .  if( p->zErrMs
14b10 67 20 29 7b 0a 20 20 20 20 75 38 20 6d 61 6c 6c  g ){.    u8 mall
14b20 6f 63 46 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d  ocFailed = db->m
14b30 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20  allocFailed;.   
14b40 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
14b50 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
14b60 20 69 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30   if( db->pErr==0
14b70 20 29 20 64 62 2d 3e 70 45 72 72 20 3d 20 73 71   ) db->pErr = sq
14b80 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62  lite3ValueNew(db
14b90 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  );.    sqlite3Va
14ba0 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45  lueSetStr(db->pE
14bb0 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d  rr, -1, p->zErrM
14bc0 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  sg, SQLITE_UTF8,
14bd0 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
14be0 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  T);.    sqlite3E
14bf0 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
14c00 3b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  ;.    db->malloc
14c10 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 46  Failed = mallocF
14c20 61 69 6c 65 64 3b 0a 20 20 20 20 64 62 2d 3e 65  ailed;.    db->e
14c30 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d  rrCode = rc;.  }
14c40 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
14c50 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a  3Error(db, rc);.
14c60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
14c70 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
14c80 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a  E_ENABLE_SQLLOG.
14c90 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 53 51 4c 49  /*.** If an SQLI
14ca0 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47  TE_CONFIG_SQLLOG
14cb0 20 68 6f 6f 6b 20 69 73 20 72 65 67 69 73 74 65   hook is registe
14cc0 72 65 64 20 61 6e 64 20 74 68 65 20 56 4d 20 68  red and the VM h
14cd0 61 73 20 62 65 65 6e 20 72 75 6e 2c 20 0a 2a 2a  as been run, .**
14ce0 20 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a 73   invoke it..*/.s
14cf0 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 49  tatic void vdbeI
14d00 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 56 64 62 65  nvokeSqllog(Vdbe
14d10 20 2a 76 29 7b 0a 20 20 69 66 28 20 73 71 6c 69   *v){.  if( sqli
14d20 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
14d30 78 53 71 6c 6c 6f 67 20 26 26 20 76 2d 3e 72 63  xSqllog && v->rc
14d40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 76  ==SQLITE_OK && v
14d50 2d 3e 7a 53 71 6c 20 26 26 20 76 2d 3e 70 63 3e  ->zSql && v->pc>
14d60 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =0 ){.    char *
14d70 7a 45 78 70 61 6e 64 65 64 20 3d 20 73 71 6c 69  zExpanded = sqli
14d80 74 65 33 56 64 62 65 45 78 70 61 6e 64 53 71 6c  te3VdbeExpandSql
14d90 28 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20 20  (v, v->zSql);.  
14da0 20 20 61 73 73 65 72 74 28 20 76 2d 3e 64 62 2d    assert( v->db-
14db0 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b  >init.busy==0 );
14dc0 0a 20 20 20 20 69 66 28 20 7a 45 78 70 61 6e 64  .    if( zExpand
14dd0 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ed ){.      sqli
14de0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
14df0 78 53 71 6c 6c 6f 67 28 0a 20 20 20 20 20 20 20  xSqllog(.       
14e00 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
14e10 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72  Config.pSqllogAr
14e20 67 2c 20 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e  g, v->db, zExpan
14e30 64 65 64 2c 20 31 0a 20 20 20 20 20 20 29 3b 0a  ded, 1.      );.
14e40 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
14e50 72 65 65 28 76 2d 3e 64 62 2c 20 7a 45 78 70 61  ree(v->db, zExpa
14e60 6e 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  nded);.    }.  }
14e70 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
14e80 65 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c  e vdbeInvokeSqll
14e90 6f 67 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  og(x).#endif../*
14ea0 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56  .** Clean up a V
14eb0 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74  DBE after execut
14ec0 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64  ion but do not d
14ed0 65 6c 65 74 65 20 74 68 65 20 56 44 42 45 20 6a  elete the VDBE j
14ee0 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74  ust yet..** Writ
14ef0 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  e any error mess
14f00 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72  ages into *pzErr
14f10 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65  Msg.  Return the
14f20 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a   result code..**
14f30 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72  .** After this r
14f40 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74  outine is run, t
14f50 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62  he VDBE should b
14f60 65 20 72 65 61 64 79 20 74 6f 20 62 65 20 65 78  e ready to be ex
14f70 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e  ecuted.** again.
14f80 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61  .**.** To look a
14f90 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79  t it another way
14fa0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
14fb0 65 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20  esets the state 
14fc0 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61  of the.** virtua
14fd0 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56  l machine from V
14fe0 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72  DBE_MAGIC_RUN or
14ff0 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54   VDBE_MAGIC_HALT
15000 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45   back to.** VDBE
15010 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a  _MAGIC_INIT..*/.
15020 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52  int sqlite3VdbeR
15030 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  eset(Vdbe *p){. 
15040 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
15050 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f  db = p->db;..  /
15060 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69 64 20  * If the VM did 
15070 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c  not run to compl
15080 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65  etion or if it e
15090 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20  ncountered an.  
150a0 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69  ** error, then i
150b0 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65  t might not have
150c0 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f   been halted pro
150d0 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a  perly.  So halt.
150e0 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a    ** it now..  *
150f0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 48  /.  sqlite3VdbeH
15100 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  alt(p);..  /* If
15110 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65   the VDBE has be
15120 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61   run even partia
15130 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66  lly, then transf
15140 65 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  er the error cod
15150 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72  e.  ** and error
15160 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68   message from th
15170 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20  e VDBE into the 
15180 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74  main database st
15190 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20  ructure.  But.  
151a0 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68  ** if the VDBE h
151b0 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74  as just been set
151c0 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20   to run but has 
151d0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65  not actually exe
151e0 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69  cuted any.  ** i
151f0 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c  nstructions yet,
15200 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20   leave the main 
15210 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69  database error i
15220 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61  nformation uncha
15230 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nged..  */.  if(
15240 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
15250 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f   vdbeInvokeSqllo
15260 67 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  g(p);.    sqlite
15270 33 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72  3VdbeTransferErr
15280 6f 72 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  or(p);.    sqlit
15290 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
152a0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d  zErrMsg);.    p-
152b0 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
152c0 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79    if( p->runOnly
152d0 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 69 72 65  Once ) p->expire
152e0 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  d = 1;.  }else i
152f0 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65  f( p->rc && p->e
15300 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a  xpired ){.    /*
15310 20 54 68 65 20 65 78 70 69 72 65 64 20 66 6c 61   The expired fla
15320 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65  g was set on the
15330 20 56 44 42 45 20 62 65 66 6f 72 65 20 74 68 65   VDBE before the
15340 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20   first call.    
15350 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74  ** to sqlite3_st
15360 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73  ep(). For consis
15370 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c  tency (since sql
15380 69 74 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a  ite3_step() was.
15390 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20      ** called), 
153a0 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  set the database
153b0 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63   error in this c
153c0 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20  ase as well..   
153d0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
153e0 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
153f0 70 2d 3e 72 63 2c 20 70 2d 3e 7a 45 72 72 4d 73  p->rc, p->zErrMs
15400 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20 70 2d  g ? "%s" : 0, p-
15410 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73  >zErrMsg);.    s
15420 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
15430 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
15440 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
15450 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c  ;.  }..  /* Recl
15460 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75  aim all memory u
15470 73 65 64 20 62 79 20 74 68 65 20 56 44 42 45 0a  sed by the VDBE.
15480 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70    */.  Cleanup(p
15490 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72  );..  /* Save pr
154a0 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74  ofiling informat
154b0 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44  ion from this VD
154c0 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66  BE run..  */.#if
154d0 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45  def VDBE_PROFILE
154e0 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f  .  {.    FILE *o
154f0 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65  ut = fopen("vdbe
15500 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22  _profile.out", "
15510 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74  a");.    if( out
15520 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
15530 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
15540 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20  ut, "---- ");.  
15550 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
15560 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
15570 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
15580 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70  , "%02x", p->aOp
15590 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20  [i].opcode);.   
155a0 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e     }.      fprin
155b0 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  tf(out, "\n");. 
155c0 20 20 20 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c       if( p->zSql
155d0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
155e0 20 63 2c 20 70 63 20 3d 20 30 3b 0a 20 20 20 20   c, pc = 0;.    
155f0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
15600 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20   "-- ");.       
15610 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 70   for(i=0; (c = p
15620 2d 3e 7a 53 71 6c 5b 69 5d 29 21 3d 30 3b 20 69  ->zSql[i])!=0; i
15630 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
15640 66 28 20 70 63 3d 3d 27 5c 6e 27 20 29 20 66 70  f( pc=='\n' ) fp
15650 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22  rintf(out, "-- "
15660 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  );.          put
15670 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20  c(c, out);.     
15680 20 20 20 20 20 70 63 20 3d 20 63 3b 0a 20 20 20       pc = c;.   
15690 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
156a0 66 28 20 70 63 21 3d 27 5c 6e 27 20 29 20 66 70  f( pc!='\n' ) fp
156b0 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29  rintf(out, "\n")
156c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
156d0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
156e0 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
156f0 20 63 68 61 72 20 7a 48 64 72 5b 31 30 30 5d 3b   char zHdr[100];
15700 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15710 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
15720 28 7a 48 64 72 29 2c 20 7a 48 64 72 2c 20 22 25  (zHdr), zHdr, "%
15730 36 75 20 25 31 32 6c 6c 75 20 25 38 6c 6c 75 20  6u %12llu %8llu 
15740 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  ",.           p-
15750 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20  >aOp[i].cnt,.   
15760 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
15770 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20  ].cycles,.      
15780 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
15790 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d  nt>0 ? p->aOp[i]
157a0 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69  .cycles/p->aOp[i
157b0 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20  ].cnt : 0.      
157c0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72    );.        fpr
157d0 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20  intf(out, "%s", 
157e0 7a 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20 73  zHdr);.        s
157f0 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
15800 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f  p(out, i, &p->aO
15810 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  p[i]);.      }. 
15820 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29       fclose(out)
15830 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
15840 69 66 0a 20 20 70 2d 3e 69 43 75 72 72 65 6e 74  if.  p->iCurrent
15850 54 69 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 6d  Time = 0;.  p->m
15860 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
15870 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e  C_INIT;.  return
15880 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72   p->rc & db->err
15890 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20  Mask;.}. ./*.** 
158a0 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c  Clean up and del
158b0 65 74 65 20 61 20 56 44 42 45 20 61 66 74 65 72  ete a VDBE after
158c0 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74   execution.  Ret
158d0 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77  urn an integer w
158e0 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72  hich is.** the r
158f0 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69  esult code.  Wri
15900 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  te any error mes
15910 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a  sage text into *
15920 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74  pzErrMsg..*/.int
15930 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61   sqlite3VdbeFina
15940 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  lize(Vdbe *p){. 
15950 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
15960 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61  _OK;.  if( p->ma
15970 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
15980 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d  RUN || p->magic=
15990 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54  =VDBE_MAGIC_HALT
159a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
159b0 69 74 65 33 56 64 62 65 52 65 73 65 74 28 70 29  ite3VdbeReset(p)
159c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 72  ;.    assert( (r
159d0 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61  c & p->db->errMa
159e0 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20  sk)==rc );.  }. 
159f0 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
15a00 74 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  te(p);.  return 
15a10 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  rc;.}../*.** If 
15a20 70 61 72 61 6d 65 74 65 72 20 69 4f 70 20 69 73  parameter iOp is
15a30 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
15a40 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65   then invoke the
15a50 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 0a   destructor for.
15a60 2a 2a 20 61 6c 6c 20 61 75 78 69 6c 69 61 72 79  ** all auxiliary
15a70 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63   data pointers c
15a80 75 72 72 65 6e 74 6c 79 20 63 61 63 68 65 64 20  urrently cached 
15a90 62 79 20 74 68 65 20 56 4d 20 70 61 73 73 65 64  by the VM passed
15aa0 20 61 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   as.** the first
15ab0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
15ac0 20 4f 72 2c 20 69 66 20 69 4f 70 20 69 73 20 67   Or, if iOp is g
15ad0 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
15ae0 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68  qual to zero, th
15af0 65 6e 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  en the destructo
15b00 72 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76  r is.** only inv
15b10 6f 6b 65 64 20 66 6f 72 20 74 68 6f 73 65 20 61  oked for those a
15b20 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f  uxiliary data po
15b30 69 6e 74 65 72 73 20 63 72 65 61 74 65 64 20 62  inters created b
15b40 79 20 74 68 65 20 75 73 65 72 20 0a 2a 2a 20 66  y the user .** f
15b50 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 64 20  unction invoked 
15b60 62 79 20 74 68 65 20 4f 50 5f 46 75 6e 63 74 69  by the OP_Functi
15b70 6f 6e 20 6f 70 63 6f 64 65 20 61 74 20 69 6e 73  on opcode at ins
15b80 74 72 75 63 74 69 6f 6e 20 69 4f 70 20 6f 66 20  truction iOp of 
15b90 0a 2a 2a 20 56 4d 20 70 56 64 62 65 2c 20 61 6e  .** VM pVdbe, an
15ba0 64 20 6f 6e 6c 79 20 74 68 65 6e 20 69 66 3a 0a  d only then if:.
15bb0 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61  **.**    * the a
15bc0 73 73 6f 63 69 61 74 65 64 20 66 75 6e 63 74 69  ssociated functi
15bd0 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  on parameter is 
15be0 74 68 65 20 33 32 6e 64 20 6f 72 20 6c 61 74 65  the 32nd or late
15bf0 72 20 28 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20  r (counting.**  
15c00 20 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f      from left to
15c10 20 72 69 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a   right), or.**.*
15c20 2a 20 20 20 20 2a 20 74 68 65 20 63 6f 72 72 65  *    * the corre
15c30 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20  sponding bit in 
15c40 61 72 67 75 6d 65 6e 74 20 6d 61 73 6b 20 69 73  argument mask is
15c50 20 63 6c 65 61 72 20 28 77 68 65 72 65 20 74 68   clear (where th
15c60 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 20 20 20  e first.**      
15c70 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74  function paramet
15c80 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  er corresponds t
15c90 6f 20 62 69 74 20 30 20 65 74 63 2e 29 2e 0a 2a  o bit 0 etc.)..*
15ca0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
15cb0 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
15cc0 56 64 62 65 20 2a 70 56 64 62 65 2c 20 69 6e 74  Vdbe *pVdbe, int
15cd0 20 69 4f 70 2c 20 69 6e 74 20 6d 61 73 6b 29 7b   iOp, int mask){
15ce0 0a 20 20 41 75 78 44 61 74 61 20 2a 2a 70 70 20  .  AuxData **pp 
15cf0 3d 20 26 70 56 64 62 65 2d 3e 70 41 75 78 44 61  = &pVdbe->pAuxDa
15d00 74 61 3b 0a 20 20 77 68 69 6c 65 28 20 2a 70 70  ta;.  while( *pp
15d10 20 29 7b 0a 20 20 20 20 41 75 78 44 61 74 61 20   ){.    AuxData 
15d20 2a 70 41 75 78 20 3d 20 2a 70 70 3b 0a 20 20 20  *pAux = *pp;.   
15d30 20 69 66 28 20 28 69 4f 70 3c 30 29 0a 20 20 20   if( (iOp<0).   
15d40 20 20 7c 7c 20 28 70 41 75 78 2d 3e 69 4f 70 3d    || (pAux->iOp=
15d50 3d 69 4f 70 20 26 26 20 28 70 41 75 78 2d 3e 69  =iOp && (pAux->i
15d60 41 72 67 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b  Arg>31 || !(mask
15d70 20 26 20 4d 41 53 4b 42 49 54 33 32 28 70 41 75   & MASKBIT32(pAu
15d80 78 2d 3e 69 41 72 67 29 29 29 29 0a 20 20 20 20  x->iArg)))).    
15d90 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
15da0 65 28 20 70 41 75 78 2d 3e 69 41 72 67 3d 3d 33  e( pAux->iArg==3
15db0 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1 );.      if( p
15dc0 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a  Aux->xDelete ){.
15dd0 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44          pAux->xD
15de0 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 41 75 78  elete(pAux->pAux
15df0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
15e00 20 2a 70 70 20 3d 20 70 41 75 78 2d 3e 70 4e 65   *pp = pAux->pNe
15e10 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  xt;.      sqlite
15e20 33 44 62 46 72 65 65 28 70 56 64 62 65 2d 3e 64  3DbFree(pVdbe->d
15e30 62 2c 20 70 41 75 78 29 3b 0a 20 20 20 20 7d 65  b, pAux);.    }e
15e40 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 3d 20 26  lse{.      pp= &
15e50 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pAux->pNext;.   
15e60 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
15e70 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
15e80 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
15e90 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20  the Vdbe passed 
15ea0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
15eb0 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78 63 65 70  gument,.** excep
15ec0 74 20 66 6f 72 20 6f 62 6a 65 63 74 20 69 74 73  t for object its
15ed0 65 6c 66 2c 20 77 68 69 63 68 20 69 73 20 70 72  elf, which is pr
15ee0 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eserved..**.** T
15ef0 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
15f00 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74  tween this funct
15f10 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74 65 33 56  ion and sqlite3V
15f20 64 62 65 44 65 6c 65 74 65 28 29 20 69 73 20 74  dbeDelete() is t
15f30 68 61 74 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74  hat.** VdbeDelet
15f40 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73  e() also unlinks
15f50 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74   the Vdbe from t
15f60 68 65 20 6c 69 73 74 20 6f 66 20 56 4d 73 20 61  he list of VMs a
15f70 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
15f80 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  * the database c
15f90 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20 66 72  onnection and fr
15fa0 65 65 73 20 74 68 65 20 6f 62 6a 65 63 74 20 69  ees the object i
15fb0 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tself..*/.void s
15fc0 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f  qlite3VdbeClearO
15fd0 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64  bject(sqlite3 *d
15fe0 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 53  b, Vdbe *p){.  S
15ff0 75 62 50 72 6f 67 72 61 6d 20 2a 70 53 75 62 2c  ubProgram *pSub,
16000 20 2a 70 4e 65 78 74 3b 0a 20 20 69 6e 74 20 69   *pNext;.  int i
16010 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
16020 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64  b==0 || p->db==d
16030 62 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65  b );.  releaseMe
16040 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20  mArray(p->aVar, 
16050 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 72 65 6c 65  p->nVar);.  rele
16060 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
16070 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73  ColName, p->nRes
16080 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
16090 29 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 2d  );.  for(pSub=p-
160a0 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b  >pProgram; pSub;
160b0 20 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20   pSub=pNext){.  
160c0 20 20 70 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e    pNext = pSub->
160d0 70 4e 65 78 74 3b 0a 20 20 20 20 76 64 62 65 46  pNext;.    vdbeF
160e0 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70  reeOpArray(db, p
160f0 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e  Sub->aOp, pSub->
16100 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nOp);.    sqlite
16110 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
16120 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70  );.  }.  for(i=p
16130 2d 3e 6e 7a 56 61 72 2d 31 3b 20 69 3e 3d 30 3b  ->nzVar-1; i>=0;
16140 20 69 2d 2d 29 20 73 71 6c 69 74 65 33 44 62 46   i--) sqlite3DbF
16150 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a 56 61 72  ree(db, p->azVar
16160 5b 69 5d 29 3b 0a 20 20 76 64 62 65 46 72 65 65  [i]);.  vdbeFree
16170 4f 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e 61  OpArray(db, p->a
16180 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73  Op, p->nOp);.  s
16190 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
161a0 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20   p->aColName);. 
161b0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
161c0 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 73  b, p->zSql);.  s
161d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
161e0 20 70 2d 3e 70 46 72 65 65 29 3b 0a 23 69 66 64   p->pFree);.#ifd
161f0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
16200 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
16210 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
16220 3e 6e 53 63 61 6e 3b 20 69 2b 2b 29 7b 0a 20 20  >nScan; i++){.  
16230 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
16240 64 62 2c 20 70 2d 3e 61 53 63 61 6e 5b 69 5d 2e  db, p->aScan[i].
16250 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71  zName);.  }.  sq
16260 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
16270 70 2d 3e 61 53 63 61 6e 29 3b 0a 23 65 6e 64 69  p->aScan);.#endi
16280 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  f.}../*.** Delet
16290 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45  e an entire VDBE
162a0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
162b0 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62 65  3VdbeDelete(Vdbe
162c0 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
162d0 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45  *db;..  if( NEVE
162e0 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(p==0) ) return
162f0 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
16300 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
16310 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
16320 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
16330 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a  ite3VdbeClearObj
16340 65 63 74 28 64 62 2c 20 70 29 3b 0a 20 20 69 66  ect(db, p);.  if
16350 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ( p->pPrev ){.  
16360 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78    p->pPrev->pNex
16370 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
16380 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
16390 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20  t( db->pVdbe==p 
163a0 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65  );.    db->pVdbe
163b0 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
163c0 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20  .  if( p->pNext 
163d0 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d  ){.    p->pNext-
163e0 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65  >pPrev = p->pPre
163f0 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69  v;.  }.  p->magi
16400 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44  c = VDBE_MAGIC_D
16410 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 30  EAD;.  p->db = 0
16420 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
16430 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
16440 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20 22 70  ** The cursor "p
16450 22 20 68 61 73 20 61 20 70 65 6e 64 69 6e 67 20  " has a pending 
16460 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 20 74  seek operation t
16470 68 61 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20  hat has not yet 
16480 62 65 65 6e 0a 2a 2a 20 63 61 72 72 69 65 64 20  been.** carried 
16490 6f 75 74 2e 20 20 53 65 65 6b 20 74 68 65 20 63  out.  Seek the c
164a0 75 72 73 6f 72 20 6e 6f 77 2e 20 20 49 66 20 61  ursor now.  If a
164b0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
164c0 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 61 70  return.** the ap
164d0 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
164e0 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
164f0 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  int SQLITE_NOINL
16500 49 4e 45 20 68 61 6e 64 6c 65 44 65 66 65 72 72  INE handleDeferr
16510 65 64 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72  edMoveto(VdbeCur
16520 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  sor *p){.  int r
16530 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66 20 53  es, rc;.#ifdef S
16540 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 65 78 74  QLITE_TEST.  ext
16550 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
16560 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65  search_count;.#e
16570 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
16580 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
16590 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
165a0 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 61 73  >isTable );.  as
165b0 73 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70  sert( p->eCurTyp
165c0 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45  e==CURTYPE_BTREE
165d0 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
165e0 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
165f0 61 63 6b 65 64 28 70 2d 3e 75 63 2e 70 43 75 72  acked(p->uc.pCur
16600 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74  sor, 0, p->movet
16610 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72 65 73  oTarget, 0, &res
16620 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
16630 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 72  turn rc;.  if( r
16640 65 73 21 3d 30 20 29 20 72 65 74 75 72 6e 20 53  es!=0 ) return S
16650 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
16660 50 54 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  PT;.#ifdef SQLIT
16670 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33  E_TEST.  sqlite3
16680 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b  _search_count++;
16690 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 64 65 66  .#endif.  p->def
166a0 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b  erredMoveto = 0;
166b0 0a 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75  .  p->cacheStatu
166c0 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
166d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
166e0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f  _OK;.}../*.** So
166f0 6d 65 74 68 69 6e 67 20 68 61 73 20 6d 6f 76 65  mething has move
16700 64 20 63 75 72 73 6f 72 20 22 70 22 20 6f 75 74  d cursor "p" out
16710 20 6f 66 20 70 6c 61 63 65 2e 20 20 4d 61 79 62   of place.  Mayb
16720 65 20 74 68 65 20 72 6f 77 20 69 74 20 77 61 73  e the row it was
16730 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 77  .** pointed to w
16740 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  as deleted out f
16750 72 6f 6d 20 75 6e 64 65 72 20 69 74 2e 20 20 4f  rom under it.  O
16760 72 20 6d 61 79 62 65 20 74 68 65 20 62 74 72 65  r maybe the btre
16770 65 20 77 61 73 0a 2a 2a 20 72 65 62 61 6c 61 6e  e was.** rebalan
16780 63 65 64 2e 20 20 57 68 61 74 65 76 65 72 20 74  ced.  Whatever t
16790 68 65 20 63 61 75 73 65 2c 20 74 72 79 20 74 6f  he cause, try to
167a0 20 72 65 73 74 6f 72 65 20 22 70 22 20 74 6f 20   restore "p" to 
167b0 74 68 65 20 70 6c 61 63 65 20 69 74 0a 2a 2a 20  the place it.** 
167c0 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f 20 62  is supposed to b
167d0 65 20 70 6f 69 6e 74 69 6e 67 2e 20 20 49 66 20  e pointing.  If 
167e0 74 68 65 20 72 6f 77 20 77 61 73 20 64 65 6c 65  the row was dele
167f0 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
16800 65 72 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72  er the.** cursor
16810 2c 20 73 65 74 20 74 68 65 20 63 75 72 73 6f 72  , set the cursor
16820 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 4e   to point to a N
16830 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74  ULL row..*/.stat
16840 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
16850 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 4d 6f 76  INLINE handleMov
16860 65 64 43 75 72 73 6f 72 28 56 64 62 65 43 75 72  edCursor(VdbeCur
16870 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  sor *p){.  int i
16880 73 44 69 66 66 65 72 65 6e 74 52 6f 77 2c 20 72  sDifferentRow, r
16890 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  c;.  assert( p->
168a0 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
168b0 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 61 73 73  E_BTREE );.  ass
168c0 65 72 74 28 20 70 2d 3e 75 63 2e 70 43 75 72 73  ert( p->uc.pCurs
168d0 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  or!=0 );.  asser
168e0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
168f0 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d  ursorHasMoved(p-
16900 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29 3b 0a  >uc.pCursor) );.
16910 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
16920 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65  reeCursorRestore
16930 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20  (p->uc.pCursor, 
16940 26 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 29  &isDifferentRow)
16950 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74  ;.  p->cacheStat
16960 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
16970 3b 0a 20 20 69 66 28 20 69 73 44 69 66 66 65 72  ;.  if( isDiffer
16980 65 6e 74 52 6f 77 20 29 20 70 2d 3e 6e 75 6c 6c  entRow ) p->null
16990 52 6f 77 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  Row = 1;.  retur
169a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
169b0 68 65 63 6b 20 74 6f 20 65 6e 73 75 72 65 20 74  heck to ensure t
169c0 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69  hat the cursor i
169d0 73 20 76 61 6c 69 64 2e 20 20 52 65 73 74 6f 72  s valid.  Restor
169e0 65 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  e the cursor.** 
169f0 69 66 20 6e 65 65 64 20 62 65 2e 20 20 52 65 74  if need be.  Ret
16a00 75 72 6e 20 61 6e 79 20 49 2f 4f 20 65 72 72 6f  urn any I/O erro
16a10 72 20 66 72 6f 6d 20 74 68 65 20 72 65 73 74 6f  r from the resto
16a20 72 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f  re operation..*/
16a30 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
16a40 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 56 64  CursorRestore(Vd
16a50 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  beCursor *p){.  
16a60 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72 54  assert( p->eCurT
16a70 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
16a80 45 45 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  EE );.  if( sqli
16a90 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
16aa0 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75  sMoved(p->uc.pCu
16ab0 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 72 65 74  rsor) ){.    ret
16ac0 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43  urn handleMovedC
16ad0 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20  ursor(p);.  }.  
16ae0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16af0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
16b00 73 75 72 65 20 74 68 65 20 63 75 72 73 6f 72 20  sure the cursor 
16b10 70 20 69 73 20 72 65 61 64 79 20 74 6f 20 72 65  p is ready to re
16b20 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65 20  ad or write the 
16b30 72 6f 77 20 74 6f 20 77 68 69 63 68 20 69 74 0a  row to which it.
16b40 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6f 73 69  ** was last posi
16b50 74 69 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e 20  tioned.  Return 
16b60 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
16b70 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72   an OOM fault or
16b80 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72   I/O error.** pr
16b90 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 70  events us from p
16ba0 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68 65 20 63  ositioning the c
16bb0 75 72 73 6f 72 20 74 6f 20 69 74 73 20 63 6f 72  ursor to its cor
16bc0 72 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a  rect position..*
16bd0 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f  *.** If a MoveTo
16be0 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70 65   operation is pe
16bf0 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69 76  nding on the giv
16c00 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20  en cursor, then 
16c10 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54  do that.** MoveT
16c20 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f  o now.  If no mo
16c30 76 65 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 63  ve is pending, c
16c40 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
16c50 68 65 20 72 6f 77 20 68 61 73 20 62 65 65 6e 0a  he row has been.
16c60 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  ** deleted out f
16c70 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75  rom under the cu
16c80 72 73 6f 72 20 61 6e 64 20 69 66 20 69 74 20 68  rsor and if it h
16c90 61 73 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f 77  as, mark the row
16ca0 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f   as.** a NULL ro
16cb0 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  w..**.** If the 
16cc0 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64  cursor is alread
16cd0 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
16ce0 65 20 63 6f 72 72 65 63 74 20 72 6f 77 20 61 6e  e correct row an
16cf0 64 20 74 68 61 74 20 72 6f 77 20 68 61 73 0a 2a  d that row has.*
16d00 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65 74  * not been delet
16d10 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
16d20 72 20 74 68 65 20 63 75 72 73 6f 72 2c 20 74 68  r the cursor, th
16d30 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
16d40 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69  is a no-op..*/.i
16d50 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  nt sqlite3VdbeCu
16d60 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65 43  rsorMoveto(VdbeC
16d70 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28  ursor *p){.  if(
16d80 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55   p->eCurType==CU
16d90 52 54 59 50 45 5f 42 54 52 45 45 20 29 7b 0a 20  RTYPE_BTREE ){. 
16da0 20 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72     if( p->deferr
16db0 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20  edMoveto ){.    
16dc0 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 44    return handleD
16dd0 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 70 29  eferredMoveto(p)
16de0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
16df0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
16e00 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63  orHasMoved(p->uc
16e10 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20  .pCursor) ){.   
16e20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65     return handle
16e30 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a  MovedCursor(p);.
16e40 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
16e50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
16e60 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
16e70 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a  wing functions:.
16e80 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  **.** sqlite3Vdb
16e90 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a  eSerialType().**
16ea0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
16eb0 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73  alTypeLen().** s
16ec0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
16ed0 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Len().** sqlite3
16ee0 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 29 0a  VdbeSerialPut().
16ef0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
16f00 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20  rialGet().**.** 
16f10 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68 65 20  encapsulate the 
16f20 63 6f 64 65 20 74 68 61 74 20 73 65 72 69 61 6c  code that serial
16f30 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20  izes values for 
16f40 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74  storage in SQLit
16f50 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e  e.** data and in
16f60 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63  dex records. Eac
16f70 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c  h serialized val
16f80 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ue consists of a
16f90 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65  .** 'serial-type
16fa0 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20  ' and a blob of 
16fb0 64 61 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c  data. The serial
16fc0 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79   type is an 8-by
16fd0 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69  te unsigned.** i
16fe0 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61  nteger, stored a
16ff0 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a  s a varint..**.*
17000 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69  * In an SQLite i
17010 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65  ndex record, the
17020 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20   serial type is 
17030 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20  stored directly 
17040 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c  before.** the bl
17050 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61 74 20  ob of data that 
17060 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  it corresponds t
17070 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65  o. In a table re
17080 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c  cord, all serial
17090 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20 73 74  .** types are st
170a0 6f 72 65 64 20 61 74 20 74 68 65 20 73 74 61 72  ored at the star
170b0 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c  t of the record,
170c0 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f   and the blobs o
170d0 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65  f data at.** the
170e0 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73   end. Hence thes
170f0 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f  e functions allo
17100 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  w the caller to 
17110 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65  handle the.** se
17120 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61  rial-type and da
17130 74 61 20 62 6c 6f 62 20 73 65 70 61 72 61 74 65  ta blob separate
17140 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ly..**.** The fo
17150 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65  llowing table de
17160 73 63 72 69 62 65 73 20 74 68 65 20 76 61 72 69  scribes the vari
17170 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73  ous storage clas
17180 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a  ses for data:.**
17190 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70  .**   serial typ
171a0 65 20 20 20 20 20 20 20 20 62 79 74 65 73 20 6f  e        bytes o
171b0 66 20 64 61 74 61 20 20 20 20 20 20 74 79 70 65  f data      type
171c0 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
171d0 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  ----     -------
171e0 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d  --------    ----
171f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
17200 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
17210 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
17220 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20         NULL.**  
17230 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
17240 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20            1     
17250 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
17260 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20  teger.**      2 
17270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17280 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
17290 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
172a0 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20 20 20  **      3       
172b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33 20                3 
172c0 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
172d0 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
172e0 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20 20    4             
172f0 20 20 20 20 20 20 20 20 34 20 20 20 20 20 20 20          4       
17300 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
17310 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20  ger.**      5   
17320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17330 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20 73    6            s
17340 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
17350 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20        6         
17360 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20              8   
17370 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
17380 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
17390 37 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  7               
173a0 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
173b0 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a     IEEE float.**
173c0 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
173d0 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
173e0 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
173f0 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20   constant 0.**  
17400 20 20 20 20 39 20 20 20 20 20 20 20 20 20 20 20      9           
17410 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
17420 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63         Integer c
17430 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20  onstant 1.**    
17440 20 31 30 2c 31 31 20 20 20 20 20 20 20 20 20 20   10,11          
17450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17460 20 20 20 20 20 72 65 73 65 72 76 65 64 20 66 6f       reserved fo
17470 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20  r expansion.**  
17480 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e    N>=12 and even
17490 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20         (N-12)/2 
174a0 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20         BLOB.**  
174b0 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20    N>=13 and odd 
174c0 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20         (N-13)/2 
174d0 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a         text.**.*
174e0 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20 74 79  * The 8 and 9 ty
174f0 70 65 73 20 77 65 72 65 20 61 64 64 65 64 20 69  pes were added i
17500 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f  n 3.3.0, file fo
17510 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76  rmat 4.  Prior v
17520 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51  ersions.** of SQ
17530 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e  Lite will not un
17540 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73  derstand those s
17550 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a  erial types..*/.
17560 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
17570 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f  e serial-type fo
17580 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72  r the value stor
17590 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75  ed in pMem..*/.u
175a0 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
175b0 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d  rialType(Mem *pM
175c0 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72  em, int file_for
175d0 6d 61 74 2c 20 75 33 32 20 2a 70 4c 65 6e 29 7b  mat, u32 *pLen){
175e0 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70  .  int flags = p
175f0 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 75 33  Mem->flags;.  u3
17600 32 20 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  2 n;..  assert( 
17610 70 4c 65 6e 21 3d 30 20 29 3b 0a 20 20 69 66 28  pLen!=0 );.  if(
17620 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20   flags&MEM_Null 
17630 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 30  ){.    *pLen = 0
17640 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
17650 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26    }.  if( flags&
17660 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f  MEM_Int ){.    /
17670 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65  * Figure out whe
17680 74 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32  ther to use 1, 2
17690 2c 20 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65  , 4, 6 or 8 byte
176a0 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65  s. */.#   define
176b0 20 4d 41 58 5f 36 42 59 54 45 20 28 28 28 28 69   MAX_6BYTE ((((i
176c0 36 34 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c  64)0x00008000)<<
176d0 33 32 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69  32)-1).    i64 i
176e0 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20   = pMem->u.i;.  
176f0 20 20 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28    u64 u;.    if(
17700 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 75 20   i<0 ){.      u 
17710 3d 20 7e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = ~i;.    }else{
17720 0a 20 20 20 20 20 20 75 20 3d 20 69 3b 0a 20 20  .      u = i;.  
17730 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 31    }.    if( u<=1
17740 32 37 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  27 ){.      if( 
17750 28 69 26 31 29 3d 3d 69 20 26 26 20 66 69 6c 65  (i&1)==i && file
17760 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20  _format>=4 ){.  
17770 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b        *pLen = 0;
17780 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
17790 38 2b 28 75 33 32 29 75 3b 0a 20 20 20 20 20 20  8+(u32)u;.      
177a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a  }else{.        *
177b0 70 4c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  pLen = 1;.      
177c0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
177d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
177e0 28 20 75 3c 3d 33 32 37 36 37 20 29 7b 20 2a 70  ( u<=32767 ){ *p
177f0 4c 65 6e 20 3d 20 32 3b 20 72 65 74 75 72 6e 20  Len = 2; return 
17800 32 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d  2; }.    if( u<=
17810 38 33 38 38 36 30 37 20 29 7b 20 2a 70 4c 65 6e  8388607 ){ *pLen
17820 20 3d 20 33 3b 20 72 65 74 75 72 6e 20 33 3b 20   = 3; return 3; 
17830 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34  }.    if( u<=214
17840 37 34 38 33 36 34 37 20 29 7b 20 2a 70 4c 65 6e  7483647 ){ *pLen
17850 20 3d 20 34 3b 20 72 65 74 75 72 6e 20 34 3b 20   = 4; return 4; 
17860 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58  }.    if( u<=MAX
17870 5f 36 42 59 54 45 20 29 7b 20 2a 70 4c 65 6e 20  _6BYTE ){ *pLen 
17880 3d 20 36 3b 20 72 65 74 75 72 6e 20 35 3b 20 7d  = 6; return 5; }
17890 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a  .    *pLen = 8;.
178a0 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20      return 6;.  
178b0 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  }.  if( flags&ME
178c0 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 2a 70  M_Real ){.    *p
178d0 4c 65 6e 20 3d 20 38 3b 0a 20 20 20 20 72 65 74  Len = 8;.    ret
178e0 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 7;.  }.  ass
178f0 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d  ert( pMem->db->m
17900 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66  allocFailed || f
17910 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45  lags&(MEM_Str|ME
17920 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 61 73 73  M_Blob) );.  ass
17930 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3e 3d 30 20  ert( pMem->n>=0 
17940 29 3b 0a 20 20 6e 20 3d 20 28 75 33 32 29 70 4d  );.  n = (u32)pM
17950 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61  em->n;.  if( fla
17960 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b  gs & MEM_Zero ){
17970 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e  .    n += pMem->
17980 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 2a  u.nZero;.  }.  *
17990 70 4c 65 6e 20 3d 20 6e 3b 0a 20 20 72 65 74 75  pLen = n;.  retu
179a0 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b  rn ((n*2) + 12 +
179b0 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72   ((flags&MEM_Str
179c0 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )!=0));.}../*.**
179d0 20 54 68 65 20 73 69 7a 65 73 20 66 6f 72 20 73   The sizes for s
179e0 65 72 69 61 6c 20 74 79 70 65 73 20 6c 65 73 73  erial types less
179f0 20 74 68 61 6e 20 31 32 38 0a 2a 2f 0a 73 74 61   than 128.*/.sta
17a00 74 69 63 20 63 6f 6e 73 74 20 75 38 20 73 71 6c  tic const u8 sql
17a10 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a  ite3SmallTypeSiz
17a20 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  es[] = {.       
17a30 20 2f 2a 20 20 30 20 20 20 31 20 20 20 32 20 20   /*  0   1   2  
17a40 20 33 20 20 20 34 20 20 20 35 20 20 20 36 20 20   3   4   5   6  
17a50 20 37 20 20 20 38 20 20 20 39 20 2a 2f 20 20 20   7   8   9 */   
17a60 0a 2f 2a 20 20 20 30 20 2a 2f 20 20 20 30 2c 20  ./*   0 */   0, 
17a70 20 31 2c 20 20 32 2c 20 20 33 2c 20 20 34 2c 20   1,  2,  3,  4, 
17a80 20 36 2c 20 20 38 2c 20 20 38 2c 20 20 30 2c 20   6,  8,  8,  0, 
17a90 20 30 2c 0a 2f 2a 20 20 31 30 20 2a 2f 20 20 20   0,./*  10 */   
17aa0 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
17ab0 31 2c 20 20 31 2c 20 20 32 2c 20 20 32 2c 20 20  1,  1,  2,  2,  
17ac0 33 2c 20 20 33 2c 0a 2f 2a 20 20 32 30 20 2a 2f  3,  3,./*  20 */
17ad0 20 20 20 34 2c 20 20 34 2c 20 20 35 2c 20 20 35     4,  4,  5,  5
17ae0 2c 20 20 36 2c 20 20 36 2c 20 20 37 2c 20 20 37  ,  6,  6,  7,  7
17af0 2c 20 20 38 2c 20 20 38 2c 0a 2f 2a 20 20 33 30  ,  8,  8,./*  30
17b00 20 2a 2f 20 20 20 39 2c 20 20 39 2c 20 31 30 2c   */   9,  9, 10,
17b10 20 31 30 2c 20 31 31 2c 20 31 31 2c 20 31 32 2c   10, 11, 11, 12,
17b20 20 31 32 2c 20 31 33 2c 20 31 33 2c 0a 2f 2a 20   12, 13, 13,./* 
17b30 20 34 30 20 2a 2f 20 20 31 34 2c 20 31 34 2c 20   40 */  14, 14, 
17b40 31 35 2c 20 31 35 2c 20 31 36 2c 20 31 36 2c 20  15, 15, 16, 16, 
17b50 31 37 2c 20 31 37 2c 20 31 38 2c 20 31 38 2c 0a  17, 17, 18, 18,.
17b60 2f 2a 20 20 35 30 20 2a 2f 20 20 31 39 2c 20 31  /*  50 */  19, 1
17b70 39 2c 20 32 30 2c 20 32 30 2c 20 32 31 2c 20 32  9, 20, 20, 21, 2
17b80 31 2c 20 32 32 2c 20 32 32 2c 20 32 33 2c 20 32  1, 22, 22, 23, 2
17b90 33 2c 0a 2f 2a 20 20 36 30 20 2a 2f 20 20 32 34  3,./*  60 */  24
17ba0 2c 20 32 34 2c 20 32 35 2c 20 32 35 2c 20 32 36  , 24, 25, 25, 26
17bb0 2c 20 32 36 2c 20 32 37 2c 20 32 37 2c 20 32 38  , 26, 27, 27, 28
17bc0 2c 20 32 38 2c 0a 2f 2a 20 20 37 30 20 2a 2f 20  , 28,./*  70 */ 
17bd0 20 32 39 2c 20 32 39 2c 20 33 30 2c 20 33 30 2c   29, 29, 30, 30,
17be0 20 33 31 2c 20 33 31 2c 20 33 32 2c 20 33 32 2c   31, 31, 32, 32,
17bf0 20 33 33 2c 20 33 33 2c 0a 2f 2a 20 20 38 30 20   33, 33,./*  80 
17c00 2a 2f 20 20 33 34 2c 20 33 34 2c 20 33 35 2c 20  */  34, 34, 35, 
17c10 33 35 2c 20 33 36 2c 20 33 36 2c 20 33 37 2c 20  35, 36, 36, 37, 
17c20 33 37 2c 20 33 38 2c 20 33 38 2c 0a 2f 2a 20 20  37, 38, 38,./*  
17c30 39 30 20 2a 2f 20 20 33 39 2c 20 33 39 2c 20 34  90 */  39, 39, 4
17c40 30 2c 20 34 30 2c 20 34 31 2c 20 34 31 2c 20 34  0, 40, 41, 41, 4
17c50 32 2c 20 34 32 2c 20 34 33 2c 20 34 33 2c 0a 2f  2, 42, 43, 43,./
17c60 2a 20 31 30 30 20 2a 2f 20 20 34 34 2c 20 34 34  * 100 */  44, 44
17c70 2c 20 34 35 2c 20 34 35 2c 20 34 36 2c 20 34 36  , 45, 45, 46, 46
17c80 2c 20 34 37 2c 20 34 37 2c 20 34 38 2c 20 34 38  , 47, 47, 48, 48
17c90 2c 0a 2f 2a 20 31 31 30 20 2a 2f 20 20 34 39 2c  ,./* 110 */  49,
17ca0 20 34 39 2c 20 35 30 2c 20 35 30 2c 20 35 31 2c   49, 50, 50, 51,
17cb0 20 35 31 2c 20 35 32 2c 20 35 32 2c 20 35 33 2c   51, 52, 52, 53,
17cc0 20 35 33 2c 0a 2f 2a 20 31 32 30 20 2a 2f 20 20   53,./* 120 */  
17cd0 35 34 2c 20 35 34 2c 20 35 35 2c 20 35 35 2c 20  54, 54, 55, 55, 
17ce0 35 36 2c 20 35 36 2c 20 35 37 2c 20 35 37 0a 7d  56, 56, 57, 57.}
17cf0 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ;../*.** Return 
17d00 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
17d10 65 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e  e data correspon
17d20 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70  ding to the supp
17d30 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65  lied serial-type
17d40 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
17d50 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
17d60 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70  n(u32 serial_typ
17d70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c  e){.  if( serial
17d80 5f 74 79 70 65 3e 3d 31 32 38 20 29 7b 0a 20 20  _type>=128 ){.  
17d90 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c    return (serial
17da0 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d  _type-12)/2;.  }
17db0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
17dc0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32  ( serial_type<12
17dd0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c   .            ||
17de0 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
17df0 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79  eSizes[serial_ty
17e00 70 65 5d 3d 3d 28 73 65 72 69 61 6c 5f 74 79 70  pe]==(serial_typ
17e10 65 20 2d 20 31 32 29 2f 32 20 29 3b 0a 20 20 20  e - 12)/2 );.   
17e20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53   return sqlite3S
17e30 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65  mallTypeSizes[se
17e40 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a  rial_type];.  }.
17e50 7d 0a 75 38 20 73 71 6c 69 74 65 33 56 64 62 65  }.u8 sqlite3Vdbe
17e60 4f 6e 65 42 79 74 65 53 65 72 69 61 6c 54 79 70  OneByteSerialTyp
17e70 65 4c 65 6e 28 75 38 20 73 65 72 69 61 6c 5f 74  eLen(u8 serial_t
17e80 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ype){.  assert( 
17e90 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 38 20  serial_type<128 
17ea0 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
17eb0 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65  te3SmallTypeSize
17ec0 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 20  s[serial_type]; 
17ed0 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65   .}../*.** If we
17ee0 20 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69   are on an archi
17ef0 74 65 63 74 75 72 65 20 77 69 74 68 20 6d 69 78  tecture with mix
17f00 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69  ed-endian floati
17f10 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65  ng .** points (e
17f20 78 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77  x: ARM7) then sw
17f30 61 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62  ap the lower 4 b
17f40 79 74 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a  ytes with the .*
17f50 2a 20 75 70 70 65 72 20 34 20 62 79 74 65 73 2e  * upper 4 bytes.
17f60 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73    Return the res
17f70 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d  ult..**.** For m
17f80 6f 73 74 20 61 72 63 68 69 74 65 63 74 75 72 65  ost architecture
17f90 73 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  s, this is a no-
17fa0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72  op..**.** (later
17fb0 29 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72 74  ):  It is report
17fc0 65 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68  ed to me that th
17fd0 65 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70  e mixed-endian p
17fe0 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d  roblem.** on ARM
17ff0 37 20 69 73 20 61 6e 20 69 73 73 75 65 20 77 69  7 is an issue wi
18000 74 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68  th GCC, not with
18010 20 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20   the ARM7 chip. 
18020 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61   It seems.** tha
18030 74 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73  t early versions
18040 20 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20 74   of GCC stored t
18050 68 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20  he two words of 
18060 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61  a 64-bit.** floa
18070 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f  t in the wrong o
18080 72 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20  rder.  And that 
18090 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70  error has been p
180a0 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65  ropagated.** eve
180b0 72 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c  r since.  The bl
180c0 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  ame is not neces
180d0 73 61 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c  sarily with GCC,
180e0 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20   though..** GCC 
180f0 6d 69 67 68 74 20 68 61 76 65 20 6a 75 73 74 20  might have just 
18100 63 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62  copying the prob
18110 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  lem from a prior
18120 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20   compiler..** I 
18130 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61  am also told tha
18140 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73  t newer versions
18150 20 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c   of GCC that fol
18160 6c 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a  low a different.
18170 2a 2a 20 41 42 49 20 67 65 74 20 74 68 65 20 62  ** ABI get the b
18180 79 74 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e  yte order right.
18190 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72  .**.** Developer
181a0 73 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f  s using SQLite o
181b0 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64  n an ARM7 should
181c0 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e   compile and run
181d0 20 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63   their.** applic
181e0 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51  ation using -DSQ
181f0 4c 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20  LITE_DEBUG=1 at 
18200 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74  least once.  Wit
18210 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c  h DEBUG.** enabl
18220 65 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73  ed, some asserts
18230 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75   below will ensu
18240 72 65 20 74 68 61 74 20 74 68 65 20 62 79 74 65  re that the byte
18250 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f   order of.** flo
18260 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
18270 65 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a  es is correct..*
18280 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30  *.** (2007-08-30
18290 29 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67  )  Frank van Vug
182a0 74 20 68 61 73 20 73 74 75 64 69 65 64 20 74 68  t has studied th
182b0 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65  is problem close
182c0 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65  ly.** and has se
182d0 6e 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20  nd his findings 
182e0 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64 65  to the SQLite de
182f0 76 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b  velopers.  Frank
18300 0a 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74 20  .** writes that 
18310 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65  some Linux kerne
18320 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e  ls offer floatin
18330 67 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65  g point hardware
18340 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68  .** emulation th
18350 61 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d  at uses only 32-
18360 62 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e  bit mantissas in
18370 73 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20  stead of a full 
18380 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72  .** 48-bits as r
18390 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 49  equired by the I
183a0 45 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28  EEE standard.  (
183b0 54 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43  This is the.** C
183c0 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50  ONFIG_FPE_FASTFP
183d0 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73  E option.)  On s
183e0 75 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f  uch systems, flo
183f0 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62  ating point.** b
18400 79 74 65 20 73 77 61 70 70 69 6e 67 20 62 65 63  yte swapping bec
18410 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69  omes very compli
18420 63 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64  cated.  To avoid
18430 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68   problems,.** th
18440 65 20 6e 65 63 65 73 73 61 72 79 20 62 79 74 65  e necessary byte
18450 20 73 77 61 70 70 69 6e 67 20 69 73 20 63 61 72   swapping is car
18460 72 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61  ried out using a
18470 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a   64-bit integer.
18480 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 61  ** rather than a
18490 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20   64-bit float.  
184a0 46 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73  Frank assures us
184b0 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 68   that the code h
184c0 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72  ere.** works for
184d0 20 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64   him.  We, the d
184e0 65 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20  evelopers, have 
184f0 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65  no way to indepe
18500 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66  ndently.** verif
18510 79 20 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e  y this, but Fran
18520 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20  k seems to know 
18530 77 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69  what he is talki
18540 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77  ng about.** so w
18550 65 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a  e trust him..*/.
18560 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49  #ifdef SQLITE_MI
18570 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54  XED_ENDIAN_64BIT
18580 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36  _FLOAT.static u6
18590 34 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20  4 floatSwap(u64 
185a0 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20  in){.  union {. 
185b0 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33     u64 r;.    u3
185c0 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20  2 i[2];.  } u;. 
185d0 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d   u32 t;..  u.r =
185e0 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30   in;.  t = u.i[0
185f0 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e  ];.  u.i[0] = u.
18600 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d  i[1];.  u.i[1] =
18610 20 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72   t;.  return u.r
18620 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61  ;.}.# define swa
18630 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
18640 74 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53  t(X)  X = floatS
18650 77 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64  wap(X).#else.# d
18660 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45  efine swapMixedE
18670 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65  ndianFloat(X).#e
18680 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
18690 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64  e the serialized
186a0 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74   data blob for t
186b0 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
186c0 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a  in pMem into .**
186d0 20 62 75 66 2e 20 49 74 20 69 73 20 61 73 73 75   buf. It is assu
186e0 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c  med that the cal
186f0 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65  ler has allocate
18700 64 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  d sufficient spa
18710 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ce..** Return th
18720 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
18730 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a  s written..**.**
18740 20 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f   nBuf is the amo
18750 75 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66  unt of space lef
18760 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20 54 68 65  t in buf[].  The
18770 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
18780 6e 73 69 62 6c 65 0a 2a 2a 20 66 6f 72 20 61 6c  nsible.** for al
18790 6c 6f 63 61 74 69 6e 67 20 65 6e 6f 75 67 68 20  locating enough 
187a0 73 70 61 63 65 20 74 6f 20 62 75 66 5b 5d 20 74  space to buf[] t
187b0 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72  o hold the entir
187c0 65 20 66 69 65 6c 64 2c 20 65 78 63 6c 75 73 69  e field, exclusi
187d0 76 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 4d 65  ve.** of the pMe
187e0 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 62 79 74 65 73  m->u.nZero bytes
187f0 20 66 6f 72 20 61 20 4d 45 4d 5f 5a 65 72 6f 20   for a MEM_Zero 
18800 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  value..**.** Ret
18810 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
18820 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79  f bytes actually
18830 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75   written into bu
18840 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  f[].  The number
18850 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20  .** of bytes in 
18860 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20  the zero-filled 
18870 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64  tail is included
18880 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76   in the return v
18890 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20  alue only.** if 
188a0 74 68 6f 73 65 20 62 79 74 65 73 20 77 65 72 65  those bytes were
188b0 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d   zeroed in buf[]
188c0 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65  ..*/ .u32 sqlite
188d0 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 75  3VdbeSerialPut(u
188e0 38 20 2a 62 75 66 2c 20 4d 65 6d 20 2a 70 4d 65  8 *buf, Mem *pMe
188f0 6d 2c 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  m, u32 serial_ty
18900 70 65 29 7b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a  pe){.  u32 len;.
18910 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e  .  /* Integer an
18920 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20  d Real */.  if( 
18930 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26  serial_type<=7 &
18940 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20  & serial_type>0 
18950 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20  ){.    u64 v;.  
18960 20 20 75 33 32 20 69 3b 0a 20 20 20 20 69 66 28    u32 i;.    if(
18970 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20   serial_type==7 
18980 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
18990 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65   sizeof(v)==size
189a0 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 29 3b  of(pMem->u.r) );
189b0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76  .      memcpy(&v
189c0 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 73 69  , &pMem->u.r, si
189d0 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20 20 20  zeof(v));.      
189e0 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
189f0 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c  loat(v);.    }el
18a00 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 4d  se{.      v = pM
18a10 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20  em->u.i;.    }. 
18a20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c     len = i = sql
18a30 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a  ite3SmallTypeSiz
18a40 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b  es[serial_type];
18a50 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 30  .    assert( i>0
18a60 20 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20   );.    do{.    
18a70 20 20 62 75 66 5b 2d 2d 69 5d 20 3d 20 28 75 38    buf[--i] = (u8
18a80 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20  )(v&0xFF);.     
18a90 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 77   v >>= 8;.    }w
18aa0 68 69 6c 65 28 20 69 20 29 3b 0a 20 20 20 20 72  hile( i );.    r
18ab0 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a  eturn len;.  }..
18ac0 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62    /* String or b
18ad0 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72  lob */.  if( ser
18ae0 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a  ial_type>=12 ){.
18af0 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
18b00 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c  ->n + ((pMem->fl
18b10 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f  ags & MEM_Zero)?
18b20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29  pMem->u.nZero:0)
18b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d  .             ==
18b40 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56 64 62   (int)sqlite3Vdb
18b50 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
18b60 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20  erial_type) );. 
18b70 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e     len = pMem->n
18b80 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e 30 20  ;.    if( len>0 
18b90 29 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d  ) memcpy(buf, pM
18ba0 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20  em->z, len);.   
18bb0 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d   return len;.  }
18bc0 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63  ..  /* NULL or c
18bd0 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20  onstants 0 or 1 
18be0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
18bf0 0a 0a 2f 2a 20 49 6e 70 75 74 20 22 78 22 20 69  ../* Input "x" i
18c00 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  s a sequence of 
18c10 75 6e 73 69 67 6e 65 64 20 63 68 61 72 61 63 74  unsigned charact
18c20 65 72 73 20 74 68 61 74 20 72 65 70 72 65 73 65  ers that represe
18c30 6e 74 20 61 0a 2a 2a 20 62 69 67 2d 65 6e 64 69  nt a.** big-endi
18c40 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 52 65 74  an integer.  Ret
18c50 75 72 6e 20 74 68 65 20 65 71 75 69 76 61 6c 65  urn the equivale
18c60 6e 74 20 6e 61 74 69 76 65 20 69 6e 74 65 67 65  nt native intege
18c70 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 4e 45  r.*/.#define ONE
18c80 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20  _BYTE_INT(x)    
18c90 28 28 69 38 29 28 78 29 5b 30 5d 29 0a 23 64 65  ((i8)(x)[0]).#de
18ca0 66 69 6e 65 20 54 57 4f 5f 42 59 54 45 5f 49 4e  fine TWO_BYTE_IN
18cb0 54 28 78 29 20 20 20 20 28 32 35 36 2a 28 69 38  T(x)    (256*(i8
18cc0 29 28 28 78 29 5b 30 5d 29 7c 28 78 29 5b 31 5d  )((x)[0])|(x)[1]
18cd0 29 0a 23 64 65 66 69 6e 65 20 54 48 52 45 45 5f  ).#define THREE_
18ce0 42 59 54 45 5f 49 4e 54 28 78 29 20 20 28 36 35  BYTE_INT(x)  (65
18cf0 35 33 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29  536*(i8)((x)[0])
18d00 7c 28 28 78 29 5b 31 5d 3c 3c 38 29 7c 28 78 29  |((x)[1]<<8)|(x)
18d10 5b 32 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55  [2]).#define FOU
18d20 52 5f 42 59 54 45 5f 55 49 4e 54 28 78 29 20 20  R_BYTE_UINT(x)  
18d30 28 28 28 75 33 32 29 28 78 29 5b 30 5d 3c 3c 32  (((u32)(x)[0]<<2
18d40 34 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c  4)|((x)[1]<<16)|
18d50 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b  ((x)[2]<<8)|(x)[
18d60 33 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52  3]).#define FOUR
18d70 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 28 31 36  _BYTE_INT(x) (16
18d80 37 37 37 32 31 36 2a 28 69 38 29 28 28 78 29 5b  777216*(i8)((x)[
18d90 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29  0])|((x)[1]<<16)
18da0 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29  |((x)[2]<<8)|(x)
18db0 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65  [3])../*.** Dese
18dc0 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61  rialize the data
18dd0 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f   blob pointed to
18de0 20 62 79 20 62 75 66 20 61 73 20 73 65 72 69 61   by buf as seria
18df0 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79  l type serial_ty
18e00 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20  pe.** and store 
18e10 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d  the result in pM
18e20 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  em.  Return the 
18e30 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
18e40 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  read..**.** This
18e50 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70   function is imp
18e60 6c 65 6d 65 6e 74 65 64 20 61 73 20 74 77 6f 20  lemented as two 
18e70 73 65 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65  separate routine
18e80 73 20 66 6f 72 20 70 65 72 66 6f 72 6d 61 6e 63  s for performanc
18e90 65 2e 0a 2a 2a 20 54 68 65 20 66 65 77 20 63 61  e..** The few ca
18ea0 73 65 73 20 74 68 61 74 20 72 65 71 75 69 72 65  ses that require
18eb0 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73   local variables
18ec0 20 61 72 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20   are broken out 
18ed0 69 6e 74 6f 20 61 20 73 65 70 61 72 61 74 65 0a  into a separate.
18ee0 2a 2a 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68  ** routine so th
18ef0 61 74 20 69 6e 20 6d 6f 73 74 20 63 61 73 65 73  at in most cases
18f00 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66   the overhead of
18f10 20 6d 6f 76 69 6e 67 20 74 68 65 20 73 74 61 63   moving the stac
18f20 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 69 73 20  k pointer.** is 
18f30 61 76 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73 74 61  avoided..*/ .sta
18f40 74 69 63 20 75 33 32 20 53 51 4c 49 54 45 5f 4e  tic u32 SQLITE_N
18f50 4f 49 4e 4c 49 4e 45 20 73 65 72 69 61 6c 47 65  OINLINE serialGe
18f60 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  t(.  const unsig
18f70 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20  ned char *buf,  
18f80 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20     /* Buffer to 
18f90 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d  deserialize from
18fa0 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c   */.  u32 serial
18fb0 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  _type,          
18fc0 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
18fd0 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  pe to deserializ
18fe0 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  e */.  Mem *pMem
18ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19000 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63       /* Memory c
19010 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c  ell to write val
19020 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20  ue into */.){.  
19030 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54  u64 x = FOUR_BYT
19040 45 5f 55 49 4e 54 28 62 75 66 29 3b 0a 20 20 75  E_UINT(buf);.  u
19050 33 32 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45  32 y = FOUR_BYTE
19060 5f 55 49 4e 54 28 62 75 66 2b 34 29 3b 0a 20 20  _UINT(buf+4);.  
19070 78 20 3d 20 28 78 3c 3c 33 32 29 20 2b 20 79 3b  x = (x<<32) + y;
19080 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
19090 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 2f 2a 20  pe==6 ){.    /* 
190a0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
190b0 39 38 35 31 2d 35 32 32 37 32 20 56 61 6c 75 65  9851-52272 Value
190c0 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e   is a big-endian
190d0 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 74   64-bit.    ** t
190e0 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69  wos-complement i
190f0 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 70  nteger. */.    p
19100 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34  Mem->u.i = *(i64
19110 2a 29 26 78 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  *)&x;.    pMem->
19120 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
19130 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
19140 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20  Mem->u.i<0 );.  
19150 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56  }else{.    /* EV
19160 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 37 33  IDENCE-OF: R-573
19170 34 33 2d 34 39 31 31 34 20 56 61 6c 75 65 20 69  43-49114 Value i
19180 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 49  s a big-endian I
19190 45 45 45 20 37 35 34 2d 32 30 30 38 20 36 34 2d  EEE 754-2008 64-
191a0 62 69 74 0a 20 20 20 20 2a 2a 20 66 6c 6f 61 74  bit.    ** float
191b0 69 6e 67 20 70 6f 69 6e 74 20 6e 75 6d 62 65 72  ing point number
191c0 2e 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  . */.#if !define
191d0 64 28 4e 44 45 42 55 47 29 20 26 26 20 21 64 65  d(NDEBUG) && !de
191e0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
191f0 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
19200 29 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20  ).    /* Verify 
19210 74 68 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e  that integers an
19220 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  d floating point
19230 20 76 61 6c 75 65 73 20 75 73 65 20 74 68 65 20   values use the 
19240 73 61 6d 65 0a 20 20 20 20 2a 2a 20 62 79 74 65  same.    ** byte
19250 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68 61   order.  Or, tha
19260 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58 45  t if SQLITE_MIXE
19270 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46  D_ENDIAN_64BIT_F
19280 4c 4f 41 54 20 69 73 0a 20 20 20 20 2a 2a 20 64  LOAT is.    ** d
19290 65 66 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62  efined that 64-b
192a0 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  it floating poin
192b0 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20  t values really 
192c0 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20 2a 2a  are mixed.    **
192d0 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 2a 2f 0a   endian..    */.
192e0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
192f0 20 75 36 34 20 74 31 20 3d 20 28 28 75 36 34 29   u64 t1 = ((u64)
19300 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b  0x3ff00000)<<32;
19310 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
19320 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e  t double r1 = 1.
19330 30 3b 0a 20 20 20 20 75 36 34 20 74 32 20 3d 20  0;.    u64 t2 = 
19340 74 31 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65  t1;.    swapMixe
19350 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29  dEndianFloat(t2)
19360 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
19370 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66  zeof(r1)==sizeof
19380 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28 26  (t2) && memcmp(&
19390 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66 28  r1, &t2, sizeof(
193a0 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69  r1))==0 );.#endi
193b0 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  f.    assert( si
193c0 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69  zeof(x)==8 && si
193d0 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 3d  zeof(pMem->u.r)=
193e0 3d 38 20 29 3b 0a 20 20 20 20 73 77 61 70 4d 69  =8 );.    swapMi
193f0 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78  xedEndianFloat(x
19400 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
19410 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20 73 69  Mem->u.r, &x, si
19420 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 70 4d  zeof(x));.    pM
19430 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69  em->flags = sqli
19440 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 75  te3IsNaN(pMem->u
19450 2e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a  .r) ? MEM_Null :
19460 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d 0a 20   MEM_Real;.  }. 
19470 20 72 65 74 75 72 6e 20 38 3b 0a 7d 0a 75 33 32   return 8;.}.u32
19480 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
19490 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75  alGet(.  const u
194a0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
194b0 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72  f,     /* Buffer
194c0 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
194d0 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65  from */.  u32 se
194e0 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20  rial_type,      
194f0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61          /* Seria
19500 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69  l type to deseri
19510 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a  alize */.  Mem *
19520 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20  pMem            
19530 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
19540 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65  ry cell to write
19550 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29   value into */.)
19560 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69  {.  switch( seri
19570 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63  al_type ){.    c
19580 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52 65 73  ase 10:   /* Res
19590 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65  erved for future
195a0 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65   use */.    case
195b0 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76   11:   /* Reserv
195c0 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73  ed for future us
195d0 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a  e */.    case 0:
195e0 20 7b 20 20 2f 2a 20 4e 75 6c 6c 20 2a 2f 0a 20   {  /* Null */. 
195f0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
19600 2d 4f 46 3a 20 52 2d 32 34 30 37 38 2d 30 39 33  -OF: R-24078-093
19610 37 35 20 56 61 6c 75 65 20 69 73 20 61 20 4e 55  75 Value is a NU
19620 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  LL. */.      pMe
19630 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  m->flags = MEM_N
19640 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ull;.      break
19650 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
19660 20 31 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45   1: {.      /* E
19670 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34  VIDENCE-OF: R-44
19680 38 38 35 2d 32 35 31 39 36 20 56 61 6c 75 65 20  885-25196 Value 
19690 69 73 20 61 6e 20 38 2d 62 69 74 20 74 77 6f 73  is an 8-bit twos
196a0 2d 63 6f 6d 70 6c 65 6d 65 6e 74 0a 20 20 20 20  -complement.    
196b0 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 2a 2f    ** integer. */
196c0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
196d0 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28   = ONE_BYTE_INT(
196e0 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  buf);.      pMem
196f0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
19700 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
19710 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
19720 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
19730 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
19740 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20   2: { /* 2-byte 
19750 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
19760 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
19770 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 37 39 34 2d  NCE-OF: R-49794-
19780 33 35 30 32 36 20 56 61 6c 75 65 20 69 73 20 61  35026 Value is a
19790 20 62 69 67 2d 65 6e 64 69 61 6e 20 31 36 2d 62   big-endian 16-b
197a0 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73  it.      ** twos
197b0 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65  -complement inte
197c0 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  ger. */.      pM
197d0 65 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f 42 59  em->u.i = TWO_BY
197e0 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20  TE_INT(buf);.   
197f0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
19800 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
19810 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
19820 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72  u.i<0 );.      r
19830 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20  eturn 2;.    }. 
19840 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20     case 3: { /* 
19850 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  3-byte signed in
19860 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f  teger */.      /
19870 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
19880 2d 33 37 38 33 39 2d 35 34 33 30 31 20 56 61 6c  -37839-54301 Val
19890 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
198a0 61 6e 20 32 34 2d 62 69 74 0a 20 20 20 20 20 20  an 24-bit.      
198b0 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  ** twos-compleme
198c0 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  nt integer. */. 
198d0 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
198e0 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28   THREE_BYTE_INT(
198f0 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  buf);.      pMem
19900 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
19910 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
19920 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
19930 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 33  ;.      return 3
19940 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
19950 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20   4: { /* 4-byte 
19960 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
19970 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
19980 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 38 34 39 2d  NCE-OF: R-01849-
19990 32 36 30 37 39 20 56 61 6c 75 65 20 69 73 20 61  26079 Value is a
199a0 20 62 69 67 2d 65 6e 64 69 61 6e 20 33 32 2d 62   big-endian 32-b
199b0 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73  it.      ** twos
199c0 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65  -complement inte
199d0 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  ger. */.      pM
199e0 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42  em->u.i = FOUR_B
199f0 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 23 69  YTE_INT(buf);.#i
19a00 66 64 65 66 20 5f 5f 48 50 5f 63 63 20 0a 20 20  fdef __HP_cc .  
19a10 20 20 20 20 2f 2a 20 57 6f 72 6b 20 61 72 6f 75      /* Work arou
19a20 6e 64 20 61 20 73 69 67 6e 2d 65 78 74 65 6e 73  nd a sign-extens
19a30 69 6f 6e 20 62 75 67 20 69 6e 20 74 68 65 20 48  ion bug in the H
19a40 50 20 63 6f 6d 70 69 6c 65 72 20 66 6f 72 20 48  P compiler for H
19a50 50 2f 55 58 20 2a 2f 0a 20 20 20 20 20 20 69 66  P/UX */.      if
19a60 28 20 62 75 66 5b 30 5d 26 30 78 38 30 20 29 20  ( buf[0]&0x80 ) 
19a70 70 4d 65 6d 2d 3e 75 2e 69 20 7c 3d 20 30 78 66  pMem->u.i |= 0xf
19a80 66 66 66 66 66 66 66 38 30 30 30 30 30 30 30 4c  fffffff80000000L
19a90 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  L;.#endif.      
19aa0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
19ab0 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73  M_Int;.      tes
19ac0 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69  tcase( pMem->u.i
19ad0 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  <0 );.      retu
19ae0 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 4;.    }.    
19af0 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62  case 5: { /* 6-b
19b00 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
19b10 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45  er */.      /* E
19b20 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 30  VIDENCE-OF: R-50
19b30 33 38 35 2d 30 39 36 37 34 20 56 61 6c 75 65 20  385-09674 Value 
19b40 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20  is a big-endian 
19b50 34 38 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20  48-bit.      ** 
19b60 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20  twos-complement 
19b70 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20  integer. */.    
19b80 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f    pMem->u.i = FO
19b90 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66  UR_BYTE_UINT(buf
19ba0 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c  +2) + (((i64)1)<
19bb0 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e  <32)*TWO_BYTE_IN
19bc0 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
19bd0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
19be0 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
19bf0 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
19c00 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
19c10 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   6;.    }.    ca
19c20 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74  se 6:   /* 8-byt
19c30 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
19c40 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20   */.    case 7: 
19c50 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69  { /* IEEE floati
19c60 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20  ng point */.    
19c70 20 20 2f 2a 20 54 68 65 73 65 20 75 73 65 20 6c    /* These use l
19c80 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 2c 20  ocal variables, 
19c90 73 6f 20 64 6f 20 74 68 65 6d 20 69 6e 20 61 20  so do them in a 
19ca0 73 65 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65  separate routine
19cb0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f  .      ** to avo
19cc0 69 64 20 68 61 76 69 6e 67 20 74 6f 20 6d 6f 76  id having to mov
19cd0 65 20 74 68 65 20 66 72 61 6d 65 20 70 6f 69 6e  e the frame poin
19ce0 74 65 72 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  ter in the commo
19cf0 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  n case */.      
19d00 72 65 74 75 72 6e 20 73 65 72 69 61 6c 47 65 74  return serialGet
19d10 28 62 75 66 2c 73 65 72 69 61 6c 5f 74 79 70 65  (buf,serial_type
19d20 2c 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20  ,pMem);.    }.  
19d30 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20    case 8:    /* 
19d40 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20  Integer 0 */.   
19d50 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49   case 9: {  /* I
19d60 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20  nteger 1 */.    
19d70 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
19d80 3a 20 52 2d 31 32 39 37 36 2d 32 32 38 39 33 20  : R-12976-22893 
19d90 56 61 6c 75 65 20 69 73 20 74 68 65 20 69 6e 74  Value is the int
19da0 65 67 65 72 20 30 2e 20 2a 2f 0a 20 20 20 20 20  eger 0. */.     
19db0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
19dc0 20 52 2d 31 38 31 34 33 2d 31 32 31 32 31 20 56   R-18143-12121 V
19dd0 61 6c 75 65 20 69 73 20 74 68 65 20 69 6e 74 65  alue is the inte
19de0 67 65 72 20 31 2e 20 2a 2f 0a 20 20 20 20 20 20  ger 1. */.      
19df0 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69  pMem->u.i = seri
19e00 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20  al_type-8;.     
19e10 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
19e20 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
19e30 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
19e40 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
19e50 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
19e60 46 3a 20 52 2d 31 34 36 30 36 2d 33 31 35 36 34  F: R-14606-31564
19e70 20 56 61 6c 75 65 20 69 73 20 61 20 42 4c 4f 42   Value is a BLOB
19e80 20 74 68 61 74 20 69 73 20 28 4e 2d 31 32 29 2f   that is (N-12)/
19e90 32 20 62 79 74 65 73 20 69 6e 0a 20 20 20 20 20  2 bytes in.     
19ea0 20 2a 2a 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20   ** length..    
19eb0 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
19ec0 3a 20 52 2d 32 38 34 30 31 2d 30 30 31 34 30 20  : R-28401-00140 
19ed0 56 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e  Value is a strin
19ee0 67 20 69 6e 20 74 68 65 20 74 65 78 74 20 65 6e  g in the text en
19ef0 63 6f 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20  coding and.     
19f00 20 2a 2a 20 28 4e 2d 31 33 29 2f 32 20 62 79 74   ** (N-13)/2 byt
19f10 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 2a 2f  es in length. */
19f20 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
19f30 6e 73 74 20 75 31 36 20 61 46 6c 61 67 5b 5d 20  nst u16 aFlag[] 
19f40 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d  = { MEM_Blob|MEM
19f50 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c  _Ephem, MEM_Str|
19f60 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20 20 20  MEM_Ephem };.   
19f70 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68     pMem->z = (ch
19f80 61 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20  ar *)buf;.      
19f90 70 4d 65 6d 2d 3e 6e 20 3d 20 28 73 65 72 69 61  pMem->n = (seria
19fa0 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20  l_type-12)/2;.  
19fb0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
19fc0 3d 20 61 46 6c 61 67 5b 73 65 72 69 61 6c 5f 74  = aFlag[serial_t
19fd0 79 70 65 26 31 5d 3b 0a 20 20 20 20 20 20 72 65  ype&1];.      re
19fe0 74 75 72 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20  turn pMem->n;.  
19ff0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1a000 20 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68 69 73   0;.}./*.** This
1a010 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
1a020 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 75 66   to allocate suf
1a030 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 66 6f  ficient space fo
1a040 72 20 61 6e 20 55 6e 70 61 63 6b 65 64 52 65 63  r an UnpackedRec
1a050 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ord.** structure
1a060 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
1a070 20 62 65 20 75 73 65 64 20 77 69 74 68 20 73 71   be used with sq
1a080 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
1a090 6e 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68  npack() if.** th
1a0a0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1a0b0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
1a0c0 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
1a0d0 72 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a  re pKeyInfo..**.
1a0e0 2a 2a 20 54 68 65 20 73 70 61 63 65 20 69 73 20  ** The space is 
1a0f0 65 69 74 68 65 72 20 61 6c 6c 6f 63 61 74 65 64  either allocated
1a100 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62   using sqlite3Db
1a110 4d 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72 20 66  MallocRaw() or f
1a120 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68  rom within.** th
1a130 65 20 75 6e 61 6c 69 67 6e 65 64 20 62 75 66 66  e unaligned buff
1a140 65 72 20 70 61 73 73 65 64 20 76 69 61 20 74 68  er passed via th
1a150 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69  e second and thi
1a160 72 64 20 61 72 67 75 6d 65 6e 74 73 20 28 70 72  rd arguments (pr
1a170 65 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63  esumably.** stac
1a180 6b 20 73 70 61 63 65 29 2e 20 49 66 20 74 68 65  k space). If the
1a190 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70   former, then *p
1a1a0 70 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20  pFree is set to 
1a1b0 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 73  a pointer that s
1a1c0 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e  hould.** be even
1a1d0 74 75 61 6c 6c 79 20 66 72 65 65 64 20 62 79 20  tually freed by 
1a1e0 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67  the caller using
1a1f0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29   sqlite3DbFree()
1a200 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a  . Or, if the .**
1a210 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65   allocation come
1a220 73 20 66 72 6f 6d 20 74 68 65 20 70 53 70 61 63  s from the pSpac
1a230 65 2f 73 7a 53 70 61 63 65 20 62 75 66 66 65 72  e/szSpace buffer
1a240 2c 20 2a 70 70 46 72 65 65 20 69 73 20 73 65 74  , *ppFree is set
1a250 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f   to NULL.** befo
1a260 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
1a270 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72  .** If an OOM er
1a280 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c  ror occurs, NULL
1a290 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1a2a0 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20  .UnpackedRecord 
1a2b0 2a 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f  *sqlite3VdbeAllo
1a2c0 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  cUnpackedRecord(
1a2d0 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
1a2e0 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
1a2f0 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f     /* Descriptio
1a300 6e 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  n of the record 
1a310 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63  */.  char *pSpac
1a320 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1a330 20 20 20 20 20 2f 2a 20 55 6e 61 6c 69 67 6e 65       /* Unaligne
1a340 64 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c  d space availabl
1a350 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61  e */.  int szSpa
1a360 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ce,             
1a370 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1a380 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62 79  f pSpace[] in by
1a390 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  tes */.  char **
1a3a0 70 70 46 72 65 65 20 20 20 20 20 20 20 20 20 20  ppFree          
1a3b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1a3c0 20 43 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 66   Caller should f
1a3d0 72 65 65 20 74 68 69 73 20 70 6f 69 6e 74 65 72  ree this pointer
1a3e0 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65   */.){.  Unpacke
1a3f0 64 52 65 63 6f 72 64 20 2a 70 3b 20 20 20 20 20  dRecord *p;     
1a400 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61           /* Unpa
1a410 63 6b 65 64 20 72 65 63 6f 72 64 20 74 6f 20 72  cked record to r
1a420 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  eturn */.  int n
1a430 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
1a440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1a450 63 72 65 6d 65 6e 74 20 70 53 70 61 63 65 20 62  crement pSpace b
1a460 79 20 6e 4f 66 66 20 74 6f 20 61 6c 69 67 6e 20  y nOff to align 
1a470 69 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  it */.  int nByt
1a480 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1a490 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1a4a0 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69  r of bytes requi
1a4b0 72 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a 0a 20  red for *p */.. 
1a4c0 20 2f 2a 20 57 65 20 77 61 6e 74 20 74 6f 20 73   /* We want to s
1a4d0 68 69 66 74 20 74 68 65 20 70 6f 69 6e 74 65 72  hift the pointer
1a4e0 20 70 53 70 61 63 65 20 75 70 20 73 75 63 68 20   pSpace up such 
1a4f0 74 68 61 74 20 69 74 20 69 73 20 38 2d 62 79 74  that it is 8-byt
1a500 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a 20  e aligned..  ** 
1a510 54 68 75 73 2c 20 77 65 20 6e 65 65 64 20 74 6f  Thus, we need to
1a520 20 63 61 6c 63 75 6c 61 74 65 20 61 20 76 61 6c   calculate a val
1a530 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77 65 65  ue, nOff, betwee
1a540 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f 20 73 68  n 0 and 7, to sh
1a550 69 66 74 20 0a 20 20 2a 2a 20 69 74 20 62 79 2e  ift .  ** it by.
1a560 20 20 49 66 20 70 53 70 61 63 65 20 69 73 20 61    If pSpace is a
1a570 6c 72 65 61 64 79 20 38 2d 62 79 74 65 20 61 6c  lready 8-byte al
1a580 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68 6f 75  igned, nOff shou
1a590 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f  ld be zero..  */
1a5a0 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d 20 28  .  nOff = (8 - (
1a5b0 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
1a5c0 54 28 70 53 70 61 63 65 29 20 26 20 37 29 29 20  T(pSpace) & 7)) 
1a5d0 26 20 37 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52  & 7;.  nByte = R
1a5e0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70  OUND8(sizeof(Unp
1a5f0 61 63 6b 65 64 52 65 63 6f 72 64 29 29 20 2b 20  ackedRecord)) + 
1a600 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65  sizeof(Mem)*(pKe
1a610 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29  yInfo->nField+1)
1a620 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 73 7a  ;.  if( nByte>sz
1a630 53 70 61 63 65 2b 6e 4f 66 66 20 29 7b 0a 20 20  Space+nOff ){.  
1a640 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52    p = (UnpackedR
1a650 65 63 6f 72 64 20 2a 29 73 71 6c 69 74 65 33 44  ecord *)sqlite3D
1a660 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49  bMallocRaw(pKeyI
1a670 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b  nfo->db, nByte);
1a680 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20 28  .    *ppFree = (
1a690 63 68 61 72 20 2a 29 70 3b 0a 20 20 20 20 69 66  char *)p;.    if
1a6a0 28 20 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b  ( !p ) return 0;
1a6b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
1a6c0 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  = (UnpackedRecor
1a6d0 64 2a 29 26 70 53 70 61 63 65 5b 6e 4f 66 66 5d  d*)&pSpace[nOff]
1a6e0 3b 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20  ;.    *ppFree = 
1a6f0 30 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 61 4d 65  0;.  }..  p->aMe
1a700 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63 68 61  m = (Mem*)&((cha
1a710 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a  r*)p)[ROUND8(siz
1a720 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f  eof(UnpackedReco
1a730 72 64 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28  rd))];.  assert(
1a740 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
1a750 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 70 2d  Order!=0 );.  p-
1a760 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79  >pKeyInfo = pKey
1a770 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c  Info;.  p->nFiel
1a780 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  d = pKeyInfo->nF
1a790 69 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65 74 75  ield + 1;.  retu
1a7a0 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn p;.}../*.** G
1a7b0 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79  iven the nKey-by
1a7c0 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61  te encoding of a
1a7d0 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b   record in pKey[
1a7e0 5d 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  ], populate the 
1a7f0 0a 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  .** UnpackedReco
1a800 72 64 20 73 74 72 75 63 74 75 72 65 20 69 6e 64  rd structure ind
1a810 69 63 61 74 65 64 20 62 79 20 74 68 65 20 66 6f  icated by the fo
1a820 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20 77 69  urth argument wi
1a830 74 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  th the.** conten
1a840 74 73 20 6f 66 20 74 68 65 20 64 65 63 6f 64 65  ts of the decode
1a850 64 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f  d record..*/ .vo
1a860 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  id sqlite3VdbeRe
1a870 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65  cordUnpack(.  Ke
1a880 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
1a890 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
1a8a0 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65  ion about the re
1a8b0 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20  cord format */. 
1a8c0 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20   int nKey,      
1a8d0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1a8e0 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20 72 65  of the binary re
1a8f0 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  cord */.  const 
1a900 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20  void *pKey,     
1a910 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72   /* The binary r
1a920 65 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63  ecord */.  Unpac
1a930 6b 65 64 52 65 63 6f 72 64 20 2a 70 20 20 20 20  kedRecord *p    
1a940 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68    /* Populate th
1a950 69 73 20 73 74 72 75 63 74 75 72 65 20 62 65 66  is structure bef
1a960 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a  ore returning. *
1a970 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  /.){.  const uns
1a980 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
1a990 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
1a9a0 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a  ed char *)pKey;.
1a9b0 20 20 69 6e 74 20 64 3b 20 0a 20 20 75 33 32 20    int d; .  u32 
1a9c0 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  idx;            
1a9d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1a9e0 66 66 73 65 74 20 69 6e 20 61 4b 65 79 5b 5d 20  ffset in aKey[] 
1a9f0 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
1aa00 20 20 75 31 36 20 75 3b 20 20 20 20 20 20 20 20    u16 u;        
1aa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f    /* Unsigned lo
1aa30 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
1aa40 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d  u32 szHdr;.  Mem
1aa50 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d   *pMem = p->aMem
1aa60 3b 0a 0a 20 20 70 2d 3e 64 65 66 61 75 6c 74 5f  ;..  p->default_
1aa70 72 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  rc = 0;.  assert
1aa80 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
1aa90 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a  GNMENT(pMem) );.
1aaa0 20 20 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e    idx = getVarin
1aab0 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29  t32(aKey, szHdr)
1aac0 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20  ;.  d = szHdr;. 
1aad0 20 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28   u = 0;.  while(
1aae0 20 69 64 78 3c 73 7a 48 64 72 20 26 26 20 64 3c   idx<szHdr && d<
1aaf0 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75 33 32  =nKey ){.    u32
1ab00 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20   serial_type;.. 
1ab10 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72     idx += getVar
1ab20 69 6e 74 33 32 28 26 61 4b 65 79 5b 69 64 78 5d  int32(&aKey[idx]
1ab30 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
1ab40 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
1ab50 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
1ab60 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b     pMem->db = pK
1ab70 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20  eyInfo->db;.    
1ab80 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d  /* pMem->flags =
1ab90 20 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33 56 64   0; // sqlite3Vd
1aba0 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 77 69  beSerialGet() wi
1abb0 6c 6c 20 73 65 74 20 74 68 69 73 20 66 6f 72 20  ll set this for 
1abc0 75 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  us */.    pMem->
1abd0 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  szMalloc = 0;.  
1abe0 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64    d += sqlite3Vd
1abf0 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
1ac00 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  y[d], serial_typ
1ac10 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d  e, pMem);.    pM
1ac20 65 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20 28 2b  em++;.    if( (+
1ac30 2b 75 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64 20 29  +u)>=p->nField )
1ac40 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 61 73   break;.  }.  as
1ac50 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66  sert( u<=pKeyInf
1ac60 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b  o->nField + 1 );
1ac70 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75  .  p->nField = u
1ac80 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
1ac90 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73  DEBUG./*.** This
1aca0 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72   function compar
1acb0 65 73 20 74 77 6f 20 69 6e 64 65 78 20 6f 72 20  es two index or 
1acc0 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6b 65 79  table record key
1acd0 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61  s in the same wa
1ace0 79 0a 2a 2a 20 61 73 20 74 68 65 20 73 71 6c 69  y.** as the sqli
1acf0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1ad00 70 61 72 65 28 29 20 72 6f 75 74 69 6e 65 2e 20  pare() routine. 
1ad10 55 6e 6c 69 6b 65 20 56 64 62 65 52 65 63 6f 72  Unlike VdbeRecor
1ad20 64 43 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a 20 74  dCompare(),.** t
1ad30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73  his function des
1ad40 65 72 69 61 6c 69 7a 65 73 20 61 6e 64 20 63 6f  erializes and co
1ad50 6d 70 61 72 65 73 20 76 61 6c 75 65 73 20 75 73  mpares values us
1ad60 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  ing the.** sqlit
1ad70 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1ad80 29 20 61 6e 64 20 73 71 6c 69 74 65 33 4d 65 6d  ) and sqlite3Mem
1ad90 43 6f 6d 70 61 72 65 28 29 20 66 75 6e 63 74 69  Compare() functi
1ada0 6f 6e 73 2e 20 49 74 20 69 73 20 75 73 65 64 0a  ons. It is used.
1adb0 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 73  ** in assert() s
1adc0 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73  tatements to ens
1add0 75 72 65 20 74 68 61 74 20 74 68 65 20 6f 70 74  ure that the opt
1ade0 69 6d 69 7a 65 64 20 63 6f 64 65 20 69 6e 0a 2a  imized code in.*
1adf0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  * sqlite3VdbeRec
1ae00 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72 65 74  ordCompare() ret
1ae10 75 72 6e 73 20 72 65 73 75 6c 74 73 20 77 69 74  urns results wit
1ae20 68 20 74 68 65 73 65 20 74 77 6f 20 70 72 69 6d  h these two prim
1ae30 69 74 69 76 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  itives..**.** Re
1ae40 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
1ae50 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61   result of compa
1ae60 72 69 73 6f 6e 20 69 73 20 65 71 75 69 76 61 6c  rison is equival
1ae70 65 6e 74 20 74 6f 20 64 65 73 69 72 65 64 52 65  ent to desiredRe
1ae80 73 75 6c 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  sult..** Return 
1ae90 66 61 6c 73 65 20 69 66 20 74 68 65 72 65 20 69  false if there i
1aea0 73 20 61 20 64 69 73 61 67 72 65 65 6d 65 6e 74  s a disagreement
1aeb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1aec0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1aed0 65 44 65 62 75 67 28 0a 20 20 69 6e 74 20 6e 4b  eDebug(.  int nK
1aee0 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
1aef0 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20  *pKey1, /* Left 
1af00 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 55  key */.  const U
1af10 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1af20 50 4b 65 79 32 2c 20 2f 2a 20 52 69 67 68 74 20  PKey2, /* Right 
1af30 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  key */.  int des
1af40 69 72 65 64 52 65 73 75 6c 74 20 20 20 20 20 20  iredResult      
1af50 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 65 63         /* Correc
1af60 74 20 61 6e 73 77 65 72 20 2a 2f 0a 29 7b 0a 20  t answer */.){. 
1af70 20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20 20   u32 d1;        
1af80 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
1af90 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
1afa0 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a  t data element *
1afb0 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20  /.  u32 idx1;   
1afc0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1afd0 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
1afe0 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d  next header elem
1aff0 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  ent */.  u32 szH
1b000 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  dr1;        /* N
1b010 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
1b020 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  n header */.  in
1b030 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  t i = 0;.  int r
1b040 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75  c = 0;.  const u
1b050 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
1b060 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73  ey1 = (const uns
1b070 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65  igned char *)pKe
1b080 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  y1;.  KeyInfo *p
1b090 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d  KeyInfo;.  Mem m
1b0a0 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f  em1;..  pKeyInfo
1b0b0 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49   = pPKey2->pKeyI
1b0c0 6e 66 6f 3b 0a 20 20 69 66 28 20 70 4b 65 79 49  nfo;.  if( pKeyI
1b0d0 6e 66 6f 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74  nfo->db==0 ) ret
1b0e0 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 31 2e 65 6e  urn 1;.  mem1.en
1b0f0 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
1b100 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70  c;.  mem1.db = p
1b110 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f  KeyInfo->db;.  /
1b120 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30  * mem1.flags = 0
1b130 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e  ;  // Will be in
1b140 69 74 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c  itialized by sql
1b150 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1b160 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c  t() */.  VVA_ONL
1b170 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63  Y( mem1.szMalloc
1b180 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20   = 0; ) /* Only 
1b190 6e 65 65 64 65 64 20 62 79 20 61 73 73 65 72 74  needed by assert
1b1a0 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  () statements */
1b1b0 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73  ..  /* Compilers
1b1c0 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68   may complain th
1b1d0 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70  at mem1.u.i is p
1b1e0 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69  otentially unini
1b1f0 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57  tialized..  ** W
1b200 65 20 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69  e could initiali
1b210 7a 65 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20  ze it, as shown 
1b220 68 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65  here, to silence
1b230 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74   those complaint
1b240 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66  s..  ** But in f
1b250 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69  act, mem1.u.i wi
1b260 6c 6c 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c  ll never actuall
1b270 79 20 62 65 20 75 73 65 64 20 75 6e 69 6e 69 74  y be used uninit
1b280 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69  ialized, and doi
1b290 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e  ng .  ** the unn
1b2a0 65 63 65 73 73 61 72 79 20 69 6e 69 74 69 61 6c  ecessary initial
1b2b0 69 7a 61 74 69 6f 6e 20 68 61 73 20 61 20 6d 65  ization has a me
1b2c0 61 73 75 72 61 62 6c 65 20 6e 65 67 61 74 69 76  asurable negativ
1b2d0 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20  e performance.  
1b2e0 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e 63 65  ** impact, since
1b2f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1b300 20 61 20 76 65 72 79 20 68 69 67 68 20 72 75 6e   a very high run
1b310 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65  ner.  And so, we
1b320 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20   choose.  ** to 
1b330 69 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70 69  ignore the compi
1b340 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61 6e 64  ler warnings and
1b350 20 6c 65 61 76 65 20 74 68 69 73 20 76 61 72 69   leave this vari
1b360 61 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a  able uninitializ
1b370 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d  ed..  */.  /*  m
1b380 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f  em1.u.i = 0;  //
1b390 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68 65 72   not needed, her
1b3a0 65 20 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d  e to silence com
1b3b0 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f  piler warning */
1b3c0 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74  .  .  idx1 = get
1b3d0 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20  Varint32(aKey1, 
1b3e0 73 7a 48 64 72 31 29 3b 0a 20 20 69 66 28 20 73  szHdr1);.  if( s
1b3f0 7a 48 64 72 31 3e 39 38 33 30 37 20 29 20 72 65  zHdr1>98307 ) re
1b400 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1b410 55 50 54 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64  UPT;.  d1 = szHd
1b420 72 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b  r1;.  assert( pK
1b430 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70  eyInfo->nField+p
1b440 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64  KeyInfo->nXField
1b450 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  >=pPKey2->nField
1b460 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
1b470 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
1b480 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
1b490 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
1b4a0 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
1b4b0 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  d>0 );.  assert(
1b4c0 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c   idx1<=szHdr1 ||
1b4d0 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
1b4e0 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72   do{.    u32 ser
1b4f0 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20  ial_type1;..    
1b500 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65 72 69  /* Read the seri
1b510 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68 65  al types for the
1b520 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e   next element in
1b530 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20   each key. */.  
1b540 20 20 69 64 78 31 20 2b 3d 20 67 65 74 56 61 72    idx1 += getVar
1b550 69 6e 74 33 32 28 20 61 4b 65 79 31 2b 69 64 78  int32( aKey1+idx
1b560 31 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20  1, serial_type1 
1b570 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66  );..    /* Verif
1b580 79 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  y that there is 
1b590 65 6e 6f 75 67 68 20 6b 65 79 20 73 70 61 63 65  enough key space
1b5a0 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f 20 61 76   remaining to av
1b5b0 6f 69 64 0a 20 20 20 20 2a 2a 20 61 20 62 75 66  oid.    ** a buf
1b5c0 66 65 72 20 6f 76 65 72 72 65 61 64 2e 20 20 54  fer overread.  T
1b5d0 68 65 20 22 64 31 2b 73 65 72 69 61 6c 5f 74 79  he "d1+serial_ty
1b5e0 70 65 31 2b 32 22 20 73 75 62 65 78 70 72 65 73  pe1+2" subexpres
1b5f0 73 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  sion will.    **
1b600 20 61 6c 77 61 79 73 20 62 65 20 67 72 65 61 74   always be great
1b610 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
1b620 20 74 6f 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   to the amount o
1b630 66 20 72 65 71 75 69 72 65 64 20 6b 65 79 20 73  f required key s
1b640 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 55 73 65  pace..    ** Use
1b650 20 74 68 61 74 20 61 70 70 72 6f 78 69 6d 61 74   that approximat
1b660 69 6f 6e 20 74 6f 20 61 76 6f 69 64 20 74 68 65  ion to avoid the
1b670 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65 20   more expensive 
1b680 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
1b690 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1b6a0 54 79 70 65 4c 65 6e 28 29 20 69 6e 20 74 68 65  TypeLen() in the
1b6b0 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20   common case..  
1b6c0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 31 2b    */.    if( d1+
1b6d0 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 3e 28  serial_type1+2>(
1b6e0 75 33 32 29 6e 4b 65 79 31 0a 20 20 20 20 20 26  u32)nKey1.     &
1b6f0 26 20 64 31 2b 73 71 6c 69 74 65 33 56 64 62 65  & d1+sqlite3Vdbe
1b700 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
1b710 72 69 61 6c 5f 74 79 70 65 31 29 3e 28 75 33 32  rial_type1)>(u32
1b720 29 6e 4b 65 79 31 20 0a 20 20 20 20 29 7b 0a 20  )nKey1 .    ){. 
1b730 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b740 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63  }..    /* Extrac
1b750 74 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20  t the values to 
1b760 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20  be compared..   
1b770 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71   */.    d1 += sq
1b780 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1b790 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73  et(&aKey1[d1], s
1b7a0 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65  erial_type1, &me
1b7b0 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20  m1);..    /* Do 
1b7c0 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20  the comparison. 
1b7d0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
1b7e0 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
1b7f0 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d  (&mem1, &pPKey2-
1b800 3e 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65 79 49 6e  >aMem[i], pKeyIn
1b810 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b 0a 20  fo->aColl[i]);. 
1b820 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
1b830 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65        assert( me
1b840 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  m1.szMalloc==0 )
1b850 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e  ;  /* See commen
1b860 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  t below */.     
1b870 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61   if( pKeyInfo->a
1b880 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a  SortOrder[i] ){.
1b890 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63          rc = -rc
1b8a0 3b 20 20 2f 2a 20 49 6e 76 65 72 74 20 74 68 65  ;  /* Invert the
1b8b0 20 72 65 73 75 6c 74 20 66 6f 72 20 44 45 53 43   result for DESC
1b8c0 20 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a   sort order. */.
1b8d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
1b8e0 74 6f 20 64 65 62 75 67 43 6f 6d 70 61 72 65 45  to debugCompareE
1b8f0 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b  nd;.    }.    i+
1b900 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78  +;.  }while( idx
1b910 31 3c 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50  1<szHdr1 && i<pP
1b920 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a  Key2->nField );.
1b930 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20  .  /* No memory 
1b940 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76  allocation is ev
1b950 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e  er used on mem1.
1b960 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69    Prove this usi
1b970 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c  ng.  ** the foll
1b980 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20  owing assert(). 
1b990 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29   If the assert()
1b9a0 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63   fails, it indic
1b9b0 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f  ates a.  ** memo
1b9c0 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65  ry leak and a ne
1b9d0 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74  ed to call sqlit
1b9e0 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
1b9f0 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20  (&mem1)..  */.  
1ba00 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d  assert( mem1.szM
1ba10 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f  alloc==0 );..  /
1ba20 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61  * rc==0 here mea
1ba30 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74  ns that one of t
1ba40 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20  he keys ran out 
1ba50 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20  of fields and.  
1ba60 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64  ** all the field
1ba70 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69  s up to that poi
1ba80 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52  nt were equal. R
1ba90 65 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c  eturn the defaul
1baa0 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  t_rc.  ** value.
1bab0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 50 4b 65    */.  rc = pPKe
1bac0 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a  y2->default_rc;.
1bad0 0a 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64  .debugCompareEnd
1bae0 3a 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52  :.  if( desiredR
1baf0 65 73 75 6c 74 3d 3d 30 20 26 26 20 72 63 3d 3d  esult==0 && rc==
1bb00 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
1bb10 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c  if( desiredResul
1bb20 74 3c 30 20 26 26 20 72 63 3c 30 20 29 20 72 65  t<0 && rc<0 ) re
1bb30 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65  turn 1;.  if( de
1bb40 73 69 72 65 64 52 65 73 75 6c 74 3e 30 20 26 26  siredResult>0 &&
1bb50 20 72 63 3e 30 20 29 20 72 65 74 75 72 6e 20 31   rc>0 ) return 1
1bb60 3b 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f  ;.  if( CORRUPT_
1bb70 44 42 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  DB ) return 1;. 
1bb80 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64   if( pKeyInfo->d
1bb90 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1bba0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
1bbb0 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1bbc0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42  ..#if SQLITE_DEB
1bbd0 55 47 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74  UG./*.** Count t
1bbe0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65  he number of fie
1bbf0 6c 64 73 20 28 61 2e 6b 2e 61 2e 20 63 6f 6c 75  lds (a.k.a. colu
1bc00 6d 6e 73 29 20 69 6e 20 74 68 65 20 72 65 63 6f  mns) in the reco
1bc10 72 64 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70  rd given by.** p
1bc20 4b 65 79 2c 6e 4b 65 79 2e 20 20 54 68 65 20 76  Key,nKey.  The v
1bc30 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20  erify that this 
1bc40 63 6f 75 6e 74 20 69 73 20 6c 65 73 73 20 74 68  count is less th
1bc50 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
1bc60 68 65 0a 2a 2a 20 6c 69 6d 69 74 20 67 69 76 65  he.** limit give
1bc70 6e 20 62 79 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  n by pKeyInfo->n
1bc80 46 69 65 6c 64 20 2b 20 70 4b 65 79 49 6e 66 6f  Field + pKeyInfo
1bc90 2d 3e 6e 58 46 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a  ->nXField..**.**
1bca0 20 49 66 20 74 68 69 73 20 63 6f 6e 73 74 72 61   If this constra
1bcb0 69 6e 74 20 69 73 20 6e 6f 74 20 73 61 74 69 73  int is not satis
1bcc0 66 69 65 64 2c 20 69 74 20 6d 65 61 6e 73 20 74  fied, it means t
1bcd0 68 61 74 20 74 68 65 20 68 69 67 68 2d 73 70 65  hat the high-spe
1bce0 65 64 0a 2a 2a 20 76 64 62 65 52 65 63 6f 72 64  ed.** vdbeRecord
1bcf0 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64  CompareInt() and
1bd00 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1bd10 72 65 53 74 72 69 6e 67 28 29 20 72 6f 75 74 69  reString() routi
1bd20 6e 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20  nes will.** not 
1bd30 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 20  work correctly. 
1bd40 20 49 66 20 74 68 69 73 20 61 73 73 65 72 74 28   If this assert(
1bd50 29 20 65 76 65 72 20 66 69 72 65 73 2c 20 69 74  ) ever fires, it
1bd60 20 70 72 6f 62 61 62 6c 79 20 6d 65 61 6e 73 0a   probably means.
1bd70 2a 2a 20 74 68 61 74 20 74 68 65 20 4b 65 79 49  ** that the KeyI
1bd80 6e 66 6f 2e 6e 46 69 65 6c 64 20 6f 72 20 4b 65  nfo.nField or Ke
1bd90 79 49 6e 66 6f 2e 6e 58 46 69 65 6c 64 20 76 61  yInfo.nXField va
1bda0 6c 75 65 73 20 77 65 72 65 20 63 6f 6d 70 75 74  lues were comput
1bdb0 65 64 0a 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c  ed.** incorrectl
1bdc0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
1bdd0 64 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c  d vdbeAssertFiel
1bde0 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69  dCountWithinLimi
1bdf0 74 73 28 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20  ts(.  int nKey, 
1be00 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1be10 2c 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72  ,   /* The recor
1be20 64 20 74 6f 20 76 65 72 69 66 79 20 2a 2f 20 0a  d to verify */ .
1be30 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e 66 6f 20    const KeyInfo 
1be40 2a 70 4b 65 79 49 6e 66 6f 20 20 20 20 20 20 20  *pKeyInfo       
1be50 2f 2a 20 43 6f 6d 70 61 72 65 20 73 69 7a 65 20  /* Compare size 
1be60 77 69 74 68 20 74 68 69 73 20 4b 65 79 49 6e 66  with this KeyInf
1be70 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 46  o */.){.  int nF
1be80 69 65 6c 64 20 3d 20 30 3b 0a 20 20 75 33 32 20  ield = 0;.  u32 
1be90 73 7a 48 64 72 3b 0a 20 20 75 33 32 20 69 64 78  szHdr;.  u32 idx
1bea0 3b 0a 20 20 75 33 32 20 6e 6f 74 55 73 65 64 3b  ;.  u32 notUsed;
1beb0 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
1bec0 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28  d char *aKey = (
1bed0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1bee0 68 61 72 2a 29 70 4b 65 79 3b 0a 0a 20 20 69 66  har*)pKey;..  if
1bef0 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72  ( CORRUPT_DB ) r
1bf00 65 74 75 72 6e 3b 0a 20 20 69 64 78 20 3d 20 67  eturn;.  idx = g
1bf10 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c  etVarint32(aKey,
1bf20 20 73 7a 48 64 72 29 3b 0a 20 20 61 73 73 65 72   szHdr);.  asser
1bf30 74 28 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20  t( nKey>=0 );.  
1bf40 61 73 73 65 72 74 28 20 73 7a 48 64 72 3c 3d 28  assert( szHdr<=(
1bf50 75 33 32 29 6e 4b 65 79 20 29 3b 0a 20 20 77 68  u32)nKey );.  wh
1bf60 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20 29  ile( idx<szHdr )
1bf70 7b 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74  {.    idx += get
1bf80 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2b 69 64  Varint32(aKey+id
1bf90 78 2c 20 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20  x, notUsed);.   
1bfa0 20 6e 46 69 65 6c 64 2b 2b 3b 0a 20 20 7d 0a 20   nField++;.  }. 
1bfb0 20 61 73 73 65 72 74 28 20 6e 46 69 65 6c 64 20   assert( nField 
1bfc0 3c 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  <= pKeyInfo->nFi
1bfd0 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58  eld+pKeyInfo->nX
1bfe0 46 69 65 6c 64 20 29 3b 0a 7d 0a 23 65 6c 73 65  Field );.}.#else
1bff0 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 41 73  .# define vdbeAs
1c000 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69  sertFieldCountWi
1c010 74 68 69 6e 4c 69 6d 69 74 73 28 41 2c 42 2c 43  thinLimits(A,B,C
1c020 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1c030 42 6f 74 68 20 2a 70 4d 65 6d 31 20 61 6e 64 20  Both *pMem1 and 
1c040 2a 70 4d 65 6d 32 20 63 6f 6e 74 61 69 6e 20 73  *pMem2 contain s
1c050 74 72 69 6e 67 20 76 61 6c 75 65 73 2e 20 43 6f  tring values. Co
1c060 6d 70 61 72 65 20 74 68 65 20 74 77 6f 20 76 61  mpare the two va
1c070 6c 75 65 73 0a 2a 2a 20 75 73 69 6e 67 20 74 68  lues.** using th
1c080 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
1c090 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 41 73 20 75  ence pColl. As u
1c0a0 73 75 61 6c 2c 20 72 65 74 75 72 6e 20 61 20 6e  sual, return a n
1c0b0 65 67 61 74 69 76 65 20 2c 20 7a 65 72 6f 0a 2a  egative , zero.*
1c0c0 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 76 61  * or positive va
1c0d0 6c 75 65 20 69 66 20 2a 70 4d 65 6d 31 20 69 73  lue if *pMem1 is
1c0e0 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
1c0f0 6c 20 74 6f 20 6f 72 20 67 72 65 61 74 65 72 20  l to or greater 
1c100 74 68 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c  than .** *pMem2,
1c110 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 53   respectively. S
1c120 69 6d 69 6c 61 72 20 69 6e 20 73 70 69 72 69 74  imilar in spirit
1c130 20 74 6f 20 22 72 63 20 3d 20 28 2a 70 4d 65 6d   to "rc = (*pMem
1c140 31 29 20 2d 20 28 2a 70 4d 65 6d 32 29 3b 22 2e  1) - (*pMem2);".
1c150 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
1c160 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72  dbeCompareMemStr
1c170 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20 4d 65 6d  ing(.  const Mem
1c180 20 2a 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e 73 74   *pMem1,.  const
1c190 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20 20 63   Mem *pMem2,.  c
1c1a0 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43  onst CollSeq *pC
1c1b0 6f 6c 6c 2c 0a 20 20 75 38 20 2a 70 72 63 45 72  oll,.  u8 *prcEr
1c1c0 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
1c1d0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20         /* If an 
1c1e0 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 73 65 74 20  OOM occurs, set 
1c1f0 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  to SQLITE_NOMEM 
1c200 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 4d 65 6d  */.){.  if( pMem
1c210 31 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65  1->enc==pColl->e
1c220 6e 63 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  nc ){.    /* The
1c230 20 73 74 72 69 6e 67 73 20 61 72 65 20 61 6c 72   strings are alr
1c240 65 61 64 79 20 69 6e 20 74 68 65 20 63 6f 72 72  eady in the corr
1c250 65 63 74 20 65 6e 63 6f 64 69 6e 67 2e 20 20 43  ect encoding.  C
1c260 61 6c 6c 20 74 68 65 0a 20 20 20 20 20 2a 2a 20  all the.     ** 
1c270 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
1c280 69 6f 6e 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a  ion directly */.
1c290 20 20 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c      return pColl
1c2a0 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55  ->xCmp(pColl->pU
1c2b0 73 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65  ser,pMem1->n,pMe
1c2c0 6d 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70  m1->z,pMem2->n,p
1c2d0 4d 65 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73  Mem2->z);.  }els
1c2e0 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  e{.    int rc;. 
1c2f0 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 76     const void *v
1c300 31 2c 20 2a 76 32 3b 0a 20 20 20 20 69 6e 74 20  1, *v2;.    int 
1c310 6e 31 2c 20 6e 32 3b 0a 20 20 20 20 4d 65 6d 20  n1, n2;.    Mem 
1c320 63 31 3b 0a 20 20 20 20 4d 65 6d 20 63 32 3b 0a  c1;.    Mem c2;.
1c330 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1c340 65 6d 49 6e 69 74 28 26 63 31 2c 20 70 4d 65 6d  emInit(&c1, pMem
1c350 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  1->db, MEM_Null)
1c360 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1c370 65 4d 65 6d 49 6e 69 74 28 26 63 32 2c 20 70 4d  eMemInit(&c2, pM
1c380 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c  em1->db, MEM_Nul
1c390 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  l);.    sqlite3V
1c3a0 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70  dbeMemShallowCop
1c3b0 79 28 26 63 31 2c 20 70 4d 65 6d 31 2c 20 4d 45  y(&c1, pMem1, ME
1c3c0 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 73 71  M_Ephem);.    sq
1c3d0 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c  lite3VdbeMemShal
1c3e0 6c 6f 77 43 6f 70 79 28 26 63 32 2c 20 70 4d 65  lowCopy(&c2, pMe
1c3f0 6d 32 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a  m2, MEM_Ephem);.
1c400 20 20 20 20 76 31 20 3d 20 73 71 6c 69 74 65 33      v1 = sqlite3
1c410 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74  ValueText((sqlit
1c420 65 33 5f 76 61 6c 75 65 2a 29 26 63 31 2c 20 70  e3_value*)&c1, p
1c430 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20  Coll->enc);.    
1c440 6e 31 20 3d 20 76 31 3d 3d 30 20 3f 20 30 20 3a  n1 = v1==0 ? 0 :
1c450 20 63 31 2e 6e 3b 0a 20 20 20 20 76 32 20 3d 20   c1.n;.    v2 = 
1c460 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
1c470 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
1c480 29 26 63 32 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63  )&c2, pColl->enc
1c490 29 3b 0a 20 20 20 20 6e 32 20 3d 20 76 32 3d 3d  );.    n2 = v2==
1c4a0 30 20 3f 20 30 20 3a 20 63 32 2e 6e 3b 0a 20 20  0 ? 0 : c2.n;.  
1c4b0 20 20 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43    rc = pColl->xC
1c4c0 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c  mp(pColl->pUser,
1c4d0 20 6e 31 2c 20 76 31 2c 20 6e 32 2c 20 76 32 29   n1, v1, n2, v2)
1c4e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1c4f0 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 31 29  eMemRelease(&c1)
1c500 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1c510 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 32 29  eMemRelease(&c2)
1c520 3b 0a 20 20 20 20 69 66 28 20 28 76 31 3d 3d 30  ;.    if( (v1==0
1c530 20 7c 7c 20 76 32 3d 3d 30 29 20 26 26 20 70 72   || v2==0) && pr
1c540 63 45 72 72 20 29 20 2a 70 72 63 45 72 72 20 3d  cErr ) *prcErr =
1c550 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1c560 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1c570 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  }.}../*.** Compa
1c580 72 65 20 74 77 6f 20 62 6c 6f 62 73 2e 20 20 52  re two blobs.  R
1c590 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20  eturn negative, 
1c5a0 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76  zero, or positiv
1c5b0 65 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 2a  e if the first.*
1c5c0 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  * is less than, 
1c5d0 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65  equal to, or gre
1c5e0 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 73 65  ater than the se
1c5f0 63 6f 6e 64 2c 20 72 65 73 70 65 63 74 69 76 65  cond, respective
1c600 6c 79 2e 0a 2a 2a 20 49 66 20 6f 6e 65 20 62 6c  ly..** If one bl
1c610 6f 62 20 69 73 20 61 20 70 72 65 66 69 78 20 6f  ob is a prefix o
1c620 66 20 74 68 65 20 6f 74 68 65 72 2c 20 74 68 65  f the other, the
1c630 6e 20 74 68 65 20 73 68 6f 72 74 65 72 20 69 73  n the shorter is
1c640 20 74 68 65 20 6c 65 73 73 6f 72 2e 0a 2a 2f 0a   the lessor..*/.
1c650 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
1c660 49 4e 4c 49 4e 45 20 69 6e 74 20 73 71 6c 69 74  INLINE int sqlit
1c670 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 63 6f  e3BlobCompare(co
1c680 6e 73 74 20 4d 65 6d 20 2a 70 42 31 2c 20 63 6f  nst Mem *pB1, co
1c690 6e 73 74 20 4d 65 6d 20 2a 70 42 32 29 7b 0a 20  nst Mem *pB2){. 
1c6a0 20 69 6e 74 20 63 20 3d 20 6d 65 6d 63 6d 70 28   int c = memcmp(
1c6b0 70 42 31 2d 3e 7a 2c 20 70 42 32 2d 3e 7a 2c 20  pB1->z, pB2->z, 
1c6c0 70 42 31 2d 3e 6e 3e 70 42 32 2d 3e 6e 20 3f 20  pB1->n>pB2->n ? 
1c6d0 70 42 32 2d 3e 6e 20 3a 20 70 42 31 2d 3e 6e 29  pB2->n : pB1->n)
1c6e0 3b 0a 20 20 69 66 28 20 63 20 29 20 72 65 74 75  ;.  if( c ) retu
1c6f0 72 6e 20 63 3b 0a 20 20 72 65 74 75 72 6e 20 70  rn c;.  return p
1c700 42 31 2d 3e 6e 20 2d 20 70 42 32 2d 3e 6e 3b 0a  B1->n - pB2->n;.
1c710 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 63 6f  }../*.** Do a co
1c720 6d 70 61 72 69 73 6f 6e 20 62 65 74 77 65 65 6e  mparison between
1c730 20 61 20 36 34 2d 62 69 74 20 73 69 67 6e 65 64   a 64-bit signed
1c740 20 69 6e 74 65 67 65 72 20 61 6e 64 20 61 20 36   integer and a 6
1c750 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 2d 70  4-bit floating-p
1c760 6f 69 6e 74 0a 2a 2a 20 6e 75 6d 62 65 72 2e 20  oint.** number. 
1c770 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65   Return negative
1c780 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74  , zero, or posit
1c790 69 76 65 20 69 66 20 74 68 65 20 66 69 72 73 74  ive if the first
1c7a0 20 28 69 36 34 29 20 69 73 20 6c 65 73 73 20 74   (i64) is less t
1c7b0 68 61 6e 2c 0a 2a 2a 20 65 71 75 61 6c 20 74 6f  han,.** equal to
1c7c0 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  , or greater tha
1c7d0 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 28 64 6f  n the second (do
1c7e0 75 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  uble)..*/.static
1c7f0 20 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 74 46   int sqlite3IntF
1c800 6c 6f 61 74 43 6f 6d 70 61 72 65 28 69 36 34 20  loatCompare(i64 
1c810 69 2c 20 64 6f 75 62 6c 65 20 72 29 7b 0a 20 20  i, double r){.  
1c820 69 66 28 20 73 69 7a 65 6f 66 28 4c 4f 4e 47 44  if( sizeof(LONGD
1c830 4f 55 42 4c 45 5f 54 59 50 45 29 3e 38 20 29 7b  OUBLE_TYPE)>8 ){
1c840 0a 20 20 20 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f  .    LONGDOUBLE_
1c850 54 59 50 45 20 78 20 3d 20 28 4c 4f 4e 47 44 4f  TYPE x = (LONGDO
1c860 55 42 4c 45 5f 54 59 50 45 29 69 3b 0a 20 20 20  UBLE_TYPE)i;.   
1c870 20 69 66 28 20 78 3c 72 20 29 20 72 65 74 75 72   if( x<r ) retur
1c880 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 78 3e  n -1;.    if( x>
1c890 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20  r ) return +1;. 
1c8a0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1c8b0 65 6c 73 65 7b 0a 20 20 20 20 69 36 34 20 79 3b  else{.    i64 y;
1c8c0 0a 20 20 20 20 64 6f 75 62 6c 65 20 73 3b 0a 20  .    double s;. 
1c8d0 20 20 20 69 66 28 20 72 3c 2d 39 32 32 33 33 37     if( r<-922337
1c8e0 32 30 33 36 38 35 34 37 37 35 38 30 38 2e 30 20  2036854775808.0 
1c8f0 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20  ) return +1;.   
1c900 20 69 66 28 20 72 3e 39 32 32 33 33 37 32 30 33   if( r>922337203
1c910 36 38 35 34 37 37 35 38 30 37 2e 30 20 29 20 72  6854775807.0 ) r
1c920 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 79 20  eturn -1;.    y 
1c930 3d 20 28 69 36 34 29 72 3b 0a 20 20 20 20 69 66  = (i64)r;.    if
1c940 28 20 69 3c 79 20 29 20 72 65 74 75 72 6e 20 2d  ( i<y ) return -
1c950 31 3b 0a 20 20 20 20 69 66 28 20 69 3e 79 20 29  1;.    if( i>y )
1c960 7b 0a 20 20 20 20 20 20 69 66 28 20 79 3d 3d 53  {.      if( y==S
1c970 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 26 26  MALLEST_INT64 &&
1c980 20 72 3e 30 2e 30 20 29 20 72 65 74 75 72 6e 20   r>0.0 ) return 
1c990 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  -1;.      return
1c9a0 20 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   +1;.    }.    s
1c9b0 20 3d 20 28 64 6f 75 62 6c 65 29 69 3b 0a 20 20   = (double)i;.  
1c9c0 20 20 69 66 28 20 73 3c 72 20 29 20 72 65 74 75    if( s<r ) retu
1c9d0 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 73  rn -1;.    if( s
1c9e0 3e 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a  >r ) return +1;.
1c9f0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1ca00 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  }.}../*.** Compa
1ca10 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 63 6f  re the values co
1ca20 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65 20 74  ntained by the t
1ca30 77 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2c  wo memory cells,
1ca40 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65   returning.** ne
1ca50 67 61 74 69 76 65 2c 20 7a 65 72 6f 20 6f 72 20  gative, zero or 
1ca60 70 6f 73 69 74 69 76 65 20 69 66 20 70 4d 65 6d  positive if pMem
1ca70 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  1 is less than, 
1ca80 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65  equal to, or gre
1ca90 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20 70 4d 65  ater.** than pMe
1caa0 6d 32 2e 20 53 6f 72 74 69 6e 67 20 6f 72 64 65  m2. Sorting orde
1cab0 72 20 69 73 20 4e 55 4c 4c 27 73 20 66 69 72 73  r is NULL's firs
1cac0 74 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6e  t, followed by n
1cad0 75 6d 62 65 72 73 20 28 69 6e 74 65 67 65 72 73  umbers (integers
1cae0 0a 2a 2a 20 61 6e 64 20 72 65 61 6c 73 29 20 73  .** and reals) s
1caf0 6f 72 74 65 64 20 6e 75 6d 65 72 69 63 61 6c 6c  orted numericall
1cb00 79 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74  y, followed by t
1cb10 65 78 74 20 6f 72 64 65 72 65 64 20 62 79 20 74  ext ordered by t
1cb20 68 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20  he collating.** 
1cb30 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 61  sequence pColl a
1cb40 6e 64 20 66 69 6e 61 6c 6c 79 20 62 6c 6f 62 27  nd finally blob'
1cb50 73 20 6f 72 64 65 72 65 64 20 62 79 20 6d 65 6d  s ordered by mem
1cb60 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f  cmp()..**.** Two
1cb70 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65   NULL values are
1cb80 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 61   considered equa
1cb90 6c 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  l by this functi
1cba0 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
1cbb0 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 63 6f 6e  e3MemCompare(con
1cbc0 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20 63  st Mem *pMem1, c
1cbd0 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c  onst Mem *pMem2,
1cbe0 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a   const CollSeq *
1cbf0 70 43 6f 6c 6c 29 7b 0a 20 20 69 6e 74 20 66 31  pColl){.  int f1
1cc00 2c 20 66 32 3b 0a 20 20 69 6e 74 20 63 6f 6d 62  , f2;.  int comb
1cc10 69 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 20 66  ined_flags;..  f
1cc20 31 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61 67 73  1 = pMem1->flags
1cc30 3b 0a 20 20 66 32 20 3d 20 70 4d 65 6d 32 2d 3e  ;.  f2 = pMem2->
1cc40 66 6c 61 67 73 3b 0a 20 20 63 6f 6d 62 69 6e 65  flags;.  combine
1cc50 64 5f 66 6c 61 67 73 20 3d 20 66 31 7c 66 32 3b  d_flags = f1|f2;
1cc60 0a 20 20 61 73 73 65 72 74 28 20 28 63 6f 6d 62  .  assert( (comb
1cc70 69 6e 65 64 5f 66 6c 61 67 73 20 26 20 4d 45 4d  ined_flags & MEM
1cc80 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b 0a 20  _RowSet)==0 );. 
1cc90 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c  .  /* If one val
1cca0 75 65 20 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69  ue is NULL, it i
1ccb0 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  s less than the 
1ccc0 6f 74 68 65 72 2e 20 49 66 20 62 6f 74 68 20 76  other. If both v
1ccd0 61 6c 75 65 73 0a 20 20 2a 2a 20 61 72 65 20 4e  alues.  ** are N
1cce0 55 4c 4c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20  ULL, return 0.. 
1ccf0 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e   */.  if( combin
1cd00 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c  ed_flags&MEM_Nul
1cd10 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
1cd20 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20  (f2&MEM_Null) - 
1cd30 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20  (f1&MEM_Null);. 
1cd40 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 6c 65 61 73   }..  /* At leas
1cd50 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f  t one of the two
1cd60 20 76 61 6c 75 65 73 20 69 73 20 61 20 6e 75 6d   values is a num
1cd70 62 65 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  ber.  */.  if( c
1cd80 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d  ombined_flags&(M
1cd90 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29  EM_Int|MEM_Real)
1cda0 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66 31 20   ){.    if( (f1 
1cdb0 26 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74 29 21  & f2 & MEM_Int)!
1cdc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1cdd0 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d 65  pMem1->u.i < pMe
1cde0 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e  m2->u.i ) return
1cdf0 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70   -1;.      if( p
1ce00 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d  Mem1->u.i > pMem
1ce10 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20  2->u.i ) return 
1ce20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  +1;.      return
1ce30 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
1ce40 28 20 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d  ( (f1 & f2 & MEM
1ce50 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20  _Real)!=0 ){.   
1ce60 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e     if( pMem1->u.
1ce70 72 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29  r < pMem2->u.r )
1ce80 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1ce90 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72    if( pMem1->u.r
1cea0 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20   > pMem2->u.r ) 
1ceb0 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20  return +1;.     
1cec0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
1ced0 0a 20 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d  .    if( (f1&MEM
1cee0 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  _Int)!=0 ){.    
1cef0 20 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 52 65    if( (f2&MEM_Re
1cf00 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
1cf10 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1cf20 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28  IntFloatCompare(
1cf30 70 4d 65 6d 31 2d 3e 75 2e 69 2c 20 70 4d 65 6d  pMem1->u.i, pMem
1cf40 32 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d  2->u.r);.      }
1cf50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
1cf60 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d  turn -1;.      }
1cf70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1cf80 66 31 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20  f1&MEM_Real)!=0 
1cf90 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66 32  ){.      if( (f2
1cfa0 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a  &MEM_Int)!=0 ){.
1cfb0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d          return -
1cfc0 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43  sqlite3IntFloatC
1cfd0 6f 6d 70 61 72 65 28 70 4d 65 6d 32 2d 3e 75 2e  ompare(pMem2->u.
1cfe0 69 2c 20 70 4d 65 6d 31 2d 3e 75 2e 72 29 3b 0a  i, pMem1->u.r);.
1cff0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d000 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
1d010 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d020 20 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 7d    return +1;.  }
1d030 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61  ..  /* If one va
1d040 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 20  lue is a string 
1d050 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 69 73  and the other is
1d060 20 61 20 62 6c 6f 62 2c 20 74 68 65 20 73 74 72   a blob, the str
1d070 69 6e 67 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a  ing is less..  *
1d080 2a 20 49 66 20 62 6f 74 68 20 61 72 65 20 73 74  * If both are st
1d090 72 69 6e 67 73 2c 20 63 6f 6d 70 61 72 65 20 75  rings, compare u
1d0a0 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69  sing the collati
1d0b0 6e 67 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20  ng functions..  
1d0c0 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65  */.  if( combine
1d0d0 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20  d_flags&MEM_Str 
1d0e0 29 7b 0a 20 20 20 20 69 66 28 20 28 66 31 20 26  ){.    if( (f1 &
1d0f0 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a   MEM_Str)==0 ){.
1d100 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1d110 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66      }.    if( (f
1d120 32 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20  2 & MEM_Str)==0 
1d130 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1d140 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61  -1;.    }..    a
1d150 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e  ssert( pMem1->en
1d160 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20 7c 7c  c==pMem2->enc ||
1d170 20 70 4d 65 6d 31 2d 3e 64 62 2d 3e 6d 61 6c 6c   pMem1->db->mall
1d180 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
1d190 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65  assert( pMem1->e
1d1a0 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20  nc==SQLITE_UTF8 
1d1b0 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
1d1c0 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49  pMem1->enc==SQLI
1d1d0 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d  TE_UTF16LE || pM
1d1e0 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  em1->enc==SQLITE
1d1f0 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a 20 20 20  _UTF16BE );..   
1d200 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f   /* The collatio
1d210 6e 20 73 65 71 75 65 6e 63 65 20 6d 75 73 74 20  n sequence must 
1d220 62 65 20 64 65 66 69 6e 65 64 20 61 74 20 74 68  be defined at th
1d230 69 73 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69  is point, even i
1d240 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 75 73 65  f.    ** the use
1d250 72 20 64 65 6c 65 74 65 73 20 74 68 65 20 63 6f  r deletes the co
1d260 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1d270 20 61 66 74 65 72 20 74 68 65 20 76 64 62 65 20   after the vdbe 
1d280 70 72 6f 67 72 61 6d 20 69 73 0a 20 20 20 20 2a  program is.    *
1d290 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74 68 69 73  * compiled (this
1d2a0 20 77 61 73 20 6e 6f 74 20 61 6c 77 61 79 73 20   was not always 
1d2b0 74 68 65 20 63 61 73 65 29 2e 0a 20 20 20 20 2a  the case)..    *
1d2c0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  /.    assert( !p
1d2d0 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78  Coll || pColl->x
1d2e0 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  Cmp );..    if( 
1d2f0 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72  pColl ){.      r
1d300 65 74 75 72 6e 20 76 64 62 65 43 6f 6d 70 61 72  eturn vdbeCompar
1d310 65 4d 65 6d 53 74 72 69 6e 67 28 70 4d 65 6d 31  eMemString(pMem1
1d320 2c 20 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20  , pMem2, pColl, 
1d330 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  0);.    }.    /*
1d340 20 49 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   If a NULL point
1d350 65 72 20 77 61 73 20 70 61 73 73 65 64 20 61 73  er was passed as
1d360 20 74 68 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e   the collate fun
1d370 63 74 69 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f  ction, fall thro
1d380 75 67 68 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  ugh.    ** to th
1d390 65 20 62 6c 6f 62 20 63 61 73 65 20 61 6e 64 20  e blob case and 
1d3a0 75 73 65 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a  use memcmp().  *
1d3b0 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74  /.  }. .  /* Bot
1d3c0 68 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65  h values must be
1d3d0 20 62 6c 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65   blobs.  Compare
1d3e0 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e   using memcmp().
1d3f0 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71    */.  return sq
1d400 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65  lite3BlobCompare
1d410 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a  (pMem1, pMem2);.
1d420 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  }.../*.** The fi
1d430 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73  rst argument pas
1d440 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
1d450 74 69 6f 6e 20 69 73 20 61 20 73 65 72 69 61 6c  tion is a serial
1d460 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a 20 63 6f  -type that.** co
1d470 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20  rresponds to an 
1d480 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c 20 76 61  integer - all va
1d490 6c 75 65 73 20 62 65 74 77 65 65 6e 20 31 20 61  lues between 1 a
1d4a0 6e 64 20 39 20 69 6e 63 6c 75 73 69 76 65 20 0a  nd 9 inclusive .
1d4b0 2a 2a 20 65 78 63 65 70 74 20 37 2e 20 54 68 65  ** except 7. The
1d4c0 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20 74   second points t
1d4d0 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
1d4e0 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67 65 72  ining an integer
1d4f0 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61 6c   value.** serial
1d500 69 7a 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74  ized according t
1d510 6f 20 73 65 72 69 61 6c 5f 74 79 70 65 2e 20 54  o serial_type. T
1d520 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73  his function des
1d530 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64  erializes.** and
1d540 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c   returns the val
1d550 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36  ue..*/.static i6
1d560 34 20 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f  4 vdbeRecordDeco
1d570 64 65 49 6e 74 28 75 33 32 20 73 65 72 69 61 6c  deInt(u32 serial
1d580 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 75 38 20  _type, const u8 
1d590 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 79 3b  *aKey){.  u32 y;
1d5a0 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
1d5b0 50 54 5f 44 42 20 7c 7c 20 28 73 65 72 69 61 6c  PT_DB || (serial
1d5c0 5f 74 79 70 65 3e 3d 31 20 26 26 20 73 65 72 69  _type>=1 && seri
1d5d0 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26 20 73 65  al_type<=9 && se
1d5e0 72 69 61 6c 5f 74 79 70 65 21 3d 37 29 20 29 3b  rial_type!=7) );
1d5f0 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61  .  switch( seria
1d600 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  l_type ){.    ca
1d610 73 65 20 30 3a 0a 20 20 20 20 63 61 73 65 20 31  se 0:.    case 1
1d620 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
1d630 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1d640 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 4f  ;.      return O
1d650 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  NE_BYTE_INT(aKey
1d660 29 3b 0a 20 20 20 20 63 61 73 65 20 32 3a 0a 20  );.    case 2:. 
1d670 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1d680 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1d690 20 20 20 20 20 72 65 74 75 72 6e 20 54 57 4f 5f       return TWO_
1d6a0 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1d6b0 20 20 20 20 63 61 73 65 20 33 3a 0a 20 20 20 20      case 3:.    
1d6c0 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1d6d0 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1d6e0 20 20 72 65 74 75 72 6e 20 54 48 52 45 45 5f 42    return THREE_B
1d6f0 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1d700 20 20 20 63 61 73 65 20 34 3a 20 7b 0a 20 20 20     case 4: {.   
1d710 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1d720 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1d730 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45     y = FOUR_BYTE
1d740 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
1d750 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a     return (i64)*
1d760 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d 0a  (int*)&y;.    }.
1d770 20 20 20 20 63 61 73 65 20 35 3a 20 7b 0a 20 20      case 5: {.  
1d780 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
1d790 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
1d7a0 20 20 20 20 72 65 74 75 72 6e 20 46 4f 55 52 5f      return FOUR_
1d7b0 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32  BYTE_UINT(aKey+2
1d7c0 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33  ) + (((i64)1)<<3
1d7d0 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  2)*TWO_BYTE_INT(
1d7e0 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  aKey);.    }.   
1d7f0 20 63 61 73 65 20 36 3a 20 7b 0a 20 20 20 20 20   case 6: {.     
1d800 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59   u64 x = FOUR_BY
1d810 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
1d820 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1d830 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1d840 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
1d850 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   | FOUR_BYTE_UIN
1d860 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20  T(aKey+4);.     
1d870 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69   return (i64)*(i
1d880 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20 20  64*)&x;.    }.  
1d890 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 73 65 72  }..  return (ser
1d8a0 69 61 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a 7d  ial_type - 8);.}
1d8b0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1d8c0 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74  ction compares t
1d8d0 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77  he two table row
1d8e0 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72  s or index recor
1d8f0 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  ds.** specified 
1d900 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  by {nKey1, pKey1
1d910 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49  } and pPKey2.  I
1d920 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61  t returns a nega
1d930 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  tive, zero.** or
1d940 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65   positive intege
1d950 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73  r if key1 is les
1d960 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
1d970 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20   or .** greater 
1d980 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20  than key2.  The 
1d990 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b  {nKey1, pKey1} k
1d9a0 65 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f  ey must be a blo
1d9b0 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20  b.** created by 
1d9c0 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
1d9d0 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20  d opcode of the 
1d9e0 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79  VDBE.  The pPKey
1d9f0 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65  2.** key must be
1da00 20 61 20 70 61 72 73 65 64 20 6b 65 79 20 73 75   a parsed key su
1da10 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66  ch as obtained f
1da20 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  rom.** sqlite3Vd
1da30 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a  beParseRecord..*
1da40 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  *.** If argument
1da50 20 62 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   bSkip is non-ze
1da60 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ro, it is assume
1da70 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  d that the calle
1da80 72 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a  r has already.**
1da90 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74   determined that
1daa0 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
1dab0 73 20 6f 66 20 74 68 65 20 6b 65 79 73 20 61 72  s of the keys ar
1dac0 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b  e equal..**.** K
1dad0 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20  ey1 and Key2 do 
1dae0 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74  not have to cont
1daf0 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ain the same num
1db00 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 20 49  ber of fields. I
1db10 66 20 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73  f all .** fields
1db20 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20   that appear in 
1db30 62 6f 74 68 20 6b 65 79 73 20 61 72 65 20 65 71  both keys are eq
1db40 75 61 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79 32  ual, then pPKey2
1db50 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 73 20  ->default_rc is 
1db60 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  .** returned..**
1db70 0a 2a 2a 20 49 66 20 64 61 74 61 62 61 73 65 20  .** If database 
1db80 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 69  corruption is di
1db90 73 63 6f 76 65 72 65 64 2c 20 73 65 74 20 70 50  scovered, set pP
1dba0 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 74 6f  Key2->errCode to
1dbb0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52   .** SQLITE_CORR
1dbc0 55 50 54 20 61 6e 64 20 72 65 74 75 72 6e 20 30  UPT and return 0
1dbd0 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  . If an OOM erro
1dbe0 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
1dbf0 2c 20 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e 65 72  , .** pPKey2->er
1dc00 72 43 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20  rCode is set to 
1dc10 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64  SQLITE_NOMEM and
1dc20 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 4e  , if it is not N
1dc30 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c  ULL, the.** mall
1dc40 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61 67 20 73  oc-failed flag s
1dc50 65 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  et on database h
1dc60 61 6e 64 6c 65 20 28 70 50 4b 65 79 32 2d 3e 70  andle (pPKey2->p
1dc70 4b 65 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f  KeyInfo->db)..*/
1dc80 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1dc90 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74  RecordCompareWit
1dca0 68 53 6b 69 70 28 0a 20 20 69 6e 74 20 6e 4b 65  hSkip(.  int nKe
1dcb0 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
1dcc0 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74  pKey1,   /* Left
1dcd0 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
1dce0 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
1dcf0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67  ,         /* Rig
1dd00 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  ht key */.  int 
1dd10 62 53 6b 69 70 20 20 20 20 20 20 20 20 20 20 20  bSkip           
1dd20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1dd30 66 20 74 72 75 65 2c 20 73 6b 69 70 20 74 68 65  f true, skip the
1dd40 20 66 69 72 73 74 20 66 69 65 6c 64 20 2a 2f 0a   first field */.
1dd50 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20  ){.  u32 d1;    
1dd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd70 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
1dd80 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
1dd90 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20  xt data element 
1dda0 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
1ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddc0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1ddd0 20 6e 65 78 74 20 66 69 65 6c 64 20 74 6f 20 63   next field to c
1dde0 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75 33 32 20  ompare */.  u32 
1ddf0 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 20  szHdr1;         
1de00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1de10 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 68 65  ize of record he
1de20 61 64 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f  ader in bytes */
1de30 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20  .  u32 idx1;    
1de40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de50 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
1de60 66 69 72 73 74 20 74 79 70 65 20 69 6e 20 68 65  first type in he
1de70 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ader */.  int rc
1de80 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1de90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1dea0 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d  urn value */.  M
1deb0 65 6d 20 2a 70 52 68 73 20 3d 20 70 50 4b 65 79  em *pRhs = pPKey
1dec0 32 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f  2->aMem;       /
1ded0 2a 20 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20  * Next field of 
1dee0 70 50 4b 65 79 32 20 74 6f 20 63 6f 6d 70 61 72  pPKey2 to compar
1def0 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  e */.  KeyInfo *
1df00 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79  pKeyInfo = pPKey
1df10 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 63  2->pKeyInfo;.  c
1df20 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1df30 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  ar *aKey1 = (con
1df40 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1df50 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4d 65 6d 20   *)pKey1;.  Mem 
1df60 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 62  mem1;..  /* If b
1df70 53 6b 69 70 20 69 73 20 74 72 75 65 2c 20 74 68  Skip is true, th
1df80 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  en the caller ha
1df90 73 20 61 6c 72 65 61 64 79 20 64 65 74 65 72 6d  s already determ
1dfa0 69 6e 65 64 20 74 68 61 74 20 74 68 65 20 66 69  ined that the fi
1dfb0 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20 65 6c 65  rst.  ** two ele
1dfc0 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6b 65 79  ments in the key
1dfd0 73 20 61 72 65 20 65 71 75 61 6c 2e 20 46 69 78  s are equal. Fix
1dfe0 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 61   the various sta
1dff0 63 6b 20 76 61 72 69 61 62 6c 65 73 20 73 6f 0a  ck variables so.
1e000 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 72    ** that this r
1e010 6f 75 74 69 6e 65 20 62 65 67 69 6e 73 20 63 6f  outine begins co
1e020 6d 70 61 72 69 6e 67 20 61 74 20 74 68 65 20 73  mparing at the s
1e030 65 63 6f 6e 64 20 66 69 65 6c 64 2e 20 2a 2f 0a  econd field. */.
1e040 20 20 69 66 28 20 62 53 6b 69 70 20 29 7b 0a 20    if( bSkip ){. 
1e050 20 20 20 75 33 32 20 73 31 3b 0a 20 20 20 20 69     u32 s1;.    i
1e060 64 78 31 20 3d 20 31 20 2b 20 67 65 74 56 61 72  dx1 = 1 + getVar
1e070 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c  int32(&aKey1[1],
1e080 20 73 31 29 3b 0a 20 20 20 20 73 7a 48 64 72 31   s1);.    szHdr1
1e090 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 20 20 20   = aKey1[0];.   
1e0a0 20 64 31 20 3d 20 73 7a 48 64 72 31 20 2b 20 73   d1 = szHdr1 + s
1e0b0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1e0c0 54 79 70 65 4c 65 6e 28 73 31 29 3b 0a 20 20 20  TypeLen(s1);.   
1e0d0 20 69 20 3d 20 31 3b 0a 20 20 20 20 70 52 68 73   i = 1;.    pRhs
1e0e0 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
1e0f0 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e   idx1 = getVarin
1e100 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72  t32(aKey1, szHdr
1e110 31 29 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48  1);.    d1 = szH
1e120 64 72 31 3b 0a 20 20 20 20 69 66 28 20 64 31 3e  dr1;.    if( d1>
1e130 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1e140 29 7b 20 0a 20 20 20 20 20 20 70 50 4b 65 79 32  ){ .      pPKey2
1e150 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29  ->errCode = (u8)
1e160 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1e170 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72  KPT;.      retur
1e180 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74  n 0;  /* Corrupt
1e190 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ion */.    }.   
1e1a0 20 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 56   i = 0;.  }..  V
1e1b0 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a  VA_ONLY( mem1.sz
1e1c0 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a  Malloc = 0; ) /*
1e1d0 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20   Only needed by 
1e1e0 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
1e1f0 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  nts */.  assert(
1e200 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1e210 6f 2d 3e 6e 46 69 65 6c 64 2b 70 50 4b 65 79 32  o->nField+pPKey2
1e220 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69  ->pKeyInfo->nXFi
1e230 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69  eld>=pPKey2->nFi
1e240 65 6c 64 20 0a 20 20 20 20 20 20 20 7c 7c 20 43  eld .       || C
1e250 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61  ORRUPT_DB );.  a
1e260 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70  ssert( pPKey2->p
1e270 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
1e280 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  der!=0 );.  asse
1e290 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  rt( pPKey2->pKey
1e2a0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29  Info->nField>0 )
1e2b0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 31  ;.  assert( idx1
1e2c0 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52  <=szHdr1 || CORR
1e2d0 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a  UPT_DB );.  do{.
1e2e0 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74      u32 serial_t
1e2f0 79 70 65 3b 0a 0a 20 20 20 20 2f 2a 20 52 48 53  ype;..    /* RHS
1e300 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a   is an integer *
1e310 2f 0a 20 20 20 20 69 66 28 20 70 52 68 73 2d 3e  /.    if( pRhs->
1e320 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
1e330 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f  ){.      serial_
1e340 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78  type = aKey1[idx
1e350 31 5d 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1];.      testca
1e360 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  se( serial_type=
1e370 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28  =12 );.      if(
1e380 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30   serial_type>=10
1e390 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1e3a0 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   +1;.      }else
1e3b0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1e3c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
1e3d0 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  c = -1;.      }e
1e3e0 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74  lse if( serial_t
1e3f0 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  ype==7 ){.      
1e400 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72    sqlite3VdbeSer
1e410 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31  ialGet(&aKey1[d1
1e420 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  ], serial_type, 
1e430 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20  &mem1);.        
1e440 72 63 20 3d 20 2d 73 71 6c 69 74 65 33 49 6e 74  rc = -sqlite3Int
1e450 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 52 68  FloatCompare(pRh
1e460 73 2d 3e 75 2e 69 2c 20 6d 65 6d 31 2e 75 2e 72  s->u.i, mem1.u.r
1e470 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1e480 20 20 20 20 20 20 20 20 69 36 34 20 6c 68 73 20          i64 lhs 
1e490 3d 20 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f  = vdbeRecordDeco
1e4a0 64 65 49 6e 74 28 73 65 72 69 61 6c 5f 74 79 70  deInt(serial_typ
1e4b0 65 2c 20 26 61 4b 65 79 31 5b 64 31 5d 29 3b 0a  e, &aKey1[d1]);.
1e4c0 20 20 20 20 20 20 20 20 69 36 34 20 72 68 73 20          i64 rhs 
1e4d0 3d 20 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20  = pRhs->u.i;.   
1e4e0 20 20 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73       if( lhs<rhs
1e4f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1e500 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d   = -1;.        }
1e510 65 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73  else if( lhs>rhs
1e520 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1e530 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d   = +1;.        }
1e540 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1e550 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 72 65      /* RHS is re
1e560 61 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69  al */.    else i
1e570 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
1e580 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20   MEM_Real ){.   
1e590 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d     serial_type =
1e5a0 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20   aKey1[idx1];.  
1e5b0 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
1e5c0 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20  ype>=10 ){.     
1e5d0 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
1e5e0 65 73 20 31 32 20 6f 72 20 67 72 65 61 74 65 72  es 12 or greater
1e5f0 20 61 72 65 20 73 74 72 69 6e 67 73 20 61 6e 64   are strings and
1e600 20 62 6c 6f 62 73 20 28 67 72 65 61 74 65 72 20   blobs (greater 
1e610 74 68 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  than.        ** 
1e620 6e 75 6d 62 65 72 73 29 2e 20 54 79 70 65 73 20  numbers). Types 
1e630 31 30 20 61 6e 64 20 31 31 20 61 72 65 20 63 75  10 and 11 are cu
1e640 72 72 65 6e 74 6c 79 20 22 72 65 73 65 72 76 65  rrently "reserve
1e650 64 20 66 6f 72 20 66 75 74 75 72 65 20 0a 20 20  d for future .  
1e660 20 20 20 20 20 20 2a 2a 20 75 73 65 22 2c 20 73        ** use", s
1e670 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 72 65 61  o it doesn't rea
1e680 6c 6c 79 20 6d 61 74 74 65 72 20 77 68 61 74 20  lly matter what 
1e690 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 63  the results of c
1e6a0 6f 6d 70 61 72 69 6e 67 0a 20 20 20 20 20 20 20  omparing.       
1e6b0 20 2a 2a 20 74 68 65 6d 20 74 6f 20 6e 75 6d 62   ** them to numb
1e6c0 65 72 69 63 20 76 61 6c 75 65 73 20 61 72 65 2e  eric values are.
1e6d0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20    */.        rc 
1e6e0 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = +1;.      }els
1e6f0 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70  e if( serial_typ
1e700 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
1e710 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  rc = -1;.      }
1e720 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
1e730 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1e740 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73  et(&aKey1[d1], s
1e750 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d  erial_type, &mem
1e760 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
1e770 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29  serial_type==7 )
1e780 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1e790 6d 65 6d 31 2e 75 2e 72 3c 70 52 68 73 2d 3e 75  mem1.u.r<pRhs->u
1e7a0 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  .r ){.          
1e7b0 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1e7c0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6d       }else if( m
1e7d0 65 6d 31 2e 75 2e 72 3e 70 52 68 73 2d 3e 75 2e  em1.u.r>pRhs->u.
1e7e0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
1e7f0 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20   rc = +1;.      
1e800 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
1e810 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
1e820 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 74 46 6c  c = sqlite3IntFl
1e830 6f 61 74 43 6f 6d 70 61 72 65 28 6d 65 6d 31 2e  oatCompare(mem1.
1e840 75 2e 69 2c 20 70 52 68 73 2d 3e 75 2e 72 29 3b  u.i, pRhs->u.r);
1e850 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1e860 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1e870 20 52 48 53 20 69 73 20 61 20 73 74 72 69 6e 67   RHS is a string
1e880 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28   */.    else if(
1e890 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d   pRhs->flags & M
1e8a0 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20  EM_Str ){.      
1e8b0 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
1e8c0 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c  y1[idx1], serial
1e8d0 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65  _type);.      te
1e8e0 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74  stcase( serial_t
1e8f0 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20  ype==12 );.     
1e900 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1e910 3c 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72  <12 ){.        r
1e920 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  c = -1;.      }e
1e930 6c 73 65 20 69 66 28 20 21 28 73 65 72 69 61 6c  lse if( !(serial
1e940 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b  _type & 0x01) ){
1e950 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31  .        rc = +1
1e960 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1e970 20 20 20 20 20 20 20 6d 65 6d 31 2e 6e 20 3d 20         mem1.n = 
1e980 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31  (serial_type - 1
1e990 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20  2) / 2;.        
1e9a0 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65  testcase( (d1+me
1e9b0 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e 65 64  m1.n)==(unsigned
1e9c0 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20  )nKey1 );.      
1e9d0 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b    testcase( (d1+
1e9e0 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69  mem1.n+1)==(unsi
1e9f0 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20  gned)nKey1 );.  
1ea00 20 20 20 20 20 20 69 66 28 20 28 64 31 2b 6d 65        if( (d1+me
1ea10 6d 31 2e 6e 29 20 3e 20 28 75 6e 73 69 67 6e 65  m1.n) > (unsigne
1ea20 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20  d)nKey1 ){.     
1ea30 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72       pPKey2->err
1ea40 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54  Code = (u8)SQLIT
1ea50 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1ea60 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1ea70 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1ea80 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e     /* Corruption
1ea90 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   */.        }els
1eaa0 65 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  e if( pKeyInfo->
1eab0 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20  aColl[i] ){.    
1eac0 20 20 20 20 20 20 6d 65 6d 31 2e 65 6e 63 20 3d        mem1.enc =
1ead0 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a   pKeyInfo->enc;.
1eae0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 64            mem1.d
1eaf0 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
1eb00 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  ;.          mem1
1eb10 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  .flags = MEM_Str
1eb20 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  ;.          mem1
1eb30 2e 7a 20 3d 20 28 63 68 61 72 2a 29 26 61 4b 65  .z = (char*)&aKe
1eb40 79 31 5b 64 31 5d 3b 0a 20 20 20 20 20 20 20 20  y1[d1];.        
1eb50 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 70 61    rc = vdbeCompa
1eb60 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 20  reMemString(.   
1eb70 20 20 20 20 20 20 20 20 20 20 20 26 6d 65 6d 31             &mem1
1eb80 2c 20 70 52 68 73 2c 20 70 4b 65 79 49 6e 66 6f  , pRhs, pKeyInfo
1eb90 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b  ->aColl[i], &pPK
1eba0 65 79 32 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20  ey2->errCode.   
1ebb0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
1ebc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1ebd0 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49     int nCmp = MI
1ebe0 4e 28 6d 65 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e  N(mem1.n, pRhs->
1ebf0 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  n);.          rc
1ec00 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31   = memcmp(&aKey1
1ec10 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e  [d1], pRhs->z, n
1ec20 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Cmp);.          
1ec30 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d  if( rc==0 ) rc =
1ec40 20 6d 65 6d 31 2e 6e 20 2d 20 70 52 68 73 2d 3e   mem1.n - pRhs->
1ec50 6e 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  n; .        }.  
1ec60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1ec70 20 2f 2a 20 52 48 53 20 69 73 20 61 20 62 6c 6f   /* RHS is a blo
1ec80 62 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66  b */.    else if
1ec90 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
1eca0 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20  MEM_Blob ){.    
1ecb0 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61    getVarint32(&a
1ecc0 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69  Key1[idx1], seri
1ecd0 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20  al_type);.      
1ece0 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c  testcase( serial
1ecf0 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20  _type==12 );.   
1ed00 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
1ed10 70 65 3c 31 32 20 7c 7c 20 28 73 65 72 69 61 6c  pe<12 || (serial
1ed20 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b  _type & 0x01) ){
1ed30 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31  .        rc = -1
1ed40 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1ed50 20 20 20 20 20 20 20 69 6e 74 20 6e 53 74 72 20         int nStr 
1ed60 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d  = (serial_type -
1ed70 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20   12) / 2;.      
1ed80 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b    testcase( (d1+
1ed90 6e 53 74 72 29 3d 3d 28 75 6e 73 69 67 6e 65 64  nStr)==(unsigned
1eda0 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20  )nKey1 );.      
1edb0 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b    testcase( (d1+
1edc0 6e 53 74 72 2b 31 29 3d 3d 28 75 6e 73 69 67 6e  nStr+1)==(unsign
1edd0 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20  ed)nKey1 );.    
1ede0 20 20 20 20 69 66 28 20 28 64 31 2b 6e 53 74 72      if( (d1+nStr
1edf0 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b  ) > (unsigned)nK
1ee00 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ey1 ){.         
1ee10 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65   pPKey2->errCode
1ee20 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f   = (u8)SQLITE_CO
1ee30 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1ee40 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
1ee50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ee60 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  * Corruption */.
1ee70 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1ee80 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d           int nCm
1ee90 70 20 3d 20 4d 49 4e 28 6e 53 74 72 2c 20 70 52  p = MIN(nStr, pR
1eea0 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20  hs->n);.        
1eeb0 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61    rc = memcmp(&a
1eec0 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e  Key1[d1], pRhs->
1eed0 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20  z, nCmp);.      
1eee0 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20      if( rc==0 ) 
1eef0 72 63 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73  rc = nStr - pRhs
1ef00 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ->n;.        }. 
1ef10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1ef20 20 20 2f 2a 20 52 48 53 20 69 73 20 6e 75 6c 6c    /* RHS is null
1ef30 20 2a 2f 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20   */.    else{.  
1ef40 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20      serial_type 
1ef50 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20  = aKey1[idx1];. 
1ef60 20 20 20 20 20 72 63 20 3d 20 28 73 65 72 69 61       rc = (seria
1ef70 6c 5f 74 79 70 65 21 3d 30 29 3b 0a 20 20 20 20  l_type!=0);.    
1ef80 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  }..    if( rc!=0
1ef90 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4b   ){.      if( pK
1efa0 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
1efb0 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20  er[i] ){.       
1efc0 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20   rc = -rc;.     
1efd0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
1efe0 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1eff0 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70  reDebug(nKey1, p
1f000 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 63  Key1, pPKey2, rc
1f010 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
1f020 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63  t( mem1.szMalloc
1f030 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63  ==0 );  /* See c
1f040 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a  omment below */.
1f050 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1f060 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b  .    }..    i++;
1f070 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 20  .    pRhs++;.   
1f080 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64   d1 += sqlite3Vd
1f090 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
1f0a0 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
1f0b0 20 20 69 64 78 31 20 2b 3d 20 73 71 6c 69 74 65    idx1 += sqlite
1f0c0 33 56 61 72 69 6e 74 4c 65 6e 28 73 65 72 69 61  3VarintLen(seria
1f0d0 6c 5f 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c  l_type);.  }whil
1f0e0 65 28 20 69 64 78 31 3c 28 75 6e 73 69 67 6e 65  e( idx1<(unsigne
1f0f0 64 29 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50  d)szHdr1 && i<pP
1f100 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 26 26 20  Key2->nField && 
1f110 64 31 3c 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b  d1<=(unsigned)nK
1f120 65 79 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  ey1 );..  /* No 
1f130 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1f140 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f  n is ever used o
1f150 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74  n mem1.  Prove t
1f160 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74  his using.  ** t
1f170 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
1f180 65 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61  ert().  If the a
1f190 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69  ssert() fails, i
1f1a0 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20  t indicates a.  
1f1b0 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61  ** memory leak a
1f1c0 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c  nd a need to cal
1f1d0 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  l sqlite3VdbeMem
1f1e0 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 20  Release(&mem1). 
1f1f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65   */.  assert( me
1f200 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  m1.szMalloc==0 )
1f210 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65  ;..  /* rc==0 he
1f220 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e  re means that on
1f230 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65  e or both of the
1f240 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66   keys ran out of
1f250 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a   fields and.  **
1f260 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20   all the fields 
1f270 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74  up to that point
1f280 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74   were equal. Ret
1f290 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f  urn the default_
1f2a0 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20  rc.  ** value.  
1f2b0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  */.  assert( COR
1f2c0 52 55 50 54 5f 44 42 20 0a 20 20 20 20 20 20 20  RUPT_DB .       
1f2d0 7c 7c 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  || vdbeRecordCom
1f2e0 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
1f2f0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
1f300 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
1f310 72 63 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  rc) .       || p
1f320 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c  KeyInfo->db->mal
1f330 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20  locFailed.  );. 
1f340 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20   pPKey2->eqSeen 
1f350 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  = 1;.  return pP
1f360 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
1f370 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
1f380 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1f390 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
1f3a0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
1f3b0 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  ,   /* Left key 
1f3c0 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
1f3d0 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20  ord *pPKey2     
1f3e0 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
1f3f0 79 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e  y */.){.  return
1f400 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1f410 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69  rdCompareWithSki
1f420 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  p(nKey1, pKey1, 
1f430 70 50 4b 65 79 32 2c 20 30 29 3b 0a 7d 0a 0a 0a  pPKey2, 0);.}...
1f440 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1f450 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ion is an optimi
1f460 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73  zed version of s
1f470 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1f480 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68  Compare() .** th
1f490 61 74 20 28 61 29 20 74 68 65 20 66 69 72 73 74  at (a) the first
1f4a0 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32   field of pPKey2
1f4b0 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20   is an integer, 
1f4c0 61 6e 64 20 28 62 29 20 74 68 65 20 0a 2a 2a 20  and (b) the .** 
1f4d0 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76  size-of-header v
1f4e0 61 72 69 6e 74 20 61 74 20 74 68 65 20 73 74 61  arint at the sta
1f4f0 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65  rt of (pKey1/nKe
1f500 79 31 29 20 66 69 74 73 20 69 6e 20 61 20 73 69  y1) fits in a si
1f510 6e 67 6c 65 0a 2a 2a 20 62 79 74 65 20 28 69 2e  ngle.** byte (i.
1f520 65 2e 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  e. is less than 
1f530 31 32 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  128)..**.** To a
1f540 76 6f 69 64 20 63 6f 6e 63 65 72 6e 73 20 61 62  void concerns ab
1f550 6f 75 74 20 62 75 66 66 65 72 20 6f 76 65 72 72  out buffer overr
1f560 65 61 64 73 2c 20 74 68 69 73 20 72 6f 75 74 69  eads, this routi
1f570 6e 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 0a  ne is only used.
1f580 2a 2a 20 6f 6e 20 73 63 68 65 6d 61 73 20 77 68  ** on schemas wh
1f590 65 72 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ere the maximum 
1f5a0 76 61 6c 69 64 20 68 65 61 64 65 72 20 73 69 7a  valid header siz
1f5b0 65 20 69 73 20 36 33 20 62 79 74 65 73 20 6f 72  e is 63 bytes or
1f5c0 20 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   less..*/.static
1f5d0 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43   int vdbeRecordC
1f5e0 6f 6d 70 61 72 65 49 6e 74 28 0a 20 20 69 6e 74  ompareInt(.  int
1f5f0 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
1f600 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65  id *pKey1, /* Le
1f610 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61  ft key */.  Unpa
1f620 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  ckedRecord *pPKe
1f630 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67  y2        /* Rig
1f640 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63  ht key */.){.  c
1f650 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 20 3d 20  onst u8 *aKey = 
1f660 26 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65  &((const u8*)pKe
1f670 79 31 29 5b 2a 28 63 6f 6e 73 74 20 75 38 2a 29  y1)[*(const u8*)
1f680 70 4b 65 79 31 20 26 20 30 78 33 46 5d 3b 0a 20  pKey1 & 0x3F];. 
1f690 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65   int serial_type
1f6a0 20 3d 20 28 28 63 6f 6e 73 74 20 75 38 2a 29 70   = ((const u8*)p
1f6b0 4b 65 79 31 29 5b 31 5d 3b 0a 20 20 69 6e 74 20  Key1)[1];.  int 
1f6c0 72 65 73 3b 0a 20 20 75 33 32 20 79 3b 0a 20 20  res;.  u32 y;.  
1f6d0 75 36 34 20 78 3b 0a 20 20 69 36 34 20 76 20 3d  u64 x;.  i64 v =
1f6e0 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
1f6f0 2e 75 2e 69 3b 0a 20 20 69 36 34 20 6c 68 73 3b  .u.i;.  i64 lhs;
1f700 0a 0a 20 20 76 64 62 65 41 73 73 65 72 74 46 69  ..  vdbeAssertFi
1f710 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69  eldCountWithinLi
1f720 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79  mits(nKey1, pKey
1f730 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  1, pPKey2->pKeyI
1f740 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nfo);.  assert( 
1f750 28 2a 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d 30  (*(u8*)pKey1)<=0
1f760 78 33 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  x3F || CORRUPT_D
1f770 42 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73  B );.  switch( s
1f780 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20  erial_type ){.  
1f790 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31    case 1: { /* 1
1f7a0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1f7b0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68  eger */.      lh
1f7c0 73 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54  s = ONE_BYTE_INT
1f7d0 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65  (aKey);.      te
1f7e0 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
1f7f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1f800 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20    }.    case 2: 
1f810 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e  { /* 2-byte sign
1f820 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1f830 20 20 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42 59      lhs = TWO_BY
1f840 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1f850 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
1f860 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
1f870 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1f880 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74  se 3: { /* 3-byt
1f890 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1f8a0 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   */.      lhs = 
1f8b0 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61  THREE_BYTE_INT(a
1f8c0 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
1f8d0 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
1f8e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f8f0 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20  }.    case 4: { 
1f900 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 4-byte signed
1f910 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1f920 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f    y = FOUR_BYTE_
1f930 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  UINT(aKey);.    
1f940 20 20 6c 68 73 20 3d 20 28 69 36 34 29 2a 28 69    lhs = (i64)*(i
1f950 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20 20 74 65  nt*)&y;.      te
1f960 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
1f970 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1f980 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20    }.    case 5: 
1f990 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e  { /* 6-byte sign
1f9a0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1f9b0 20 20 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f 42      lhs = FOUR_B
1f9c0 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29  YTE_UINT(aKey+2)
1f9d0 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32   + (((i64)1)<<32
1f9e0 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61  )*TWO_BYTE_INT(a
1f9f0 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
1fa00 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
1fa10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1fa20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b 20  }.    case 6: { 
1fa30 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 8-byte signed
1fa40 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1fa50 20 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f    x = FOUR_BYTE_
1fa60 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  UINT(aKey);.    
1fa70 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20    x = (x<<32) | 
1fa80 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
1fa90 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c 68  Key+4);.      lh
1faa0 73 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20  s = *(i64*)&x;. 
1fab0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
1fac0 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
1fad0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1fae0 61 73 65 20 38 3a 20 0a 20 20 20 20 20 20 6c 68  ase 8: .      lh
1faf0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  s = 0;.      bre
1fb00 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 39 3a 0a  ak;.    case 9:.
1fb10 20 20 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a 20        lhs = 1;. 
1fb20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
1fb30 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 63 6f   /* This case co
1fb40 75 6c 64 20 62 65 20 72 65 6d 6f 76 65 64 20 77  uld be removed w
1fb50 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20  ithout changing 
1fb60 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 72  the results of r
1fb70 75 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  unning.    ** th
1fb80 69 73 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64 69  is code. Includi
1fb90 6e 67 20 69 74 20 63 61 75 73 65 73 20 67 63 63  ng it causes gcc
1fba0 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 66   to generate a f
1fbb0 61 73 74 65 72 20 73 77 69 74 63 68 20 0a 20 20  aster switch .  
1fbc0 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28    ** statement (
1fbd0 73 69 6e 63 65 20 74 68 65 20 72 61 6e 67 65 20  since the range 
1fbe0 6f 66 20 73 77 69 74 63 68 20 74 61 72 67 65 74  of switch target
1fbf0 73 20 6e 6f 77 20 73 74 61 72 74 73 20 61 74 20  s now starts at 
1fc00 7a 65 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a 20  zero and.    ** 
1fc10 69 73 20 63 6f 6e 74 69 67 75 6f 75 73 29 20 62  is contiguous) b
1fc20 75 74 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73  ut does not caus
1fc30 65 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65 20  e any duplicate 
1fc40 63 6f 64 65 20 74 6f 20 62 65 20 67 65 6e 65 72  code to be gener
1fc50 61 74 65 64 0a 20 20 20 20 2a 2a 20 28 61 73 20  ated.    ** (as 
1fc60 67 63 63 20 69 73 20 63 6c 65 76 65 72 20 65 6e  gcc is clever en
1fc70 6f 75 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65 20  ough to combine 
1fc80 74 68 65 20 74 77 6f 20 6c 69 6b 65 20 63 61 73  the two like cas
1fc90 65 73 29 2e 20 4f 74 68 65 72 20 0a 20 20 20 20  es). Other .    
1fca0 2a 2a 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69 67  ** compilers mig
1fcb0 68 74 20 62 65 20 73 69 6d 69 6c 61 72 2e 20 20  ht be similar.  
1fcc0 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 30 3a 20  */ .    case 0: 
1fcd0 63 61 73 65 20 37 3a 0a 20 20 20 20 20 20 72 65  case 7:.      re
1fce0 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
1fcf0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b  RecordCompare(nK
1fd00 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1fd10 79 32 29 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c  y2);..    defaul
1fd20 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
1fd30 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1fd40 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20  dCompare(nKey1, 
1fd50 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a  pKey1, pPKey2);.
1fd60 20 20 7d 0a 0a 20 20 69 66 28 20 76 3e 6c 68 73    }..  if( v>lhs
1fd70 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50   ){.    res = pP
1fd80 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73  Key2->r1;.  }els
1fd90 65 20 69 66 28 20 76 3c 6c 68 73 20 29 7b 0a 20  e if( v<lhs ){. 
1fda0 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
1fdb0 3e 72 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  >r2;.  }else if(
1fdc0 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e   pPKey2->nField>
1fdd0 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  1 ){.    /* The 
1fde0 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20  first fields of 
1fdf0 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65  the two keys are
1fe00 20 65 71 75 61 6c 2e 20 43 6f 6d 70 61 72 65 20   equal. Compare 
1fe10 74 68 65 20 74 72 61 69 6c 69 6e 67 20 0a 20 20  the trailing .  
1fe20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 20 2a 2f    ** fields.  */
1fe30 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74  .    res = sqlit
1fe40 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1fe50 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79  areWithSkip(nKey
1fe60 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1fe70 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 1);.  }else{. 
1fe80 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
1fe90 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77  fields of the tw
1fea0 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c  o keys are equal
1feb0 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e   and there are n
1fec0 6f 20 74 72 61 69 6c 69 6e 67 0a 20 20 20 20 2a  o trailing.    *
1fed0 2a 20 66 69 65 6c 64 73 2e 20 52 65 74 75 72 6e  * fields. Return
1fee0 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
1fef0 5f 72 63 20 69 6e 20 74 68 69 73 20 63 61 73 65  _rc in this case
1ff00 2e 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 70  . */.    res = p
1ff10 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
1ff20 63 3b 0a 20 20 20 20 70 50 4b 65 79 32 2d 3e 65  c;.    pPKey2->e
1ff30 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a  qSeen = 1;.  }..
1ff40 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65    assert( vdbeRe
1ff50 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
1ff60 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
1ff70 50 4b 65 79 32 2c 20 72 65 73 29 20 29 3b 0a 20  PKey2, res) );. 
1ff80 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
1ff90 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1ffa0 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ion is an optimi
1ffb0 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73  zed version of s
1ffc0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1ffd0 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68  Compare() .** th
1ffe0 61 74 20 28 61 29 20 74 68 65 20 66 69 72 73 74  at (a) the first
1fff0 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32   field of pPKey2
20000 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20 74 68   is a string, th
20010 61 74 20 28 62 29 20 74 68 65 20 66 69 72 73 74  at (b) the first
20020 20 66 69 65 6c 64 0a 2a 2a 20 75 73 65 73 20 74   field.** uses t
20030 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
20040 75 65 6e 63 65 20 42 49 4e 41 52 59 20 61 6e 64  uence BINARY and
20050 20 28 63 29 20 74 68 61 74 20 74 68 65 20 73 69   (c) that the si
20060 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72  ze-of-header var
20070 69 6e 74 20 0a 2a 2a 20 61 74 20 74 68 65 20 73  int .** at the s
20080 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e  tart of (pKey1/n
20090 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20 61 20  Key1) fits in a 
200a0 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a  single byte..*/.
200b0 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52  static int vdbeR
200c0 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69  ecordCompareStri
200d0 6e 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  ng(.  int nKey1,
200e0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
200f0 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  y1, /* Left key 
20100 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
20110 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20  ord *pPKey2     
20120 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20     /* Right key 
20130 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38  */.){.  const u8
20140 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74   *aKey1 = (const
20150 20 75 38 2a 29 70 4b 65 79 31 3b 0a 20 20 69 6e   u8*)pKey1;.  in
20160 74 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 20  t serial_type;. 
20170 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73 73   int res;..  ass
20180 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65  ert( pPKey2->aMe
20190 6d 5b 30 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d  m[0].flags & MEM
201a0 5f 53 74 72 20 29 3b 0a 20 20 76 64 62 65 41 73  _Str );.  vdbeAs
201b0 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69  sertFieldCountWi
201c0 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31  thinLimits(nKey1
201d0 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d  , pKey1, pPKey2-
201e0 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 67 65  >pKeyInfo);.  ge
201f0 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31  tVarint32(&aKey1
20200 5b 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  [1], serial_type
20210 29 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  );.  if( serial_
20220 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 72  type<12 ){.    r
20230 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b  es = pPKey2->r1;
20240 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f        /* (pKey1/
20250 6e 4b 65 79 31 29 20 69 73 20 61 20 6e 75 6d 62  nKey1) is a numb
20260 65 72 20 6f 72 20 61 20 6e 75 6c 6c 20 2a 2f 0a  er or a null */.
20270 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65    }else if( !(se
20280 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31  rial_type & 0x01
20290 29 20 29 7b 20 0a 20 20 20 20 72 65 73 20 3d 20  ) ){ .    res = 
202a0 70 50 4b 65 79 32 2d 3e 72 32 3b 20 20 20 20 20  pPKey2->r2;     
202b0 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31   /* (pKey1/nKey1
202c0 29 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20  ) is a blob */. 
202d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
202e0 6e 43 6d 70 3b 0a 20 20 20 20 69 6e 74 20 6e 53  nCmp;.    int nS
202f0 74 72 3b 0a 20 20 20 20 69 6e 74 20 73 7a 48 64  tr;.    int szHd
20300 72 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 0a 20  r = aKey1[0];.. 
20310 20 20 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61     nStr = (seria
20320 6c 5f 74 79 70 65 2d 31 32 29 20 2f 20 32 3b 0a  l_type-12) / 2;.
20330 20 20 20 20 69 66 28 20 28 73 7a 48 64 72 20 2b      if( (szHdr +
20340 20 6e 53 74 72 29 20 3e 20 6e 4b 65 79 31 20 29   nStr) > nKey1 )
20350 7b 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e  {.      pPKey2->
20360 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51  errCode = (u8)SQ
20370 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
20380 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T;.      return 
20390 30 3b 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74  0;    /* Corrupt
203a0 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ion */.    }.   
203b0 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 20 70 50 4b   nCmp = MIN( pPK
203c0 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c 20  ey2->aMem[0].n, 
203d0 6e 53 74 72 20 29 3b 0a 20 20 20 20 72 65 73 20  nStr );.    res 
203e0 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b  = memcmp(&aKey1[
203f0 73 7a 48 64 72 5d 2c 20 70 50 4b 65 79 32 2d 3e  szHdr], pPKey2->
20400 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d 70 29  aMem[0].z, nCmp)
20410 3b 0a 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d  ;..    if( res==
20420 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d  0 ){.      res =
20430 20 6e 53 74 72 20 2d 20 70 50 4b 65 79 32 2d 3e   nStr - pPKey2->
20440 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20  aMem[0].n;.     
20450 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
20460 20 20 20 20 20 20 20 69 66 28 20 70 50 4b 65 79         if( pPKey
20470 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20  2->nField>1 ){. 
20480 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 73           res = s
20490 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
204a0 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28  CompareWithSkip(
204b0 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
204c0 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20 20 20 20  Key2, 1);.      
204d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
204e0 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
204f0 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20  >default_rc;.   
20500 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65         pPKey2->e
20510 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20  qSeen = 1;.     
20520 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
20530 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20   if( res>0 ){.  
20540 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
20550 79 32 2d 3e 72 32 3b 0a 20 20 20 20 20 20 7d 65  y2->r2;.      }e
20560 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73  lse{.        res
20570 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20   = pPKey2->r1;. 
20580 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
20590 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20   if( res>0 ){.  
205a0 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
205b0 2d 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ->r2;.    }else{
205c0 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b  .      res = pPK
205d0 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a 20  ey2->r1;.    }. 
205e0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64   }..  assert( vd
205f0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
20600 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79  ebug(nKey1, pKey
20610 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29 0a  1, pPKey2, res).
20620 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50         || CORRUP
20630 54 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c 20 70  T_DB.       || p
20640 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
20650 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
20660 64 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  d.  );.  return 
20670 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  res;.}../*.** Re
20680 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
20690 6f 20 61 6e 20 73 71 6c 69 74 65 33 56 64 62 65  o an sqlite3Vdbe
206a0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
206b0 63 6f 6d 70 61 74 69 62 6c 65 20 66 75 6e 63 74  compatible funct
206c0 69 6f 6e 0a 2a 2a 20 73 75 69 74 61 62 6c 65 20  ion.** suitable 
206d0 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 73 65  for comparing se
206e0 72 69 61 6c 69 7a 65 64 20 72 65 63 6f 72 64 73  rialized records
206f0 20 74 6f 20 74 68 65 20 75 6e 70 61 63 6b 65 64   to the unpacked
20700 20 72 65 63 6f 72 64 20 70 61 73 73 65 64 0a 2a   record passed.*
20710 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  * as the only ar
20720 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72  gument..*/.Recor
20730 64 43 6f 6d 70 61 72 65 20 73 71 6c 69 74 65 33  dCompare sqlite3
20740 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28  VdbeFindCompare(
20750 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
20760 70 29 7b 0a 20 20 2f 2a 20 76 61 72 69 6e 74 52  p){.  /* varintR
20770 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28  ecordCompareInt(
20780 29 20 61 6e 64 20 76 61 72 69 6e 74 52 65 63 6f  ) and varintReco
20790 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28  rdCompareString(
207a0 29 20 62 6f 74 68 20 61 73 73 75 6d 65 0a 20 20  ) both assume.  
207b0 2a 2a 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  ** that the size
207c0 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e  -of-header varin
207d0 74 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74  t that occurs at
207e0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61   the start of ea
207f0 63 68 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 66  ch record.  ** f
20800 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20  its in a single 
20810 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20 31 32  byte (i.e. is 12
20820 37 20 6f 72 20 6c 65 73 73 29 2e 20 76 61 72 69  7 or less). vari
20830 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  ntRecordCompareI
20840 6e 74 28 29 0a 20 20 2a 2a 20 61 6c 73 6f 20 61  nt().  ** also a
20850 73 73 75 6d 65 73 20 74 68 61 74 20 69 74 20 69  ssumes that it i
20860 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72 72 65  s safe to overre
20870 61 64 20 61 20 62 75 66 66 65 72 20 62 79 20 61  ad a buffer by a
20880 74 20 6c 65 61 73 74 20 74 68 65 20 0a 20 20 2a  t least the .  *
20890 2a 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73 69 62  * maximum possib
208a0 6c 65 20 6c 65 67 61 6c 20 68 65 61 64 65 72 20  le legal header 
208b0 73 69 7a 65 20 70 6c 75 73 20 38 20 62 79 74 65  size plus 8 byte
208c0 73 2e 20 42 65 63 61 75 73 65 20 74 68 65 72 65  s. Because there
208d0 20 69 73 0a 20 20 2a 2a 20 67 75 61 72 61 6e 74   is.  ** guarant
208e0 65 65 64 20 74 6f 20 62 65 20 61 74 20 6c 65 61  eed to be at lea
208f0 73 74 20 37 34 20 28 62 75 74 20 6e 6f 74 20 31  st 74 (but not 1
20900 33 36 29 20 62 79 74 65 73 20 6f 66 20 70 61 64  36) bytes of pad
20910 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 65  ding following e
20920 61 63 68 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  ach.  ** buffer 
20930 70 61 73 73 65 64 20 74 6f 20 76 61 72 69 6e 74  passed to varint
20940 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
20950 28 29 20 74 68 69 73 20 6d 61 6b 65 73 20 69 74  () this makes it
20960 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 0a 20   convenient to. 
20970 20 2a 2a 20 6c 69 6d 69 74 20 74 68 65 20 73 69   ** limit the si
20980 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ze of the header
20990 20 74 6f 20 36 34 20 62 79 74 65 73 20 69 6e 20   to 64 bytes in 
209a0 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20  cases where the 
209b0 66 69 72 73 74 20 66 69 65 6c 64 0a 20 20 2a 2a  first field.  **
209c0 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a   is an integer..
209d0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65 61    **.  ** The ea
209e0 73 69 65 73 74 20 77 61 79 20 74 6f 20 65 6e 66  siest way to enf
209f0 6f 72 63 65 20 74 68 69 73 20 6c 69 6d 69 74 20  orce this limit 
20a00 69 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 6f  is to consider o
20a10 6e 6c 79 20 72 65 63 6f 72 64 73 20 77 69 74 68  nly records with
20a20 0a 20 20 2a 2a 20 31 33 20 66 69 65 6c 64 73 20  .  ** 13 fields 
20a30 6f 72 20 6c 65 73 73 2e 20 49 66 20 74 68 65 20  or less. If the 
20a40 66 69 72 73 74 20 66 69 65 6c 64 20 69 73 20 61  first field is a
20a50 6e 20 69 6e 74 65 67 65 72 2c 20 74 68 65 20 6d  n integer, the m
20a60 61 78 69 6d 75 6d 20 6c 65 67 61 6c 0a 20 20 2a  aximum legal.  *
20a70 2a 20 68 65 61 64 65 72 20 73 69 7a 65 20 69 73  * header size is
20a80 20 28 31 32 2a 35 20 2b 20 31 20 2b 20 31 29 20   (12*5 + 1 + 1) 
20a90 62 79 74 65 73 2e 20 20 2a 2f 0a 20 20 69 66 28  bytes.  */.  if(
20aa0 20 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e   (p->pKeyInfo->n
20ab0 46 69 65 6c 64 20 2b 20 70 2d 3e 70 4b 65 79 49  Field + p->pKeyI
20ac0 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 29 3c 3d 31  nfo->nXField)<=1
20ad0 33 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61  3 ){.    int fla
20ae0 67 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e  gs = p->aMem[0].
20af0 66 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20 70  flags;.    if( p
20b00 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ->pKeyInfo->aSor
20b10 74 4f 72 64 65 72 5b 30 5d 20 29 7b 0a 20 20 20  tOrder[0] ){.   
20b20 20 20 20 70 2d 3e 72 31 20 3d 20 31 3b 0a 20 20     p->r1 = 1;.  
20b30 20 20 20 20 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a      p->r2 = -1;.
20b40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20b50 20 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20 20 20   p->r1 = -1;.   
20b60 20 20 20 70 2d 3e 72 32 20 3d 20 31 3b 0a 20 20     p->r2 = 1;.  
20b70 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61    }.    if( (fla
20b80 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20 29 7b  gs & MEM_Int) ){
20b90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64  .      return vd
20ba0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  beRecordCompareI
20bb0 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65  nt;.    }.    te
20bc0 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20  stcase( flags & 
20bd0 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20  MEM_Real );.    
20be0 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20  testcase( flags 
20bf0 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20  & MEM_Null );.  
20c00 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67    testcase( flag
20c10 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a  s & MEM_Blob );.
20c20 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26      if( (flags &
20c30 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e   (MEM_Real|MEM_N
20c40 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d  ull|MEM_Blob))==
20c50 30 20 26 26 20 70 2d 3e 70 4b 65 79 49 6e 66 6f  0 && p->pKeyInfo
20c60 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29 7b  ->aColl[0]==0 ){
20c70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66  .      assert( f
20c80 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
20c90 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76  ;.      return v
20ca0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
20cb0 53 74 72 69 6e 67 3b 0a 20 20 20 20 7d 0a 20 20  String;.    }.  
20cc0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  }..  return sqli
20cd0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
20ce0 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  pare;.}../*.** p
20cf0 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  Cur points at an
20d00 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65   index entry cre
20d10 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f  ated using the O
20d20 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
20d30 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65  ode..** Read the
20d40 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74   rowid (the last
20d50 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65   field in the re
20d60 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20  cord) and store 
20d70 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a  it in *rowid..**
20d80 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
20d90 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
20da0 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72  works, or an err
20db0 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
20dc0 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69  e..**.** pCur mi
20dd0 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20  ght be pointing 
20de0 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64  to text obtained
20df0 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74 20   from a corrupt 
20e00 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
20e10 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74  * So the content
20e20 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74   cannot be trust
20e30 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72 69  ed.  Do appropri
20e40 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74 68  ate checks on th
20e50 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e  e content..*/.in
20e60 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  t sqlite3VdbeIdx
20e70 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64  Rowid(sqlite3 *d
20e80 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  b, BtCursor *pCu
20e90 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a  r, i64 *rowid){.
20ea0 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d    i64 nCellKey =
20eb0 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
20ec0 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20  u32 szHdr;      
20ed0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
20ee0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32   header */.  u32
20ef0 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f   typeRowid;    /
20f00 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66  * Serial type of
20f10 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
20f20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20  u32 lenRowid;   
20f30 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
20f40 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20   rowid */.  Mem 
20f50 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47 65 74 20  m, v;..  /* Get 
20f60 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
20f70 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e  index entry.  On
20f80 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72 69  ly indices entri
20f90 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20  es of less.  ** 
20fa0 74 68 61 6e 20 32 47 69 42 20 61 72 65 20 73 75  than 2GiB are su
20fb0 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e 67  pport - anything
20fc0 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20 64   large must be d
20fd0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
20fe0 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72  on..  ** Any cor
20ff0 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63  ruption is detec
21000 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42 74  ted in sqlite3Bt
21010 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
21020 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20  ), though, so.  
21030 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e  ** this code can
21040 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20 74   safely assume t
21050 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20  hat nCellKey is 
21060 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20  32-bits  .  */. 
21070 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
21080 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c  BtreeCursorIsVal
21090 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56  id(pCur) );.  VV
210a0 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c  A_ONLY(rc =) sql
210b0 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
210c0 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79  (pCur, &nCellKey
210d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
210e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20  =SQLITE_OK );   
210f0 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77    /* pCur is alw
21100 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79  ays valid so Key
21110 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  Size cannot fail
21120 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 6e   */.  assert( (n
21130 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45  CellKey & SQLITE
21140 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29  _MAX_U32)==(u64)
21150 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f  nCellKey );..  /
21160 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f  * Read in the co
21170 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f  mplete content o
21180 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
21190 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  y */.  sqlite3Vd
211a0 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62  beMemInit(&m, db
211b0 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  , 0);.  rc = sql
211c0 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
211d0 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75  tree(pCur, 0, (u
211e0 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20  32)nCellKey, 1, 
211f0 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  &m);.  if( rc ){
21200 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
21210 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e    }..  /* The in
21220 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62  dex entry must b
21230 65 67 69 6e 20 77 69 74 68 20 61 20 68 65 61 64  egin with a head
21240 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f  er size */.  (vo
21250 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28  id)getVarint32((
21260 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b  u8*)m.z, szHdr);
21270 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48  .  testcase( szH
21280 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63  dr==3 );.  testc
21290 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20  ase( szHdr==m.n 
212a0 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
212b0 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e  y(szHdr<3 || (in
212c0 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a  t)szHdr>m.n) ){.
212d0 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77      goto idx_row
212e0 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20  id_corruption;. 
212f0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73   }..  /* The las
21300 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69  t field of the i
21310 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61  ndex should be a
21320 6e 20 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20  n integer - the 
21330 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69  ROWID..  ** Veri
21340 66 79 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  fy that the last
21350 20 65 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73   entry really is
21360 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a   an integer. */.
21370 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e    (void)getVarin
21380 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a  t32((u8*)&m.z[sz
21390 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69  Hdr-1], typeRowi
213a0 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  d);.  testcase( 
213b0 74 79 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a  typeRowid==1 );.
213c0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
213d0 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65  Rowid==2 );.  te
213e0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
213f0 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61  d==3 );.  testca
21400 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34  se( typeRowid==4
21410 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
21420 74 79 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a  typeRowid==5 );.
21430 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
21440 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65  Rowid==6 );.  te
21450 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
21460 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61  d==8 );.  testca
21470 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39  se( typeRowid==9
21480 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65   );.  if( unlike
21490 6c 79 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c  ly(typeRowid<1 |
214a0 7c 20 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c  | typeRowid>9 ||
214b0 20 74 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29   typeRowid==7) )
214c0 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72  {.    goto idx_r
214d0 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b  owid_corruption;
214e0 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20  .  }.  lenRowid 
214f0 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79  = sqlite3SmallTy
21500 70 65 53 69 7a 65 73 5b 74 79 70 65 52 6f 77 69  peSizes[typeRowi
21510 64 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  d];.  testcase( 
21520 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b  (u32)m.n==szHdr+
21530 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66  lenRowid );.  if
21540 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29  ( unlikely((u32)
21550 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77  m.n<szHdr+lenRow
21560 69 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  id) ){.    goto 
21570 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
21580 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  tion;.  }..  /* 
21590 46 65 74 63 68 20 74 68 65 20 69 6e 74 65 67 65  Fetch the intege
215a0 72 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  r off the end of
215b0 20 74 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72   the index recor
215c0 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  d */.  sqlite3Vd
215d0 62 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a  beSerialGet((u8*
215e0 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77  )&m.z[m.n-lenRow
215f0 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20  id], typeRowid, 
21600 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20  &v);.  *rowid = 
21610 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33  v.u.i;.  sqlite3
21620 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
21630 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
21640 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75  ITE_OK;..  /* Ju
21650 6d 70 20 68 65 72 65 20 69 66 20 64 61 74 61 62  mp here if datab
21660 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
21670 73 20 64 65 74 65 63 74 65 64 20 61 66 74 65 72  s detected after
21680 20 6d 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a   m has been.  **
21690 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65   allocated.  Fre
216a0 65 20 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61  e the m object a
216b0 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
216c0 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78  _CORRUPT. */.idx
216d0 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
216e0 6e 3a 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d  n:.  testcase( m
216f0 2e 73 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a  .szMalloc!=0 );.
21700 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
21710 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
21720 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
21730 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a  RUPT_BKPT;.}../*
21740 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
21750 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78  key of the index
21760 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73   entry that curs
21770 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e  or pC is pointin
21780 67 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20  g to against.** 
21790 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69  the key string i
217a0 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72  n pUnpacked.  Wr
217b0 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61  ite into *pRes a
217c0 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20   number.** that 
217d0 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72  is negative, zer
217e0 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  o, or positive i
217f0 66 20 70 43 20 69 73 20 6c 65 73 73 20 74 68 61  f pC is less tha
21800 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20  n, equal to,.** 
21810 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
21820 70 55 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75  pUnpacked.  Retu
21830 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
21840 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70  success..**.** p
21850 55 6e 70 61 63 6b 65 64 20 69 73 20 65 69 74 68  Unpacked is eith
21860 65 72 20 63 72 65 61 74 65 64 20 77 69 74 68 6f  er created witho
21870 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73  ut a rowid or is
21880 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68   truncated so th
21890 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74  at it.** omits t
218a0 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20  he rowid at the 
218b0 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20  end.  The rowid 
218c0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
218d0 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a  e index entry.**
218e0 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77   is ignored as w
218f0 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69  ell.  Hence, thi
21900 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63  s routine only c
21910 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72 65 66  ompares the pref
21920 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20  ixes .** of the 
21930 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68  keys prior to th
21940 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e  e final rowid, n
21950 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65  ot the entire ke
21960 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
21970 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61  3VdbeIdxKeyCompa
21980 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  re(.  sqlite3 *d
21990 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
219a0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
219b0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
219c0 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
219d0 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C,              
219e0 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
219f0 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61  r to compare aga
21a00 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  inst */.  Unpack
21a10 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63  edRecord *pUnpac
21a20 6b 65 64 2c 20 20 20 20 20 20 20 2f 2a 20 55 6e  ked,       /* Un
21a30 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f  packed version o
21a40 66 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 2a  f key */.  int *
21a50 72 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  res             
21a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
21a70 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69  rite the compari
21a80 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20  son result here 
21a90 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c  */.){.  i64 nCel
21aa0 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lKey = 0;.  int 
21ab0 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  rc;.  BtCursor *
21ac0 70 43 75 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a  pCur;.  Mem m;..
21ad0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43    assert( pC->eC
21ae0 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
21af0 42 54 52 45 45 20 29 3b 0a 20 20 70 43 75 72 20  BTREE );.  pCur 
21b00 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  = pC->uc.pCursor
21b10 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
21b20 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
21b30 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20  Valid(pCur) );. 
21b40 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20   VVA_ONLY(rc =) 
21b50 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
21b60 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c  ize(pCur, &nCell
21b70 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Key);.  assert( 
21b80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
21b90 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61      /* pCur is a
21ba0 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b  lways valid so K
21bb0 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61  eySize cannot fa
21bc0 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c  il */.  /* nCell
21bd0 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  Key will always 
21be0 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  be between 0 and
21bf0 20 30 78 66 66 66 66 66 66 66 66 20 62 65 63 61   0xffffffff beca
21c00 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 0a 20  use of the way. 
21c10 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50 61   ** that btreePa
21c20 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64  rseCellPtr() and
21c30 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
21c40 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d  t32() are implem
21c50 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e  ented */.  if( n
21c60 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43  CellKey<=0 || nC
21c70 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66  ellKey>0x7ffffff
21c80 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20  f ){.    *res = 
21c90 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
21ca0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
21cb0 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  T;.  }.  sqlite3
21cc0 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20  VdbeMemInit(&m, 
21cd0 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73  db, 0);.  rc = s
21ce0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
21cf0 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20  mBtree(pCur, 0, 
21d00 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31  (u32)nCellKey, 1
21d10 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20  , &m);.  if( rc 
21d20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
21d30 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d 20 73  ;.  }.  *res = s
21d40 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
21d50 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a  Compare(m.n, m.z
21d60 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20  , pUnpacked);.  
21d70 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
21d80 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
21d90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
21da0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
21db0 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76 61  tine sets the va
21dc0 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e  lue to be return
21dd0 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e 74  ed by subsequent
21de0 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c   calls to.** sql
21df0 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f  ite3_changes() o
21e00 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
21e10 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a  andle 'db'. .*/.
21e20 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
21e30 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74  SetChanges(sqlit
21e40 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61  e3 *db, int nCha
21e50 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  nge){.  assert( 
21e60 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
21e70 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
21e80 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d  .  db->nChange =
21e90 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e   nChange;.  db->
21ea0 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20  nTotalChange += 
21eb0 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nChange;.}../*.*
21ec0 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20  * Set a flag in 
21ed0 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64 61  the vdbe to upda
21ee0 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  te the change co
21ef0 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69 73  unter when it is
21f00 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72   finalised.** or
21f10 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20   reset..*/.void 
21f20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74  sqlite3VdbeCount
21f30 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29  Changes(Vdbe *v)
21f40 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74  {.  v->changeCnt
21f50 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  On = 1;.}../*.**
21f60 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65 70   Mark every prep
21f70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61  ared statement a
21f80 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
21f90 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
21fa0 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72  tion.** as expir
21fb0 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70  ed..**.** An exp
21fc0 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d  ired statement m
21fd0 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70  eans that recomp
21fe0 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ilation of the s
21ff0 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72  tatement is.** r
22000 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65  ecommend.  State
22010 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68 65  ments expire whe
22020 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20  n things happen 
22030 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a  that make their.
22040 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f  ** programs obso
22050 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20  lete.  Removing 
22060 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
22070 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74  ctions or collat
22080 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73  ing.** sequences
22090 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e  , or changing an
220a0 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66   authorization f
220b0 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20  unction are the 
220c0 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e  types of.** thin
220d0 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65  gs that make pre
220e0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
220f0 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f   obsolete..*/.vo
22100 69 64 20 73 71 6c 69 74 65 33 45 78 70 69 72 65  id sqlite3Expire
22110 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
22120 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ts(sqlite3 *db){
22130 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f  .  Vdbe *p;.  fo
22140 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b  r(p = db->pVdbe;
22150 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
22160 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20  .    p->expired 
22170 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
22180 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74  * Return the dat
22190 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64  abase associated
221a0 20 77 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a   with the Vdbe..
221b0 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69  */.sqlite3 *sqli
221c0 74 65 33 56 64 62 65 44 62 28 56 64 62 65 20 2a  te3VdbeDb(Vdbe *
221d0 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e  v){.  return v->
221e0 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  db;.}../*.** Ret
221f0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
22200 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   an sqlite3_valu
22210 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  e structure cont
22220 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65  aining the value
22230 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65   bound.** parame
22240 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d 20 76  ter iVar of VM v
22250 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65  . Except, if the
22260 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53 51 4c   value is an SQL
22270 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a   NULL, return .*
22280 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c  * 0 instead. Unl
22290 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20  ess it is NULL, 
222a0 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20 61  apply affinity a
222b0 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65 20 53  ff (one of the S
222c0 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63  QLITE_AFF_*.** c
222d0 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74 68 65  onstants) to the
222e0 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65   value before re
222f0 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a  turning it..**.*
22300 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
22310 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66 72 65  alue must be fre
22320 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
22330 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 61   using sqlite3Va
22340 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71  lueFree()..*/.sq
22350 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c  lite3_value *sql
22360 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64  ite3VdbeGetBound
22370 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c 20 69  Value(Vdbe *v, i
22380 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66 66 29  nt iVar, u8 aff)
22390 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72  {.  assert( iVar
223a0 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  >0 );.  if( v ){
223b0 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  .    Mem *pMem =
223c0 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31   &v->aVar[iVar-1
223d0 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70  ];.    if( 0==(p
223e0 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
223f0 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  _Null) ){.      
22400 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
22410 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Ret = sqlite3Val
22420 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20  ueNew(v->db);.  
22430 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
22440 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
22450 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20  dbeMemCopy((Mem 
22460 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20  *)pRet, pMem);. 
22470 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61         sqlite3Va
22480 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  lueApplyAffinity
22490 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51 4c 49  (pRet, aff, SQLI
224a0 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20  TE_UTF8);.      
224b0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  }.      return p
224c0 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Ret;.    }.  }. 
224d0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
224e0 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51  .** Configure SQ
224f0 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61 72 20  L variable iVar 
22500 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20  so that binding 
22510 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69  a new value to i
22520 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20  t signals.** to 
22530 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69  sqlite3_reoptimi
22540 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70 72 65  ze() that re-pre
22550 70 61 72 69 6e 67 20 74 68 65 20 73 74 61 74 65  paring the state
22560 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a  ment may result.
22570 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20 71  ** in a better q
22580 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f  uery plan..*/.vo
22590 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
225a0 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76  tVarmask(Vdbe *v
225b0 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61  , int iVar){.  a
225c0 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b  ssert( iVar>0 );
225d0 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32 20 29  .  if( iVar>32 )
225e0 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b  {.    v->expmask
225f0 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20   = 0xffffffff;. 
22600 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e 65   }else{.    v->e
22610 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32 29  xpmask |= ((u32)
22620 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b 0a  1 << (iVar-1));.
22630 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
22640 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
22650 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 72  ALTABLE./*.** Tr
22660 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d 65 73  ansfer error mes
22670 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d 20 61  sage text from a
22680 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 2e 7a  n sqlite3_vtab.z
22690 45 72 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f  ErrMsg (text sto
226a0 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  red.** in memory
226b0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
226c0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 69  qlite3_malloc) i
226d0 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72 72 4d  nto a Vdbe.zErrM
226e0 73 67 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a  sg (text stored.
226f0 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  ** in memory obt
22700 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
22710 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a  e3DbMalloc)..*/.
22720 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61 62  void sqlite3Vtab
22730 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56 64 62  ImportErrmsg(Vdb
22740 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 74  e *p, sqlite3_vt
22750 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 73 71  ab *pVtab){.  sq
22760 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
22770 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  b;.  sqlite3DbFr
22780 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
22790 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67  g);.  p->zErrMsg
227a0 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
227b0 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45  up(db, pVtab->zE
227c0 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
227d0 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45  3_free(pVtab->zE
227e0 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d  rrMsg);.  pVtab-
227f0 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 7d 0a  >zErrMsg = 0;.}.
22800 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
22810 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
22820 4c 45 20 2a 2f 0a                                LE */.