/ Hex Artifact Content
Login

Artifact 23b38b447ebf5991de1d3d456003c58cf523a5da:


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 3d 30 20 26   assert( op>=0 &
1360: 26 20 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20 69  & op<0xff );.  i
1370: 66 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f  f( p->pParse->nO
1380: 70 41 6c 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20 20  pAlloc<=i ){.   
1390: 20 72 65 74 75 72 6e 20 67 72 6f 77 4f 70 33 28   return growOp3(
13a0: 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70  p, op, p1, p2, p
13b0: 33 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70  3);.  }.  p->nOp
13c0: 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e  ++;.  pOp = &p->
13d0: 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f  aOp[i];.  pOp->o
13e0: 70 63 6f 64 65 20 3d 20 28 75 38 29 6f 70 3b 0a  pcode = (u8)op;.
13f0: 20 20 70 4f 70 2d 3e 70 35 20 3d 20 30 3b 0a 20    pOp->p5 = 0;. 
1400: 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20   pOp->p1 = p1;. 
1410: 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20   pOp->p2 = p2;. 
1420: 20 70 4f 70 2d 3e 70 33 20 3d 20 70 33 3b 0a 20   pOp->p3 = p3;. 
1430: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a   pOp->p4.p = 0;.
1440: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
1450: 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66 64  P4_NOTUSED;.#ifd
1460: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1470: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
1480: 53 0a 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  S.  pOp->zCommen
1490: 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69  t = 0;.#endif.#i
14a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
14b0: 47 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66  G.  if( p->db->f
14c0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
14d0: 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
14e0: 20 20 20 20 69 6e 74 20 6a 6a 2c 20 6b 6b 3b 0a      int jj, kk;.
14f0: 20 20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73      Parse *pPars
1500: 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20  e = p->pParse;. 
1510: 20 20 20 66 6f 72 28 6a 6a 3d 6b 6b 3d 30 3b 20     for(jj=kk=0; 
1520: 6a 6a 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43  jj<SQLITE_N_COLC
1530: 41 43 48 45 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20  ACHE; jj++){.   
1540: 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61     struct yColCa
1550: 63 68 65 20 2a 78 20 3d 20 70 50 61 72 73 65 2d  che *x = pParse-
1560: 3e 61 43 6f 6c 43 61 63 68 65 20 2b 20 6a 6a 3b  >aColCache + jj;
1570: 0a 20 20 20 20 20 20 69 66 28 20 78 2d 3e 69 4c  .      if( x->iL
1580: 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43 61  evel>pParse->iCa
1590: 63 68 65 4c 65 76 65 6c 20 7c 7c 20 78 2d 3e 69  cheLevel || x->i
15a0: 52 65 67 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Reg==0 ) continu
15b0: 65 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  e;.      printf(
15c0: 22 20 72 5b 25 64 5d 3d 7b 25 64 3a 25 64 7d 22  " r[%d]={%d:%d}"
15d0: 2c 20 78 2d 3e 69 52 65 67 2c 20 78 2d 3e 69 54  , x->iReg, x->iT
15e0: 61 62 6c 65 2c 20 78 2d 3e 69 43 6f 6c 75 6d 6e  able, x->iColumn
15f0: 29 3b 0a 20 20 20 20 20 20 6b 6b 2b 2b 3b 0a 20  );.      kk++;. 
1600: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6b 6b 20     }.    if( kk 
1610: 29 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ) printf("\n");.
1620: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
1630: 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d  rintOp(0, i, &p-
1640: 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 74 65  >aOp[i]);.    te
1650: 73 74 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f  st_addop_breakpo
1660: 69 6e 74 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  int();.  }.#endi
1670: 66 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  f.#ifdef VDBE_PR
1680: 4f 46 49 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63  OFILE.  pOp->cyc
1690: 6c 65 73 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e  les = 0;.  pOp->
16a0: 63 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  cnt = 0;.#endif.
16b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44  #ifdef SQLITE_VD
16c0: 42 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 70 4f  BE_COVERAGE.  pO
16d0: 70 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 30 3b  p->iSrcLine = 0;
16e0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
16f0: 20 69 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65   i;.}.int sqlite
1700: 33 56 64 62 65 41 64 64 4f 70 30 28 56 64 62 65  3VdbeAddOp0(Vdbe
1710: 20 2a 70 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20   *p, int op){.  
1720: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
1730: 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20  beAddOp3(p, op, 
1740: 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20  0, 0, 0);.}.int 
1750: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1760: 31 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f  1(Vdbe *p, int o
1770: 70 2c 20 69 6e 74 20 70 31 29 7b 0a 20 20 72 65  p, int p1){.  re
1780: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
1790: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31  AddOp3(p, op, p1
17a0: 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73  , 0, 0);.}.int s
17b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17c0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
17d0: 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32  , int p1, int p2
17e0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
17f0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1800: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 30 29 3b   op, p1, p2, 0);
1810: 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20  .}../* Generate 
1820: 63 6f 64 65 20 66 6f 72 20 61 6e 20 75 6e 63 6f  code for an unco
1830: 6e 64 69 74 69 6f 6e 61 6c 20 6a 75 6d 70 20 74  nditional jump t
1840: 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 44  o instruction iD
1850: 65 73 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  est.*/.int sqlit
1860: 65 33 56 64 62 65 47 6f 74 6f 28 56 64 62 65 20  e3VdbeGoto(Vdbe 
1870: 2a 70 2c 20 69 6e 74 20 69 44 65 73 74 29 7b 0a  *p, int iDest){.
1880: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1890: 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 4f 50  VdbeAddOp3(p, OP
18a0: 5f 47 6f 74 6f 2c 20 30 2c 20 69 44 65 73 74 2c  _Goto, 0, iDest,
18b0: 20 30 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72   0);.}../* Gener
18c0: 61 74 65 20 63 6f 64 65 20 74 6f 20 63 61 75 73  ate code to caus
18d0: 65 20 74 68 65 20 73 74 72 69 6e 67 20 7a 53 74  e the string zSt
18e0: 72 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 69  r to be loaded i
18f0: 6e 74 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72 20  nto.** register 
1900: 69 44 65 73 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c  iDest.*/.int sql
1910: 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
1920: 6e 67 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ng(Vdbe *p, int 
1930: 69 44 65 73 74 2c 20 63 6f 6e 73 74 20 63 68 61  iDest, const cha
1940: 72 20 2a 7a 53 74 72 29 7b 0a 20 20 72 65 74 75  r *zStr){.  retu
1950: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
1960: 64 4f 70 34 28 70 2c 20 4f 50 5f 53 74 72 69 6e  dOp4(p, OP_Strin
1970: 67 38 2c 20 30 2c 20 69 44 65 73 74 2c 20 30 2c  g8, 0, iDest, 0,
1980: 20 7a 53 74 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a   zStr, 0);.}../*
1990: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
19a0: 65 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a  e that initializ
19b0: 65 73 20 6d 75 6c 74 69 70 6c 65 20 72 65 67 69  es multiple regi
19c0: 73 74 65 72 73 20 74 6f 20 73 74 72 69 6e 67 20  sters to string 
19d0: 6f 72 20 69 6e 74 65 67 65 72 0a 2a 2a 20 63 6f  or integer.** co
19e0: 6e 73 74 61 6e 74 73 2e 20 20 54 68 65 20 72 65  nstants.  The re
19f0: 67 69 73 74 65 72 73 20 62 65 67 69 6e 20 77 69  gisters begin wi
1a00: 74 68 20 69 44 65 73 74 20 61 6e 64 20 69 6e 63  th iDest and inc
1a10: 72 65 61 73 65 20 63 6f 6e 73 65 63 75 74 69 76  rease consecutiv
1a20: 65 6c 79 2e 0a 2a 2a 20 4f 6e 65 20 72 65 67 69  ely..** One regi
1a30: 73 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69  ster is initiali
1a40: 7a 65 64 20 66 6f 72 20 65 61 63 68 20 63 68 61  zed for each cha
1a50: 72 61 63 67 74 65 72 20 69 6e 20 7a 54 79 70 65  racgter in zType
1a60: 73 5b 5d 2e 20 20 46 6f 72 20 65 61 63 68 0a 2a  s[].  For each.*
1a70: 2a 20 22 73 22 20 63 68 61 72 61 63 74 65 72 20  * "s" character 
1a80: 69 6e 20 7a 54 79 70 65 73 5b 5d 2c 20 74 68 65  in zTypes[], the
1a90: 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20 73   register is a s
1aa0: 74 72 69 6e 67 20 69 66 20 74 68 65 20 61 72 67  tring if the arg
1ab0: 75 6d 65 6e 74 20 69 73 0a 2a 2a 20 6e 6f 74 20  ument is.** not 
1ac0: 4e 55 4c 4c 2c 20 6f 72 20 4f 50 5f 4e 75 6c 6c  NULL, or OP_Null
1ad0: 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73   if the value is
1ae0: 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2e   a null pointer.
1af0: 20 20 46 6f 72 20 65 61 63 68 20 22 69 22 20 63    For each "i" c
1b00: 68 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 7a  haracter.** in z
1b10: 54 79 70 65 73 5b 5d 2c 20 74 68 65 20 72 65 67  Types[], the reg
1b20: 69 73 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c  ister is initial
1b30: 69 7a 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 67  ized to an integ
1b40: 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  er..*/.void sqli
1b50: 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64  te3VdbeMultiLoad
1b60: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44  (Vdbe *p, int iD
1b70: 65 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  est, const char 
1b80: 2a 7a 54 79 70 65 73 2c 20 2e 2e 2e 29 7b 0a 20  *zTypes, ...){. 
1b90: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
1ba0: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a  nt i;.  char c;.
1bb0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
1bc0: 54 79 70 65 73 29 3b 0a 20 20 66 6f 72 28 69 3d  Types);.  for(i=
1bd0: 30 3b 20 28 63 20 3d 20 7a 54 79 70 65 73 5b 69  0; (c = zTypes[i
1be0: 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  ])!=0; i++){.   
1bf0: 20 69 66 28 20 63 3d 3d 27 73 27 20 29 7b 0a 20   if( c=='s' ){. 
1c00: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1c10: 2a 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  *z = va_arg(ap, 
1c20: 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20  const char*);.  
1c30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c40: 64 64 4f 70 34 28 70 2c 20 7a 3d 3d 30 20 3f 20  ddOp4(p, z==0 ? 
1c50: 4f 50 5f 4e 75 6c 6c 20 3a 20 4f 50 5f 53 74 72  OP_Null : OP_Str
1c60: 69 6e 67 38 2c 20 30 2c 20 69 44 65 73 74 2b 2b  ing8, 0, iDest++
1c70: 2c 20 30 2c 20 7a 2c 20 30 29 3b 0a 20 20 20 20  , 0, z, 0);.    
1c80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1c90: 65 72 74 28 20 63 3d 3d 27 69 27 20 29 3b 0a 20  ert( c=='i' );. 
1ca0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1cb0: 41 64 64 4f 70 32 28 70 2c 20 4f 50 5f 49 6e 74  AddOp2(p, OP_Int
1cc0: 65 67 65 72 2c 20 76 61 5f 61 72 67 28 61 70 2c  eger, va_arg(ap,
1cd0: 20 69 6e 74 29 2c 20 69 44 65 73 74 2b 2b 29 3b   int), iDest++);
1ce0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f  .    }.  }.  va_
1cf0: 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  end(ap);.}../*.*
1d00: 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20  * Add an opcode 
1d10: 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68  that includes th
1d20: 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 20  e p4 value as a 
1d30: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  pointer..*/.int 
1d40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d50: 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  4(.  Vdbe *p,   
1d60: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
1d70: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  the opcode to th
1d80: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f  is VM */.  int o
1d90: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
1da0: 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65  * The new opcode
1db0: 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20   */.  int p1,   
1dc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1dd0: 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P1 operand */. 
1de0: 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20   int p2,        
1df0: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f       /* The P2 o
1e00: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
1e10: 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p3,             
1e20: 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e  /* The P3 operan
1e30: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
1e40: 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68  r *zP4,    /* Th
1e50: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P4 operand */.
1e60: 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20    int p4type    
1e70: 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72        /* P4 oper
1e80: 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20  and type */.){. 
1e90: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
1ea0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1eb0: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
1ec0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
1ed0: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
1ee0: 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20   zP4, p4type);. 
1ef0: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
1f00: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70  ./*.** Add an op
1f10: 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64  code that includ
1f20: 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20  es the p4 value 
1f30: 77 69 74 68 20 61 20 50 34 5f 49 4e 54 36 34 20  with a P4_INT64 
1f40: 6f 72 0a 2a 2a 20 50 34 5f 52 45 41 4c 20 74 79  or.** P4_REAL ty
1f50: 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  pe..*/.int sqlit
1f60: 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
1f70: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
1f80: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
1f90: 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69  he opcode to thi
1fa0: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  s VM */.  int op
1fb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1fc0: 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20   The new opcode 
1fd0: 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20  */.  int p1,    
1fe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1ff0: 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P1 operand */.  
2000: 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20  int p2,         
2010: 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70      /* The P2 op
2020: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
2030: 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  3,             /
2040: 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64  * The P3 operand
2050: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
2060: 7a 50 34 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  zP4,      /* The
2070: 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P4 operand */. 
2080: 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20 20   int p4type     
2090: 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61       /* P4 opera
20a0: 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20  nd type */.){.  
20b0: 63 68 61 72 20 2a 70 34 63 6f 70 79 20 3d 20 73  char *p4copy = s
20c0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
20d0: 77 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  w(sqlite3VdbeDb(
20e0: 70 29 2c 20 38 29 3b 0a 20 20 69 66 28 20 70 34  p), 8);.  if( p4
20f0: 63 6f 70 79 20 29 20 6d 65 6d 63 70 79 28 70 34  copy ) memcpy(p4
2100: 63 6f 70 79 2c 20 7a 50 34 2c 20 38 29 3b 0a 20  copy, zP4, 8);. 
2110: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
2120: 64 62 65 41 64 64 4f 70 34 28 70 2c 20 6f 70 2c  dbeAddOp4(p, op,
2130: 20 70 31 2c 20 70 32 2c 20 70 33 2c 20 70 34 63   p1, p2, p3, p4c
2140: 6f 70 79 2c 20 70 34 74 79 70 65 29 3b 0a 7d 0a  opy, p4type);.}.
2150: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 4f 50  ./*.** Add an OP
2160: 5f 50 61 72 73 65 53 63 68 65 6d 61 20 6f 70 63  _ParseSchema opc
2170: 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ode.  This routi
2180: 6e 65 20 69 73 20 62 72 6f 6b 65 6e 20 6f 75 74  ne is broken out
2190: 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
21a0: 56 64 62 65 41 64 64 4f 70 34 28 29 20 73 69 6e  VdbeAddOp4() sin
21b0: 63 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20 61  ce it needs to a
21c0: 6c 73 6f 20 6e 65 65 64 73 20 74 6f 20 6d 61 72  lso needs to mar
21d0: 6b 20 61 6c 6c 20 62 74 72 65 65 73 0a 2a 2a 20  k all btrees.** 
21e0: 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20 75  as having been u
21f0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  sed..**.** The z
2200: 57 68 65 72 65 20 73 74 72 69 6e 67 20 6d 75 73  Where string mus
2210: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61  t have been obta
2220: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
2230: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54  3_malloc()..** T
2240: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
2250: 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20   take ownership 
2260: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  of the allocated
2270: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64   memory..*/.void
2280: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50   sqlite3VdbeAddP
2290: 61 72 73 65 53 63 68 65 6d 61 4f 70 28 56 64 62  arseSchemaOp(Vdb
22a0: 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 2c 20 63  e *p, int iDb, c
22b0: 68 61 72 20 2a 7a 57 68 65 72 65 29 7b 0a 20 20  har *zWhere){.  
22c0: 69 6e 74 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33  int j;.  sqlite3
22d0: 56 64 62 65 41 64 64 4f 70 34 28 70 2c 20 4f 50  VdbeAddOp4(p, OP
22e0: 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44  _ParseSchema, iD
22f0: 62 2c 20 30 2c 20 30 2c 20 7a 57 68 65 72 65 2c  b, 0, 0, zWhere,
2300: 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
2310: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62  for(j=0; j<p->db
2320: 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 20 73 71 6c 69  ->nDb; j++) sqli
2330: 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
2340: 28 70 2c 20 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (p, j);.}../*.**
2350: 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74   Add an opcode t
2360: 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65  hat includes the
2370: 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 6e 20   p4 value as an 
2380: 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20  integer..*/.int 
2390: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23a0: 34 49 6e 74 28 0a 20 20 56 64 62 65 20 2a 70 2c  4Int(.  Vdbe *p,
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
23c0: 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f  dd the opcode to
23d0: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
23e0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
23f0: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63    /* The new opc
2400: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c  ode */.  int p1,
2410: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2420: 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a  The P1 operand *
2430: 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20  /.  int p2,     
2440: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
2450: 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  2 operand */.  i
2460: 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20  nt p3,          
2470: 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65     /* The P3 ope
2480: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34  rand */.  int p4
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24a0: 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   The P4 operand 
24b0: 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f  as an integer */
24c0: 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d  .){.  int addr =
24d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24e0: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
24f0: 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33  , p3);.  sqlite3
2500: 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20  VdbeChangeP4(p, 
2510: 61 64 64 72 2c 20 53 51 4c 49 54 45 5f 49 4e 54  addr, SQLITE_INT
2520: 5f 54 4f 5f 50 54 52 28 70 34 29 2c 20 50 34 5f  _TO_PTR(p4), P4_
2530: 49 4e 54 33 32 29 3b 0a 20 20 72 65 74 75 72 6e  INT32);.  return
2540: 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
2550: 43 72 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d  Create a new sym
2560: 62 6f 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20  bolic label for 
2570: 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
2580: 68 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62  hat has yet to b
2590: 65 0a 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65  e.** coded.  The
25a0: 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20   symbolic label 
25b0: 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61  is really just a
25c0: 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
25d0: 2e 20 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20  .  The.** label 
25e0: 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 74  can be used as t
25f0: 68 65 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61  he P2 value of a
2600: 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61  n operation.  La
2610: 74 65 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65  ter, when.** the
2620: 20 6c 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76   label is resolv
2630: 65 64 20 74 6f 20 61 20 73 70 65 63 69 66 69 63  ed to a specific
2640: 20 61 64 64 72 65 73 73 2c 20 74 68 65 20 56 44   address, the VD
2650: 42 45 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20  BE will scan.** 
2660: 74 68 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72  through its oper
2670: 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63  ation list and c
2680: 68 61 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73  hange all values
2690: 20 6f 66 20 50 32 20 77 68 69 63 68 20 6d 61 74   of P2 which mat
26a0: 63 68 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20  ch.** the label 
26b0: 69 6e 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65  into the resolve
26c0: 64 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a  d address..**.**
26d0: 20 54 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20   The VDBE knows 
26e0: 74 68 61 74 20 61 20 50 32 20 76 61 6c 75 65 20  that a P2 value 
26f0: 69 73 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75  is a label becau
2700: 73 65 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a  se labels are.**
2710: 20 61 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65   always negative
2720: 20 61 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61   and P2 values a
2730: 72 65 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65  re suppose to be
2740: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a   non-negative..*
2750: 2a 20 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74  * Hence, a negat
2760: 69 76 65 20 50 32 20 76 61 6c 75 65 20 69 73 20  ive P2 value is 
2770: 61 20 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73  a label that has
2780: 20 79 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c   yet to be resol
2790: 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20  ved..**.** Zero 
27a0: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61  is returned if a
27b0: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e   malloc() fails.
27c0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
27d0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62  dbeMakeLabel(Vdb
27e0: 65 20 2a 76 29 7b 0a 20 20 50 61 72 73 65 20 2a  e *v){.  Parse *
27f0: 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20  p = v->pParse;. 
2800: 20 69 6e 74 20 69 20 3d 20 70 2d 3e 6e 4c 61 62   int i = p->nLab
2810: 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20  el++;.  assert( 
2820: 76 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  v->magic==VDBE_M
2830: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
2840: 66 28 20 28 69 20 26 20 28 69 2d 31 29 29 3d 3d  f( (i & (i-1))==
2850: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62  0 ){.    p->aLab
2860: 65 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  el = sqlite3DbRe
2870: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64  allocOrFree(p->d
2880: 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 20 0a 20  b, p->aLabel, . 
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b0: 20 20 20 20 20 20 28 69 2a 32 2b 31 29 2a 73 69        (i*2+1)*si
28c0: 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30  zeof(p->aLabel[0
28d0: 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ]));.  }.  if( p
28e0: 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20  ->aLabel ){.    
28f0: 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d  p->aLabel[i] = -
2900: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
2910: 41 44 44 52 28 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ADDR(i);.}../*.*
2920: 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20  * Resolve label 
2930: 22 78 22 20 74 6f 20 62 65 20 74 68 65 20 61 64  "x" to be the ad
2940: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
2950: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
2960: 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e  .** be inserted.
2970: 20 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20    The parameter 
2980: 22 78 22 20 6d 75 73 74 20 68 61 76 65 20 62 65  "x" must have be
2990: 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  en obtained from
29a0: 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c  .** a prior call
29b0: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d   to sqlite3VdbeM
29c0: 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76  akeLabel()..*/.v
29d0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
29e0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65  esolveLabel(Vdbe
29f0: 20 2a 76 2c 20 69 6e 74 20 78 29 7b 0a 20 20 50   *v, int x){.  P
2a00: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
2a10: 72 73 65 3b 0a 20 20 69 6e 74 20 6a 20 3d 20 41  rse;.  int j = A
2a20: 44 44 52 28 78 29 3b 0a 20 20 61 73 73 65 72 74  DDR(x);.  assert
2a30: 28 20 76 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( v->magic==VDBE
2a40: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
2a50: 20 61 73 73 65 72 74 28 20 6a 3c 70 2d 3e 6e 4c   assert( j<p->nL
2a60: 61 62 65 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  abel );.  assert
2a70: 28 20 6a 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  ( j>=0 );.  if( 
2a80: 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20  p->aLabel ){.   
2a90: 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20   p->aLabel[j] = 
2aa0: 76 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 20 20 70 2d  v->nOp;.  }.  p-
2ab0: 3e 69 46 69 78 65 64 4f 70 20 3d 20 76 2d 3e 6e  >iFixedOp = v->n
2ac0: 4f 70 20 2d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Op - 1;.}../*.**
2ad0: 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20 61   Mark the VDBE a
2ae0: 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 6f  s one that can o
2af0: 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65 20 74  nly be run one t
2b00: 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ime..*/.void sql
2b10: 69 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f  ite3VdbeRunOnlyO
2b20: 6e 63 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  nce(Vdbe *p){.  
2b30: 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d  p->runOnlyOnce =
2b40: 20 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51   1;.}..#ifdef SQ
2b50: 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73 71  LITE_DEBUG /* sq
2b60: 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62  lite3AssertMayAb
2b70: 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a  ort() logic */..
2b80: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
2b90: 69 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75 6e  ing type and fun
2ba0: 63 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74  ction are used t
2bb0: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
2bc0: 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a  h all opcodes.**
2bd0: 20 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e 20   in a Vdbe main 
2be0: 70 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63 68  program and each
2bf0: 20 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67   of the sub-prog
2c00: 72 61 6d 73 20 28 74 72 69 67 67 65 72 73 29 20  rams (triggers) 
2c10: 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b  it may .** invok
2c20: 65 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e  e directly or in
2c30: 64 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68 6f  directly. It sho
2c40: 75 6c 64 20 62 65 20 75 73 65 64 20 61 73 20 66  uld be used as f
2c50: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
2c60: 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64  Op *pOp;.**   Vd
2c70: 62 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a  beOpIter sIter;.
2c80: 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26  **.**   memset(&
2c90: 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  sIter, 0, sizeof
2ca0: 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73  (sIter));.**   s
2cb0: 49 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20 20  Iter.v = v;     
2cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd0: 20 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20 6f         // v is o
2ce0: 66 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a  f type Vdbe* .**
2cf0: 20 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d     while( (pOp =
2d00: 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74   opIterNext(&sIt
2d10: 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f  er)) ){.**     /
2d20: 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77  / Do something w
2d30: 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a  ith pOp.**   }.*
2d40: 2a 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  *   sqlite3DbFre
2d50: 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61  e(v->db, sIter.a
2d60: 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79  pSub);.** .*/.ty
2d70: 70 65 64 65 66 20 73 74 72 75 63 74 20 56 64 62  pedef struct Vdb
2d80: 65 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49 74  eOpIter VdbeOpIt
2d90: 65 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65 4f  er;.struct VdbeO
2da0: 70 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20 2a  pIter {.  Vdbe *
2db0: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
2dc0: 20 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20       /* Vdbe to 
2dd0: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
2de0: 74 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a  the opcodes of *
2df0: 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a  /.  SubProgram *
2e00: 2a 61 70 53 75 62 3b 20 20 20 20 20 20 20 20 2f  *apSub;        /
2e10: 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 70 72  * Array of subpr
2e20: 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20  ograms */.  int 
2e30: 6e 53 75 62 3b 20 20 20 20 20 20 20 20 20 20 20  nSub;           
2e40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2e50: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
2e60: 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41  pSub */.  int iA
2e70: 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ddr;            
2e80: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
2e90: 6f 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  of next instruct
2ea0: 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ion to return */
2eb0: 0a 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20 20  .  int iSub;    
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ed0: 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61   0 = main progra
2ee0: 6d 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75 62  m, 1 = first sub
2ef0: 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f  -program etc. */
2f00: 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f  .};.static Op *o
2f10: 70 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f 70  pIterNext(VdbeOp
2f20: 49 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62 65  Iter *p){.  Vdbe
2f30: 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70   *v = p->v;.  Op
2f40: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70   *pRet = 0;.  Op
2f50: 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70   *aOp;.  int nOp
2f60: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75 62  ;..  if( p->iSub
2f70: 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20  <=p->nSub ){..  
2f80: 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30    if( p->iSub==0
2f90: 20 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20   ){.      aOp = 
2fa0: 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f  v->aOp;.      nO
2fb0: 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20  p = v->nOp;.    
2fc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f 70  }else{.      aOp
2fd0: 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69   = p->apSub[p->i
2fe0: 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20  Sub-1]->aOp;.   
2ff0: 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75     nOp = p->apSu
3000: 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f  b[p->iSub-1]->nO
3010: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  p;.    }.    ass
3020: 65 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f  ert( p->iAddr<nO
3030: 70 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d  p );..    pRet =
3040: 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b   &aOp[p->iAddr];
3050: 0a 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b  .    p->iAddr++;
3060: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64 64  .    if( p->iAdd
3070: 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20  r==nOp ){.      
3080: 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20  p->iSub++;.     
3090: 20 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20   p->iAddr = 0;. 
30a0: 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
30b0: 70 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34  pRet->p4type==P4
30c0: 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20  _SUBPROGRAM ){. 
30d0: 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d       int nByte =
30e0: 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 7a   (p->nSub+1)*siz
30f0: 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29  eof(SubProgram*)
3100: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
3110: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
3120: 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20  p->nSub; j++){. 
3130: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 70         if( p->ap
3140: 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34  Sub[j]==pRet->p4
3150: 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61  .pProgram ) brea
3160: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
3170: 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20   if( j==p->nSub 
3180: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70  ){.        p->ap
3190: 53 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62 52  Sub = sqlite3DbR
31a0: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d 3e  eallocOrFree(v->
31b0: 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e 42  db, p->apSub, nB
31c0: 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  yte);.        if
31d0: 28 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a 20  ( !p->apSub ){. 
31e0: 20 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20           pRet = 
31f0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
3200: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  {.          p->a
3210: 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20  pSub[p->nSub++] 
3220: 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67  = pRet->p4.pProg
3230: 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ram;.        }. 
3240: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
3250: 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ..  return pRet;
3260: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
3270: 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 73  if the program s
3280: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d 20  tored in the VM 
3290: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
32a0: 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74 68  pParse may.** th
32b0: 72 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63  row an ABORT exc
32c0: 65 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67 20  eption (causing 
32d0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 62  the statement, b
32e0: 75 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74 72  ut not entire tr
32f0: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20  ansaction.** to 
3300: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2e  be rolled back).
3310: 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20   This condition 
3320: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6d  is true if the m
3330: 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20 61  ain program or a
3340: 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72 61  ny.** sub-progra
3350: 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20  ms contains any 
3360: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
3370: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  :.**.**   *  OP_
3380: 48 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c  Halt with P1=SQL
3390: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61  ITE_CONSTRAINT a
33a0: 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a  nd P2=OE_Abort..
33b0: 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 49  **   *  OP_HaltI
33c0: 66 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53 51  fNull with P1=SQ
33d0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
33e0: 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e  and P2=OE_Abort.
33f0: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74  .**   *  OP_Dest
3400: 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56  roy.**   *  OP_V
3410: 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f  Update.**   *  O
3420: 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a  P_VRename.**   *
3430: 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 77    OP_FkCounter w
3440: 69 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65 64  ith P2==0 (immed
3450: 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  iate foreign key
3460: 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a 20   constraint).** 
3470: 20 20 2a 20 20 4f 50 5f 43 72 65 61 74 65 54 61    *  OP_CreateTa
3480: 62 6c 65 20 61 6e 64 20 4f 50 5f 49 6e 69 74 43  ble and OP_InitC
3490: 6f 72 6f 75 74 69 6e 65 20 28 66 6f 72 20 43 52  oroutine (for CR
34a0: 45 41 54 45 20 54 41 42 4c 45 20 41 53 20 53 45  EATE TABLE AS SE
34b0: 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  LECT ...).**.** 
34c0: 54 68 65 6e 20 63 68 65 63 6b 20 74 68 61 74 20  Then check that 
34d0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 72  the value of Par
34e0: 73 65 2e 6d 61 79 41 62 6f 72 74 20 69 73 20 74  se.mayAbort is t
34f0: 72 75 65 20 69 66 20 61 6e 0a 2a 2a 20 41 42 4f  rue if an.** ABO
3500: 52 54 20 6d 61 79 20 62 65 20 74 68 72 6f 77 6e  RT may be thrown
3510: 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
3520: 77 69 73 65 2e 20 52 65 74 75 72 6e 20 74 72 75  wise. Return tru
3530: 65 20 69 66 20 69 74 20 64 6f 65 73 0a 2a 2a 20  e if it does.** 
3540: 6d 61 74 63 68 2c 20 6f 72 20 66 61 6c 73 65 20  match, or false 
3550: 6f 74 68 65 72 77 69 73 65 2e 20 54 68 69 73 20  otherwise. This 
3560: 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 74 65  function is inte
3570: 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  nded to be used 
3580: 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 61 6e  as.** part of an
3590: 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e   assert statemen
35a0: 74 20 69 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65  t in the compile
35b0: 72 2e 20 53 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a  r. Similar to:.*
35c0: 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 73  *.**   assert( s
35d0: 71 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74  qlite3VdbeAssert
35e0: 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 2d  MayAbort(pParse-
35f0: 3e 70 56 64 62 65 2c 20 70 50 61 72 73 65 2d 3e  >pVdbe, pParse->
3600: 6d 61 79 41 62 6f 72 74 29 20 29 3b 0a 2a 2f 0a  mayAbort) );.*/.
3610: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
3620: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 56 64  ssertMayAbort(Vd
3630: 62 65 20 2a 76 2c 20 69 6e 74 20 6d 61 79 41 62  be *v, int mayAb
3640: 6f 72 74 29 7b 0a 20 20 69 6e 74 20 68 61 73 41  ort){.  int hasA
3650: 62 6f 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  bort = 0;.  int 
3660: 68 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 30  hasFkCounter = 0
3670: 3b 0a 20 20 69 6e 74 20 68 61 73 43 72 65 61 74  ;.  int hasCreat
3680: 65 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 69 6e  eTable = 0;.  in
3690: 74 20 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69  t hasInitCorouti
36a0: 6e 65 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 70 4f  ne = 0;.  Op *pO
36b0: 70 3b 0a 20 20 56 64 62 65 4f 70 49 74 65 72 20  p;.  VdbeOpIter 
36c0: 73 49 74 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28  sIter;.  memset(
36d0: 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  &sIter, 0, sizeo
36e0: 66 28 73 49 74 65 72 29 29 3b 0a 20 20 73 49 74  f(sIter));.  sIt
36f0: 65 72 2e 76 20 3d 20 76 3b 0a 0a 20 20 77 68 69  er.v = v;..  whi
3700: 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74 65  le( (pOp = opIte
3710: 72 4e 65 78 74 28 26 73 49 74 65 72 29 29 21 3d  rNext(&sIter))!=
3720: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 63  0 ){.    int opc
3730: 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64  ode = pOp->opcod
3740: 65 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64  e;.    if( opcod
3750: 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20 7c 7c  e==OP_Destroy ||
3760: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64   opcode==OP_VUpd
3770: 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  ate || opcode==O
3780: 50 5f 56 52 65 6e 61 6d 65 20 0a 20 20 20 20 20  P_VRename .     
3790: 7c 7c 20 28 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f  || ((opcode==OP_
37a0: 48 61 6c 74 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d  Halt || opcode==
37b0: 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 29 20 0a  OP_HaltIfNull) .
37c0: 20 20 20 20 20 20 26 26 20 28 28 70 4f 70 2d 3e        && ((pOp->
37d0: 70 31 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  p1&0xff)==SQLITE
37e0: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70  _CONSTRAINT && p
37f0: 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74  Op->p2==OE_Abort
3800: 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
3810: 68 61 73 41 62 6f 72 74 20 3d 20 31 3b 0a 20 20  hasAbort = 1;.  
3820: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3830: 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d  .    if( opcode=
3840: 3d 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20  =OP_CreateTable 
3850: 29 20 68 61 73 43 72 65 61 74 65 54 61 62 6c 65  ) hasCreateTable
3860: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 6f 70   = 1;.    if( op
3870: 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 43 6f 72  code==OP_InitCor
3880: 6f 75 74 69 6e 65 20 29 20 68 61 73 49 6e 69 74  outine ) hasInit
3890: 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 23  Coroutine = 1;.#
38a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
38b0: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
38c0: 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f     if( opcode==O
38d0: 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26 26 20 70  P_FkCounter && p
38e0: 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20 70 4f 70  Op->p1==0 && pOp
38f0: 2d 3e 70 32 3d 3d 31 20 29 7b 0a 20 20 20 20 20  ->p2==1 ){.     
3900: 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20   hasFkCounter = 
3910: 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  1;.    }.#endif.
3920: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
3930: 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72  ree(v->db, sIter
3940: 2e 61 70 53 75 62 29 3b 0a 0a 20 20 2f 2a 20 52  .apSub);..  /* R
3950: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 68 61  eturn true if ha
3960: 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74  sAbort==mayAbort
3970: 2e 20 4f 72 20 69 66 20 61 20 6d 61 6c 6c 6f 63  . Or if a malloc
3980: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
3990: 64 2e 0a 20 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f  d..  ** If mallo
39a0: 63 20 66 61 69 6c 65 64 2c 20 74 68 65 6e 20 74  c failed, then t
39b0: 68 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f 70 20  he while() loop 
39c0: 61 62 6f 76 65 20 6d 61 79 20 6e 6f 74 20 68 61  above may not ha
39d0: 76 65 20 69 74 65 72 61 74 65 64 0a 20 20 2a 2a  ve iterated.  **
39e0: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63   through all opc
39f0: 6f 64 65 73 20 61 6e 64 20 68 61 73 41 62 6f 72  odes and hasAbor
3a00: 74 20 6d 61 79 20 62 65 20 73 65 74 20 69 6e 63  t may be set inc
3a10: 6f 72 72 65 63 74 6c 79 2e 20 52 65 74 75 72 6e  orrectly. Return
3a20: 0a 20 20 2a 2a 20 74 72 75 65 20 66 6f 72 20 74  .  ** true for t
3a30: 68 69 73 20 63 61 73 65 20 74 6f 20 70 72 65 76  his case to prev
3a40: 65 6e 74 20 74 68 65 20 61 73 73 65 72 74 28 29  ent the assert()
3a50: 20 69 6e 20 74 68 65 20 63 61 6c 6c 65 72 73 20   in the callers 
3a60: 66 72 61 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d 20  frame.  ** from 
3a70: 66 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 72  failing.  */.  r
3a80: 65 74 75 72 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d  eturn ( v->db->m
3a90: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 68  allocFailed || h
3aa0: 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72  asAbort==mayAbor
3ab0: 74 20 7c 7c 20 68 61 73 46 6b 43 6f 75 6e 74 65  t || hasFkCounte
3ac0: 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r.              
3ad0: 7c 7c 20 28 68 61 73 43 72 65 61 74 65 54 61 62  || (hasCreateTab
3ae0: 6c 65 20 26 26 20 68 61 73 49 6e 69 74 43 6f 72  le && hasInitCor
3af0: 6f 75 74 69 6e 65 29 20 29 3b 0a 7d 0a 23 65 6e  outine) );.}.#en
3b00: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
3b10: 42 55 47 20 2d 20 74 68 65 20 73 71 6c 69 74 65  BUG - the sqlite
3b20: 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  3AssertMayAbort(
3b30: 29 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f  ) function */../
3b40: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3b50: 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  e is called afte
3b60: 72 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61  r all opcodes ha
3b70: 76 65 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64  ve been inserted
3b80: 2e 20 20 49 74 20 6c 6f 6f 70 73 0a 2a 2a 20 74  .  It loops.** t
3b90: 68 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 6f  hrough all the o
3ba0: 70 63 6f 64 65 73 20 61 6e 64 20 66 69 78 65 73  pcodes and fixes
3bb0: 20 75 70 20 73 6f 6d 65 20 64 65 74 61 69 6c 73   up some details
3bc0: 2e 0a 2a 2a 0a 2a 2a 20 28 31 29 20 46 6f 72 20  ..**.** (1) For 
3bd0: 65 61 63 68 20 6a 75 6d 70 20 69 6e 73 74 72 75  each jump instru
3be0: 63 74 69 6f 6e 20 77 69 74 68 20 61 20 6e 65 67  ction with a neg
3bf0: 61 74 69 76 65 20 50 32 20 76 61 6c 75 65 20 28  ative P2 value (
3c00: 61 20 6c 61 62 65 6c 29 0a 2a 2a 20 20 20 20 20  a label).**     
3c10: 72 65 73 6f 6c 76 65 20 74 68 65 20 50 32 20 76  resolve the P2 v
3c20: 61 6c 75 65 20 74 6f 20 61 6e 20 61 63 74 75 61  alue to an actua
3c30: 6c 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a  l address..**.**
3c40: 20 28 32 29 20 43 6f 6d 70 75 74 65 20 74 68 65   (2) Compute the
3c50: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
3c60: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 75 73 65  of arguments use
3c70: 64 20 62 79 20 61 6e 79 20 53 51 4c 20 66 75 6e  d by any SQL fun
3c80: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 61 6e 64  ction.**     and
3c90: 20 73 74 6f 72 65 20 74 68 61 74 20 76 61 6c 75   store that valu
3ca0: 65 20 69 6e 20 2a 70 4d 61 78 46 75 6e 63 41 72  e in *pMaxFuncAr
3cb0: 67 73 2e 0a 2a 2a 0a 2a 2a 20 28 33 29 20 55 70  gs..**.** (3) Up
3cc0: 64 61 74 65 20 74 68 65 20 56 64 62 65 2e 72 65  date the Vdbe.re
3cd0: 61 64 4f 6e 6c 79 20 61 6e 64 20 56 64 62 65 2e  adOnly and Vdbe.
3ce0: 62 49 73 52 65 61 64 65 72 20 66 6c 61 67 73 20  bIsReader flags 
3cf0: 74 6f 20 61 63 63 75 72 61 74 65 6c 79 0a 2a 2a  to accurately.**
3d00: 20 20 20 20 20 69 6e 64 69 63 61 74 65 20 77 68       indicate wh
3d10: 61 74 20 74 68 65 20 70 72 65 70 61 72 65 64 20  at the prepared 
3d20: 73 74 61 74 65 6d 65 6e 74 20 61 63 74 75 61 6c  statement actual
3d30: 6c 79 20 64 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 28  ly does..**.** (
3d40: 34 29 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  4) Initialize th
3d50: 65 20 70 34 2e 78 41 64 76 61 6e 63 65 20 70 6f  e p4.xAdvance po
3d60: 69 6e 74 65 72 20 6f 6e 20 6f 70 63 6f 64 65 73  inter on opcodes
3d70: 20 74 68 61 74 20 75 73 65 20 69 74 2e 0a 2a 2a   that use it..**
3d80: 0a 2a 2a 20 28 35 29 20 52 65 63 6c 61 69 6d 20  .** (5) Reclaim 
3d90: 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
3da0: 61 74 65 64 20 66 6f 72 20 73 74 6f 72 69 6e 67  ated for storing
3db0: 20 6c 61 62 65 6c 73 2e 0a 2a 2f 0a 73 74 61 74   labels..*/.stat
3dc0: 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50  ic void resolveP
3dd0: 32 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c  2Values(Vdbe *p,
3de0: 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72   int *pMaxFuncAr
3df0: 67 73 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  gs){.  int i;.  
3e00: 69 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a  int nMaxArgs = *
3e10: 70 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20 20  pMaxFuncArgs;.  
3e20: 4f 70 20 2a 70 4f 70 3b 0a 20 20 50 61 72 73 65  Op *pOp;.  Parse
3e30: 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50   *pParse = p->pP
3e40: 61 72 73 65 3b 0a 20 20 69 6e 74 20 2a 61 4c 61  arse;.  int *aLa
3e50: 62 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 61 4c  bel = pParse->aL
3e60: 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f  abel;.  p->readO
3e70: 6e 6c 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 62 49  nly = 1;.  p->bI
3e80: 73 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 66  sReader = 0;.  f
3e90: 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69  or(pOp=p->aOp, i
3ea0: 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b  =p->nOp-1; i>=0;
3eb0: 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20   i--, pOp++){.  
3ec0: 20 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f    u8 opcode = pO
3ed0: 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20  p->opcode;..    
3ee0: 2f 2a 20 4e 4f 54 45 3a 20 42 65 20 73 75 72 65  /* NOTE: Be sure
3ef0: 20 74 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70 63   to update mkopc
3f00: 6f 64 65 68 2e 74 63 6c 20 77 68 65 6e 20 61 64  odeh.tcl when ad
3f10: 64 69 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e 67  ding or removing
3f20: 0a 20 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72  .    ** cases fr
3f30: 6f 6d 20 74 68 69 73 20 73 77 69 74 63 68 21 20  om this switch! 
3f40: 2a 2f 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f  */.    switch( o
3f50: 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63  pcode ){.      c
3f60: 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  ase OP_Transacti
3f70: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  on: {.        if
3f80: 28 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29 20 70  ( pOp->p2!=0 ) p
3f90: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a  ->readOnly = 0;.
3fa0: 20 20 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20          /* fall 
3fb0: 74 68 72 75 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  thru */.      }.
3fc0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41 75        case OP_Au
3fd0: 74 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20 20  toCommit:.      
3fe0: 63 61 73 65 20 4f 50 5f 53 61 76 65 70 6f 69 6e  case OP_Savepoin
3ff0: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  t: {.        p->
4000: 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20  bIsReader = 1;. 
4010: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4020: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
4030: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
4040: 20 20 20 20 63 61 73 65 20 4f 50 5f 43 68 65 63      case OP_Chec
4050: 6b 70 6f 69 6e 74 3a 0a 23 65 6e 64 69 66 0a 20  kpoint:.#endif. 
4060: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 61 63       case OP_Vac
4070: 75 75 6d 3a 0a 20 20 20 20 20 20 63 61 73 65 20  uum:.      case 
4080: 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20  OP_JournalMode: 
4090: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 65 61  {.        p->rea
40a0: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20  dOnly = 0;.     
40b0: 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20     p->bIsReader 
40c0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 1;.        bre
40d0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e  ak;.      }.#ifn
40e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
40f0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
4100: 20 20 20 63 61 73 65 20 4f 50 5f 56 55 70 64 61     case OP_VUpda
4110: 74 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  te: {.        if
4120: 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72  ( pOp->p2>nMaxAr
4130: 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20  gs ) nMaxArgs = 
4140: 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20  pOp->p2;.       
4150: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4160: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 46        case OP_VF
4170: 69 6c 74 65 72 3a 20 7b 0a 20 20 20 20 20 20 20  ilter: {.       
4180: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20   int n;.        
4190: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d  assert( p->nOp -
41a0: 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20   i >= 3 );.     
41b0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d     assert( pOp[-
41c0: 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  1].opcode==OP_In
41d0: 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20 20 20  teger );.       
41e0: 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b   n = pOp[-1].p1;
41f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 3e 6e  .        if( n>n
4200: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
4210: 67 73 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20  gs = n;.        
4220: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  break;.      }.#
4230: 65 6e 64 69 66 0a 20 20 20 20 20 20 63 61 73 65  endif.      case
4240: 20 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20 20 20   OP_Next:.      
4250: 63 61 73 65 20 4f 50 5f 4e 65 78 74 49 66 4f 70  case OP_NextIfOp
4260: 65 6e 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  en:.      case O
4270: 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a 20 7b 0a  P_SorterNext: {.
4280: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e          pOp->p4.
4290: 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74  xAdvance = sqlit
42a0: 65 33 42 74 72 65 65 4e 65 78 74 3b 0a 20 20 20  e3BtreeNext;.   
42b0: 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65       pOp->p4type
42c0: 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20   = P4_ADVANCE;. 
42d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
42e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
42f0: 20 4f 50 5f 50 72 65 76 3a 0a 20 20 20 20 20 20   OP_Prev:.      
4300: 63 61 73 65 20 4f 50 5f 50 72 65 76 49 66 4f 70  case OP_PrevIfOp
4310: 65 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 4f  en: {.        pO
4320: 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d  p->p4.xAdvance =
4330: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
4340: 76 69 6f 75 73 3b 0a 20 20 20 20 20 20 20 20 70  vious;.        p
4350: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
4360: 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20  ADVANCE;.       
4370: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4380: 20 20 20 20 7d 0a 0a 20 20 20 20 70 4f 70 2d 3e      }..    pOp->
4390: 6f 70 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65  opflags = sqlite
43a0: 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b  3OpcodeProperty[
43b0: 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 20 69 66 28  opcode];.    if(
43c0: 20 28 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26   (pOp->opflags &
43d0: 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20   OPFLG_JUMP)!=0 
43e0: 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a  && pOp->p2<0 ){.
43f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 41 44        assert( AD
4400: 44 52 28 70 4f 70 2d 3e 70 32 29 3c 70 50 61 72  DR(pOp->p2)<pPar
4410: 73 65 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20  se->nLabel );.  
4420: 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c      pOp->p2 = aL
4430: 61 62 65 6c 5b 41 44 44 52 28 70 4f 70 2d 3e 70  abel[ADDR(pOp->p
4440: 32 29 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  2)];.    }.  }. 
4450: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
4460: 2d 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 4c  ->db, pParse->aL
4470: 61 62 65 6c 29 3b 0a 20 20 70 50 61 72 73 65 2d  abel);.  pParse-
4480: 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 70  >aLabel = 0;.  p
4490: 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 3d 20  Parse->nLabel = 
44a0: 30 3b 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72  0;.  *pMaxFuncAr
44b0: 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 20  gs = nMaxArgs;. 
44c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52   assert( p->bIsR
44d0: 65 61 64 65 72 21 3d 30 20 7c 7c 20 44 62 4d 61  eader!=0 || DbMa
44e0: 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72  skAllZero(p->btr
44f0: 65 65 4d 61 73 6b 29 20 29 3b 0a 7d 0a 0a 2f 2a  eeMask) );.}../*
4500: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
4510: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
4520: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
4530: 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a  o be inserted..*
4540: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
4550: 65 43 75 72 72 65 6e 74 41 64 64 72 28 56 64 62  eCurrentAddr(Vdb
4560: 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
4570: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
4580: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
4590: 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d  return p->nOp;.}
45a0: 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74  ../*.** Verify t
45b0: 68 61 74 20 61 74 20 6c 65 61 73 74 20 4e 20 6f  hat at least N o
45c0: 70 63 6f 64 65 20 73 6c 6f 74 73 20 61 72 65 20  pcode slots are 
45d0: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 20 77  available in p w
45e0: 69 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69 6e 67  ithout.** having
45f0: 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 6f 72 20 6d   to malloc for m
4600: 6f 72 65 20 73 70 61 63 65 20 28 65 78 63 65 70  ore space (excep
4610: 74 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20  t when compiled 
4620: 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 5f  using.** SQLITE_
4630: 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52  TEST_REALLOC_STR
4640: 45 53 53 29 2e 20 20 54 68 69 73 20 69 6e 74 65  ESS).  This inte
4650: 72 66 61 63 65 20 69 73 20 75 73 65 64 20 64 75  rface is used du
4660: 72 69 6e 67 20 74 65 73 74 69 6e 67 0a 2a 2a 20  ring testing.** 
4670: 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 63  to verify that c
4680: 65 72 74 61 69 6e 20 63 61 6c 6c 73 20 74 6f 20  ertain calls to 
4690: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
46a0: 4c 69 73 74 28 29 20 63 61 6e 20 6e 65 76 65 72  List() can never
46b0: 0a 2a 2a 20 66 61 69 6c 20 64 75 65 20 74 6f 20  .** fail due to 
46c0: 61 20 4f 4f 4d 20 66 61 75 6c 74 20 61 6e 64 20  a OOM fault and 
46d0: 68 65 6e 63 65 20 74 68 61 74 20 74 68 65 20 72  hence that the r
46e0: 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d  eturn value from
46f0: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41  .** sqlite3VdbeA
4700: 64 64 4f 70 4c 69 73 74 28 29 20 77 69 6c 6c 20  ddOpList() will 
4710: 61 6c 77 61 79 73 20 62 65 20 6e 6f 6e 2d 4e 55  always be non-NU
4720: 4c 4c 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  LL..*/.#if defin
4730: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
4740: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
4750: 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43  ITE_TEST_REALLOC
4760: 5f 53 54 52 45 53 53 29 0a 76 6f 69 64 20 73 71  _STRESS).void sq
4770: 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79 4e  lite3VdbeVerifyN
4780: 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65 64 28  oMallocRequired(
4790: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 4e 29 7b  Vdbe *p, int N){
47a0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
47b0: 70 20 2b 20 4e 20 3c 3d 20 70 2d 3e 70 50 61 72  p + N <= p->pPar
47c0: 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29 3b 0a  se->nOpAlloc );.
47d0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
47e0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
47f0: 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
4800: 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  to the array of 
4810: 6f 70 63 6f 64 65 73 20 61 73 73 6f 63 69 61 74  opcodes associat
4820: 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 56  ed with.** the V
4830: 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dbe passed as th
4840: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
4850: 2e 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c  . It is the call
4860: 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  ers responsibili
4870: 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65  ty.** to arrange
4880: 20 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e 65   for the returne
4890: 64 20 61 72 72 61 79 20 74 6f 20 62 65 20 65 76  d array to be ev
48a0: 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75  entually freed u
48b0: 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76 64 62  sing the .** vdb
48c0: 65 46 72 65 65 4f 70 41 72 72 61 79 28 29 20 66  eFreeOpArray() f
48d0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42  unction..**.** B
48e0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
48f0: 20 2a 70 6e 4f 70 20 69 73 20 73 65 74 20 74 6f   *pnOp is set to
4900: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
4910: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 72 65  ntries in the re
4920: 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e  turned.** array.
4930: 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67   Also, *pnMaxArg
4940: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6c   is set to the l
4950: 61 72 67 65 72 20 6f 66 20 69 74 73 20 63 75 72  arger of its cur
4960: 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20 0a  rent value and .
4970: 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
4980: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
4990: 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72  Vdbe.apArg[] arr
49a0: 61 79 20 72 65 71 75 69 72 65 64 20 74 6f 20 65  ay required to e
49b0: 78 65 63 75 74 65 20 74 68 65 20 0a 2a 2a 20 72  xecute the .** r
49c0: 65 74 75 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e  eturned program.
49d0: 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69  .*/.VdbeOp *sqli
49e0: 74 65 33 56 64 62 65 54 61 6b 65 4f 70 41 72 72  te3VdbeTakeOpArr
49f0: 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ay(Vdbe *p, int 
4a00: 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61  *pnOp, int *pnMa
4a10: 78 41 72 67 29 7b 0a 20 20 56 64 62 65 4f 70 20  xArg){.  VdbeOp 
4a20: 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20  *aOp = p->aOp;. 
4a30: 20 61 73 73 65 72 74 28 20 61 4f 70 20 26 26 20   assert( aOp && 
4a40: 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  !p->db->mallocFa
4a50: 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  iled );..  /* Ch
4a60: 65 63 6b 20 74 68 61 74 20 73 71 6c 69 74 65 33  eck that sqlite3
4a70: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 29 20  VdbeUsesBtree() 
4a80: 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f  was not called o
4a90: 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61  n this VM */.  a
4aa0: 73 73 65 72 74 28 20 44 62 4d 61 73 6b 41 6c 6c  ssert( DbMaskAll
4ab0: 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73  Zero(p->btreeMas
4ac0: 6b 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65  k) );..  resolve
4ad0: 50 32 56 61 6c 75 65 73 28 70 2c 20 70 6e 4d 61  P2Values(p, pnMa
4ae0: 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d  xArg);.  *pnOp =
4af0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f   p->nOp;.  p->aO
4b00: 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  p = 0;.  return 
4b10: 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  aOp;.}../*.** Ad
4b20: 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f  d a whole list o
4b30: 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20  f operations to 
4b40: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74  the operation st
4b50: 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 61 0a 2a  ack.  Return a.*
4b60: 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * pointer to the
4b70: 20 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e   first operation
4b80: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a   inserted..**.**
4b90: 20 4e 6f 6e 2d 7a 65 72 6f 20 50 32 20 61 72 67   Non-zero P2 arg
4ba0: 75 6d 65 6e 74 73 20 74 6f 20 6a 75 6d 70 20 69  uments to jump i
4bb0: 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20  nstructions are 
4bc0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 64  automatically ad
4bd0: 6a 75 73 74 65 64 0a 2a 2a 20 73 6f 20 74 68 61  justed.** so tha
4be0: 74 20 74 68 65 20 6a 75 6d 70 20 74 61 72 67 65  t the jump targe
4bf0: 74 20 69 73 20 72 65 6c 61 74 69 76 65 20 74 6f  t is relative to
4c00: 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72 61   the first opera
4c10: 74 69 6f 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a  tion inserted..*
4c20: 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65  /.VdbeOp *sqlite
4c30: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 0a  3VdbeAddOpList(.
4c40: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
4c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4c60: 2a 20 41 64 64 20 6f 70 63 6f 64 65 73 20 74 6f  * Add opcodes to
4c70: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
4c80: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
4c90: 20 6e 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20   nOp,           
4ca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4cb0: 62 65 72 20 6f 66 20 6f 70 63 6f 64 65 73 20 74  ber of opcodes t
4cc0: 6f 20 61 64 64 20 2a 2f 0a 20 20 56 64 62 65 4f  o add */.  VdbeO
4cd0: 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70  pList const *aOp
4ce0: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  ,       /* The o
4cf0: 70 63 6f 64 65 73 20 74 6f 20 62 65 20 61 64 64  pcodes to be add
4d00: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e  ed */.  int iLin
4d10: 65 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20 20  eno             
4d20: 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 2d 66       /* Source-f
4d30: 69 6c 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  ile line number 
4d40: 6f 66 20 66 69 72 73 74 20 6f 70 63 6f 64 65 20  of first opcode 
4d50: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
4d60: 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 2c 20 2a   VdbeOp *pOut, *
4d70: 70 46 69 72 73 74 3b 0a 20 20 61 73 73 65 72 74  pFirst;.  assert
4d80: 28 20 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73  ( nOp>0 );.  ass
4d90: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
4da0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
4db0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b  ;.  if( p->nOp +
4dc0: 20 6e 4f 70 20 3e 20 70 2d 3e 70 50 61 72 73 65   nOp > p->pParse
4dd0: 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67 72  ->nOpAlloc && gr
4de0: 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 6e 4f 70  owOpArray(p, nOp
4df0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
4e00: 30 3b 0a 20 20 7d 0a 20 20 70 46 69 72 73 74 20  0;.  }.  pFirst 
4e10: 3d 20 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70  = pOut = &p->aOp
4e20: 5b 70 2d 3e 6e 4f 70 5d 3b 0a 20 20 66 6f 72 28  [p->nOp];.  for(
4e30: 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c  i=0; i<nOp; i++,
4e40: 20 61 4f 70 2b 2b 2c 20 70 4f 75 74 2b 2b 29 7b   aOp++, pOut++){
4e50: 0a 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64  .    pOut->opcod
4e60: 65 20 3d 20 61 4f 70 2d 3e 6f 70 63 6f 64 65 3b  e = aOp->opcode;
4e70: 0a 20 20 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20  .    pOut->p1 = 
4e80: 61 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 70 4f 75  aOp->p1;.    pOu
4e90: 74 2d 3e 70 32 20 3d 20 61 4f 70 2d 3e 70 32 3b  t->p2 = aOp->p2;
4ea0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 4f 70  .    assert( aOp
4eb0: 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20 20 69  ->p2>=0 );.    i
4ec0: 66 28 20 28 73 71 6c 69 74 65 33 4f 70 63 6f 64  f( (sqlite3Opcod
4ed0: 65 50 72 6f 70 65 72 74 79 5b 61 4f 70 2d 3e 6f  eProperty[aOp->o
4ee0: 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f 4a  pcode] & OPFLG_J
4ef0: 55 4d 50 29 21 3d 30 20 26 26 20 61 4f 70 2d 3e  UMP)!=0 && aOp->
4f00: 70 32 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 4f  p2>0 ){.      pO
4f10: 75 74 2d 3e 70 32 20 2b 3d 20 70 2d 3e 6e 4f 70  ut->p2 += p->nOp
4f20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 75 74  ;.    }.    pOut
4f30: 2d 3e 70 33 20 3d 20 61 4f 70 2d 3e 70 33 3b 0a  ->p3 = aOp->p3;.
4f40: 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 79 70 65      pOut->p4type
4f50: 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20   = P4_NOTUSED;. 
4f60: 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20     pOut->p4.p = 
4f70: 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 35 20  0;.    pOut->p5 
4f80: 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
4f90: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
4fa0: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 70  N_COMMENTS.    p
4fb0: 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20  Out->zComment = 
4fc0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  0;.#endif.#ifdef
4fd0: 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56   SQLITE_VDBE_COV
4fe0: 45 52 41 47 45 0a 20 20 20 20 70 4f 75 74 2d 3e  ERAGE.    pOut->
4ff0: 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65  iSrcLine = iLine
5000: 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20 20 20 20  no+i;.#else.    
5010: 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b 0a 23  (void)iLineno;.#
5020: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
5030: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 69 66  ITE_DEBUG.    if
5040: 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  ( p->db->flags &
5050: 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f   SQLITE_VdbeAddo
5060: 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  pTrace ){.      
5070: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
5080: 4f 70 28 30 2c 20 69 2b 70 2d 3e 6e 4f 70 2c 20  Op(0, i+p->nOp, 
5090: 26 70 2d 3e 61 4f 70 5b 69 2b 70 2d 3e 6e 4f 70  &p->aOp[i+p->nOp
50a0: 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ]);.    }.#endif
50b0: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 20 2b 3d  .  }.  p->nOp +=
50c0: 20 6e 4f 70 3b 0a 20 20 72 65 74 75 72 6e 20 70   nOp;.  return p
50d0: 46 69 72 73 74 3b 0a 7d 0a 0a 23 69 66 20 64 65  First;.}..#if de
50e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
50f0: 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
5100: 54 55 53 29 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  TUS)./*.** Add a
5110: 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 61  n entry to the a
5120: 72 72 61 79 20 6f 66 20 63 6f 75 6e 74 65 72 73  rray of counters
5130: 20 6d 61 6e 61 67 65 64 20 62 79 20 73 71 6c 69   managed by sqli
5140: 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
5150: 74 75 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tus()..*/.void s
5160: 71 6c 69 74 65 33 56 64 62 65 53 63 61 6e 53 74  qlite3VdbeScanSt
5170: 61 74 75 73 28 0a 20 20 56 64 62 65 20 2a 70 2c  atus(.  Vdbe *p,
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5190: 20 20 20 20 20 20 20 20 2f 2a 20 56 4d 20 74 6f          /* VM to
51a0: 20 61 64 64 20 73 63 61 6e 73 74 61 74 75 73 28   add scanstatus(
51b0: 29 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ) to */.  int ad
51c0: 64 72 45 78 70 6c 61 69 6e 2c 20 20 20 20 20 20  drExplain,      
51d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
51e0: 72 65 73 73 20 6f 66 20 4f 50 5f 45 78 70 6c 61  ress of OP_Expla
51f0: 69 6e 20 28 6f 72 20 30 29 20 2a 2f 0a 20 20 69  in (or 0) */.  i
5200: 6e 74 20 61 64 64 72 4c 6f 6f 70 2c 20 20 20 20  nt addrLoop,    
5210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5220: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6c 6f 6f  * Address of loo
5230: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 20 0a 20 20  p counter */ .  
5240: 69 6e 74 20 61 64 64 72 56 69 73 69 74 2c 20 20  int addrVisit,  
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5260: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 72 6f  /* Address of ro
5270: 77 73 20 76 69 73 69 74 65 64 20 63 6f 75 6e 74  ws visited count
5280: 65 72 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e  er */.  LogEst n
5290: 45 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  Est,            
52a0: 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d          /* Estim
52b0: 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f  ated number of o
52c0: 75 74 70 75 74 20 72 6f 77 73 20 2a 2f 0a 20 20  utput rows */.  
52d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
52e0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
52f0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65  /* Name of table
5300: 20 6f 72 20 69 6e 64 65 78 20 62 65 69 6e 67 20   or index being 
5310: 73 63 61 6e 6e 65 64 20 2a 2f 0a 29 7b 0a 20 20  scanned */.){.  
5320: 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70 2d 3e  int nByte = (p->
5330: 6e 53 63 61 6e 2b 31 29 20 2a 20 73 69 7a 65 6f  nScan+1) * sizeo
5340: 66 28 53 63 61 6e 53 74 61 74 75 73 29 3b 0a 20  f(ScanStatus);. 
5350: 20 53 63 61 6e 53 74 61 74 75 73 20 2a 61 4e 65   ScanStatus *aNe
5360: 77 3b 0a 20 20 61 4e 65 77 20 3d 20 28 53 63 61  w;.  aNew = (Sca
5370: 6e 53 74 61 74 75 73 2a 29 73 71 6c 69 74 65 33  nStatus*)sqlite3
5380: 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c  DbRealloc(p->db,
5390: 20 70 2d 3e 61 53 63 61 6e 2c 20 6e 42 79 74 65   p->aScan, nByte
53a0: 29 3b 0a 20 20 69 66 28 20 61 4e 65 77 20 29 7b  );.  if( aNew ){
53b0: 0a 20 20 20 20 53 63 61 6e 53 74 61 74 75 73 20  .    ScanStatus 
53c0: 2a 70 4e 65 77 20 3d 20 26 61 4e 65 77 5b 70 2d  *pNew = &aNew[p-
53d0: 3e 6e 53 63 61 6e 2b 2b 5d 3b 0a 20 20 20 20 70  >nScan++];.    p
53e0: 4e 65 77 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e  New->addrExplain
53f0: 20 3d 20 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a   = addrExplain;.
5400: 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4c 6f      pNew->addrLo
5410: 6f 70 20 3d 20 61 64 64 72 4c 6f 6f 70 3b 0a 20  op = addrLoop;. 
5420: 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 56 69 73     pNew->addrVis
5430: 69 74 20 3d 20 61 64 64 72 56 69 73 69 74 3b 0a  it = addrVisit;.
5440: 20 20 20 20 70 4e 65 77 2d 3e 6e 45 73 74 20 3d      pNew->nEst =
5450: 20 6e 45 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d   nEst;.    pNew-
5460: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
5470: 44 62 53 74 72 44 75 70 28 70 2d 3e 64 62 2c 20  DbStrDup(p->db, 
5480: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 61  zName);.    p->a
5490: 53 63 61 6e 20 3d 20 61 4e 65 77 3b 0a 20 20 7d  Scan = aNew;.  }
54a0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
54b0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
54c0: 75 65 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65  ue of the opcode
54d0: 2c 20 6f 72 20 50 31 2c 20 50 32 2c 20 50 33 2c  , or P1, P2, P3,
54e0: 20 6f 72 20 50 35 20 6f 70 65 72 61 6e 64 73 0a   or P5 operands.
54f0: 2a 2a 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  ** for a specifi
5500: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
5510: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
5520: 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 56  beChangeOpcode(V
5530: 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72  dbe *p, u32 addr
5540: 2c 20 75 38 20 69 4e 65 77 4f 70 63 6f 64 65 29  , u8 iNewOpcode)
5550: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47  {.  sqlite3VdbeG
5560: 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 6f 70  etOp(p,addr)->op
5570: 63 6f 64 65 20 3d 20 69 4e 65 77 4f 70 63 6f 64  code = iNewOpcod
5580: 65 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  e;.}.void sqlite
5590: 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 56 64  3VdbeChangeP1(Vd
55a0: 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c  be *p, u32 addr,
55b0: 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c   int val){.  sql
55c0: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c  ite3VdbeGetOp(p,
55d0: 61 64 64 72 29 2d 3e 70 31 20 3d 20 76 61 6c 3b  addr)->p1 = val;
55e0: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
55f0: 64 62 65 43 68 61 6e 67 65 50 32 28 56 64 62 65  dbeChangeP2(Vdbe
5600: 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69   *p, u32 addr, i
5610: 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74  nt val){.  sqlit
5620: 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64  e3VdbeGetOp(p,ad
5630: 64 72 29 2d 3e 70 32 20 3d 20 76 61 6c 3b 0a 7d  dr)->p2 = val;.}
5640: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
5650: 65 43 68 61 6e 67 65 50 33 28 56 64 62 65 20 2a  eChangeP3(Vdbe *
5660: 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74  p, u32 addr, int
5670: 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33   val){.  sqlite3
5680: 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72  VdbeGetOp(p,addr
5690: 29 2d 3e 70 33 20 3d 20 76 61 6c 3b 0a 7d 0a 76  )->p3 = val;.}.v
56a0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
56b0: 68 61 6e 67 65 50 35 28 56 64 62 65 20 2a 70 2c  hangeP5(Vdbe *p,
56c0: 20 75 38 20 70 35 29 7b 0a 20 20 69 66 28 20 21   u8 p5){.  if( !
56d0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
56e0: 6c 65 64 20 29 20 70 2d 3e 61 4f 70 5b 70 2d 3e  led ) p->aOp[p->
56f0: 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20 70 35 3b 0a  nOp-1].p5 = p5;.
5700: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
5710: 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f  the P2 operand o
5720: 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64  f instruction ad
5730: 64 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  dr so that it po
5740: 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61  ints to.** the a
5750: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
5760: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
5770: 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76  o be coded..*/.v
5780: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a  oid sqlite3VdbeJ
5790: 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c  umpHere(Vdbe *p,
57a0: 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 70 2d   int addr){.  p-
57b0: 3e 70 50 61 72 73 65 2d 3e 69 46 69 78 65 64 4f  >pParse->iFixedO
57c0: 70 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a  p = p->nOp - 1;.
57d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
57e0: 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70  ngeP2(p, addr, p
57f0: 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ->nOp);.}.../*.*
5800: 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 46  * If the input F
5810: 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72 65  uncDef structure
5820: 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74   is ephemeral, t
5830: 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66  hen free it.  If
5840: 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20  .** the FuncDef 
5850: 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c  is not ephermal,
5860: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67   then do nothing
5870: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5880: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
5890: 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a  nction(sqlite3 *
58a0: 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65  db, FuncDef *pDe
58b0: 66 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  f){.  if( ALWAYS
58c0: 28 70 44 65 66 29 20 26 26 20 28 70 44 65 66 2d  (pDef) && (pDef-
58d0: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
58e0: 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21  ITE_FUNC_EPHEM)!
58f0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
5900: 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 65 66  3DbFree(db, pDef
5910: 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
5920: 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70   void vdbeFreeOp
5930: 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 2c  Array(sqlite3 *,
5940: 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a   Op *, int);../*
5950: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20  .** Delete a P4 
5960: 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61  value if necessa
5970: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
5980: 69 64 20 66 72 65 65 50 34 28 73 71 6c 69 74 65  id freeP4(sqlite
5990: 33 20 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70  3 *db, int p4typ
59a0: 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20  e, void *p4){.  
59b0: 69 66 28 20 70 34 20 29 7b 0a 20 20 20 20 61 73  if( p4 ){.    as
59c0: 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20 20 20  sert( db );.    
59d0: 73 77 69 74 63 68 28 20 70 34 74 79 70 65 20 29  switch( p4type )
59e0: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  {.      case P4_
59f0: 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20 20  FUNCCTX: {.     
5a00: 20 20 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c     freeEphemeral
5a10: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28 28 73  Function(db, ((s
5a20: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
5a30: 70 34 29 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 20  p4)->pFunc);.   
5a40: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
5a50: 6f 75 67 68 20 69 6e 74 6f 20 74 68 65 20 6e 65  ough into the ne
5a60: 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20  xt case */.     
5a70: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34   }.      case P4
5a80: 5f 52 45 41 4c 3a 0a 20 20 20 20 20 20 63 61 73  _REAL:.      cas
5a90: 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20  e P4_INT64:.    
5aa0: 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49    case P4_DYNAMI
5ab0: 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34  C:.      case P4
5ac0: 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20  _INTARRAY: {.   
5ad0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
5ae0: 65 65 28 64 62 2c 20 70 34 29 3b 0a 20 20 20 20  ee(db, p4);.    
5af0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5b00: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34   }.      case P4
5b10: 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20  _KEYINFO: {.    
5b20: 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79      if( db->pnBy
5b30: 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71  tesFreed==0 ) sq
5b40: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
5b50: 66 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b  f((KeyInfo*)p4);
5b60: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
5b70: 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
5b80: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
5b90: 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20 20 20  SOR_HINTS.      
5ba0: 63 61 73 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a  case P4_EXPR: {.
5bb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
5bc0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 28 45  xprDelete(db, (E
5bd0: 78 70 72 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  xpr*)p4);.      
5be0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
5bf0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63 61  .#endif.      ca
5c00: 73 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a 20 7b  se P4_MPRINTF: {
5c10: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
5c20: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
5c30: 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
5c40: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
5c50: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
5c60: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45    case P4_FUNCDE
5c70: 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65  F: {.        fre
5c80: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69  eEphemeralFuncti
5c90: 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44 65 66 2a  on(db, (FuncDef*
5ca0: 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72  )p4);.        br
5cb0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
5cc0: 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20     case P4_MEM: 
5cd0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
5ce0: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
5cf0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
5d00: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
5d10: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
5d20: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  p4);.        }el
5d30: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 4d 65  se{.          Me
5d40: 6d 20 2a 70 20 3d 20 28 4d 65 6d 2a 29 70 34 3b  m *p = (Mem*)p4;
5d50: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
5d60: 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c  ->szMalloc ) sql
5d70: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
5d80: 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  ->zMalloc);.    
5d90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
5da0: 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  ree(db, p);.    
5db0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
5dc0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
5dd0: 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 20     case P4_VTAB 
5de0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
5df0: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
5e00: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 74 61  ==0 ) sqlite3Vta
5e10: 62 55 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20  bUnlock((VTable 
5e20: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62  *)p4);.        b
5e30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
5e40: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
5e50: 20 46 72 65 65 20 74 68 65 20 73 70 61 63 65 20   Free the space 
5e60: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f  allocated for aO
5e70: 70 20 61 6e 64 20 61 6e 79 20 70 34 20 76 61 6c  p and any p4 val
5e80: 75 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ues allocated fo
5e90: 72 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73  r the.** opcodes
5ea0: 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
5eb0: 6e 2e 20 49 66 20 61 4f 70 20 69 73 20 6e 6f 74  n. If aOp is not
5ec0: 20 4e 55 4c 4c 20 69 74 20 69 73 20 61 73 73 75   NULL it is assu
5ed0: 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a  med to contain .
5ee0: 2a 2a 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20  ** nOp entries. 
5ef0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5f00: 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
5f10: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70 20  sqlite3 *db, Op 
5f20: 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a  *aOp, int nOp){.
5f30: 20 20 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20    if( aOp ){.   
5f40: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f   Op *pOp;.    fo
5f50: 72 28 70 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26  r(pOp=aOp; pOp<&
5f60: 61 4f 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29  aOp[nOp]; pOp++)
5f70: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  {.      if( pOp-
5f80: 3e 70 34 74 79 70 65 20 29 20 66 72 65 65 50 34  >p4type ) freeP4
5f90: 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65  (db, pOp->p4type
5fa0: 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69  , pOp->p4.p);.#i
5fb0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
5fc0: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
5fd0: 4e 54 53 0a 20 20 20 20 20 20 73 71 6c 69 74 65  NTS.      sqlite
5fe0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d  3DbFree(db, pOp-
5ff0: 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64  >zComment);.#end
6000: 69 66 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20  if     .    }.  
6010: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
6020: 65 28 64 62 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f  e(db, aOp);.}../
6030: 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65 20 53 75  *.** Link the Su
6040: 62 50 72 6f 67 72 61 6d 20 6f 62 6a 65 63 74 20  bProgram object 
6050: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
6060: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 6e  cond argument in
6070: 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a  to the linked.**
6080: 20 6c 69 73 74 20 61 74 20 56 64 62 65 2e 70 53   list at Vdbe.pS
6090: 75 62 50 72 6f 67 72 61 6d 2e 20 54 68 69 73 20  ubProgram. This 
60a0: 6c 69 73 74 20 69 73 20 75 73 65 64 20 74 6f 20  list is used to 
60b0: 64 65 6c 65 74 65 20 61 6c 6c 20 73 75 62 2d 70  delete all sub-p
60c0: 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74  rogram.** object
60d0: 73 20 77 68 65 6e 20 74 68 65 20 56 4d 20 69 73  s when the VM is
60e0: 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69   no longer requi
60f0: 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  red..*/.void sql
6100: 69 74 65 33 56 64 62 65 4c 69 6e 6b 53 75 62 50  ite3VdbeLinkSubP
6110: 72 6f 67 72 61 6d 28 56 64 62 65 20 2a 70 56 64  rogram(Vdbe *pVd
6120: 62 65 2c 20 53 75 62 50 72 6f 67 72 61 6d 20 2a  be, SubProgram *
6130: 70 29 7b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d  p){.  p->pNext =
6140: 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d   pVdbe->pProgram
6150: 3b 0a 20 20 70 56 64 62 65 2d 3e 70 50 72 6f 67  ;.  pVdbe->pProg
6160: 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  ram = p;.}../*.*
6170: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6f 70 63  * Change the opc
6180: 6f 64 65 20 61 74 20 61 64 64 72 20 69 6e 74 6f  ode at addr into
6190: 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a 69 6e 74 20   OP_Noop.*/.int 
61a0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
61b0: 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c  eToNoop(Vdbe *p,
61c0: 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 56 64   int addr){.  Vd
61d0: 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28  beOp *pOp;.  if(
61e0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
61f0: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b  iled ) return 0;
6200: 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3e  .  assert( addr>
6210: 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f  =0 && addr<p->nO
6220: 70 20 29 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d  p );.  pOp = &p-
6230: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72  >aOp[addr];.  fr
6240: 65 65 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d  eeP4(p->db, pOp-
6250: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34  >p4type, pOp->p4
6260: 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79  .p);.  pOp->p4ty
6270: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
6280: 0a 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 30  .  pOp->p4.z = 0
6290: 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20  ;.  pOp->opcode 
62a0: 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 72 65 74  = OP_Noop;.  ret
62b0: 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
62c0: 49 66 20 74 68 65 20 6c 61 73 74 20 6f 70 63 6f  If the last opco
62d0: 64 65 20 69 73 20 22 6f 70 22 20 61 6e 64 20 69  de is "op" and i
62e0: 74 20 69 73 20 6e 6f 74 20 61 20 6a 75 6d 70 20  t is not a jump 
62f0: 64 65 73 74 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20  destination,.** 
6300: 74 68 65 6e 20 72 65 6d 6f 76 65 20 69 74 2e 20  then remove it. 
6310: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
6320: 61 6e 64 20 6f 6e 6c 79 20 69 66 20 61 6e 20 6f  and only if an o
6330: 70 63 6f 64 65 20 77 61 73 20 72 65 6d 6f 76 65  pcode was remove
6340: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
6350: 33 56 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72  3VdbeDeletePrior
6360: 4f 70 63 6f 64 65 28 56 64 62 65 20 2a 70 2c 20  Opcode(Vdbe *p, 
6370: 75 38 20 6f 70 29 7b 0a 20 20 69 66 28 20 28 70  u8 op){.  if( (p
6380: 2d 3e 6e 4f 70 2d 31 29 3e 28 70 2d 3e 70 50 61  ->nOp-1)>(p->pPa
6390: 72 73 65 2d 3e 69 46 69 78 65 64 4f 70 29 20 26  rse->iFixedOp) &
63a0: 26 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d  & p->aOp[p->nOp-
63b0: 31 5d 2e 6f 70 63 6f 64 65 3d 3d 6f 70 20 29 7b  1].opcode==op ){
63c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
63d0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
63e0: 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70 2d 31 29  oop(p, p->nOp-1)
63f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
6400: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 0;.  }.}..
6410: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
6420: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34   value of the P4
6430: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73   operand for a s
6440: 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74  pecific instruct
6450: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
6460: 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77  tine is useful w
6470: 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67  hen a large prog
6480: 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72  ram is loaded fr
6490: 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61  om a.** static a
64a0: 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74  rray using sqlit
64b0: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20  e3VdbeAddOpList 
64c0: 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d  but we want to m
64d0: 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e  ake a.** few min
64e0: 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  or changes to th
64f0: 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a  e program..**.**
6500: 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68   If n>=0 then th
6510: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20  e P4 operand is 
6520: 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67  dynamic, meaning
6530: 20 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a   that a copy of.
6540: 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73  ** the string is
6550: 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   made into memor
6560: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
6570: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
6580: 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20  ..** A value of 
6590: 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20  n==0 means copy 
65a0: 62 79 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20  bytes of zP4 up 
65b0: 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67  to and including
65c0: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75   the.** first nu
65d0: 6c 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30  ll byte.  If n>0
65e0: 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62   then copy n+1 b
65f0: 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 20  ytes of zP4..** 
6600: 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73  .** Other values
6610: 20 6f 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43   of n (P4_STATIC
6620: 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63  , P4_COLLSEQ etc
6630: 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  .) indicate that
6640: 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74   zP4 points.** t
6650: 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74  o a string or st
6660: 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20  ructure that is 
6670: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78  guaranteed to ex
6680: 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65  ist for the life
6690: 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56  time of.** the V
66a0: 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61  dbe. In these ca
66b0: 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20  ses we can just 
66c0: 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72  copy the pointer
66d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c  ..**.** If addr<
66e0: 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34  0 then change P4
66f0: 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
6700: 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69  ently inserted i
6710: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  nstruction..*/.s
6720: 74 61 74 69 63 20 76 6f 69 64 20 53 51 4c 49 54  tatic void SQLIT
6730: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 64 62 65 43  E_NOINLINE vdbeC
6740: 68 61 6e 67 65 50 34 46 75 6c 6c 28 0a 20 20 56  hangeP4Full(.  V
6750: 64 62 65 20 2a 70 2c 0a 20 20 4f 70 20 2a 70 4f  dbe *p,.  Op *pO
6760: 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  p,.  const char 
6770: 2a 7a 50 34 2c 0a 20 20 69 6e 74 20 6e 0a 29 7b  *zP4,.  int n.){
6780: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79  .  if( pOp->p4ty
6790: 70 65 20 29 7b 0a 20 20 20 20 66 72 65 65 50 34  pe ){.    freeP4
67a0: 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70 34 74  (p->db, pOp->p4t
67b0: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
67c0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
67d0: 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70   = 0;.    pOp->p
67e0: 34 2e 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  4.p = 0;.  }.  i
67f0: 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 73 71  f( n<0 ){.    sq
6800: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
6810: 34 28 70 2c 20 28 69 6e 74 29 28 70 4f 70 20 2d  4(p, (int)(pOp -
6820: 20 70 2d 3e 61 4f 70 29 2c 20 7a 50 34 2c 20 6e   p->aOp), zP4, n
6830: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
6840: 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73  if( n==0 ) n = s
6850: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
6860: 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  P4);.    pOp->p4
6870: 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  .z = sqlite3DbSt
6880: 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34  rNDup(p->db, zP4
6890: 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  , n);.    pOp->p
68a0: 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d  4type = P4_DYNAM
68b0: 49 43 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73  IC;.  }.}.void s
68c0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
68d0: 50 34 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  P4(Vdbe *p, int 
68e0: 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  addr, const char
68f0: 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20   *zP4, int n){. 
6900: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 71 6c 69   Op *pOp;.  sqli
6910: 74 65 33 20 2a 64 62 3b 0a 20 20 61 73 73 65 72  te3 *db;.  asser
6920: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 64 62 20  t( p!=0 );.  db 
6930: 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  = p->db;.  asser
6940: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
6950: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
6960: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70    assert( p->aOp
6970: 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !=0 || db->mallo
6980: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
6990: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
69a0: 64 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 21 3d  d ){.    if( n!=
69b0: 50 34 5f 56 54 41 42 20 29 20 66 72 65 65 50 34  P4_VTAB ) freeP4
69c0: 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 2a  (db, n, (void*)*
69d0: 28 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20  (char**)&zP4);. 
69e0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
69f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
6a00: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  0 );.  assert( a
6a10: 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  ddr<p->nOp );.  
6a20: 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20  if( addr<0 ){.  
6a30: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20    addr = p->nOp 
6a40: 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d  - 1;.  }.  pOp =
6a50: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
6a60: 20 20 69 66 28 20 6e 3e 3d 30 20 7c 7c 20 70 4f    if( n>=0 || pO
6a70: 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20  p->p4type ){.   
6a80: 20 76 64 62 65 43 68 61 6e 67 65 50 34 46 75 6c   vdbeChangeP4Ful
6a90: 6c 28 70 2c 20 70 4f 70 2c 20 7a 50 34 2c 20 6e  l(p, pOp, zP4, n
6aa0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
6ab0: 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49   }.  if( n==P4_I
6ac0: 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  NT32 ){.    /* N
6ad0: 6f 74 65 3a 20 74 68 69 73 20 63 61 73 74 20 69  ote: this cast i
6ae0: 73 20 73 61 66 65 2c 20 62 65 63 61 75 73 65 20  s safe, because 
6af0: 74 68 65 20 6f 72 69 67 69 6e 20 64 61 74 61 20  the origin data 
6b00: 70 6f 69 6e 74 20 77 61 73 20 61 6e 20 69 6e 74  point was an int
6b10: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 61 73  .    ** that was
6b20: 20 63 61 73 74 20 74 6f 20 61 20 28 63 6f 6e 73   cast to a (cons
6b30: 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20  t char *). */.  
6b40: 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51    pOp->p4.i = SQ
6b50: 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
6b60: 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  zP4);.    pOp->p
6b70: 34 74 79 70 65 20 3d 20 50 34 5f 49 4e 54 33 32  4type = P4_INT32
6b80: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50  ;.  }else if( zP
6b90: 34 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  4!=0 ){.    asse
6ba0: 72 74 28 20 6e 3c 30 20 29 3b 0a 20 20 20 20 70  rt( n<0 );.    p
6bb0: 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64  Op->p4.p = (void
6bc0: 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP4;.    pOp->
6bd0: 70 34 74 79 70 65 20 3d 20 28 73 69 67 6e 65 64  p4type = (signed
6be0: 20 63 68 61 72 29 6e 3b 0a 20 20 20 20 69 66 28   char)n;.    if(
6bf0: 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29 20 73 71   n==P4_VTAB ) sq
6c00: 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b 28 28 56  lite3VtabLock((V
6c10: 54 61 62 6c 65 2a 29 7a 50 34 29 3b 0a 20 20 7d  Table*)zP4);.  }
6c20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
6c30: 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74  e P4 on the most
6c40: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
6c50: 6f 70 63 6f 64 65 20 74 6f 20 74 68 65 20 4b 65  opcode to the Ke
6c60: 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 0a 2a 2a  yInfo for the.**
6c70: 20 69 6e 64 65 78 20 67 69 76 65 6e 2e 0a 2a 2f   index given..*/
6c80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6c90: 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 50 61  eSetP4KeyInfo(Pa
6ca0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64  rse *pParse, Ind
6cb0: 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 56 64 62  ex *pIdx){.  Vdb
6cc0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
6cd0: 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
6ce0: 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  v!=0 );.  assert
6cf0: 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 73  ( pIdx!=0 );.  s
6d00: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6d10: 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a  P4(v, -1, (char*
6d20: 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f  )sqlite3KeyInfoO
6d30: 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  fIndex(pParse, p
6d40: 49 64 78 29 2c 0a 20 20 20 20 20 20 20 20 20 20  Idx),.          
6d50: 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b              P4_K
6d60: 45 59 49 4e 46 4f 29 3b 0a 7d 0a 0a 23 69 66 64  EYINFO);.}..#ifd
6d70: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
6d80: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
6d90: 53 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  S./*.** Change t
6da0: 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  he comment on th
6db0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
6dc0: 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f  coded instructio
6dd0: 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74  n.  Or.** insert
6de0: 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64   a No-op and add
6df0: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20   the comment to 
6e00: 74 68 61 74 20 6e 65 77 20 69 6e 73 74 72 75 63  that new instruc
6e10: 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d  tion.  This.** m
6e20: 61 6b 65 73 20 74 68 65 20 63 6f 64 65 20 65 61  akes the code ea
6e30: 73 69 65 72 20 74 6f 20 72 65 61 64 20 64 75 72  sier to read dur
6e40: 69 6e 67 20 64 65 62 75 67 67 69 6e 67 2e 20 20  ing debugging.  
6e50: 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 68 61 70  None of this hap
6e60: 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f  pens.** in a pro
6e70: 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a  duction build..*
6e80: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
6e90: 62 65 56 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20  beVComment(Vdbe 
6ea0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
6eb0: 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74  zFormat, va_list
6ec0: 20 61 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   ap){.  assert( 
6ed0: 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61  p->nOp>0 || p->a
6ee0: 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Op==0 );.  asser
6ef0: 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20  t( p->aOp==0 || 
6f00: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
6f10: 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20  .zComment==0 || 
6f20: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
6f30: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  led );.  if( p->
6f40: 6e 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nOp ){.    asser
6f50: 74 28 20 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20  t( p->aOp );.   
6f60: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
6f70: 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b 70 2d 3e  ->db, p->aOp[p->
6f80: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 29  nOp-1].zComment)
6f90: 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e  ;.    p->aOp[p->
6fa0: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 20  nOp-1].zComment 
6fb0: 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
6fc0: 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74  f(p->db, zFormat
6fd0: 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  , ap);.  }.}.voi
6fe0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d  d sqlite3VdbeCom
6ff0: 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f  ment(Vdbe *p, co
7000: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
7010: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
7020: 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29  st ap;.  if( p )
7030: 7b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61  {.    va_start(a
7040: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20  p, zFormat);.   
7050: 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c   vdbeVComment(p,
7060: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
7070: 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
7080: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
7090: 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74  3VdbeNoopComment
70a0: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
70b0: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
70c0: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
70d0: 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  p;.  if( p ){.  
70e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
70f0: 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b  Op0(p, OP_Noop);
7100: 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70  .    va_start(ap
7110: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  , zFormat);.    
7120: 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20  vdbeVComment(p, 
7130: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
7140: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
7150: 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e  }.}.#endif  /* N
7160: 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66  DEBUG */..#ifdef
7170: 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56   SQLITE_VDBE_COV
7180: 45 52 41 47 45 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ERAGE./*.** Set 
7190: 74 68 65 20 76 61 6c 75 65 20 69 66 20 74 68 65  the value if the
71a0: 20 69 53 72 63 4c 69 6e 65 20 66 69 65 6c 64 20   iSrcLine field 
71b0: 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73  for the previous
71c0: 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63  ly coded instruc
71d0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
71e0: 6c 69 74 65 33 56 64 62 65 53 65 74 4c 69 6e 65  lite3VdbeSetLine
71f0: 4e 75 6d 62 65 72 28 56 64 62 65 20 2a 76 2c 20  Number(Vdbe *v, 
7200: 69 6e 74 20 69 4c 69 6e 65 29 7b 0a 20 20 73 71  int iLine){.  sq
7210: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
7220: 2c 2d 31 29 2d 3e 69 53 72 63 4c 69 6e 65 20 3d  ,-1)->iSrcLine =
7230: 20 69 4c 69 6e 65 3b 0a 7d 0a 23 65 6e 64 69 66   iLine;.}.#endif
7240: 20 2f 2a 20 53 51 4c 49 54 45 5f 56 44 42 45 5f   /* SQLITE_VDBE_
7250: 43 4f 56 45 52 41 47 45 20 2a 2f 0a 0a 2f 2a 0a  COVERAGE */../*.
7260: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70  ** Return the op
7270: 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e  code for a given
7280: 20 61 64 64 72 65 73 73 2e 20 20 49 66 20 74 68   address.  If th
7290: 65 20 61 64 64 72 65 73 73 20 69 73 20 2d 31 2c  e address is -1,
72a0: 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20   then.** return 
72b0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
72c0: 79 20 69 6e 73 65 72 74 65 64 20 6f 70 63 6f 64  y inserted opcod
72d0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  e..**.** If a me
72e0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
72f0: 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
7300: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
7310: 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73 0a  calling of this.
7320: 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e  ** routine, then
7330: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
7340: 64 75 6d 6d 79 20 56 64 62 65 4f 70 20 77 69 6c  dummy VdbeOp wil
7350: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20  l be returned.  
7360: 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69  That opcode.** i
7370: 73 20 72 65 61 64 61 62 6c 65 20 62 75 74 20 6e  s readable but n
7380: 6f 74 20 77 72 69 74 61 62 6c 65 2c 20 74 68 6f  ot writable, tho
7390: 75 67 68 20 69 74 20 69 73 20 63 61 73 74 20 74  ugh it is cast t
73a0: 6f 20 61 20 77 72 69 74 61 62 6c 65 20 76 61 6c  o a writable val
73b0: 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ue..** The retur
73c0: 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f 70 63  n of a dummy opc
73d0: 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63  ode allows the c
73e0: 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  all to continue 
73f0: 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61  functioning.** a
7400: 66 74 65 72 20 61 6e 20 4f 4f 4d 20 66 61 75 6c  fter an OOM faul
7410: 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  t without having
7420: 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73 65 65   to check to see
7430: 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 20 66   if the return f
7440: 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75  rom .** this rou
7450: 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69 64 20  tine is a valid 
7460: 70 6f 69 6e 74 65 72 2e 20 20 42 75 74 20 62 65  pointer.  But be
7470: 63 61 75 73 65 20 74 68 65 20 64 75 6d 6d 79 2e  cause the dummy.
7480: 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20  opcode is 0,.** 
7490: 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72  dummy will never
74a0: 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20   be written to. 
74b0: 20 54 68 69 73 20 69 73 20 76 65 72 69 66 69 65   This is verifie
74c0: 64 20 62 79 20 63 6f 64 65 20 69 6e 73 70 65 63  d by code inspec
74d0: 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72  tion and.** by r
74e0: 75 6e 6e 69 6e 67 20 77 69 74 68 20 56 61 6c 67  unning with Valg
74f0: 72 69 6e 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20  rind..*/.VdbeOp 
7500: 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f  *sqlite3VdbeGetO
7510: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
7520: 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73  ddr){.  /* C89 s
7530: 70 65 63 69 66 69 65 73 20 74 68 61 74 20 74 68  pecifies that th
7540: 65 20 63 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d  e constant "dumm
7550: 79 22 20 77 69 6c 6c 20 62 65 20 69 6e 69 74 69  y" will be initi
7560: 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20  alized to all.  
7570: 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63 68 20  ** zeros, which 
7580: 69 73 20 63 6f 72 72 65 63 74 2e 20 20 4d 53 56  is correct.  MSV
7590: 43 20 67 65 6e 65 72 61 74 65 73 20 61 20 77 61  C generates a wa
75a0: 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c  rning, neverthel
75b0: 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63  ess. */.  static
75c0: 20 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20   VdbeOp dummy;  
75d0: 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 4d 53  /* Ignore the MS
75e0: 56 43 20 77 61 72 6e 69 6e 67 20 61 62 6f 75 74  VC warning about
75f0: 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65 72 20   no initializer 
7600: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
7610: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
7620: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
7630: 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64  addr<0 ){.    ad
7640: 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  dr = p->nOp - 1;
7650: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
7660: 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c  addr>=0 && addr<
7670: 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62  p->nOp) || p->db
7680: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7690: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
76a0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
76b0: 20 20 20 72 65 74 75 72 6e 20 28 56 64 62 65 4f     return (VdbeO
76c0: 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c  p*)&dummy;.  }el
76d0: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26  se{.    return &
76e0: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
76f0: 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  }.}..#if defined
7700: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45  (SQLITE_ENABLE_E
7710: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 29  XPLAIN_COMMENTS)
7720: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  ./*.** Return an
7730: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66   integer value f
7740: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 70 61  or one of the pa
7750: 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68 65 20  rameters to the 
7760: 6f 70 63 6f 64 65 20 70 4f 70 0a 2a 2a 20 64 65  opcode pOp.** de
7770: 74 65 72 6d 69 6e 65 64 20 62 79 20 63 68 61 72  termined by char
7780: 61 63 74 65 72 20 63 2e 0a 2a 2f 0a 73 74 61 74  acter c..*/.stat
7790: 69 63 20 69 6e 74 20 74 72 61 6e 73 6c 61 74 65  ic int translate
77a0: 50 28 63 68 61 72 20 63 2c 20 63 6f 6e 73 74 20  P(char c, const 
77b0: 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 69 66 28 20  Op *pOp){.  if( 
77c0: 63 3d 3d 27 31 27 20 29 20 72 65 74 75 72 6e 20  c=='1' ) return 
77d0: 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 66 28 20 63  pOp->p1;.  if( c
77e0: 3d 3d 27 32 27 20 29 20 72 65 74 75 72 6e 20 70  =='2' ) return p
77f0: 4f 70 2d 3e 70 32 3b 0a 20 20 69 66 28 20 63 3d  Op->p2;.  if( c=
7800: 3d 27 33 27 20 29 20 72 65 74 75 72 6e 20 70 4f  ='3' ) return pO
7810: 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20 63 3d 3d  p->p3;.  if( c==
7820: 27 34 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70  '4' ) return pOp
7830: 2d 3e 70 34 2e 69 3b 0a 20 20 72 65 74 75 72 6e  ->p4.i;.  return
7840: 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a   pOp->p5;.}../*.
7850: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
7860: 69 6e 67 20 66 6f 72 20 74 68 65 20 22 63 6f 6d  ing for the "com
7870: 6d 65 6e 74 22 20 66 69 65 6c 64 20 6f 66 20 61  ment" field of a
7880: 20 56 44 42 45 20 6f 70 63 6f 64 65 20 6c 69 73   VDBE opcode lis
7890: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ting..**.** The 
78a0: 53 79 6e 6f 70 73 69 73 3a 20 66 69 65 6c 64 20  Synopsis: field 
78b0: 69 6e 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74  in comments in t
78c0: 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65  he vdbe.c source
78d0: 20 66 69 6c 65 20 67 65 74 73 20 63 6f 6e 76 65   file gets conve
78e0: 72 74 65 64 0a 2a 2a 20 74 6f 20 61 6e 20 65 78  rted.** to an ex
78f0: 74 72 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  tra string that 
7900: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
7910: 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  he sqlite3Opcode
7920: 4e 61 6d 65 28 29 2e 20 20 49 6e 20 74 68 65 0a  Name().  In the.
7930: 2a 2a 20 61 62 73 65 6e 63 65 20 6f 66 20 6f 74  ** absence of ot
7940: 68 65 72 20 63 6f 6d 6d 65 6e 74 73 2c 20 74 68  her comments, th
7950: 69 73 20 73 79 6e 6f 70 73 69 73 20 62 65 63 6f  is synopsis beco
7960: 6d 65 73 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  mes the comment 
7970: 6f 6e 20 74 68 65 20 6f 70 63 6f 64 65 2e 0a 2a  on the opcode..*
7980: 2a 20 53 6f 6d 65 20 74 72 61 6e 73 6c 61 74 69  * Some translati
7990: 6f 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a 0a 2a 2a  on occurs:.**.**
79a0: 20 20 20 20 20 20 20 22 50 58 22 20 20 20 20 20         "PX"     
79b0: 20 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a 2a 20 20   ->  "r[X]".**  
79c0: 20 20 20 20 20 22 50 58 40 50 59 22 20 20 20 2d       "PX@PY"   -
79d0: 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 2d 31 5d 22  >  "r[X..X+Y-1]"
79e0: 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79    or "r[x]" if y
79f0: 20 69 73 20 30 20 6f 72 20 31 0a 2a 2a 20 20 20   is 0 or 1.**   
7a00: 20 20 20 20 22 50 58 40 50 59 2b 31 22 20 2d 3e      "PX@PY+1" ->
7a10: 20 20 22 72 5b 58 2e 2e 58 2b 59 5d 22 20 20 20    "r[X..X+Y]"   
7a20: 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 20   or "r[x]" if y 
7a30: 69 73 20 30 0a 2a 2a 20 20 20 20 20 20 20 22 50  is 0.**       "P
7a40: 59 2e 2e 50 59 22 20 20 2d 3e 20 20 22 72 5b 58  Y..PY"  ->  "r[X
7a50: 2e 2e 59 5d 22 20 20 20 20 20 20 6f 72 20 22 72  ..Y]"      or "r
7a60: 5b 78 5d 22 20 69 66 20 79 3c 3d 78 0a 2a 2f 0a  [x]" if y<=x.*/.
7a70: 73 74 61 74 69 63 20 69 6e 74 20 64 69 73 70 6c  static int displ
7a80: 61 79 43 6f 6d 6d 65 6e 74 28 0a 20 20 63 6f 6e  ayComment(.  con
7a90: 73 74 20 4f 70 20 2a 70 4f 70 2c 20 20 20 20 20  st Op *pOp,     
7aa0: 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 74 6f  /* The opcode to
7ab0: 20 62 65 20 63 6f 6d 6d 65 6e 74 65 64 20 2a 2f   be commented */
7ac0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7ad0: 50 34 2c 20 20 20 2f 2a 20 50 72 65 76 69 6f 75  P4,   /* Previou
7ae0: 73 6c 79 20 6f 62 74 61 69 6e 65 64 20 76 61 6c  sly obtained val
7af0: 75 65 20 66 6f 72 20 50 34 20 2a 2f 0a 20 20 63  ue for P4 */.  c
7b00: 68 61 72 20 2a 7a 54 65 6d 70 2c 20 20 20 20 20  har *zTemp,     
7b10: 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c    /* Write resul
7b20: 74 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  t here */.  int 
7b30: 6e 54 65 6d 70 20 20 20 20 20 20 20 20 20 20 2f  nTemp          /
7b40: 2a 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c  * Space availabl
7b50: 65 20 69 6e 20 7a 54 65 6d 70 5b 5d 20 2a 2f 0a  e in zTemp[] */.
7b60: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
7b70: 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73  *zOpName;.  cons
7b80: 74 20 63 68 61 72 20 2a 7a 53 79 6e 6f 70 73 69  t char *zSynopsi
7b90: 73 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e 61 6d 65  s;.  int nOpName
7ba0: 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a  ;.  int ii, jj;.
7bb0: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69    zOpName = sqli
7bc0: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
7bd0: 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20 20 6e 4f  p->opcode);.  nO
7be0: 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  pName = sqlite3S
7bf0: 74 72 6c 65 6e 33 30 28 7a 4f 70 4e 61 6d 65 29  trlen30(zOpName)
7c00: 3b 0a 20 20 69 66 28 20 7a 4f 70 4e 61 6d 65 5b  ;.  if( zOpName[
7c10: 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29 7b 0a 20 20  nOpName+1] ){.  
7c20: 20 20 69 6e 74 20 73 65 65 6e 43 6f 6d 20 3d 20    int seenCom = 
7c30: 30 3b 0a 20 20 20 20 63 68 61 72 20 63 3b 0a 20  0;.    char c;. 
7c40: 20 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a     zSynopsis = z
7c50: 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f 70 4e 61 6d  OpName += nOpNam
7c60: 65 20 2b 20 31 3b 0a 20 20 20 20 66 6f 72 28 69  e + 1;.    for(i
7c70: 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65 6d 70  i=jj=0; jj<nTemp
7c80: 2d 31 20 26 26 20 28 63 20 3d 20 7a 53 79 6e 6f  -1 && (c = zSyno
7c90: 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b 20 69 69  psis[ii])!=0; ii
7ca0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63  ++){.      if( c
7cb0: 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20 20 20 20  =='P' ){.       
7cc0: 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 2b   c = zSynopsis[+
7cd0: 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  +ii];.        if
7ce0: 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20 20 20 20  ( c=='4' ){.    
7cf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
7d00: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
7d10: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c   zTemp+jj, "%s",
7d20: 20 7a 50 34 29 3b 0a 20 20 20 20 20 20 20 20 7d   zP4);.        }
7d30: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 58 27 20  else if( c=='X' 
7d40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
7d50: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7d60: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
7d70: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f  , "%s", pOp->zCo
7d80: 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  mment);.        
7d90: 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31 3b 0a 20    seenCom = 1;. 
7da0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
7db0: 20 20 20 20 20 20 20 20 69 6e 74 20 76 31 20 3d          int v1 =
7dc0: 20 74 72 61 6e 73 6c 61 74 65 50 28 63 2c 20 70   translateP(c, p
7dd0: 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Op);.          i
7de0: 6e 74 20 76 32 3b 0a 20 20 20 20 20 20 20 20 20  nt v2;.         
7df0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
7e00: 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d  f(nTemp-jj, zTem
7e10: 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76 31 29 3b  p+jj, "%d", v1);
7e20: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
7e30: 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73  trncmp(zSynopsis
7e40: 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20 32 29 3d  +ii+1, "@P", 2)=
7e50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
7e60: 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20 20 20 20    ii += 3;.     
7e70: 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c         jj += sql
7e80: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
7e90: 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 20 20  mp+jj);.        
7ea0: 20 20 20 20 76 32 20 3d 20 74 72 61 6e 73 6c 61      v2 = transla
7eb0: 74 65 50 28 7a 53 79 6e 6f 70 73 69 73 5b 69 69  teP(zSynopsis[ii
7ec0: 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20  ], pOp);.       
7ed0: 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
7ee0: 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c  (zSynopsis+ii+1,
7ef0: 22 2b 31 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20  "+1",2)==0 ){.  
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b              ii +
7f10: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 2;.           
7f20: 20 20 20 76 32 2b 2b 3b 0a 20 20 20 20 20 20 20     v2++;.       
7f30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7f40: 20 20 20 69 66 28 20 76 32 3e 31 20 29 7b 0a 20     if( v2>1 ){. 
7f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
7f60: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7f70: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
7f80: 2c 20 22 2e 2e 25 64 22 2c 20 76 31 2b 76 32 2d  , "..%d", v1+v2-
7f90: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
7fa0: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
7fb0: 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53  e if( strncmp(zS
7fc0: 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 2e  ynopsis+ii+1, ".
7fd0: 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26 26 20 70  .P3", 4)==0 && p
7fe0: 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20 20 20  Op->p3==0 ){.   
7ff0: 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 34           ii += 4
8000: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
8010: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8020: 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  jj += sqlite3Str
8030: 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b  len30(zTemp+jj);
8040: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8050: 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a 6a 2b 2b        zTemp[jj++
8060: 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = c;.      }. 
8070: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65     }.    if( !se
8080: 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54 65 6d  enCom && jj<nTem
8090: 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43 6f 6d  p-5 && pOp->zCom
80a0: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ment ){.      sq
80b0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
80c0: 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a  Temp-jj, zTemp+j
80d0: 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70 2d 3e  j, "; %s", pOp->
80e0: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20  zComment);.     
80f0: 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74   jj += sqlite3St
8100: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29  rlen30(zTemp+jj)
8110: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
8120: 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65 6d 70  jj<nTemp ) zTemp
8130: 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  [jj] = 0;.  }els
8140: 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  e if( pOp->zComm
8150: 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ent ){.    sqlit
8160: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
8170: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22 2c 20  p, zTemp, "%s", 
8180: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a  pOp->zComment);.
8190: 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74 65 33      jj = sqlite3
81a0: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b  Strlen30(zTemp);
81b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 54  .  }else{.    zT
81c0: 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[0] = 0;.    
81d0: 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  jj = 0;.  }.  re
81e0: 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e 64 69  turn jj;.}.#endi
81f0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
8200: 47 20 2a 2f 0a 0a 23 69 66 20 56 44 42 45 5f 44  G */..#if VDBE_D
8210: 49 53 50 4c 41 59 5f 50 34 20 26 26 20 64 65 66  ISPLAY_P4 && def
8220: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
8230: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 29  LE_CURSOR_HINTS)
8240: 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65  ./*.** Translate
8250: 20 74 68 65 20 50 34 2e 70 45 78 70 72 20 76 61   the P4.pExpr va
8260: 6c 75 65 20 66 6f 72 20 61 6e 20 4f 50 5f 43 75  lue for an OP_Cu
8270: 72 73 6f 72 48 69 6e 74 20 6f 70 63 6f 64 65 20  rsorHint opcode 
8280: 69 6e 74 6f 20 74 65 78 74 0a 2a 2a 20 74 68 61  into text.** tha
8290: 74 20 63 61 6e 20 62 65 20 64 69 73 70 6c 61 79  t can be display
82a0: 65 64 20 69 6e 20 74 68 65 20 50 34 20 63 6f 6c  ed in the P4 col
82b0: 75 6d 6e 20 6f 66 20 45 58 50 4c 41 49 4e 20 6f  umn of EXPLAIN o
82c0: 75 74 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  utput..*/.static
82d0: 20 76 6f 69 64 20 64 69 73 70 6c 61 79 50 34 45   void displayP4E
82e0: 78 70 72 28 53 74 72 41 63 63 75 6d 20 2a 70 2c  xpr(StrAccum *p,
82f0: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
8300: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
8310: 20 3d 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20   = 0;.  switch( 
8320: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
8330: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
8340: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50  .      sqlite3XP
8350: 72 69 6e 74 66 28 70 2c 20 22 25 51 22 2c 20 70  rintf(p, "%Q", p
8360: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
8370: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8380: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
8390: 52 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  R:.      sqlite3
83a0: 58 50 72 69 6e 74 66 28 70 2c 20 22 25 64 22 2c  XPrintf(p, "%d",
83b0: 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65   pExpr->u.iValue
83c0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
83d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c      case TK_NULL
83e0: 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58  :.      sqlite3X
83f0: 50 72 69 6e 74 66 28 70 2c 20 22 4e 55 4c 4c 22  Printf(p, "NULL"
8400: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
8410: 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49      case TK_REGI
8420: 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71  STER: {.      sq
8430: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20  lite3XPrintf(p, 
8440: 22 72 5b 25 64 5d 22 2c 20 70 45 78 70 72 2d 3e  "r[%d]", pExpr->
8450: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62  iTable);.      b
8460: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
8470: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
8480: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
8490: 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  r->iColumn<0 ){.
84a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58          sqlite3X
84b0: 50 72 69 6e 74 66 28 70 2c 20 22 72 6f 77 69 64  Printf(p, "rowid
84c0: 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ");.      }else{
84d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
84e0: 58 50 72 69 6e 74 66 28 70 2c 20 22 63 25 64 22  XPrintf(p, "c%d"
84f0: 2c 20 28 69 6e 74 29 70 45 78 70 72 2d 3e 69 43  , (int)pExpr->iC
8500: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  olumn);.      }.
8510: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8520: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
8530: 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c  T:      zOp = "L
8540: 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  T";      break;.
8550: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20      case TK_LE: 
8560: 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c 45 22 3b       zOp = "LE";
8570: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8580: 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20   case TK_GT:    
8590: 20 20 7a 4f 70 20 3d 20 22 47 54 22 3b 20 20 20    zOp = "GT";   
85a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
85b0: 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 7a  se TK_GE:      z
85c0: 4f 70 20 3d 20 22 47 45 22 3b 20 20 20 20 20 20  Op = "GE";      
85d0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
85e0: 54 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 4f 70 20  TK_NE:      zOp 
85f0: 3d 20 22 4e 45 22 3b 20 20 20 20 20 20 62 72 65  = "NE";      bre
8600: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8610: 45 51 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22  EQ:      zOp = "
8620: 45 51 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  EQ";      break;
8630: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a  .    case TK_IS:
8640: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 49 53 22        zOp = "IS"
8650: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
8660: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
8670: 20 20 20 7a 4f 70 20 3d 20 22 49 53 4e 4f 54 22     zOp = "ISNOT"
8680: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
8690: 61 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20  ase TK_AND:     
86a0: 7a 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20 20 20  zOp = "AND";    
86b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
86c0: 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a 4f 70   TK_OR:      zOp
86d0: 20 3d 20 22 4f 52 22 3b 20 20 20 20 20 20 62 72   = "OR";      br
86e0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
86f0: 5f 50 4c 55 53 3a 20 20 20 20 7a 4f 70 20 3d 20  _PLUS:    zOp = 
8700: 22 41 44 44 22 3b 20 20 20 20 20 62 72 65 61 6b  "ADD";     break
8710: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  ;.    case TK_ST
8720: 41 52 3a 20 20 20 20 7a 4f 70 20 3d 20 22 4d 55  AR:    zOp = "MU
8730: 4c 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  L";     break;. 
8740: 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53     case TK_MINUS
8750: 3a 20 20 20 7a 4f 70 20 3d 20 22 53 55 42 22 3b  :   zOp = "SUB";
8760: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8770: 63 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20  case TK_REM:    
8780: 20 7a 4f 70 20 3d 20 22 52 45 4d 22 3b 20 20 20   zOp = "REM";   
8790: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
87a0: 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20 7a 4f  e TK_BITAND:  zO
87b0: 70 20 3d 20 22 42 49 54 41 4e 44 22 3b 20 20 62  p = "BITAND";  b
87c0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
87d0: 4b 5f 42 49 54 4f 52 3a 20 20 20 7a 4f 70 20 3d  K_BITOR:   zOp =
87e0: 20 22 42 49 54 4f 52 22 3b 20 20 20 62 72 65 61   "BITOR";   brea
87f0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  k;.    case TK_S
8800: 4c 41 53 48 3a 20 20 20 7a 4f 70 20 3d 20 22 44  LASH:   zOp = "D
8810: 49 56 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  IV";     break;.
8820: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49      case TK_LSHI
8830: 46 54 3a 20 20 7a 4f 70 20 3d 20 22 4c 53 48 49  FT:  zOp = "LSHI
8840: 46 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  FT";  break;.   
8850: 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a   case TK_RSHIFT:
8860: 20 20 7a 4f 70 20 3d 20 22 52 53 48 49 46 54 22    zOp = "RSHIFT"
8870: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
8880: 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a  se TK_CONCAT:  z
8890: 4f 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b 20 20  Op = "CONCAT";  
88a0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
88b0: 54 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 4f 70 20  TK_UMINUS:  zOp 
88c0: 3d 20 22 4d 49 4e 55 53 22 3b 20 20 20 62 72 65  = "MINUS";   bre
88d0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
88e0: 55 50 4c 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22  UPLUS:   zOp = "
88f0: 50 4c 55 53 22 3b 20 20 20 20 62 72 65 61 6b 3b  PLUS";    break;
8900: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
8910: 4e 4f 54 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54  NOT:  zOp = "BIT
8920: 4e 4f 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  NOT";  break;.  
8930: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20    case TK_NOT:  
8940: 20 20 20 7a 4f 70 20 3d 20 22 4e 4f 54 22 3b 20     zOp = "NOT"; 
8950: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
8960: 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20  ase TK_ISNULL:  
8970: 7a 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22 3b 20  zOp = "ISNULL"; 
8980: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8990: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4f 70   TK_NOTNULL: zOp
89a0: 20 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20 62 72   = "NOTNULL"; br
89b0: 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c  eak;..    defaul
89c0: 74 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t:.      sqlite3
89d0: 58 50 72 69 6e 74 66 28 70 2c 20 22 25 73 22 2c  XPrintf(p, "%s",
89e0: 20 22 65 78 70 72 22 29 3b 0a 20 20 20 20 20 20   "expr");.      
89f0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66  break;.  }..  if
8a00: 28 20 7a 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c  ( zOp ){.    sql
8a10: 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22  ite3XPrintf(p, "
8a20: 25 73 28 22 2c 20 7a 4f 70 29 3b 0a 20 20 20 20  %s(", zOp);.    
8a30: 64 69 73 70 6c 61 79 50 34 45 78 70 72 28 70 2c  displayP4Expr(p,
8a40: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
8a50: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
8a60: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73  Right ){.      s
8a70: 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
8a80: 70 65 6e 64 28 70 2c 20 22 2c 22 2c 20 31 29 3b  pend(p, ",", 1);
8a90: 0a 20 20 20 20 20 20 64 69 73 70 6c 61 79 50 34  .      displayP4
8aa0: 45 78 70 72 28 70 2c 20 70 45 78 70 72 2d 3e 70  Expr(p, pExpr->p
8ab0: 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20  Right);.    }.  
8ac0: 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
8ad0: 6d 41 70 70 65 6e 64 28 70 2c 20 22 29 22 2c 20  mAppend(p, ")", 
8ae0: 31 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  1);.  }.}.#endif
8af0: 20 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c 41 59   /* VDBE_DISPLAY
8b00: 5f 50 34 20 26 26 20 64 65 66 69 6e 65 64 28 53  _P4 && defined(S
8b10: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
8b20: 53 4f 52 5f 48 49 4e 54 53 29 20 2a 2f 0a 0a 0a  SOR_HINTS) */...
8b30: 23 69 66 20 56 44 42 45 5f 44 49 53 50 4c 41 59  #if VDBE_DISPLAY
8b40: 5f 50 34 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  _P4./*.** Comput
8b50: 65 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  e a string that 
8b60: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 50 34  describes the P4
8b70: 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
8b80: 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65  n opcode..** Use
8b90: 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72   zTemp for any r
8ba0: 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72  equired temporar
8bb0: 79 20 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a  y buffer space..
8bc0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
8bd0: 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f  displayP4(Op *pO
8be0: 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20  p, char *zTemp, 
8bf0: 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68  int nTemp){.  ch
8c00: 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b  ar *zP4 = zTemp;
8c10: 0a 20 20 53 74 72 41 63 63 75 6d 20 78 3b 0a 20  .  StrAccum x;. 
8c20: 20 61 73 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d   assert( nTemp>=
8c30: 32 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  20 );.  sqlite3S
8c40: 74 72 41 63 63 75 6d 49 6e 69 74 28 26 78 2c 20  trAccumInit(&x, 
8c50: 30 2c 20 7a 54 65 6d 70 2c 20 6e 54 65 6d 70 2c  0, zTemp, nTemp,
8c60: 20 30 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70   0);.  switch( p
8c70: 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20  Op->p4type ){.  
8c80: 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46    case P4_KEYINF
8c90: 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a  O: {.      int j
8ca0: 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  ;.      KeyInfo 
8cb0: 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d  *pKeyInfo = pOp-
8cc0: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  >p4.pKeyInfo;.  
8cd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79      assert( pKey
8ce0: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
8cf0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  !=0 );.      sql
8d00: 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20  ite3XPrintf(&x, 
8d10: 22 6b 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f  "k(%d", pKeyInfo
8d20: 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20  ->nField);.     
8d30: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79   for(j=0; j<pKey
8d40: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b  Info->nField; j+
8d50: 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c  +){.        Coll
8d60: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65  Seq *pColl = pKe
8d70: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b  yInfo->aColl[j];
8d80: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
8d90: 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f  har *zColl = pCo
8da0: 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ll ? pColl->zNam
8db0: 65 20 3a 20 22 22 3b 0a 20 20 20 20 20 20 20 20  e : "";.        
8dc0: 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6f 6c 6c  if( strcmp(zColl
8dd0: 2c 20 22 42 49 4e 41 52 59 22 29 3d 3d 30 20 29  , "BINARY")==0 )
8de0: 20 7a 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20 20   zColl = "B";.  
8df0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
8e00: 69 6e 74 66 28 26 78 2c 20 22 2c 25 73 25 73 22  intf(&x, ",%s%s"
8e10: 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  , pKeyInfo->aSor
8e20: 74 4f 72 64 65 72 5b 6a 5d 20 3f 20 22 2d 22 20  tOrder[j] ? "-" 
8e30: 3a 20 22 22 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  : "", zColl);.  
8e40: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
8e50: 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
8e60: 64 28 26 78 2c 20 22 29 22 2c 20 31 29 3b 0a 20  d(&x, ")", 1);. 
8e70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8e80: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
8e90: 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49  ENABLE_CURSOR_HI
8ea0: 4e 54 53 0a 20 20 20 20 63 61 73 65 20 50 34 5f  NTS.    case P4_
8eb0: 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 64 69  EXPR: {.      di
8ec0: 73 70 6c 61 79 50 34 45 78 70 72 28 26 78 2c 20  splayP4Expr(&x, 
8ed0: 70 4f 70 2d 3e 70 34 2e 70 45 78 70 72 29 3b 0a  pOp->p4.pExpr);.
8ee0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8ef0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
8f00: 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b  se P4_COLLSEQ: {
8f10: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
8f20: 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e  pColl = pOp->p4.
8f30: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c  pColl;.      sql
8f40: 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20  ite3XPrintf(&x, 
8f50: 22 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c  "(%.20s)", pColl
8f60: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
8f70: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
8f80: 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46   case P4_FUNCDEF
8f90: 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65  : {.      FuncDe
8fa0: 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70  f *pDef = pOp->p
8fb0: 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73  4.pFunc;.      s
8fc0: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78  qlite3XPrintf(&x
8fd0: 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44 65 66  , "%s(%d)", pDef
8fe0: 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e  ->zName, pDef->n
8ff0: 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Arg);.      brea
9000: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  k;.    }.#ifdef 
9010: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
9020: 20 63 61 73 65 20 50 34 5f 46 55 4e 43 43 54 58   case P4_FUNCCTX
9030: 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65  : {.      FuncDe
9040: 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70  f *pDef = pOp->p
9050: 34 2e 70 43 74 78 2d 3e 70 46 75 6e 63 3b 0a 20  4.pCtx->pFunc;. 
9060: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
9070: 6e 74 66 28 26 78 2c 20 22 25 73 28 25 64 29 22  ntf(&x, "%s(%d)"
9080: 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70  , pDef->zName, p
9090: 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20  Def->nArg);.    
90a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
90b0: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50  endif.    case P
90c0: 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20  4_INT64: {.     
90d0: 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
90e0: 26 78 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70  &x, "%lld", *pOp
90f0: 2d 3e 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20  ->p4.pI64);.    
9100: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
9110: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32     case P4_INT32
9120: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
9130: 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25 64  3XPrintf(&x, "%d
9140: 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20  ", pOp->p4.i);. 
9150: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9160: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52 45  }.    case P4_RE
9170: 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AL: {.      sqli
9180: 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22  te3XPrintf(&x, "
9190: 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34  %.16g", *pOp->p4
91a0: 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62  .pReal);.      b
91b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
91c0: 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20  case P4_MEM: {. 
91d0: 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d       Mem *pMem =
91e0: 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20   pOp->p4.pMem;. 
91f0: 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66       if( pMem->f
9200: 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
9210: 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  {.        zP4 = 
9220: 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d  pMem->z;.      }
9230: 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66  else if( pMem->f
9240: 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
9250: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9260: 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25 6c  3XPrintf(&x, "%l
9270: 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b  ld", pMem->u.i);
9280: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
9290: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
92a0: 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20  EM_Real ){.     
92b0: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
92c0: 66 28 26 78 2c 20 22 25 2e 31 36 67 22 2c 20 70  f(&x, "%.16g", p
92d0: 4d 65 6d 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20  Mem->u.r);.     
92e0: 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d   }else if( pMem-
92f0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
9300: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34  l ){.        zP4
9310: 20 3d 20 22 4e 55 4c 4c 22 3b 0a 20 20 20 20 20   = "NULL";.     
9320: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9330: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c  assert( pMem->fl
9340: 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
9350: 3b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  ;.        zP4 = 
9360: 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20  "(blob)";.      
9370: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
9380: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
9390: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
93a0: 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50  TABLE.    case P
93b0: 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20  4_VTAB: {.      
93c0: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
93d0: 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56  tab = pOp->p4.pV
93e0: 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20  tab->pVtab;.    
93f0: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
9400: 28 26 78 2c 20 22 76 74 61 62 3a 25 70 22 2c 20  (&x, "vtab:%p", 
9410: 70 56 74 61 62 29 3b 0a 20 20 20 20 20 20 62 72  pVtab);.      br
9420: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
9430: 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e  f.    case P4_IN
9440: 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20  TARRAY: {.      
9450: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74  int i;.      int
9460: 20 2a 61 69 20 3d 20 70 4f 70 2d 3e 70 34 2e 61   *ai = pOp->p4.a
9470: 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  i;.      int n =
9480: 20 61 69 5b 30 5d 3b 20 20 20 2f 2a 20 54 68 65   ai[0];   /* The
9490: 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f   first element o
94a0: 66 20 61 6e 20 49 4e 54 41 52 52 41 59 20 69 73  f an INTARRAY is
94b0: 20 61 6c 77 61 79 73 20 74 68 65 0a 20 20 20 20   always the.    
94c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94d0: 20 20 20 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74     ** count of t
94e0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
94f0: 6d 65 6e 74 73 20 74 6f 20 66 6f 6c 6c 6f 77 20  ments to follow 
9500: 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31  */.      for(i=1
9510: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
9520: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
9530: 6e 74 66 28 26 78 2c 20 22 2c 25 64 22 2c 20 61  ntf(&x, ",%d", a
9540: 69 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  i[i]);.      }. 
9550: 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20       zTemp[0] = 
9560: 27 5b 27 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  '[';.      sqlit
9570: 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
9580: 28 26 78 2c 20 22 5d 22 2c 20 31 29 3b 0a 20 20  (&x, "]", 1);.  
9590: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
95a0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53 55 42  .    case P4_SUB
95b0: 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20  PROGRAM: {.     
95c0: 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
95d0: 26 78 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a  &x, "program");.
95e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
95f0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 41   }.    case P4_A
9600: 44 56 41 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20  DVANCE: {.      
9610: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20  zTemp[0] = 0;.  
9620: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9630: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
9640: 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d        zP4 = pOp-
9650: 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28  >p4.z;.      if(
9660: 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20   zP4==0 ){.     
9670: 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a     zP4 = zTemp;.
9680: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d          zTemp[0]
9690: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
96a0: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
96b0: 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28  3StrAccumFinish(
96c0: 26 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  &x);.  assert( z
96d0: 50 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  P4!=0 );.  retur
96e0: 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 20  n zP4;.}.#endif 
96f0: 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f  /* VDBE_DISPLAY_
9700: 50 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  P4 */../*.** Dec
9710: 6c 61 72 65 20 74 6f 20 74 68 65 20 56 64 62 65  lare to the Vdbe
9720: 20 74 68 61 74 20 74 68 65 20 42 54 72 65 65 20   that the BTree 
9730: 6f 62 6a 65 63 74 20 61 74 20 64 62 2d 3e 61 44  object at db->aD
9740: 62 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a  b[i] is used..**
9750: 0a 2a 2a 20 54 68 65 20 70 72 65 70 61 72 65 64  .** The prepared
9760: 20 73 74 61 74 65 6d 65 6e 74 73 20 6e 65 65 64   statements need
9770: 20 74 6f 20 6b 6e 6f 77 20 69 6e 20 61 64 76 61   to know in adva
9780: 6e 63 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  nce the complete
9790: 20 73 65 74 20 6f 66 0a 2a 2a 20 61 74 74 61 63   set of.** attac
97a0: 68 65 64 20 64 61 74 61 62 61 73 65 73 20 74 68  hed databases th
97b0: 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 2e 20  at will be use. 
97c0: 20 41 20 6d 61 73 6b 20 6f 66 20 74 68 65 73 65   A mask of these
97d0: 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 69 73   databases.** is
97e0: 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 6e 20 70   maintained in p
97f0: 2d 3e 62 74 72 65 65 4d 61 73 6b 2e 20 20 54 68  ->btreeMask.  Th
9800: 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 76 61  e p->lockMask va
9810: 6c 75 65 20 69 73 20 74 68 65 20 73 75 62 73 65  lue is the subse
9820: 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62 74 72 65 65  t of.** p->btree
9830: 4d 61 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65  Mask of database
9840: 73 20 74 68 61 74 20 77 69 6c 6c 20 72 65 71 75  s that will requ
9850: 69 72 65 20 61 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76  ire a lock..*/.v
9860: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 55  oid sqlite3VdbeU
9870: 73 65 73 42 74 72 65 65 28 56 64 62 65 20 2a 70  sesBtree(Vdbe *p
9880: 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61 73 73 65  , int i){.  asse
9890: 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d  rt( i>=0 && i<p-
98a0: 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69 3c 28 69  >db->nDb && i<(i
98b0: 6e 74 29 73 69 7a 65 6f 66 28 79 44 62 4d 61 73  nt)sizeof(yDbMas
98c0: 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73 65 72 74  k)*8 );.  assert
98d0: 28 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28  ( i<(int)sizeof(
98e0: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38 20  p->btreeMask)*8 
98f0: 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74 28 70  );.  DbMaskSet(p
9900: 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 69 29 3b  ->btreeMask, i);
9910: 0a 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 73  .  if( i!=1 && s
9920: 71 6c 69 74 65 33 42 74 72 65 65 53 68 61 72 61  qlite3BtreeShara
9930: 62 6c 65 28 70 2d 3e 64 62 2d 3e 61 44 62 5b 69  ble(p->db->aDb[i
9940: 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20 20 44 62  ].pBt) ){.    Db
9950: 4d 61 73 6b 53 65 74 28 70 2d 3e 6c 6f 63 6b 4d  MaskSet(p->lockM
9960: 61 73 6b 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a  ask, i);.  }.}..
9970: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
9980: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
9990: 43 41 43 48 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20  CACHE)./*.** If 
99a0: 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c  SQLite is compil
99b0: 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 73 68  ed to support sh
99c0: 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20  ared-cache mode 
99d0: 61 6e 64 20 74 6f 20 62 65 20 74 68 72 65 61 64  and to be thread
99e0: 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f  safe,.** this ro
99f0: 75 74 69 6e 65 20 6f 62 74 61 69 6e 73 20 74 68  utine obtains th
9a00: 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74  e mutex associat
9a10: 65 64 20 77 69 74 68 20 65 61 63 68 20 42 74 53  ed with each BtS
9a20: 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 0a  hared structure.
9a30: 2a 2a 20 74 68 61 74 20 6d 61 79 20 62 65 20 61  ** that may be a
9a40: 63 63 65 73 73 65 64 20 62 79 20 74 68 65 20 56  ccessed by the V
9a50: 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  M passed as an a
9a60: 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 6e  rgument. In doin
9a70: 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a 20  g so it also.** 
9a80: 73 65 74 73 20 74 68 65 20 42 74 53 68 61 72 65  sets the BtShare
9a90: 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66 20 65  d.db member of e
9aa0: 61 63 68 20 6f 66 20 74 68 65 20 42 74 53 68 61  ach of the BtSha
9ab0: 72 65 64 20 73 74 72 75 63 74 75 72 65 73 2c 20  red structures, 
9ac0: 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74  ensuring.** that
9ad0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 75 73   the correct bus
9ae0: 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  y-handler callba
9af0: 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 66  ck is invoked if
9b00: 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a   required..**.**
9b10: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f   If SQLite is no
9b20: 74 20 74 68 72 65 61 64 73 61 66 65 20 62 75 74  t threadsafe but
9b30: 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20 73 68   does support sh
9b40: 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c  ared-cache mode,
9b50: 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33   then.** sqlite3
9b60: 42 74 72 65 65 45 6e 74 65 72 28 29 20 69 73 20  BtreeEnter() is 
9b70: 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 74  invoked to set t
9b80: 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 76  he BtShared.db v
9b90: 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 61  ariables.** of a
9ba0: 6c 6c 20 6f 66 20 42 74 53 68 61 72 65 64 20 73  ll of BtShared s
9bb0: 74 72 75 63 74 75 72 65 73 20 61 63 63 65 73 73  tructures access
9bc0: 69 62 6c 65 20 76 69 61 20 74 68 65 20 64 61 74  ible via the dat
9bd0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a  abase handle .**
9be0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
9bf0: 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49   the VM..**.** I
9c00: 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20  f SQLite is not 
9c10: 74 68 72 65 61 64 73 61 66 65 20 61 6e 64 20 64  threadsafe and d
9c20: 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
9c30: 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
9c40: 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  e, this.** funct
9c50: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
9c60: 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e 62 74 72  **.** The p->btr
9c70: 65 65 4d 61 73 6b 20 66 69 65 6c 64 20 69 73 20  eeMask field is 
9c80: 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c  a bitmask of all
9c90: 20 62 74 72 65 65 73 20 74 68 61 74 20 74 68 65   btrees that the
9ca0: 20 70 72 65 70 61 72 65 64 20 0a 2a 2a 20 73 74   prepared .** st
9cb0: 61 74 65 6d 65 6e 74 20 70 20 77 69 6c 6c 20 65  atement p will e
9cc0: 76 65 72 20 75 73 65 2e 20 20 4c 65 74 20 4e 20  ver use.  Let N 
9cd0: 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  be the number of
9ce0: 20 62 69 74 73 20 69 6e 20 70 2d 3e 62 74 72 65   bits in p->btre
9cf0: 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70  eMask.** corresp
9d00: 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72 65 65 73  onding to btrees
9d10: 20 74 68 61 74 20 75 73 65 20 73 68 61 72 65 64   that use shared
9d20: 20 63 61 63 68 65 2e 20 20 54 68 65 6e 20 74 68   cache.  Then th
9d30: 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20  e runtime of.** 
9d40: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
9d50: 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20 4e 20 69  N*N.  But as N i
9d60: 73 20 72 61 72 65 6c 79 20 6d 6f 72 65 20 74 68  s rarely more th
9d70: 61 6e 20 31 2c 20 74 68 69 73 20 73 68 6f 75 6c  an 1, this shoul
9d80: 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 20 70 72  d not.** be a pr
9d90: 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  oblem..*/.void s
9da0: 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28  qlite3VdbeEnter(
9db0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
9dc0: 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  i;.  sqlite3 *db
9dd0: 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69  ;.  Db *aDb;.  i
9de0: 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 44 62  nt nDb;.  if( Db
9df0: 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c  MaskAllZero(p->l
9e00: 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72  ockMask) ) retur
9e10: 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f  n;  /* The commo
9e20: 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d  n case */.  db =
9e30: 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20   p->db;.  aDb = 
9e40: 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d  db->aDb;.  nDb =
9e50: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28   db->nDb;.  for(
9e60: 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29  i=0; i<nDb; i++)
9e70: 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20 26  {.    if( i!=1 &
9e80: 26 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e  & DbMaskTest(p->
9e90: 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41  lockMask,i) && A
9ea0: 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74  LWAYS(aDb[i].pBt
9eb0: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71  !=0) ){.      sq
9ec0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
9ed0: 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[i].pBt);.   
9ee0: 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
9ef0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
9f00: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
9f10: 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c 49 54  _CACHE) && SQLIT
9f20: 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a 2f  E_THREADSAFE>0./
9f30: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20  *.** Unlock all 
9f40: 6f 66 20 74 68 65 20 62 74 72 65 65 73 20 70 72  of the btrees pr
9f50: 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b 65 64 20  eviously locked 
9f60: 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  by a call to sql
9f70: 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 29 2e  ite3VdbeEnter().
9f80: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
9f90: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20  E_NOINLINE void 
9fa0: 76 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 6e 74 20 69 3b 0a 20 20 73  p){.  int i;.  s
9fc0: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62  qlite3 *db;.  Db
9fd0: 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62   *aDb;.  int nDb
9fe0: 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
9ff0: 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b    aDb = db->aDb;
a000: 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62  .  nDb = db->nDb
a010: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
a020: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Db; i++){.    if
a030: 28 20 69 21 3d 31 20 26 26 20 44 62 4d 61 73 6b  ( i!=1 && DbMask
a040: 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  Test(p->lockMask
a050: 2c 69 29 20 26 26 20 41 4c 57 41 59 53 28 61 44  ,i) && ALWAYS(aD
a060: 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a  b[i].pBt!=0) ){.
a070: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
a080: 65 65 4c 65 61 76 65 28 61 44 62 5b 69 5d 2e 70  eeLeave(aDb[i].p
a090: 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  Bt);.    }.  }.}
a0a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
a0b0: 65 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b  eLeave(Vdbe *p){
a0c0: 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c  .  if( DbMaskAll
a0d0: 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  Zero(p->lockMask
a0e0: 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  ) ) return;  /* 
a0f0: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
a100: 2a 2f 0a 20 20 76 64 62 65 4c 65 61 76 65 28 70  */.  vdbeLeave(p
a110: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
a120: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
a130: 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65  OFILE) || define
a140: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
a150: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69  /*.** Print a si
a160: 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68  ngle opcode.  Th
a170: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
a180: 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ed for debugging
a190: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73   only..*/.void s
a1a0: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
a1b0: 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e  p(FILE *pOut, in
a1c0: 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a  t pc, Op *pOp){.
a1d0: 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63    char *zP4;.  c
a1e0: 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20  har zPtr[50];.  
a1f0: 63 68 61 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a  char zCom[100];.
a200: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
a210: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20  har *zFormat1 = 
a220: 22 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25  "%4d %-13s %4d %
a230: 34 64 20 25 34 64 20 25 2d 31 33 73 20 25 2e 32  4d %4d %-13s %.2
a240: 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70  X %s\n";.  if( p
a250: 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20  Out==0 ) pOut = 
a260: 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20  stdout;.  zP4 = 
a270: 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a  displayP4(pOp, z
a280: 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72  Ptr, sizeof(zPtr
a290: 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
a2a0: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
a2b0: 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 64 69 73 70  _COMMENTS.  disp
a2c0: 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20  layComment(pOp, 
a2d0: 7a 50 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f  zP4, zCom, sizeo
a2e0: 66 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a  f(zCom));.#else.
a2f0: 20 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23    zCom[0] = 0;.#
a300: 65 6e 64 69 66 0a 20 20 2f 2a 20 4e 42 3a 20 20  endif.  /* NB:  
a310: 54 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  The sqlite3Opcod
a320: 65 4e 61 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e  eName() function
a330: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
a340: 62 79 20 63 6f 64 65 20 63 72 65 61 74 65 64 0a  by code created.
a350: 20 20 2a 2a 20 62 79 20 74 68 65 20 6d 6b 6f 70    ** by the mkop
a360: 63 6f 64 65 68 2e 61 77 6b 20 61 6e 64 20 6d 6b  codeh.awk and mk
a370: 6f 70 63 6f 64 65 63 2e 61 77 6b 20 73 63 72 69  opcodec.awk scri
a380: 70 74 73 20 77 68 69 63 68 20 65 78 74 72 61 63  pts which extrac
a390: 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66 6f 72  t the.  ** infor
a3a0: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
a3b0: 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20 74 65  vdbe.c source te
a3c0: 78 74 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28  xt */.  fprintf(
a3d0: 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20  pOut, zFormat1, 
a3e0: 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74  pc, .      sqlit
a3f0: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70  e3OpcodeName(pOp
a400: 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e  ->opcode), pOp->
a410: 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70  p1, pOp->p2, pOp
a420: 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e  ->p3, zP4, pOp->
a430: 70 35 2c 0a 20 20 20 20 20 20 7a 43 6f 6d 0a 20  p5,.      zCom. 
a440: 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75   );.  fflush(pOu
a450: 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  t);.}.#endif../*
a460: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61  .** Release an a
a470: 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c  rray of N Mem el
a480: 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63  ements.*/.static
a490: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d   void releaseMem
a4a0: 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e  Array(Mem *p, in
a4b0: 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26  t N){.  if( p &&
a4c0: 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70   N ){.    Mem *p
a4d0: 45 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a 20 20 20  End = &p[N];.   
a4e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
a4f0: 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20 6d 61 6c  ->db;.    u8 mal
a500: 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64 62 2d  loc_failed = db-
a510: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20  >mallocFailed;. 
a520: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
a530: 65 73 46 72 65 65 64 20 29 7b 0a 20 20 20 20 20  esFreed ){.     
a540: 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28   do{.        if(
a550: 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73   p->szMalloc ) s
a560: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
a570: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
a580: 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70      }while( (++p
a590: 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  )<pEnd );.      
a5a0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
a5b0: 20 20 64 6f 7b 0a 20 20 20 20 20 20 61 73 73 65    do{.      asse
a5c0: 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e  rt( (&p[1])==pEn
a5d0: 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b  d || p[0].db==p[
a5e0: 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 61  1].db );.      a
a5f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
a600: 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69  beCheckMemInvari
a610: 61 6e 74 73 28 70 29 20 29 3b 0a 0a 20 20 20 20  ants(p) );..    
a620: 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
a630: 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c  is really an inl
a640: 69 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ined version of 
a650: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
a660: 6c 65 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a  lease().      **
a670: 20 74 68 61 74 20 74 61 6b 65 73 20 61 64 76 61   that takes adva
a680: 6e 74 61 67 65 20 6f 66 20 74 68 65 20 66 61 63  ntage of the fac
a690: 74 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72  t that the memor
a6a0: 79 20 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20  y cell value is 
a6b0: 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20  .      ** being 
a6c0: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65  set to NULL afte
a6d0: 72 20 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20  r releasing any 
a6e0: 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65  dynamic resource
a6f0: 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s..      **.    
a700: 20 20 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69    ** The justifi
a710: 63 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69  cation for dupli
a720: 63 61 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74  cating code is t
a730: 68 61 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  hat according to
a740: 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67   .      ** callg
a750: 72 69 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65  rind, this cause
a760: 73 20 61 20 63 65 72 74 61 69 6e 20 74 65 73 74  s a certain test
a770: 20 63 61 73 65 20 74 6f 20 68 69 74 20 74 68 65   case to hit the
a780: 20 43 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20   CPU 4.7 .      
a790: 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20  ** percent less 
a7a0: 28 78 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20  (x86 linux, gcc 
a7b0: 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d  version 4.1.2, -
a7c0: 4f 36 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20  O6) than if .   
a7d0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d     ** sqlite3Mem
a7e0: 52 65 6c 65 61 73 65 28 29 20 77 65 72 65 20 63  Release() were c
a7f0: 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e  alled from here.
a800: 20 57 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20   With -O2, this 
a810: 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74  jumps.      ** t
a820: 6f 20 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54  o 6.6 percent. T
a830: 68 65 20 74 65 73 74 20 63 61 73 65 20 69 73 20  he test case is 
a840: 69 6e 73 65 72 74 69 6e 67 20 31 30 30 30 20 72  inserting 1000 r
a850: 6f 77 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ows into a table
a860: 20 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20   .      ** with 
a870: 6e 6f 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67  no indexes using
a880: 20 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72   a single prepar
a890: 65 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d  ed INSERT statem
a8a0: 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20  ent, bind() .   
a8b0: 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28     ** and reset(
a8c0: 29 2e 20 49 6e 73 65 72 74 73 20 61 72 65 20 67  ). Inserts are g
a8d0: 72 6f 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72  rouped into a tr
a8e0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
a8f0: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
a900: 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  se( p->flags & M
a910: 45 4d 5f 41 67 67 20 29 3b 0a 20 20 20 20 20 20  EM_Agg );.      
a920: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61  testcase( p->fla
a930: 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a  gs & MEM_Dyn );.
a940: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
a950: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 46  p->flags & MEM_F
a960: 72 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 74 65  rame );.      te
a970: 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73  stcase( p->flags
a980: 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29 3b   & MEM_RowSet );
a990: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c  .      if( p->fl
a9a0: 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d  ags&(MEM_Agg|MEM
a9b0: 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d  _Dyn|MEM_Frame|M
a9c0: 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20 20  EM_RowSet) ){.  
a9d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a9e0: 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a  eMemRelease(p);.
a9f0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
aa00: 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20  p->szMalloc ){. 
aa10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
aa20: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c  Free(db, p->zMal
aa30: 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  loc);.        p-
aa40: 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20  >szMalloc = 0;. 
aa50: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d       }..      p-
aa60: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64  >flags = MEM_Und
aa70: 65 66 69 6e 65 64 3b 0a 20 20 20 20 7d 77 68 69  efined;.    }whi
aa80: 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29  le( (++p)<pEnd )
aa90: 3b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  ;.    db->malloc
aaa0: 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f  Failed = malloc_
aab0: 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f  failed;.  }.}../
aac0: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 56 64  *.** Delete a Vd
aad0: 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 61  beFrame object a
aae0: 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e  nd its contents.
aaf0: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
ab00: 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61  ts are.** alloca
ab10: 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 50 72  ted by the OP_Pr
ab20: 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20  ogram opcode in 
ab30: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
ab40: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
ab50: 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74  e3VdbeFrameDelet
ab60: 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b  e(VdbeFrame *p){
ab70: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20  .  int i;.  Mem 
ab80: 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d  *aMem = VdbeFram
ab90: 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62 65 43  eMem(p);.  VdbeC
aba0: 75 72 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20  ursor **apCsr = 
abb0: 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26  (VdbeCursor **)&
abc0: 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65  aMem[p->nChildMe
abd0: 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  m];.  for(i=0; i
abe0: 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69  <p->nChildCsr; i
abf0: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
ac00: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70  VdbeFreeCursor(p
ac10: 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a  ->v, apCsr[i]);.
ac20: 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d    }.  releaseMem
ac30: 41 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e  Array(aMem, p->n
ac40: 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c  ChildMem);.  sql
ac50: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d  ite3DbFree(p->v-
ac60: 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e  >db, p);.}..#ifn
ac70: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ac80: 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69  EXPLAIN./*.** Gi
ac90: 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20  ve a listing of 
aca0: 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74  the program in t
acb0: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
acc0: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ne..**.** The in
acd0: 74 65 72 66 61 63 65 20 69 73 20 74 68 65 20 73  terface is the s
ace0: 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56 64  ame as sqlite3Vd
acf0: 62 65 45 78 65 63 28 29 2e 20 20 42 75 74 20 69  beExec().  But i
ad00: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e  nstead of.** run
ad10: 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69  ning the code, i
ad20: 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61  t invokes the ca
ad30: 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20  llback once for 
ad40: 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  each instruction
ad50: 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72  ..** This featur
ad60: 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  e is used to imp
ad70: 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22  lement "EXPLAIN"
ad80: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e  ..**.** When p->
ad90: 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68  explain==1, each
ada0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
adb0: 6c 69 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a  listed.  When.**
adc0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20   p->explain==2, 
add0: 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20  only OP_Explain 
ade0: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65  instructions are
adf0: 20 6c 69 73 74 65 64 20 61 6e 64 20 74 68 65 73   listed and thes
ae00: 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69  e.** are shown i
ae10: 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f  n a different fo
ae20: 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69  rmat.  p->explai
ae30: 6e 3d 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20  n==2 is used to 
ae40: 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50  implement.** EXP
ae50: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e  LAIN QUERY PLAN.
ae60: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65  .**.** When p->e
ae70: 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74  xplain==1, first
ae80: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
ae90: 6d 20 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65  m is listed, the
aea0: 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65  n each of.** the
aeb0: 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67   trigger subprog
aec0: 72 61 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20  rams are listed 
aed0: 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69  one by one..*/.i
aee0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69  nt sqlite3VdbeLi
aef0: 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20  st(.  Vdbe *p   
af00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af10: 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29  /* The VDBE */.)
af20: 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20  {.  int nRow;   
af30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af40: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70           /* Stop
af50: 20 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20   when row count 
af60: 72 65 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a  reaches this */.
af70: 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20    int nSub = 0; 
af80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af90: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
afa0: 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20 73 65   of sub-vdbes se
afb0: 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53  en so far */.  S
afc0: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75  ubProgram **apSu
afd0: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
afe0: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
aff0: 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d  sub-vdbes */.  M
b000: 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20  em *pSub = 0;   
b010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b020: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
b030: 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66  ll hold array of
b040: 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73   subprogs */.  s
b050: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
b060: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
b070: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
b080: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
b090: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
b0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
b0c0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
b0d0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
b0e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b0f0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
b100: 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  e */.  Mem *pMem
b110: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20   = &p->aMem[1]; 
b120: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
b130: 69 72 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75  irst Mem of resu
b140: 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73  lt set */..  ass
b150: 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20  ert( p->explain 
b160: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
b170: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
b180: 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73 65 72  C_RUN );.  asser
b190: 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
b1a0: 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  _OK || p->rc==SQ
b1b0: 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e  LITE_BUSY || p->
b1c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
b1d0: 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74   );..  /* Even t
b1e0: 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64  hough this opcod
b1f0: 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64  e does not use d
b200: 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66  ynamic strings f
b210: 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75  or.  ** the resu
b220: 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  lt, result colum
b230: 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79  ns may become dy
b240: 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75 73 65  namic if the use
b250: 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c  r calls.  ** sql
b260: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
b270: 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20  16(), causing a 
b280: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55  translation to U
b290: 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a  TF-16 encoding..
b2a0: 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65    */.  releaseMe
b2b0: 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b  mArray(pMem, 8);
b2c0: 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74  .  p->pResultSet
b2d0: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e   = 0;..  if( p->
b2e0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
b2f0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
b300: 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c  happens if a mal
b310: 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20 63  loc() inside a c
b320: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63  all to sqlite3_c
b330: 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a  olumn_text() or.
b340: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63      ** sqlite3_c
b350: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66  olumn_text16() f
b360: 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64  ailed.  */.    d
b370: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
b380: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
b390: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
b3a0: 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65  }..  /* When the
b3b0: 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
b3c0: 74 20 72 6f 77 73 20 72 65 61 63 68 65 73 20 6e  t rows reaches n
b3d0: 52 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  Row, that means 
b3e0: 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67  the.  ** listing
b3f0: 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 61 6e   has finished an
b400: 64 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  d sqlite3_step()
b410: 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 53   should return S
b420: 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a  QLITE_DONE..  **
b430: 20 6e 52 6f 77 20 69 73 20 74 68 65 20 73 75 6d   nRow is the sum
b440: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
b450: 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61  f rows in the ma
b460: 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73  in program, plus
b470: 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66  .  ** the sum of
b480: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
b490: 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72 69 67 67  ows in all trigg
b4a0: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 65  er subprograms e
b4b0: 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20  ncountered.  ** 
b4c0: 73 6f 20 66 61 72 2e 20 20 54 68 65 20 6e 52 6f  so far.  The nRo
b4d0: 77 20 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63  w value will inc
b4e0: 72 65 61 73 65 20 61 73 20 6e 65 77 20 74 72 69  rease as new tri
b4f0: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
b500: 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e   are.  ** encoun
b510: 74 65 72 65 64 2c 20 62 75 74 20 70 2d 3e 70 63  tered, but p->pc
b520: 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79   will eventually
b530: 20 63 61 74 63 68 20 75 70 20 74 6f 20 6e 52 6f   catch up to nRo
b540: 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d  w..  */.  nRow =
b550: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 70   p->nOp;.  if( p
b560: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a  ->explain==1 ){.
b570: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74      /* The first
b580: 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20   8 memory cells 
b590: 61 72 65 20 75 73 65 64 20 66 6f 72 20 74 68 65  are used for the
b5a0: 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 53 6f   result set.  So
b5b0: 20 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20   we will.    ** 
b5c0: 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65 20 39  commandeer the 9
b5d0: 74 68 20 63 65 6c 6c 20 74 6f 20 75 73 65 20 61  th cell to use a
b5e0: 73 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 6e  s storage for an
b5f0: 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65   array of pointe
b600: 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72 69  rs.    ** to tri
b610: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
b620: 2e 20 20 54 68 65 20 56 44 42 45 20 69 73 20 67  .  The VDBE is g
b630: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76  uaranteed to hav
b640: 65 20 61 74 20 6c 65 61 73 74 20 39 0a 20 20 20  e at least 9.   
b650: 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20   ** cells.  */. 
b660: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d     assert( p->nM
b670: 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53 75 62  em>9 );.    pSub
b680: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a   = &p->aMem[9];.
b690: 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 66 6c      if( pSub->fl
b6a0: 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a  ags&MEM_Blob ){.
b6b0: 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20        /* On the 
b6c0: 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71  first call to sq
b6d0: 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20 70 53  lite3_step(), pS
b6e0: 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e  ub will hold a N
b6f0: 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20 20 20  ULL.  It is.    
b700: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64    ** initialized
b710: 20 74 6f 20 61 20 42 4c 4f 42 20 62 79 20 74 68   to a BLOB by th
b720: 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  e P4_SUBPROGRAM 
b730: 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63  processing logic
b740: 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20   below */.      
b750: 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73  nSub = pSub->n/s
b760: 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20  izeof(Vdbe*);.  
b770: 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62      apSub = (Sub
b780: 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d  Program **)pSub-
b790: 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  >z;.    }.    fo
b7a0: 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69  r(i=0; i<nSub; i
b7b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20  ++){.      nRow 
b7c0: 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70  += apSub[i]->nOp
b7d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64  ;.    }.  }..  d
b7e0: 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63  o{.    i = p->pc
b7f0: 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c  ++;.  }while( i<
b800: 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78 70 6c 61  nRow && p->expla
b810: 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b  in==2 && p->aOp[
b820: 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78  i].opcode!=OP_Ex
b830: 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69  plain );.  if( i
b840: 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d  >=nRow ){.    p-
b850: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
b860: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
b870: 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69  _DONE;.  }else i
b880: 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65  f( db->u1.isInte
b890: 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70  rrupted ){.    p
b8a0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e  ->rc = SQLITE_IN
b8b0: 54 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20  TERRUPT;.    rc 
b8c0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
b8d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
b8e0: 72 72 6f 72 28 70 2c 20 73 71 6c 69 74 65 33 45  rror(p, sqlite3E
b8f0: 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20  rrStr(p->rc));. 
b900: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
b910: 20 2a 7a 50 34 3b 0a 20 20 20 20 4f 70 20 2a 70   *zP4;.    Op *p
b920: 4f 70 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 2d  Op;.    if( i<p-
b930: 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a  >nOp ){.      /*
b940: 20 54 68 65 20 6f 75 74 70 75 74 20 6c 69 6e 65   The output line
b950: 20 6e 75 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c   number is small
b960: 20 65 6e 6f 75 67 68 20 74 68 61 74 20 77 65 20   enough that we 
b970: 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65  are still in the
b980: 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70  .      ** main p
b990: 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20  rogram. */.     
b9a0: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69   pOp = &p->aOp[i
b9b0: 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
b9c0: 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 63 75      /* We are cu
b9d0: 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20  rrently listing 
b9e0: 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 46 69  subprograms.  Fi
b9f0: 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f  gure out which o
ba00: 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ne and.      ** 
ba10: 70 69 63 6b 20 75 70 20 74 68 65 20 61 70 70 72  pick up the appr
ba20: 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 65 2e 20  opriate opcode. 
ba30: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  */.      int j;.
ba40: 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f        i -= p->nO
ba50: 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  p;.      for(j=0
ba60: 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e  ; i>=apSub[j]->n
ba70: 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; j++){.      
ba80: 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d    i -= apSub[j]-
ba90: 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  >nOp;.      }.  
baa0: 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53 75 62      pOp = &apSub
bab0: 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20  [j]->aOp[i];.   
bac0: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78   }.    if( p->ex
bad0: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
bae0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
baf0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70  MEM_Int;.      p
bb00: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20  Mem->u.i = i;   
bb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bb30: 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20  Program counter 
bb40: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  */.      pMem++;
bb50: 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  .  .      pMem->
bb60: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74  flags = MEM_Stat
bb70: 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54  ic|MEM_Str|MEM_T
bb80: 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  erm;.      pMem-
bb90: 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  >z = (char*)sqli
bba0: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
bbb0: 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f  p->opcode); /* O
bbc0: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 61  pcode */.      a
bbd0: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d  ssert( pMem->z!=
bbe0: 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  0 );.      pMem-
bbf0: 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  >n = sqlite3Strl
bc00: 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  en30(pMem->z);. 
bc10: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
bc20: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
bc30: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
bc40: 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50     /* When an OP
bc50: 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20  _Program opcode 
bc60: 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 28 74 68  is encounter (th
bc70: 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68  e only opcode th
bc80: 61 74 20 68 61 73 0a 20 20 20 20 20 20 2a 2a 20  at has.      ** 
bc90: 61 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  a P4_SUBPROGRAM 
bca0: 61 72 67 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e  argument), expan
bcb0: 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
bcc0: 65 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72  e array of subpr
bcd0: 6f 67 72 61 6d 73 0a 20 20 20 20 20 20 2a 2a 20  ograms.      ** 
bce0: 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b  kept in p->aMem[
bcf0: 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65  9].z to hold the
bd00: 20 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d 20 61   new program - a
bd10: 73 73 75 6d 69 6e 67 20 74 68 69 73 20 73 75 62  ssuming this sub
bd20: 70 72 6f 67 72 61 6d 0a 20 20 20 20 20 20 2a 2a  program.      **
bd30: 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
bd40: 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20   been seen..    
bd50: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
bd60: 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53  Op->p4type==P4_S
bd70: 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20  UBPROGRAM ){.   
bd80: 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d       int nByte =
bd90: 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66   (nSub+1)*sizeof
bda0: 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20  (SubProgram*);. 
bdb0: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
bdc0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
bdd0: 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20  <nSub; j++){.   
bde0: 20 20 20 20 20 20 20 69 66 28 20 61 70 53 75 62         if( apSub
bdf0: 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72  [j]==pOp->p4.pPr
be00: 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20  ogram ) break;. 
be10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
be20: 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20   if( j==nSub && 
be30: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74  SQLITE_OK==sqlit
be40: 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 53  e3VdbeMemGrow(pS
be50: 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53 75 62 21  ub, nByte, nSub!
be60: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =0) ){.         
be70: 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f   apSub = (SubPro
be80: 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b  gram **)pSub->z;
be90: 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62  .          apSub
bea0: 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e  [nSub++] = pOp->
beb0: 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20  p4.pProgram;.   
bec0: 20 20 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61         pSub->fla
bed0: 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a  gs |= MEM_Blob;.
bee0: 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e            pSub->
bef0: 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28  n = nSub*sizeof(
bf00: 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20  SubProgram*);.  
bf10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
bf20: 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d      }..    pMem-
bf30: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
bf40: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  ;.    pMem->u.i 
bf50: 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20  = pOp->p1;      
bf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf70: 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20      /* P1 */.   
bf80: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d   pMem++;..    pM
bf90: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
bfa0: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  Int;.    pMem->u
bfb0: 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20  .i = pOp->p2;   
bfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfd0: 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a         /* P2 */.
bfe0: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
bff0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
c000: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
c010: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b  ->u.i = pOp->p3;
c020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c030: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20            /* P3 
c040: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  */.    pMem++;..
c050: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
c060: 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65  dbeMemClearAndRe
c070: 73 69 7a 65 28 70 4d 65 6d 2c 20 31 30 30 29 20  size(pMem, 100) 
c080: 29 7b 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20  ){ /* P4 */.    
c090: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d    assert( p->db-
c0a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
c0b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
c0c0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
c0d0: 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  }.    pMem->flag
c0e0: 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  s = MEM_Str|MEM_
c0f0: 54 65 72 6d 3b 0a 20 20 20 20 7a 50 34 20 3d 20  Term;.    zP4 = 
c100: 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 70  displayP4(pOp, p
c110: 4d 65 6d 2d 3e 7a 2c 20 70 4d 65 6d 2d 3e 73 7a  Mem->z, pMem->sz
c120: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28  Malloc);.    if(
c130: 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b   zP4!=pMem->z ){
c140: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c150: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d  beMemSetStr(pMem
c160: 2c 20 7a 50 34 2c 20 2d 31 2c 20 53 51 4c 49 54  , zP4, -1, SQLIT
c170: 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20  E_UTF8, 0);.    
c180: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
c190: 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20  ert( pMem->z!=0 
c1a0: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  );.      pMem->n
c1b0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
c1c0: 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20  30(pMem->z);.   
c1d0: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53     pMem->enc = S
c1e0: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20  QLITE_UTF8;.    
c1f0: 7d 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  }.    pMem++;.. 
c200: 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69     if( p->explai
c210: 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66  n==1 ){.      if
c220: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
c230: 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70  ClearAndResize(p
c240: 4d 65 6d 2c 20 34 29 20 29 7b 0a 20 20 20 20 20  Mem, 4) ){.     
c250: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62     assert( p->db
c260: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
c270: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
c280: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
c290: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65       }.      pMe
c2a0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
c2b0: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
c2c0: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a     pMem->n = 2;.
c2d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
c2e0: 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e  printf(3, pMem->
c2f0: 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e  z, "%.2x", pOp->
c300: 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a  p5);   /* P5 */.
c310: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
c320: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
c330: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a       pMem++;.  .
c340: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
c350: 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d  ABLE_EXPLAIN_COM
c360: 4d 45 4e 54 53 0a 20 20 20 20 20 20 69 66 28 20  MENTS.      if( 
c370: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c  sqlite3VdbeMemCl
c380: 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65  earAndResize(pMe
c390: 6d 2c 20 35 30 30 29 20 29 7b 0a 20 20 20 20 20  m, 500) ){.     
c3a0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62     assert( p->db
c3b0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
c3c0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
c3d0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
c3e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65       }.      pMe
c3f0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
c400: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
c410: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69 73     pMem->n = dis
c420: 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c  playComment(pOp,
c430: 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 35   zP4, pMem->z, 5
c440: 30 30 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  00);.      pMem-
c450: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
c460: 46 38 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  F8;.#else.      
c470: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
c480: 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20  M_Null;         
c490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c4a0: 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64   Comment */.#end
c4b0: 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d  if.    }..    p-
c4c0: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20  >nResColumn = 8 
c4d0: 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d  - 4*(p->explain-
c4e0: 31 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 73 75  1);.    p->pResu
c4f0: 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d  ltSet = &p->aMem
c500: 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  [1];.    p->rc =
c510: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
c520: 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b  rc = SQLITE_ROW;
c530: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
c540: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
c550: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
c560: 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  N */..#ifdef SQL
c570: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
c580: 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68  Print the SQL th
c590: 61 74 20 77 61 73 20 75 73 65 64 20 74 6f 20 67  at was used to g
c5a0: 65 6e 65 72 61 74 65 20 61 20 56 44 42 45 20 70  enerate a VDBE p
c5b0: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  rogram..*/.void 
c5c0: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
c5d0: 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  Sql(Vdbe *p){.  
c5e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
c5f0: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c  0;.  if( p->zSql
c600: 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 2d 3e 7a   ){.    z = p->z
c610: 53 71 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  Sql;.  }else if(
c620: 20 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20   p->nOp>=1 ){.  
c630: 20 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 20 2a    const VdbeOp *
c640: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d  pOp = &p->aOp[0]
c650: 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f  ;.    if( pOp->o
c660: 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26  pcode==OP_Init &
c670: 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29  & pOp->p4.z!=0 )
c680: 7b 0a 20 20 20 20 20 20 7a 20 3d 20 70 4f 70 2d  {.      z = pOp-
c690: 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 77 68 69  >p4.z;.      whi
c6a0: 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73 70 61  le( sqlite3Isspa
c6b0: 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20  ce(*z) ) z++;.  
c6c0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20    }.  }.  if( z 
c6d0: 29 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b  ) printf("SQL: [
c6e0: 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65  %s]\n", z);.}.#e
c6f0: 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
c700: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
c710: 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64  RACE) && defined
c720: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49  (SQLITE_ENABLE_I
c730: 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72  OTRACE)./*.** Pr
c740: 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d  int an IOTRACE m
c750: 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53  essage showing S
c760: 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76  QL content..*/.v
c770: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 49  oid sqlite3VdbeI
c780: 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a  OTraceSql(Vdbe *
c790: 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20  p){.  int nOp = 
c7a0: 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p->nOp;.  VdbeOp
c7b0: 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c   *pOp;.  if( sql
c7c0: 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30 20 29  ite3IoTrace==0 )
c7d0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e   return;.  if( n
c7e0: 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20  Op<1 ) return;. 
c7f0: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30   pOp = &p->aOp[0
c800: 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  ];.  if( pOp->op
c810: 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26  code==OP_Init &&
c820: 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b   pOp->p4.z!=0 ){
c830: 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  .    int i, j;. 
c840: 20 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b     char z[1000];
c850: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
c860: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c  rintf(sizeof(z),
c870: 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70   z, "%s", pOp->p
c880: 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  4.z);.    for(i=
c890: 30 3b 20 73 71 6c 69 74 65 33 49 73 73 70 61 63  0; sqlite3Isspac
c8a0: 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a  e(z[i]); i++){}.
c8b0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69      for(j=0; z[i
c8c0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
c8d0: 66 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63  f( sqlite3Isspac
c8e0: 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20  e(z[i]) ){.     
c8f0: 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27     if( z[i-1]!='
c900: 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20   ' ){.          
c910: 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20  z[j++] = ' ';.  
c920: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
c930: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a  lse{.        z[j
c940: 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20  ++] = z[i];.    
c950: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b    }.    }.    z[
c960: 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  j] = 0;.    sqli
c970: 74 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c 20  te3IoTrace("SQL 
c980: 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d  %s\n", z);.  }.}
c990: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
c9a0: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26  TE_OMIT_TRACE &&
c9b0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
c9c0: 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 20 41 6e  OTRACE */../* An
c9d0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
c9e0: 73 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69 62  s object describ
c9f0: 65 73 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 61  es bulk memory a
ca00: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
ca10: 0a 2a 2a 20 62 79 20 73 75 62 63 6f 6d 70 6f 6e  .** by subcompon
ca20: 65 6e 74 73 20 6f 66 20 61 20 70 72 65 70 61 72  ents of a prepar
ca30: 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53  ed statement.  S
ca40: 70 61 63 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  pace is allocate
ca50: 64 20 6f 75 74 0a 2a 2a 20 6f 66 20 61 20 52 65  d out.** of a Re
ca60: 75 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a 65  usableSpace obje
ca70: 63 74 20 62 79 20 74 68 65 20 61 6c 6c 6f 63 53  ct by the allocS
ca80: 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20 62  pace() routine b
ca90: 65 6c 6f 77 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  elow..*/.struct 
caa0: 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 7b 0a  ReusableSpace {.
cab0: 20 20 75 38 20 2a 70 53 70 61 63 65 3b 20 20 20    u8 *pSpace;   
cac0: 20 20 20 20 20 20 20 2f 2a 20 41 76 61 69 6c 61         /* Availa
cad0: 62 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  ble memory */.  
cae0: 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20  int nFree;      
caf0: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
cb00: 20 61 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72   available memor
cb10: 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 65 64  y */.  int nNeed
cb20: 65 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ed;         /* T
cb30: 6f 74 61 6c 20 62 79 74 65 73 20 74 68 61 74 20  otal bytes that 
cb40: 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 6c 6c  could not be all
cb50: 6f 63 61 74 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ocated */.};../*
cb60: 20 54 72 79 20 74 6f 20 61 6c 6c 6f 63 61 74 65   Try to allocate
cb70: 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
cb80: 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 62  8-byte aligned b
cb90: 75 6c 6b 20 6d 65 6d 6f 72 79 20 66 6f 72 20 70  ulk memory for p
cba0: 42 75 66 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  Buf.** from the 
cbb0: 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 6f 62  ReusableSpace ob
cbc0: 6a 65 63 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ject.  Return a 
cbd0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61  pointer to the a
cbe0: 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 6d 65 6d 6f  llocated.** memo
cbf0: 72 79 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ry on success.  
cc00: 49 66 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20  If insufficient 
cc10: 6d 65 6d 6f 72 79 20 69 73 20 61 76 61 69 6c 61  memory is availa
cc20: 62 6c 65 20 69 6e 20 74 68 65 0a 2a 2a 20 52 65  ble in the.** Re
cc30: 75 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a 65  usableSpace obje
cc40: 63 74 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  ct, increase the
cc50: 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 2e 6e   ReusableSpace.n
cc60: 4e 65 65 64 65 64 0a 2a 2a 20 76 61 6c 75 65 20  Needed.** value 
cc70: 62 79 20 74 68 65 20 61 6d 6f 75 6e 74 20 6e 65  by the amount ne
cc80: 65 64 65 64 20 61 6e 64 20 72 65 74 75 72 6e 20  eded and return 
cc90: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  NULL..**.** If p
cca0: 42 75 66 20 69 73 20 6e 6f 74 20 69 6e 69 74 69  Buf is not initi
ccb0: 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 61 74 20  ally NULL, that 
ccc0: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6d  means that the m
ccd0: 65 6d 6f 72 79 20 68 61 73 20 61 6c 72 65 61 64  emory has alread
cce0: 79 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61  y.** been alloca
ccf0: 74 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 63  ted by a prior c
cd00: 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
cd10: 69 6e 65 2c 20 73 6f 20 6a 75 73 74 20 72 65 74  ine, so just ret
cd20: 75 72 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66  urn a copy.** of
cd30: 20 70 42 75 66 20 61 6e 64 20 6c 65 61 76 65 20   pBuf and leave 
cd40: 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 75 6e  ReusableSpace un
cd50: 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  changed..**.** T
cd60: 68 69 73 20 61 6c 6c 6f 63 61 74 6f 72 20 69 73  his allocator is
cd70: 20 65 6d 70 6c 6f 79 65 64 20 74 6f 20 72 65 70   employed to rep
cd80: 75 72 70 6f 73 65 20 75 6e 75 73 65 64 20 73 6c  urpose unused sl
cd90: 6f 74 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ots at the end o
cda0: 66 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 20  f the.** opcode 
cdb0: 61 72 72 61 79 20 6f 66 20 70 72 65 70 61 72 65  array of prepare
cdc0: 64 20 73 74 61 74 65 20 66 6f 72 20 6f 74 68 65  d state for othe
cdd0: 72 20 6d 65 6d 6f 72 79 20 6e 65 65 64 73 20 6f  r memory needs o
cde0: 66 20 74 68 65 20 70 72 65 70 61 72 65 64 0a 2a  f the prepared.*
cdf0: 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  * statement..*/.
ce00: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c  static void *all
ce10: 6f 63 53 70 61 63 65 28 0a 20 20 73 74 72 75 63  ocSpace(.  struc
ce20: 74 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20  t ReusableSpace 
ce30: 2a 70 2c 20 20 2f 2a 20 42 75 6c 6b 20 6d 65 6d  *p,  /* Bulk mem
ce40: 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  ory available fo
ce50: 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a  r allocation */.
ce60: 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
ce70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
ce80: 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 72 69 6f  ointer to a prio
ce90: 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a  r allocation */.
cea0: 20 20 69 6e 74 20 6e 42 79 74 65 20 20 20 20 20    int nByte     
ceb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
cec0: 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 6e  ytes of memory n
ced0: 65 65 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73  eeded */.){.  as
cee0: 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
cef0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 2d 3e 70 53  _ALIGNMENT(p->pS
cf00: 70 61 63 65 29 20 29 3b 0a 20 20 69 66 28 20 70  pace) );.  if( p
cf10: 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 42  Buf==0 ){.    nB
cf20: 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79  yte = ROUND8(nBy
cf30: 74 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79  te);.    if( nBy
cf40: 74 65 20 3c 3d 20 70 2d 3e 6e 46 72 65 65 20 29  te <= p->nFree )
cf50: 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 46 72 65 65  {.      p->nFree
cf60: 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20   -= nByte;.     
cf70: 20 70 42 75 66 20 3d 20 26 70 2d 3e 70 53 70 61   pBuf = &p->pSpa
cf80: 63 65 5b 70 2d 3e 6e 46 72 65 65 5d 3b 0a 20 20  ce[p->nFree];.  
cf90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
cfa0: 2d 3e 6e 4e 65 65 64 65 64 20 2b 3d 20 6e 42 79  ->nNeeded += nBy
cfb0: 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  te;.    }.  }.  
cfc0: 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
cfd0: 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 42 75  TE_ALIGNMENT(pBu
cfe0: 66 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  f) );.  return p
cff0: 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Buf;.}../*.** Re
d000: 77 69 6e 64 20 74 68 65 20 56 44 42 45 20 62 61  wind the VDBE ba
d010: 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ck to the beginn
d020: 69 6e 67 20 69 6e 20 70 72 65 70 61 72 61 74 69  ing in preparati
d030: 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e  on for.** runnin
d040: 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  g it..*/.void sq
d050: 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28  lite3VdbeRewind(
d060: 56 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 64 65  Vdbe *p){.#if de
d070: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
d080: 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56  UG) || defined(V
d090: 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69  DBE_PROFILE).  i
d0a0: 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20 61  nt i;.#endif.  a
d0b0: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
d0c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
d0d0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
d0e0: 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72  IT );..  /* Ther
d0f0: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c  e should be at l
d100: 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e  east one opcode.
d110: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
d120: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f  p->nOp>0 );..  /
d130: 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69 63 20  * Set the magic 
d140: 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  to VDBE_MAGIC_RU
d150: 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20  N sooner rather 
d160: 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20  than later. */. 
d170: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
d180: 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 23 69 66  _MAGIC_RUN;..#if
d190: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
d1a0: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d  .  for(i=1; i<p-
d1b0: 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nMem; i++){.   
d1c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d   assert( p->aMem
d1d0: 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b  [i].db==p->db );
d1e0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d  .  }.#endif.  p-
d1f0: 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72  >pc = -1;.  p->r
d200: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
d210: 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20   p->errorAction 
d220: 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d  = OE_Abort;.  p-
d230: 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
d240: 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b  p->cacheCtr = 1;
d250: 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69  .  p->minWriteFi
d260: 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a  leFormat = 255;.
d270: 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20    p->iStatement 
d280: 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e  = 0;.  p->nFkCon
d290: 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66  straint = 0;.#if
d2a0: 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45  def VDBE_PROFILE
d2b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
d2c0: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
d2d0: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20  p->aOp[i].cnt = 
d2e0: 30 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d  0;.    p->aOp[i]
d2f0: 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 7d  .cycles = 0;.  }
d300: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
d310: 20 50 72 65 70 61 72 65 20 61 20 76 69 72 74 75   Prepare a virtu
d320: 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65  al machine for e
d330: 78 65 63 75 74 69 6f 6e 20 66 6f 72 20 74 68 65  xecution for the
d340: 20 66 69 72 73 74 20 74 69 6d 65 20 61 66 74 65   first time afte
d350: 72 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 74 68  r.** creating th
d360: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
d370: 65 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65  e.  This involve
d380: 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a  s things such.**
d390: 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 72   as allocating r
d3a0: 65 67 69 73 74 65 72 73 20 61 6e 64 20 69 6e 69  egisters and ini
d3b0: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72  tializing the pr
d3c0: 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a  ogram counter..*
d3d0: 2a 20 41 66 74 65 72 20 74 68 65 20 56 44 42 45  * After the VDBE
d3e0: 20 68 61 73 20 62 65 20 70 72 65 70 70 65 64 2c   has be prepped,
d3f0: 20 69 74 20 63 61 6e 20 62 65 20 65 78 65 63 75   it can be execu
d400: 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f  ted by one or mo
d410: 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73  re.** calls to s
d420: 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29  qlite3VdbeExec()
d430: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  .  .**.** This f
d440: 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63  unction may be c
d450: 61 6c 6c 65 64 20 65 78 61 63 74 6c 79 20 6f 6e  alled exactly on
d460: 63 65 20 6f 6e 20 65 61 63 68 20 76 69 72 74 75  ce on each virtu
d470: 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 41  al machine..** A
d480: 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
d490: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  e is called the 
d4a0: 56 4d 20 68 61 73 20 62 65 65 6e 20 22 70 61 63  VM has been "pac
d4b0: 6b 61 67 65 64 22 20 61 6e 64 20 69 73 20 72 65  kaged" and is re
d4c0: 61 64 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20 20  ady.** to run.  
d4d0: 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  After this routi
d4e0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 66 75  ne is called, fu
d4f0: 72 74 68 65 72 20 63 61 6c 6c 73 20 74 6f 20 0a  rther calls to .
d500: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  ** sqlite3VdbeAd
d510: 64 4f 70 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  dOp() functions 
d520: 61 72 65 20 70 72 6f 68 69 62 69 74 65 64 2e 20  are prohibited. 
d530: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 69   This routine di
d540: 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74 68 65  sconnects.** the
d550: 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20 50   Vdbe from the P
d560: 61 72 73 65 20 6f 62 6a 65 63 74 20 74 68 61 74  arse object that
d570: 20 68 65 6c 70 65 64 20 67 65 6e 65 72 61 74 65   helped generate
d580: 20 69 74 20 73 6f 20 74 68 61 74 20 74 68 65 0a   it so that the.
d590: 2a 2a 20 74 68 65 20 56 64 62 65 20 62 65 63 6f  ** the Vdbe beco
d5a0: 6d 65 73 20 61 6e 20 69 6e 64 65 70 65 6e 64 65  mes an independe
d5b0: 6e 74 20 65 6e 74 69 74 79 20 61 6e 64 20 74 68  nt entity and th
d5c0: 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 63  e Parse object c
d5d0: 61 6e 20 62 65 0a 2a 2a 20 64 65 73 74 72 6f 79  an be.** destroy
d5e0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  ed..**.** Use th
d5f0: 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77  e sqlite3VdbeRew
d600: 69 6e 64 28 29 20 70 72 6f 63 65 64 75 72 65 20  ind() procedure 
d610: 74 6f 20 72 65 73 74 6f 72 65 20 61 20 76 69 72  to restore a vir
d620: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 61 63  tual machine bac
d630: 6b 0a 2a 2a 20 74 6f 20 69 74 73 20 69 6e 69 74  k.** to its init
d640: 69 61 6c 20 73 74 61 74 65 20 61 66 74 65 72 20  ial state after 
d650: 69 74 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2e  it has been run.
d660: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d670: 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20  VdbeMakeReady(. 
d680: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
d690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6a0: 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20  /* The VDBE */. 
d6b0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 20   Parse *pParse  
d6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6d0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
d6e0: 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  xt */.){.  sqlit
d6f0: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
d700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
d710: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
d720: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56  tion */.  int nV
d730: 61 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ar;             
d740: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
d750: 65 72 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73  er of parameters
d760: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20   */.  int nMem; 
d770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d780: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
d790: 66 20 56 4d 20 6d 65 6d 6f 72 79 20 72 65 67 69  f VM memory regi
d7a0: 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  sters */.  int n
d7b0: 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20  Cursor;         
d7c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
d7d0: 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 72  ber of cursors r
d7e0: 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74  equired */.  int
d7f0: 20 6e 41 72 67 3b 20 20 20 20 20 20 20 20 20 20   nArg;          
d800: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
d810: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
d820: 74 73 20 69 6e 20 73 75 62 70 72 6f 67 72 61 6d  ts in subprogram
d830: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6e 63 65  s */.  int nOnce
d840: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d850: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
d860: 6f 66 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72  of OP_Once instr
d870: 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  uctions */.  int
d880: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
d890: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
d8a0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
d8b0: 20 73 74 72 75 63 74 20 52 65 75 73 61 62 6c 65   struct Reusable
d8c0: 53 70 61 63 65 20 78 3b 20 20 20 20 20 20 20 20  Space x;        
d8d0: 2f 2a 20 52 65 75 73 61 62 6c 65 20 62 75 6c 6b  /* Reusable bulk
d8e0: 20 6d 65 6d 6f 72 79 20 2a 2f 0a 0a 20 20 61 73   memory */..  as
d8f0: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
d900: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
d910: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
d920: 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  arse!=0 );.  ass
d930: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
d940: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
d950: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
d960: 73 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20 29 3b  se==p->pParse );
d970: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
d980: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
d990: 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a  locFailed==0 );.
d9a0: 20 20 6e 56 61 72 20 3d 20 70 50 61 72 73 65 2d    nVar = pParse-
d9b0: 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20  >nVar;.  nMem = 
d9c0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
d9d0: 6e 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65  nCursor = pParse
d9e0: 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d  ->nTab;.  nArg =
d9f0: 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67   pParse->nMaxArg
da00: 3b 0a 20 20 6e 4f 6e 63 65 20 3d 20 70 50 61 72  ;.  nOnce = pPar
da10: 73 65 2d 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66 28  se->nOnce;.  if(
da20: 20 6e 4f 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e 63   nOnce==0 ) nOnc
da30: 65 20 3d 20 31 3b 20 2f 2a 20 45 6e 73 75 72 65  e = 1; /* Ensure
da40: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 79   at least one by
da50: 74 65 20 69 6e 20 70 2d 3e 61 4f 6e 63 65 46 6c  te in p->aOnceFl
da60: 61 67 5b 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20  ag[] */.  .  /* 
da70: 46 6f 72 20 65 61 63 68 20 63 75 72 73 6f 72 20  For each cursor 
da80: 72 65 71 75 69 72 65 64 2c 20 61 6c 73 6f 20 61  required, also a
da90: 6c 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f 72 79  llocate a memory
daa0: 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20   cell. Memory.  
dab0: 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31  ** cells (nMem+1
dac0: 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c  -nCursor)..nMem,
dad0: 20 69 6e 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c   inclusive, will
dae0: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 62   never be used b
daf0: 79 0a 20 20 2a 2a 20 74 68 65 20 76 64 62 65 20  y.  ** the vdbe 
db00: 70 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65 61 64  program. Instead
db10: 20 74 68 65 79 20 61 72 65 20 75 73 65 64 20 74   they are used t
db20: 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
db30: 79 20 66 6f 72 0a 20 20 2a 2a 20 56 64 62 65 43  y for.  ** VdbeC
db40: 75 72 73 6f 72 2f 42 74 43 75 72 73 6f 72 20 73  ursor/BtCursor s
db50: 74 72 75 63 74 75 72 65 73 2e 20 54 68 65 20 62  tructures. The b
db60: 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73  lob of memory as
db70: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 20  sociated with . 
db80: 20 2a 2a 20 63 75 72 73 6f 72 20 30 20 69 73 20   ** cursor 0 is 
db90: 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79  stored in memory
dba0: 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f   cell nMem. Memo
dbb0: 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29  ry cell (nMem-1)
dbc0: 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65  .  ** stores the
dbd0: 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20   blob of memory 
dbe0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
dbf0: 63 75 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20  cursor 1, etc.. 
dc00: 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73   **.  ** See als
dc10: 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f  o: allocateCurso
dc20: 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d  r()..  */.  nMem
dc30: 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20   += nCursor;..  
dc40: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
dc50: 77 20 6d 75 63 68 20 72 65 75 73 61 62 6c 65 20  w much reusable 
dc60: 6d 65 6d 6f 72 79 20 69 73 20 61 76 61 69 6c 61  memory is availa
dc70: 62 6c 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ble at the end o
dc80: 66 20 74 68 65 0a 20 20 2a 2a 20 6f 70 63 6f 64  f the.  ** opcod
dc90: 65 20 61 72 72 61 79 2e 20 20 54 68 69 73 20 65  e array.  This e
dca0: 78 74 72 61 20 6d 65 6d 6f 72 79 20 77 69 6c 6c  xtra memory will
dcb0: 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20   be reallocated 
dcc0: 66 6f 72 20 6f 74 68 65 72 20 65 6c 65 6d 65 6e  for other elemen
dcd0: 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 70  ts.  ** of the p
dce0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
dcf0: 74 2e 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 52 4f  t..  */.  n = RO
dd00: 55 4e 44 38 28 73 69 7a 65 6f 66 28 4f 70 29 2a  UND8(sizeof(Op)*
dd10: 70 2d 3e 6e 4f 70 29 3b 20 20 20 20 20 20 20 20  p->nOp);        
dd20: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
dd30: 66 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20  f opcode memory 
dd40: 75 73 65 64 20 2a 2f 0a 20 20 78 2e 70 53 70 61  used */.  x.pSpa
dd50: 63 65 20 3d 20 26 28 28 75 38 2a 29 70 2d 3e 61  ce = &((u8*)p->a
dd60: 4f 70 29 5b 6e 5d 3b 20 20 20 20 20 20 20 20 20  Op)[n];         
dd70: 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20        /* Unused 
dd80: 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20 2a 2f  opcode memory */
dd90: 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
dda0: 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
ddb0: 78 2e 70 53 70 61 63 65 29 20 29 3b 0a 20 20 78  x.pSpace) );.  x
ddc0: 2e 6e 46 72 65 65 20 3d 20 52 4f 55 4e 44 44 4f  .nFree = ROUNDDO
ddd0: 57 4e 38 28 70 50 61 72 73 65 2d 3e 73 7a 4f 70  WN8(pParse->szOp
dde0: 41 6c 6c 6f 63 20 2d 20 6e 29 3b 20 20 2f 2a 20  Alloc - n);  /* 
ddf0: 42 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20  Bytes of unused 
de00: 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 73 73 65  memory */.  asse
de10: 72 74 28 20 78 2e 6e 46 72 65 65 3e 3d 30 20 29  rt( x.nFree>=0 )
de20: 3b 0a 20 20 69 66 28 20 78 2e 6e 46 72 65 65 3e  ;.  if( x.nFree>
de30: 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  0 ){.    memset(
de40: 78 2e 70 53 70 61 63 65 2c 20 30 2c 20 78 2e 6e  x.pSpace, 0, x.n
de50: 46 72 65 65 29 3b 0a 20 20 20 20 61 73 73 65 72  Free);.    asser
de60: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
de70: 49 47 4e 4d 45 4e 54 28 26 78 2e 70 53 70 61 63  IGNMENT(&x.pSpac
de80: 65 5b 78 2e 6e 46 72 65 65 5d 29 20 29 3b 0a 20  e[x.nFree]) );. 
de90: 20 7d 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56   }..  resolveP2V
dea0: 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b  alues(p, &nArg);
deb0: 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f  .  p->usesStmtJo
dec0: 75 72 6e 61 6c 20 3d 20 28 75 38 29 28 70 50 61  urnal = (u8)(pPa
ded0: 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74  rse->isMultiWrit
dee0: 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61 79  e && pParse->may
def0: 41 62 6f 72 74 29 3b 0a 20 20 69 66 28 20 70 50  Abort);.  if( pP
df00: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26  arse->explain &&
df10: 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20   nMem<10 ){.    
df20: 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20  nMem = 10;.  }. 
df30: 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b   p->expired = 0;
df40: 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f  ..  /* Memory fo
df50: 72 20 72 65 67 69 73 74 65 72 73 2c 20 70 61 72  r registers, par
df60: 61 6d 65 74 65 72 73 2c 20 63 75 72 73 6f 72 2c  ameters, cursor,
df70: 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74   etc, is allocat
df80: 65 64 20 69 6e 20 6f 6e 65 20 6f 72 20 74 77 6f  ed in one or two
df90: 0a 20 20 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f  .  ** passes.  O
dfa0: 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 73 73  n the first pass
dfb0: 2c 20 77 65 20 74 72 79 20 74 6f 20 72 65 75 73  , we try to reus
dfc0: 65 20 75 6e 75 73 65 64 20 6d 65 6d 6f 72 79 20  e unused memory 
dfd0: 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 64  at the .  ** end
dfe0: 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61   of the opcode a
dff0: 72 72 61 79 2e 20 20 49 66 20 77 65 20 61 72 65  rray.  If we are
e000: 20 75 6e 61 62 6c 65 20 74 6f 20 73 61 74 69 73   unable to satis
e010: 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20  fy all memory.  
e020: 2a 2a 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20  ** requirements 
e030: 62 79 20 72 65 75 73 69 6e 67 20 74 68 65 20 6f  by reusing the o
e040: 70 63 6f 64 65 20 61 72 72 61 79 20 74 61 69 6c  pcode array tail
e050: 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e  , then the secon
e060: 64 0a 20 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c  d.  ** pass will
e070: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 72 65 6d   fill in the rem
e080: 61 69 6e 64 65 72 20 75 73 69 6e 67 20 61 20 66  ainder using a f
e090: 72 65 73 68 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  resh memory allo
e0a0: 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20  cation.  .  **. 
e0b0: 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70 61 73   ** This two-pas
e0c0: 73 20 61 70 70 72 6f 61 63 68 20 74 68 61 74 20  s approach that 
e0d0: 72 65 75 73 65 73 20 61 73 20 6d 75 63 68 20 6d  reuses as much m
e0e0: 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c  emory as possibl
e0f0: 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20  e from.  ** the 
e100: 6c 65 66 74 6f 76 65 72 20 6d 65 6d 6f 72 79 20  leftover memory 
e110: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
e120: 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20  e opcode array. 
e130: 20 54 68 69 73 20 63 61 6e 20 73 69 67 6e 69 66   This can signif
e140: 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64  icantly.  ** red
e150: 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  uce the amount o
e160: 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79  f memory held by
e170: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
e180: 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f  ement..  */.  do
e190: 20 7b 0a 20 20 20 20 78 2e 6e 4e 65 65 64 65 64   {.    x.nNeeded
e1a0: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d 65   = 0;.    p->aMe
e1b0: 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26  m = allocSpace(&
e1c0: 78 2c 20 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d  x, p->aMem, nMem
e1d0: 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20  *sizeof(Mem));. 
e1e0: 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c     p->aVar = all
e1f0: 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61  ocSpace(&x, p->a
e200: 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66  Var, nVar*sizeof
e210: 28 4d 65 6d 29 29 3b 0a 20 20 20 20 70 2d 3e 61  (Mem));.    p->a
e220: 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63  pArg = allocSpac
e230: 65 28 26 78 2c 20 70 2d 3e 61 70 41 72 67 2c 20  e(&x, p->apArg, 
e240: 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a  nArg*sizeof(Mem*
e250: 29 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73 72  ));.    p->apCsr
e260: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78   = allocSpace(&x
e270: 2c 20 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72  , p->apCsr, nCur
e280: 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43  sor*sizeof(VdbeC
e290: 75 72 73 6f 72 2a 29 29 3b 0a 20 20 20 20 70 2d  ursor*));.    p-
e2a0: 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20 61 6c 6c  >aOnceFlag = all
e2b0: 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61  ocSpace(&x, p->a
e2c0: 4f 6e 63 65 46 6c 61 67 2c 20 6e 4f 6e 63 65 29  OnceFlag, nOnce)
e2d0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
e2e0: 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
e2f0: 53 54 41 54 55 53 0a 20 20 20 20 70 2d 3e 61 6e  STATUS.    p->an
e300: 45 78 65 63 20 3d 20 61 6c 6c 6f 63 53 70 61 63  Exec = allocSpac
e310: 65 28 26 78 2c 20 70 2d 3e 61 6e 45 78 65 63 2c  e(&x, p->anExec,
e320: 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69   p->nOp*sizeof(i
e330: 36 34 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  64));.#endif.   
e340: 20 69 66 28 20 78 2e 6e 4e 65 65 64 65 64 3d 3d   if( x.nNeeded==
e350: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 78  0 ) break;.    x
e360: 2e 70 53 70 61 63 65 20 3d 20 70 2d 3e 70 46 72  .pSpace = p->pFr
e370: 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ee = sqlite3DbMa
e380: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 78 2e 6e  llocZero(db, x.n
e390: 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 78 2e 6e  Needed);.    x.n
e3a0: 46 72 65 65 20 3d 20 78 2e 6e 4e 65 65 64 65 64  Free = x.nNeeded
e3b0: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 21 64 62 2d  ;.  }while( !db-
e3c0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
e3d0: 0a 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d  ..  p->nCursor =
e3e0: 20 6e 43 75 72 73 6f 72 3b 0a 20 20 70 2d 3e 6e   nCursor;.  p->n
e3f0: 4f 6e 63 65 46 6c 61 67 20 3d 20 6e 4f 6e 63 65  OnceFlag = nOnce
e400: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 56 61 72 20  ;.  if( p->aVar 
e410: 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d  ){.    p->nVar =
e420: 20 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20   (ynVar)nVar;.  
e430: 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61    for(n=0; n<nVa
e440: 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70  r; n++){.      p
e450: 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20  ->aVar[n].flags 
e460: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
e470: 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20    p->aVar[n].db 
e480: 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = db;.    }.  }.
e490: 20 20 70 2d 3e 6e 7a 56 61 72 20 3d 20 70 50 61    p->nzVar = pPa
e4a0: 72 73 65 2d 3e 6e 7a 56 61 72 3b 0a 20 20 70 2d  rse->nzVar;.  p-
e4b0: 3e 61 7a 56 61 72 20 3d 20 70 50 61 72 73 65 2d  >azVar = pParse-
e4c0: 3e 61 7a 56 61 72 3b 0a 20 20 70 50 61 72 73 65  >azVar;.  pParse
e4d0: 2d 3e 6e 7a 56 61 72 20 3d 20 20 30 3b 0a 20 20  ->nzVar =  0;.  
e4e0: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 20 3d 20  pParse->azVar = 
e4f0: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d  0;.  if( p->aMem
e500: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 2d   ){.    p->aMem-
e510: 2d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  -;              
e520: 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b          /* aMem[
e530: 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e  ] goes from 1..n
e540: 4d 65 6d 20 2a 2f 0a 20 20 20 20 70 2d 3e 6e 4d  Mem */.    p->nM
e550: 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20  em = nMem;      
e560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
e570: 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e      not from 0..
e580: 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 66 6f  nMem-1 */.    fo
e590: 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20  r(n=1; n<=nMem; 
e5a0: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  n++){.      p->a
e5b0: 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d  Mem[n].flags = M
e5c0: 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20  EM_Undefined;.  
e5d0: 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64      p->aMem[n].d
e5e0: 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20  b = db;.    }.  
e5f0: 7d 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 3d  }.  p->explain =
e600: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
e610: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
e620: 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  ewind(p);.}../*.
e630: 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20  ** Close a VDBE 
e640: 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61  cursor and relea
e650: 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75  se all the resou
e660: 72 63 65 73 20 74 68 61 74 20 63 75 72 73 6f 72  rces that cursor
e670: 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20   .** happens to 
e680: 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  hold..*/.void sq
e690: 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
e6a0: 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62  sor(Vdbe *p, Vdb
e6b0: 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20  eCursor *pCx){. 
e6c0: 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20   if( pCx==0 ){. 
e6d0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
e6e0: 20 61 73 73 65 72 74 28 20 70 43 78 2d 3e 70 42   assert( pCx->pB
e6f0: 74 3d 3d 30 20 7c 7c 20 70 43 78 2d 3e 65 43 75  t==0 || pCx->eCu
e700: 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
e710: 54 52 45 45 20 29 3b 0a 20 20 73 77 69 74 63 68  TREE );.  switch
e720: 28 20 70 43 78 2d 3e 65 43 75 72 54 79 70 65 20  ( pCx->eCurType 
e730: 29 7b 0a 20 20 20 20 63 61 73 65 20 43 55 52 54  ){.    case CURT
e740: 59 50 45 5f 53 4f 52 54 45 52 3a 20 7b 0a 20 20  YPE_SORTER: {.  
e750: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
e760: 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62  orterClose(p->db
e770: 2c 20 70 43 78 29 3b 0a 20 20 20 20 20 20 62 72  , pCx);.      br
e780: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
e790: 61 73 65 20 43 55 52 54 59 50 45 5f 42 54 52 45  ase CURTYPE_BTRE
e7a0: 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  E: {.      if( p
e7b0: 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  Cx->pBt ){.     
e7c0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
e7d0: 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a  lose(pCx->pBt);.
e7e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
e7f0: 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c  Cx->pCursor will
e800: 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61   be close automa
e810: 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65  tically, if it e
e820: 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20 20 20  xists, by.      
e830: 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62    ** the call ab
e840: 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 65  ove. */.      }e
e850: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
e860: 65 72 74 28 20 70 43 78 2d 3e 75 63 2e 70 43 75  ert( pCx->uc.pCu
e870: 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  rsor!=0 );.     
e880: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
e890: 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e  loseCursor(pCx->
e8a0: 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20  uc.pCursor);.   
e8b0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
e8c0: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
e8d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
e8e0: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73  UALTABLE.    cas
e8f0: 65 20 43 55 52 54 59 50 45 5f 56 54 41 42 3a 20  e CURTYPE_VTAB: 
e900: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
e910: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 43  vtab_cursor *pVC
e920: 75 72 20 3d 20 70 43 78 2d 3e 75 63 2e 70 56 43  ur = pCx->uc.pVC
e930: 75 72 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  ur;.      const 
e940: 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a  sqlite3_module *
e950: 70 4d 6f 64 75 6c 65 20 3d 20 70 56 43 75 72 2d  pModule = pVCur-
e960: 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b  >pVtab->pModule;
e970: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
e980: 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65  VCur->pVtab->nRe
e990: 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 56 43  f>0 );.      pVC
e9a0: 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 2d  ur->pVtab->nRef-
e9b0: 2d 3b 0a 20 20 20 20 20 20 70 4d 6f 64 75 6c 65  -;.      pModule
e9c0: 2d 3e 78 43 6c 6f 73 65 28 70 56 43 75 72 29 3b  ->xClose(pVCur);
e9d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e9e0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d    }.#endif.  }.}
e9f0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  ../*.** Close al
ea00: 6c 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65  l cursors in the
ea10: 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65 2e 0a   current frame..
ea20: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
ea30: 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61  loseCursorsInFra
ea40: 6d 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  me(Vdbe *p){.  i
ea50: 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20  f( p->apCsr ){. 
ea60: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
ea70: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72  r(i=0; i<p->nCur
ea80: 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  sor; i++){.     
ea90: 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 20   VdbeCursor *pC 
eaa0: 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20  = p->apCsr[i];. 
eab0: 20 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a 20       if( pC ){. 
eac0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ead0: 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20  beFreeCursor(p, 
eae0: 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  pC);.        p->
eaf0: 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20  apCsr[i] = 0;.  
eb00: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
eb10: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68  }../*.** Copy th
eb20: 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20  e values stored 
eb30: 69 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d 65  in the VdbeFrame
eb40: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74   structure to it
eb50: 73 20 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20  s Vdbe. This.** 
eb60: 69 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78 61  is used, for exa
eb70: 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 72 69  mple, when a tri
eb80: 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61 6d  gger sub-program
eb90: 20 69 73 20 68 61 6c 74 65 64 20 74 6f 20 72 65   is halted to re
eba0: 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c  store.** control
ebb0: 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 72 6f   to the main pro
ebc0: 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  gram..*/.int sql
ebd0: 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73  ite3VdbeFrameRes
ebe0: 74 6f 72 65 28 56 64 62 65 46 72 61 6d 65 20 2a  tore(VdbeFrame *
ebf0: 70 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 65 20  pFrame){.  Vdbe 
ec00: 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a  *v = pFrame->v;.
ec10: 20 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e    closeCursorsIn
ec20: 46 72 61 6d 65 28 76 29 3b 0a 23 69 66 64 65 66  Frame(v);.#ifdef
ec30: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
ec40: 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20  TMT_SCANSTATUS. 
ec50: 20 76 2d 3e 61 6e 45 78 65 63 20 3d 20 70 46 72   v->anExec = pFr
ec60: 61 6d 65 2d 3e 61 6e 45 78 65 63 3b 0a 23 65 6e  ame->anExec;.#en
ec70: 64 69 66 0a 20 20 76 2d 3e 61 4f 6e 63 65 46 6c  dif.  v->aOnceFl
ec80: 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 6e  ag = pFrame->aOn
ec90: 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 6e 4f 6e  ceFlag;.  v->nOn
eca0: 63 65 46 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d  ceFlag = pFrame-
ecb0: 3e 6e 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d  >nOnceFlag;.  v-
ecc0: 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61  >aOp = pFrame->a
ecd0: 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70  Op;.  v->nOp = p
ece0: 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d  Frame->nOp;.  v-
ecf0: 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e  >aMem = pFrame->
ed00: 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20  aMem;.  v->nMem 
ed10: 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a  = pFrame->nMem;.
ed20: 20 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72    v->apCsr = pFr
ed30: 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d  ame->apCsr;.  v-
ed40: 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d  >nCursor = pFram
ed50: 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d  e->nCursor;.  v-
ed60: 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d  >db->lastRowid =
ed70: 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77   pFrame->lastRow
ed80: 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65  id;.  v->nChange
ed90: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e   = pFrame->nChan
eda0: 67 65 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6e 43 68  ge;.  v->db->nCh
edb0: 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  ange = pFrame->n
edc0: 44 62 43 68 61 6e 67 65 3b 0a 20 20 72 65 74 75  DbChange;.  retu
edd0: 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d  rn pFrame->pc;.}
ede0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  ../*.** Close al
edf0: 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a  l cursors..**.**
ee00: 20 41 6c 73 6f 20 72 65 6c 65 61 73 65 20 61 6e   Also release an
ee10: 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79  y dynamic memory
ee20: 20 68 65 6c 64 20 62 79 20 74 68 65 20 56 4d 20   held by the VM 
ee30: 69 6e 20 74 68 65 20 56 64 62 65 2e 61 4d 65 6d  in the Vdbe.aMem
ee40: 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c   memory .** cell
ee50: 20 61 72 72 61 79 2e 20 54 68 69 73 20 69 73 20   array. This is 
ee60: 6e 65 63 65 73 73 61 72 79 20 61 73 20 74 68 65  necessary as the
ee70: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72   memory cell arr
ee80: 61 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a  ay may contain.*
ee90: 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 56 64  * pointers to Vd
eea0: 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c  beFrame objects,
eeb0: 20 77 68 69 63 68 20 6d 61 79 20 69 6e 20 74 75   which may in tu
eec0: 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74  rn contain point
eed0: 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63  ers to.** open c
eee0: 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  ursors..*/.stati
eef0: 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43  c void closeAllC
ef00: 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b  ursors(Vdbe *p){
ef10: 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65  .  if( p->pFrame
ef20: 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d   ){.    VdbeFram
ef30: 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20 66  e *pFrame;.    f
ef40: 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72  or(pFrame=p->pFr
ef50: 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61  ame; pFrame->pPa
ef60: 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46 72  rent; pFrame=pFr
ef70: 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20  ame->pParent);. 
ef80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
ef90: 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72 61 6d  ameRestore(pFram
efa0: 65 29 3b 0a 20 20 20 20 70 2d 3e 70 46 72 61 6d  e);.    p->pFram
efb0: 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 46  e = 0;.    p->nF
efc0: 72 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  rame = 0;.  }.  
efd0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 46 72 61 6d  assert( p->nFram
efe0: 65 3d 3d 30 20 29 3b 0a 20 20 63 6c 6f 73 65 43  e==0 );.  closeC
eff0: 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 70 29  ursorsInFrame(p)
f000: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20  ;.  if( p->aMem 
f010: 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65  ){.    releaseMe
f020: 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b  mArray(&p->aMem[
f030: 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  1], p->nMem);.  
f040: 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 44  }.  while( p->pD
f050: 65 6c 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56  elFrame ){.    V
f060: 64 62 65 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d  dbeFrame *pDel =
f070: 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20   p->pDelFrame;. 
f080: 20 20 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20     p->pDelFrame 
f090: 3d 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b  = pDel->pParent;
f0a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f0b0: 46 72 61 6d 65 44 65 6c 65 74 65 28 70 44 65 6c  FrameDelete(pDel
f0c0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c  );.  }..  /* Del
f0d0: 65 74 65 20 61 6e 79 20 61 75 78 64 61 74 61 20  ete any auxdata 
f0e0: 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65  allocations made
f0f0: 20 62 79 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20   by the VM */.  
f100: 69 66 28 20 70 2d 3e 70 41 75 78 44 61 74 61 20  if( p->pAuxData 
f110: 29 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  ) sqlite3VdbeDel
f120: 65 74 65 41 75 78 44 61 74 61 28 70 2c 20 2d 31  eteAuxData(p, -1
f130: 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
f140: 70 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30 20 29  p->pAuxData==0 )
f150: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  ;.}../*.** Clean
f160: 20 75 70 20 74 68 65 20 56 4d 20 61 66 74 65 72   up the VM after
f170: 20 61 20 73 69 6e 67 6c 65 20 72 75 6e 2e 0a 2a   a single run..*
f180: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c  /.static void Cl
f190: 65 61 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a  eanup(Vdbe *p){.
f1a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
f1b0: 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66 20 53  p->db;..#ifdef S
f1c0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
f1d0: 20 45 78 65 63 75 74 65 20 61 73 73 65 72 74 28   Execute assert(
f1e0: 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  ) statements to 
f1f0: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
f200: 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64  Vdbe.apCsr[] and
f210: 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d   .  ** Vdbe.aMem
f220: 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65 20 61  [] arrays have a
f230: 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c 65 61  lready been clea
f240: 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e  ned up.  */.  in
f250: 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70  t i;.  if( p->ap
f260: 43 73 72 20 29 20 66 6f 72 28 69 3d 30 3b 20 69  Csr ) for(i=0; i
f270: 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b  <p->nCursor; i++
f280: 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43  ) assert( p->apC
f290: 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 69 66  sr[i]==0 );.  if
f2a0: 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20  ( p->aMem ){.   
f2b0: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e   for(i=1; i<=p->
f2c0: 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72  nMem; i++) asser
f2d0: 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c  t( p->aMem[i].fl
f2e0: 61 67 73 3d 3d 4d 45 4d 5f 55 6e 64 65 66 69 6e  ags==MEM_Undefin
f2f0: 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ed );.  }.#endif
f300: 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ..  sqlite3DbFre
f310: 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
f320: 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  );.  p->zErrMsg 
f330: 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c  = 0;.  p->pResul
f340: 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tSet = 0;.}../*.
f350: 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65  ** Set the numbe
f360: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
f370: 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  mns that will be
f380: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
f390: 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65  s SQL.** stateme
f3a0: 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20  nt. This is now 
f3b0: 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  set at compile t
f3c0: 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e  ime, rather than
f3d0: 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75   during.** execu
f3e0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65  tion of the vdbe
f3f0: 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74   program so that
f400: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
f410: 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62  count() can.** b
f420: 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53  e called on an S
f430: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66  QL statement bef
f440: 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ore sqlite3_step
f450: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
f460: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
f470: 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e  s(Vdbe *p, int n
f480: 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65  ResColumn){.  Me
f490: 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69  m *pColName;.  i
f4a0: 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt n;.  sqlite3 
f4b0: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  *db = p->db;..  
f4c0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
f4d0: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e  p->aColName, p->
f4e0: 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
f4f0: 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33  ME_N);.  sqlite3
f500: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43  DbFree(db, p->aC
f510: 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e  olName);.  n = n
f520: 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
f530: 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f  E_N;.  p->nResCo
f540: 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73  lumn = (u16)nRes
f550: 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f  Column;.  p->aCo
f560: 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65  lName = pColName
f570: 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33   = (Mem*)sqlite3
f580: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
f590: 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29   sizeof(Mem)*n )
f5a0: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e  ;.  if( p->aColN
f5b0: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
f5c0: 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20  .  while( n-- > 
f5d0: 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  0 ){.    pColNam
f5e0: 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  e->flags = MEM_N
f5f0: 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  ull;.    pColNam
f600: 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  e->db = p->db;. 
f610: 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20     pColName++;. 
f620: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
f630: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
f640: 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f  idx'th column to
f650: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
f660: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
f670: 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74  t..** zName must
f680: 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
f690: 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65   a nul terminate
f6a0: 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  d string..**.** 
f6b0: 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62  This call must b
f6c0: 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63  e made after a c
f6d0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64  all to sqlite3Vd
f6e0: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a  beSetNumCols()..
f6f0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20  **.** The final 
f700: 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c  parameter, xDel,
f710: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
f720: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20  SQLITE_DYNAMIC, 
f730: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a  SQLITE_STATIC.**
f740: 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53   or SQLITE_TRANS
f750: 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53  IENT. If it is S
f760: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74  QLITE_DYNAMIC, t
f770: 68 65 6e 20 74 68 65 20 62 75 66 66 65 72 20 70  hen the buffer p
f780: 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20  ointed.** to by 
f790: 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72  zName will be fr
f7a0: 65 65 64 20 62 79 20 73 71 6c 69 74 65 33 44 62  eed by sqlite3Db
f7b0: 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20  Free() when the 
f7c0: 76 64 62 65 20 69 73 20 64 65 73 74 72 6f 79 65  vdbe is destroye
f7d0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
f7e0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
f7f0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
f800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f810: 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e      /* Vdbe bein
f820: 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a  g configured */.
f830: 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20    int idx,      
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f850: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
f860: 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c  olumn zName appl
f870: 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  ies to */.  int 
f880: 76 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  var,            
f890: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f8a0: 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41  One of the COLNA
f8b0: 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a  ME_* constants *
f8c0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
f8d0: 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  zName,          
f8e0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
f8f0: 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  to buffer contai
f900: 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76  ning name */.  v
f910: 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64  oid (*xDel)(void
f920: 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
f930: 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65  /* Memory manage
f940: 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f  ment strategy fo
f950: 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20  r zName */.){.  
f960: 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70  int rc;.  Mem *p
f970: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72  ColName;.  asser
f980: 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f  t( idx<p->nResCo
f990: 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74  lumn );.  assert
f9a0: 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20  ( var<COLNAME_N 
f9b0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
f9c0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
f9d0: 20 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61      assert( !zNa
f9e0: 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49  me || xDel!=SQLI
f9f0: 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20  TE_DYNAMIC );.  
fa00: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fa10: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73  NOMEM;.  }.  ass
fa20: 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  ert( p->aColName
fa30: 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d  !=0 );.  pColNam
fa40: 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d  e = &(p->aColNam
fa50: 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65  e[idx+var*p->nRe
fa60: 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20  sColumn]);.  rc 
fa70: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
fa80: 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c  SetStr(pColName,
fa90: 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49   zName, -1, SQLI
faa0: 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a  TE_UTF8, xDel);.
fab0: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 30 20    assert( rc!=0 
fac0: 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43  || !zName || (pC
fad0: 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45  olName->flags&ME
fae0: 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20  M_Term)!=0 );.  
faf0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
fb00: 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72  .** A read or wr
fb10: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
fb20: 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
fb30: 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61  e active on data
fb40: 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
fb50: 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  b. If a transact
fb60: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63  ion is active, c
fb70: 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65  ommit it. If the
fb80: 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65  re is a.** write
fb90: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61  -transaction spa
fba0: 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  nning more than 
fbb0: 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  one database fil
fbc0: 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  e, this routine.
fbd0: 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66  ** takes care of
fbe0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
fbf0: 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f  nal trickery..*/
fc00: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
fc10: 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a  Commit(sqlite3 *
fc20: 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20  db, Vdbe *p){.  
fc30: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72  int i;.  int nTr
fc40: 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d  ans = 0;  /* Num
fc50: 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65 73  ber of databases
fc60: 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 65 20   with an active 
fc70: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
fc80: 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  n */.  int rc = 
fc90: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
fca0: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30   needXcommit = 0
fcb0: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
fcc0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
fcd0: 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 68 69  LE.  /* With thi
fce0: 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65  s option, sqlite
fcf0: 33 56 74 61 62 53 79 6e 63 28 29 20 69 73 20 64  3VtabSync() is d
fd00: 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73 69 6d  efined to be sim
fd10: 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45  ply .  ** SQLITE
fd20: 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74 20  _OK so p is not 
fd30: 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e  used. .  */.  UN
fd40: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
fd50: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
fd60: 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79  Before doing any
fd70: 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c  thing else, call
fd80: 20 74 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c   the xSync() cal
fd90: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20  lback for any.  
fda0: 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c  ** virtual modul
fdb0: 65 20 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e  e tables written
fdc0: 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63   in this transac
fdd0: 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74  tion. This has t
fde0: 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62  o.  ** be done b
fdf0: 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e  efore determinin
fe00: 67 20 77 68 65 74 68 65 72 20 61 20 6d 61 73 74  g whether a mast
fe10: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
fe20: 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  is .  ** require
fe30: 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29  d, as an xSync()
fe40: 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64   callback may ad
fe50: 64 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61  d an attached da
fe60: 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74  tabase.  ** to t
fe70: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
fe80: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
fe90: 74 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20  te3VtabSync(db, 
fea0: 70 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c  p);..  /* This l
feb0: 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28  oop determines (
fec0: 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74  a) if the commit
fed0: 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20   hook should be 
fee0: 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a  invoked and.  **
fef0: 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61   (b) how many da
ff00: 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 76  tabase files hav
ff10: 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  e open write tra
ff20: 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a  nsactions, not .
ff30: 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74    ** including t
ff40: 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
ff50: 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61  . (b) is importa
ff60: 6e 74 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f  nt because if mo
ff70: 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e  re than .  ** on
ff80: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
ff90: 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  has an open writ
ffa0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e transaction, a
ffb0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
ffc0: 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71    ** file is req
ffd0: 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f  uired for an ato
ffe0: 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f  mic commit..  */
fff0: 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d   .  for(i=0; rc=
10000 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
10010 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
10020 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
10030 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
10040 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
10050 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
10060 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65  Bt) ){.      nee
10070 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  dXcommit = 1;.  
10080 20 20 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e      if( i!=1 ) n
10090 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 73  Trans++;.      s
100a0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
100b0 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20  (pBt);.      rc 
100c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78  = sqlite3PagerEx
100d0 63 6c 75 73 69 76 65 4c 6f 63 6b 28 73 71 6c 69  clusiveLock(sqli
100e0 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42  te3BtreePager(pB
100f0 74 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t));.      sqlit
10100 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
10110 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
10120 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10130 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
10140 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  c;.  }..  /* If 
10150 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 77 72  there are any wr
10160 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite-transactions
10170 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20   at all, invoke 
10180 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  the commit hook 
10190 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f  */.  if( needXco
101a0 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d  mmit && db->xCom
101b0 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  mitCallback ){. 
101c0 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d     rc = db->xCom
101d0 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e  mitCallback(db->
101e0 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20  pCommitArg);.   
101f0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
10200 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
10210 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54  ONSTRAINT_COMMIT
10220 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  HOOK;.    }.  }.
10230 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65  .  /* The simple
10240 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20   case - no more 
10250 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73  than one databas
10260 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e  e file (not coun
10270 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45  ting the.  ** TE
10280 4d 50 20 64 61 74 61 62 61 73 65 29 20 68 61 73  MP database) has
10290 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61   a transaction a
102a0 63 74 69 76 65 2e 20 20 20 54 68 65 72 65 20 69  ctive.   There i
102b0 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68  s no need for th
102c0 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f  e.  ** master-jo
102d0 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  urnal..  **.  **
102e0 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76   If the return v
102f0 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42  alue of sqlite3B
10300 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
10310 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67  ) is a zero leng
10320 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20  th.  ** string, 
10330 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69  it means the mai
10340 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d  n database is :m
10350 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70  emory: or a temp
10360 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a   file.  In .  **
10370 20 74 68 61 74 20 63 61 73 65 20 77 65 20 64 6f   that case we do
10380 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f   not support ato
10390 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63  mic multi-file c
103a0 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74  ommits, so use t
103b0 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20  he .  ** simple 
103c0 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20  case then too.. 
103d0 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c   */.  if( 0==sql
103e0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c  ite3Strlen30(sql
103f0 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
10400 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
10410 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61  pBt)).   || nTra
10420 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66  ns<=1.  ){.    f
10430 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
10440 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
10450 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
10460 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
10470 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
10480 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
10490 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
104a0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
104b0 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20  seOne(pBt, 0);. 
104c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
104d0 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d    /* Do the comm
104e0 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64  it only if all d
104f0 61 74 61 62 61 73 65 73 20 73 75 63 63 65 73 73  atabases success
10500 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70  fully complete p
10510 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20  hase 1. .    ** 
10520 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74  If one of the Bt
10530 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
10540 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c  e() calls fails,
10550 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   this indicates 
10560 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72  an.    ** IO err
10570 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e  or while deletin
10580 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
10590 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  a journal file. 
105a0 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a  It is unlikely,.
105b0 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64      ** but could
105c0 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73   happen. In this
105d0 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72   case abandon pr
105e0 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74  ocessing and ret
105f0 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20  urn the error.. 
10600 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
10610 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
10620 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
10630 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
10640 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
10650 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
10660 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
10670 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
10680 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
10690 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  (pBt, 0);.      
106a0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
106b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
106c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74  .      sqlite3Vt
106d0 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20  abCommit(db);.  
106e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
106f0 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d  e complex case -
10700 20 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74   There is a mult
10710 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61  i-file write-tra
10720 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e  nsaction active.
10730 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69  .  ** This requi
10740 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  res a master jou
10750 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73  rnal file to ens
10760 75 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ure the transact
10770 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d  ion is.  ** comm
10780 69 74 74 65 64 20 61 74 6f 6d 69 63 61 6c 6c 79  itted atomically
10790 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
107a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
107b0 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71  O.  else{.    sq
107c0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
107d0 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20  = db->pVfs;.    
107e0 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30  int needSync = 0
107f0 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73  ;.    char *zMas
10800 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69  ter = 0;   /* Fi
10810 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  le-name for the 
10820 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a  master journal *
10830 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74  /.    char const
10840 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71   *zMainFile = sq
10850 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
10860 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d  ename(db->aDb[0]
10870 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  .pBt);.    sqlit
10880 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
10890 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66   = 0;.    i64 of
108a0 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  fset = 0;.    in
108b0 74 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 72  t res;.    int r
108c0 65 74 72 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20  etryCount = 0;. 
108d0 20 20 20 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65     int nMainFile
108e0 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74  ;..    /* Select
108f0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
10900 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20  l file name */. 
10910 20 20 20 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73     nMainFile = s
10920 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
10930 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a  MainFile);.    z
10940 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
10950 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d  MPrintf(db, "%s-
10960 6d 6a 58 58 58 58 58 58 39 58 58 7a 22 2c 20 7a  mjXXXXXX9XXz", z
10970 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69  MainFile);.    i
10980 66 28 20 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20  f( zMaster==0 ) 
10990 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
109a0 4d 45 4d 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  MEM;.    do {.  
109b0 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b      u32 iRandom;
109c0 0a 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79  .      if( retry
109d0 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  Count ){.       
109e0 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3e   if( retryCount>
109f0 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  100 ){.         
10a00 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
10a10 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65  ITE_FULL, "MJ de
10a20 6c 65 74 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74  lete: %s", zMast
10a30 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  er);.          s
10a40 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
10a50 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
10a60 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
10a70 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
10a80 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3d   if( retryCount=
10a90 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =1 ){.          
10aa0 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
10ab0 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c  TE_FULL, "MJ col
10ac0 6c 69 64 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74  lide: %s", zMast
10ad0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  er);.        }. 
10ae0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
10af0 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20  ryCount++;.     
10b00 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
10b10 65 73 73 28 73 69 7a 65 6f 66 28 69 52 61 6e 64  ess(sizeof(iRand
10b20 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a  om), &iRandom);.
10b30 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
10b40 70 72 69 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73  printf(13, &zMas
10b50 74 65 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20  ter[nMainFile], 
10b60 22 2d 6d 6a 25 30 36 58 39 25 30 32 58 22 2c 0a  "-mj%06X9%02X",.
10b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
10b90 69 52 61 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66  iRandom>>8)&0xff
10ba0 66 66 66 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78  ffff, iRandom&0x
10bb0 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ff);.      /* Th
10bc0 65 20 61 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74  e antipenultimat
10bd0 65 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74  e character of t
10be0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10bf0 6c 20 6e 61 6d 65 20 6d 75 73 74 0a 20 20 20 20  l name must.    
10c00 20 20 2a 2a 20 62 65 20 22 39 22 20 74 6f 20 61    ** be "9" to a
10c10 76 6f 69 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73  void name collis
10c20 69 6f 6e 73 20 77 68 65 6e 20 75 73 69 6e 67 20  ions when using 
10c30 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a  8+3 filenames. *
10c40 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
10c50 7a 4d 61 73 74 65 72 5b 73 71 6c 69 74 65 33 53  zMaster[sqlite3S
10c60 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72 29  trlen30(zMaster)
10c70 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20  -3]=='9' );.    
10c80 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66    sqlite3FileSuf
10c90 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20  fix3(zMainFile, 
10ca0 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
10cb0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
10cc0 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74  cess(pVfs, zMast
10cd0 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  er, SQLITE_ACCES
10ce0 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b  S_EXISTS, &res);
10cf0 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  .    }while( rc=
10d00 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65  =SQLITE_OK && re
10d10 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  s );.    if( rc=
10d20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10d30 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
10d40 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
10d50 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
10d60 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f  lite3OsOpenMallo
10d70 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  c(pVfs, zMaster,
10d80 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20   &pMaster, .    
10d90 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
10da0 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
10db0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a  TE_OPEN_CREATE|.
10dc0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
10dd0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c  _OPEN_EXCLUSIVE|
10de0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
10df0 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20  ER_JOURNAL, 0.  
10e00 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
10e10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10e20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
10e30 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
10e40 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
10e50 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
10e60 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
10e70 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64  e name of each d
10e80 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
10e90 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
10ea0 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20  into the new.   
10eb0 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   ** master journ
10ec0 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65  al file. If an e
10ed0 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74  rror occurs at t
10ee0 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a  his point close.
10ef0 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74      ** and delet
10f00 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
10f10 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74  rnal file. All t
10f20 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  he individual jo
10f30 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20  urnal files.    
10f40 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e  ** still have 'n
10f50 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74  ull' as the mast
10f60 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
10f70 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c  er, so they will
10f80 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63   roll.    ** bac
10f90 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20  k independently 
10fa0 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63  if a failure occ
10fb0 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  urs..    */.    
10fc0 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
10fd0 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
10fe0 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
10ff0 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
11000 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
11010 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
11020 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ) ){.        cha
11030 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d  r const *zFile =
11040 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
11050 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29  Journalname(pBt)
11060 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46  ;.        if( zF
11070 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ile==0 ){.      
11080 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f      continue;  /
11090 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e  * Ignore TEMP an
110a0 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62  d :memory: datab
110b0 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ases */.        
110c0 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
110d0 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b  ( zFile[0]!=0 );
110e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6e 65  .        if( !ne
110f0 65 64 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74  edSync && !sqlit
11100 65 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62  e3BtreeSyncDisab
11110 6c 65 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20  led(pBt) ){.    
11120 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d        needSync =
11130 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
11140 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
11150 65 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65  e3OsWrite(pMaste
11160 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65  r, zFile, sqlite
11170 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29  3Strlen30(zFile)
11180 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  +1, offset);.   
11190 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73       offset += s
111a0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
111b0 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20  File)+1;.       
111c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
111d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
111e0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
111f0 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
11200 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
11210 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
11220 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ster, 0);.      
11230 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
11240 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
11250 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
11260 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
11270 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
11280 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61    /* Sync the ma
11290 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
112a0 65 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f  e. If the IOCAP_
112b0 53 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63  SEQUENTIAL devic
112c0 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73  e.    ** flag is
112d0 20 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74   set this is not
112e0 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
112f0 2f 0a 20 20 20 20 69 66 28 20 6e 65 65 64 53 79  /.    if( needSy
11300 6e 63 20 0a 20 20 20 20 20 26 26 20 30 3d 3d 28  nc .     && 0==(
11310 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
11320 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
11330 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49  Master)&SQLITE_I
11340 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
11350 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f  .     && SQLITE_
11360 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
11370 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c  3OsSync(pMaster,
11380 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
11390 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  MAL)).    ){.   
113a0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
113b0 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  eFree(pMaster);.
113c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
113d0 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
113e0 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ter, 0);.      s
113f0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
11400 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
11410 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
11420 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61  }..    /* Sync a
11430 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73 20  ll the db files 
11440 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20  involved in the 
11450 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
11460 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a   same call.    *
11470 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73 74 65  * sets the maste
11480 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
11490 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69  r in each indivi
114a0 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  dual journal. If
114b0 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  .    ** an error
114c0 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f   occurs here, do
114d0 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
114e0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
114f0 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
11500 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20  ** If the error 
11510 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
11520 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a  e first call to.
11530 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74      ** sqlite3Bt
11540 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
11550 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20  e(), then there 
11560 69 73 20 61 20 63 68 61 6e 63 65 20 74 68 61 74  is a chance that
11570 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74   the.    ** mast
11580 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
11590 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64  will be orphaned
115a0 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20  . But we cannot 
115b0 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a  delete it,.    *
115c0 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61  * in case the ma
115d0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
115e0 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74  e name was writt
115f0 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
11600 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
11610 62 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75  before the failu
11620 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20  re occurred..   
11630 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
11640 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
11650 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
11660 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20  ){ .      Btree 
11670 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
11680 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
11690 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
116a0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
116b0 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
116c0 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  pBt, zMaster);. 
116d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
116e0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
116f0 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
11700 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
11710 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 20 20 20  LITE_BUSY );.   
11720 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11730 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
11740 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
11750 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
11760 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
11770 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68      /* Delete th
11780 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11790 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d   file. This comm
117a0 69 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  its the transact
117b0 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a  ion. After.    *
117c0 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65  * doing this the
117d0 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 73 79   directory is sy
117e0 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72  nced again befor
117f0 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c  e any individual
11800 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
11810 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65  ion files are de
11820 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
11830 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
11840 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
11850 73 74 65 72 2c 20 6e 65 65 64 53 79 6e 63 29 3b  ster, needSync);
11860 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
11870 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
11880 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30  .    zMaster = 0
11890 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
118a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
118b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
118c0 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72  ll files and dir
118d0 65 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c  ectories have al
118e0 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65  ready been synce
118f0 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  d, so the follow
11900 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73  ing.    ** calls
11910 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
11920 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
11930 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e   are only closin
11940 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20  g files and.    
11950 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74  ** deleting or t
11960 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61  runcating journa
11970 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67  ls. If something
11980 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c   goes wrong whil
11990 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73  e.    ** this is
119a0 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f   happening we do
119b0 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e  n't really care.
119c0 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f   The integrity o
119d0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  f the.    ** tra
119e0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65  nsaction is alre
119f0 61 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20  ady guaranteed, 
11a00 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27  but some stray '
11a10 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20  cold' journals. 
11a20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69     ** may be lyi
11a30 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72  ng around. Retur
11a40 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f  ning an error co
11a50 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61  de won't help ma
11a60 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  tters..    */.  
11a70 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
11a80 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
11a90 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
11aa0 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
11ab0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
11ac0 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
11ad0 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
11ae0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
11af0 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
11b00 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
11b10 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
11b20 61 73 65 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a  aseTwo(pBt, 1);.
11b30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11b40 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
11b50 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
11b60 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
11b70 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20  _io_errors();.. 
11b80 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f     sqlite3VtabCo
11b90 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  mmit(db);.  }.#e
11ba0 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
11bb0 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69  c;.}../* .** Thi
11bc0 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
11bd0 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
11be0 33 2e 6e 56 64 62 65 41 63 74 69 76 65 20 63 6f  3.nVdbeActive co
11bf0 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  unt variable.** 
11c00 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62  matches the numb
11c10 65 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20  er of vdbe's in 
11c20 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33  the list sqlite3
11c30 2e 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a  .pVdbe that are.
11c40 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ** currently act
11c50 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f  ive. An assertio
11c60 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74  n fails if the t
11c70 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74  wo counts do not
11c80 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20   match..** This 
11c90 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73  is an internal s
11ca0 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d  elf-check only -
11cb0 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73   it is not an es
11cc0 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69  sential processi
11cd0 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a  ng.** step..**.*
11ce0 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  * This is a no-o
11cf0 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64  p if NDEBUG is d
11d00 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64  efined..*/.#ifnd
11d10 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63  ef NDEBUG.static
11d20 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76   void checkActiv
11d30 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33  eVdbeCnt(sqlite3
11d40 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70   *db){.  Vdbe *p
11d50 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  ;.  int cnt = 0;
11d60 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20  .  int nWrite = 
11d70 30 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64 20 3d  0;.  int nRead =
11d80 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56   0;.  p = db->pV
11d90 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  dbe;.  while( p 
11da0 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
11db0 65 33 5f 73 74 6d 74 5f 62 75 73 79 28 28 73 71  e3_stmt_busy((sq
11dc0 6c 69 74 65 33 5f 73 74 6d 74 2a 29 70 29 20 29  lite3_stmt*)p) )
11dd0 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20  {.      cnt++;. 
11de0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64       if( p->read
11df0 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65  Only==0 ) nWrite
11e00 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ++;.      if( p-
11e10 3e 62 49 73 52 65 61 64 65 72 20 29 20 6e 52 65  >bIsReader ) nRe
11e20 61 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ad++;.    }.    
11e30 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
11e40 7d 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d  }.  assert( cnt=
11e50 3d 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65  =db->nVdbeActive
11e60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57   );.  assert( nW
11e70 72 69 74 65 3d 3d 64 62 2d 3e 6e 56 64 62 65 57  rite==db->nVdbeW
11e80 72 69 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  rite );.  assert
11e90 28 20 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e 56 64  ( nRead==db->nVd
11ea0 62 65 52 65 61 64 20 29 3b 0a 7d 0a 23 65 6c 73  beRead );.}.#els
11eb0 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41  e.#define checkA
11ec0 63 74 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a  ctiveVdbeCnt(x).
11ed0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
11ee0 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64   the Vdbe passed
11ef0 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
11f00 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61 20  gument opened a 
11f10 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61  statement-transa
11f20 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20  ction,.** close 
11f30 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74  it now. Argument
11f40 20 65 4f 70 20 6d 75 73 74 20 62 65 20 65 69 74   eOp must be eit
11f50 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  her SAVEPOINT_RO
11f60 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56  LLBACK or.** SAV
11f70 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20  EPOINT_RELEASE. 
11f80 49 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49  If it is SAVEPOI
11f90 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
11fa0 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  n the statement.
11fb0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
11fc0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49  s rolled back. I
11fd0 66 20 65 4f 70 20 69 73 20 53 41 56 45 50 4f 49  f eOp is SAVEPOI
11fe0 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e  NT_RELEASE, then
11ff0 20 74 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65   the .** stateme
12000 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
12010 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a  s committed..**.
12020 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
12030 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c  r occurs, an SQL
12040 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72  ITE_IOERR_XXX er
12050 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
12060 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  rned. .** Otherw
12070 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
12080 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
12090 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
120a0 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70  Vdbe *p, int eOp
120b0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 63 6f  ){.  sqlite3 *co
120c0 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  nst db = p->db;.
120d0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
120e0 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  E_OK;..  /* If p
120f0 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20  ->iStatement is 
12100 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
12110 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 56 64 62  o, then this Vdb
12120 65 20 6f 70 65 6e 65 64 20 61 20 0a 20 20 2a 2a  e opened a .  **
12130 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
12140 61 63 74 69 6f 6e 20 74 68 61 74 20 73 68 6f 75  action that shou
12150 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 68 65 72  ld be closed her
12160 65 2e 20 54 68 65 20 6f 6e 6c 79 20 65 78 63 65  e. The only exce
12170 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 68  ption.  ** is th
12180 61 74 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6d  at an IO error m
12190 61 79 20 68 61 76 65 20 6f 63 63 75 72 72 65 64  ay have occurred
121a0 2c 20 63 61 75 73 69 6e 67 20 61 6e 20 65 6d 65  , causing an eme
121b0 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 2e  rgency rollback.
121c0 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61  .  ** In this ca
121d0 73 65 20 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65  se (db->nStateme
121e0 6e 74 3d 3d 30 29 2c 20 61 6e 64 20 74 68 65 72  nt==0), and ther
121f0 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20  e is nothing to 
12200 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  do..  */.  if( d
12210 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26 26  b->nStatement &&
12220 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 29   p->iStatement )
12230 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
12240 20 63 6f 6e 73 74 20 69 6e 74 20 69 53 61 76 65   const int iSave
12250 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74  point = p->iStat
12260 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20 20 61 73  ement-1;..    as
12270 73 65 72 74 28 20 65 4f 70 3d 3d 53 41 56 45 50  sert( eOp==SAVEP
12280 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c  OINT_ROLLBACK ||
12290 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
122a0 52 45 4c 45 41 53 45 29 3b 0a 20 20 20 20 61 73  RELEASE);.    as
122b0 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65  sert( db->nState
122c0 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 20 20 61 73  ment>0 );.    as
122d0 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d  sert( p->iStatem
122e0 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65  ent==(db->nState
122f0 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f  ment+db->nSavepo
12300 69 6e 74 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72  int) );..    for
12310 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
12320 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e   i++){ .      in
12330 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f  t rc2 = SQLITE_O
12340 4b 3b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  K;.      Btree *
12350 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
12360 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
12370 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  pBt ){.        i
12380 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  f( eOp==SAVEPOIN
12390 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
123a0 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71          rc2 = sq
123b0 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
123c0 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49  int(pBt, SAVEPOI
123d0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61  NT_ROLLBACK, iSa
123e0 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
123f0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
12400 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2==SQLITE_OK )
12410 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 32 20  {.          rc2 
12420 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  = sqlite3BtreeSa
12430 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56  vepoint(pBt, SAV
12440 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20  EPOINT_RELEASE, 
12450 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
12460 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
12470 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12480 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
12490 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 20 20   = rc2;.        
124a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
124b0 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65      db->nStateme
124c0 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69 53 74  nt--;.    p->iSt
124d0 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20  atement = 0;..  
124e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
124f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
12500 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
12510 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
12520 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12530 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62  VtabSavepoint(db
12540 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  , SAVEPOINT_ROLL
12550 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74  BACK, iSavepoint
12560 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
12570 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12580 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
12590 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61   = sqlite3VtabSa
125a0 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45  vepoint(db, SAVE
125b0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69  POINT_RELEASE, i
125c0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
125d0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
125e0 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65  * If the stateme
125f0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
12600 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
12610 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72  ack, also restor
12620 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61  e the .    ** da
12630 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64  tabase handles d
12640 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69  eferred constrai
12650 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f 20 74 68  nt counter to th
12660 65 20 76 61 6c 75 65 20 69 74 20 68 61 64 20 77  e value it had w
12670 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  hen .    ** the 
12680 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
12690 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
126a0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f  .  */.    if( eO
126b0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
126c0 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 64  LBACK ){.      d
126d0 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
126e0 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f   = p->nStmtDefCo
126f0 6e 73 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44  ns;.      db->nD
12700 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d  eferredImmCons =
12710 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d 6d 43   p->nStmtDefImmC
12720 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ons;.    }.  }. 
12730 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12740 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
12750 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
12760 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  n a transaction 
12770 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 64 61  opened by the da
12780 74 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c  tabase .** handl
12790 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
127a0 68 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20  h the VM passed 
127b0 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 69  as an argument i
127c0 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a  s about to be .*
127d0 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20  * committed. If 
127e0 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
127f0 6e 64 69 6e 67 20 64 65 66 65 72 72 65 64 20 66  nding deferred f
12800 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
12810 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69  raint.** violati
12820 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ons, return SQLI
12830 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72 77  TE_ERROR. Otherw
12840 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
12850 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  **.** If there a
12860 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 46  re outstanding F
12870 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64  K violations and
12880 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
12890 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54  eturns .** SQLIT
128a0 45 5f 45 52 52 4f 52 2c 20 73 65 74 20 74 68 65  E_ERROR, set the
128b0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 56   result of the V
128c0 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53  M to SQLITE_CONS
128d0 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45  TRAINT_FOREIGNKE
128e0 59 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 61  Y.** and write a
128f0 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
12900 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 74 75  to it. Then retu
12910 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e  rn SQLITE_ERROR.
12920 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
12930 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
12940 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  KEY.int sqlite3V
12950 64 62 65 43 68 65 63 6b 46 6b 28 56 64 62 65 20  dbeCheckFk(Vdbe 
12960 2a 70 2c 20 69 6e 74 20 64 65 66 65 72 72 65 64  *p, int deferred
12970 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
12980 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20   = p->db;.  if( 
12990 28 64 65 66 65 72 72 65 64 20 26 26 20 28 64 62  (deferred && (db
129a0 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 2b  ->nDeferredCons+
129b0 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
129c0 43 6f 6e 73 29 3e 30 29 20 0a 20 20 20 7c 7c 20  Cons)>0) .   || 
129d0 28 21 64 65 66 65 72 72 65 64 20 26 26 20 70 2d  (!deferred && p-
129e0 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30  >nFkConstraint>0
129f0 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 72  ) .  ){.    p->r
12a00 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
12a10 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59  RAINT_FOREIGNKEY
12a20 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41 63  ;.    p->errorAc
12a30 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  tion = OE_Abort;
12a40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12a50 45 72 72 6f 72 28 70 2c 20 22 46 4f 52 45 49 47  Error(p, "FOREIG
12a60 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  N KEY constraint
12a70 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 72   failed");.    r
12a80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
12a90 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
12aa0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
12ab0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
12ac0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
12ad0 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56 44  ed the when a VD
12ae0 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74  BE tries to halt
12af0 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a  .  If the VDBE.*
12b00 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67  * has made chang
12b10 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74  es and is in aut
12b20 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68  ocommit mode, th
12b30 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a  en commit those.
12b40 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20  ** changes.  If 
12b50 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65  a rollback is ne
12b60 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68  eded, then do th
12b70 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  e rollback..**.*
12b80 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
12b90 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74  s the only way t
12ba0 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65  o move the state
12bb0 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a   of a VM from.**
12bc0 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55   SQLITE_MAGIC_RU
12bd0 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49  N to SQLITE_MAGI
12be0 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68  C_HALT.  It is h
12bf0 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61  armless to.** ca
12c00 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20  ll this on a VM 
12c10 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 53  that is in the S
12c20 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54  QLITE_MAGIC_HALT
12c30 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   state..**.** Re
12c40 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
12c50 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  de.  If the comm
12c60 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d  it could not com
12c70 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f 66  plete because of
12c80 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74  .** lock content
12c90 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ion, return SQLI
12ca0 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c  TE_BUSY.  If SQL
12cb0 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
12cc0 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e  rned, it.** mean
12cd0 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20  s the close did 
12ce0 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e  not happen and n
12cf0 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65 61  eeds to be repea
12d00 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
12d10 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62 65  te3VdbeHalt(Vdbe
12d20 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20   *p){.  int rc; 
12d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d40 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
12d50 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69 65  to store transie
12d60 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20  nt return codes 
12d70 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
12d80 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20   = p->db;..  /* 
12d90 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
12da0 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63  ntains the logic
12db0 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73   that determines
12dc0 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20   if a statement 
12dd0 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  or.  ** transact
12de0 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d  ion will be comm
12df0 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
12e00 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74  back as a result
12e10 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65   of the.  ** exe
12e20 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76  cution of this v
12e30 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20  irtual machine. 
12e40 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e  .  **.  ** If an
12e50 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
12e60 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a  ng errors occur:
12e70 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
12e80 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a  QLITE_NOMEM.  **
12e90 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52       SQLITE_IOER
12ea0 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  R.  **     SQLIT
12eb0 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  E_FULL.  **     
12ec0 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
12ed0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20  .  **.  ** Then 
12ee0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63  the internal cac
12ef0 68 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65  he might have be
12f00 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e  en left in an in
12f10 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20  consistent.  ** 
12f20 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20  state.  We need 
12f30 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
12f40 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
12f50 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20  ction, if there 
12f60 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20  is.  ** one, or 
12f70 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61  the complete tra
12f80 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72  nsaction if ther
12f90 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e  e is no statemen
12fa0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
12fb0 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62   */..  if( p->db
12fc0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
12fd0 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
12fe0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
12ff0 20 20 69 66 28 20 70 2d 3e 61 4f 6e 63 65 46 6c    if( p->aOnceFl
13000 61 67 20 29 20 6d 65 6d 73 65 74 28 70 2d 3e 61  ag ) memset(p->a
13010 4f 6e 63 65 46 6c 61 67 2c 20 30 2c 20 70 2d 3e  OnceFlag, 0, p->
13020 6e 4f 6e 63 65 46 6c 61 67 29 3b 0a 20 20 63 6c  nOnceFlag);.  cl
13030 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29  oseAllCursors(p)
13040 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  ;.  if( p->magic
13050 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  !=VDBE_MAGIC_RUN
13060 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
13070 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
13080 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
13090 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  nt(db);..  /* No
130a0 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62   commit or rollb
130b0 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68  ack needed if th
130c0 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20  e program never 
130d0 73 74 61 72 74 65 64 20 6f 72 20 69 66 20 74 68  started or if th
130e0 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65  e.  ** SQL state
130f0 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 72 65  ment does not re
13100 61 64 20 6f 72 20 77 72 69 74 65 20 61 20 64 61  ad or write a da
13110 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 2a 2f  tabase file.  */
13120 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
13130 26 26 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  && p->bIsReader 
13140 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20  ){.    int mrc; 
13150 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72    /* Primary err
13160 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e  or code from p->
13170 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53  rc */.    int eS
13180 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a  tatementOp = 0;.
13190 20 20 20 20 69 6e 74 20 69 73 53 70 65 63 69 61      int isSpecia
131a0 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20  lError;         
131b0 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75     /* Set to tru
131c0 65 20 69 66 20 61 20 27 73 70 65 63 69 61 6c 27  e if a 'special'
131d0 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f   error */..    /
131e0 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65  * Lock all btree
131f0 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73 74  s used by the st
13200 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73  atement */.    s
13210 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28  qlite3VdbeEnter(
13220 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  p);..    /* Chec
13230 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  k for one of the
13240 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20   special errors 
13250 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e  */.    mrc = p->
13260 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20 69  rc & 0xff;.    i
13270 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20  sSpecialError = 
13280 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  mrc==SQLITE_NOME
13290 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  M || mrc==SQLITE
132a0 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20  _IOERR.         
132b0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d              || m
132c0 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52  rc==SQLITE_INTER
132d0 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c  RUPT || mrc==SQL
132e0 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66  ITE_FULL;.    if
132f0 28 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72  ( isSpecialError
13300 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
13310 74 68 65 20 71 75 65 72 79 20 77 61 73 20 72 65  the query was re
13320 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65 20  ad-only and the 
13330 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51  error code is SQ
13340 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2c 20  LITE_INTERRUPT, 
13350 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c  .      ** no rol
13360 6c 62 61 63 6b 20 69 73 20 6e 65 63 65 73 73 61  lback is necessa
13370 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  ry. Otherwise, a
13380 74 20 6c 65 61 73 74 20 61 20 73 61 76 65 70 6f  t least a savepo
13390 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72  int .      ** tr
133a0 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
133b0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f  e rolled back to
133c0 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
133d0 61 62 61 73 65 20 74 6f 20 61 20 0a 20 20 20 20  abase to a .    
133e0 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20    ** consistent 
133f0 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  state..      **.
13400 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69 66        ** Even if
13410 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
13420 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74 20  s read-only, it 
13430 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  is important to 
13440 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a  perform.      **
13450 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20   a statement or 
13460 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c  transaction roll
13470 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20  back operation. 
13480 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a 20 20  If the error .  
13490 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 65 64 20      ** occurred 
134a0 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f  while writing to
134b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 75   the journal, su
134c0 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61 74  b-journal or dat
134d0 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66  abase.      ** f
134e0 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20 61  ile as part of a
134f0 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72 65 65  n effort to free
13500 20 75 70 20 63 61 63 68 65 20 73 70 61 63 65 20   up cache space 
13510 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20  (see function.  
13520 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74 72 65      ** pagerStre
13530 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e 63 29  ss() in pager.c)
13540 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69  , the rollback i
13550 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 72 65  s required to re
13560 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20  store .      ** 
13570 74 68 65 20 70 61 67 65 72 20 74 6f 20 61 20 63  the pager to a c
13580 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e  onsistent state.
13590 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
135a0 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79  if( !p->readOnly
135b0 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f   || mrc!=SQLITE_
135c0 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20  INTERRUPT ){.   
135d0 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d 3d 53       if( (mrc==S
135e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d  QLITE_NOMEM || m
135f0 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29  rc==SQLITE_FULL)
13600 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a   && p->usesStmtJ
13610 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
13620 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70      eStatementOp
13630 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c   = SAVEPOINT_ROL
13640 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d  LBACK;.        }
13650 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
13660 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65 64  /* We are forced
13670 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68   to roll back th
13680 65 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  e active transac
13690 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69  tion. Before doi
136a0 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ng.          ** 
136b0 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74  so, abort any ot
136c0 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74  her statements t
136d0 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65  his handle curre
136e0 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e  ntly has active.
136f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
13700 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
13710 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
13720 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
13730 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  BACK);.         
13740 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
13750 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
13760 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
13770 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
13780 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
13790 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
137a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
137b0 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 69    /* Check for i
137c0 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e  mmediate foreign
137d0 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2e   key violations.
137e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   */.    if( p->r
137f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
13800 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13810 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b 0a  eCheckFk(p, 0);.
13820 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
13830 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  If the auto-comm
13840 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 61  it flag is set a
13850 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20 6f  nd this is the o
13860 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69 74 65  nly active write
13870 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74 68  r .    ** VM, th
13880 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72 20  en we do either 
13890 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c  a commit or roll
138a0 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72  back of the curr
138b0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
138c0 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
138d0 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b  Note: This block
138e0 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e   also runs if on
138f0 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  e of the special
13900 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20   errors handled 
13910 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61  .    ** above ha
13920 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20 20  s occurred. .   
13930 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71 6c   */.    if( !sql
13940 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28 64  ite3VtabInSync(d
13950 62 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e  b) .     && db->
13960 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20  autoCommit .    
13970 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 57 72 69   && db->nVdbeWri
13980 74 65 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79  te==(p->readOnly
13990 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20  ==0) .    ){.   
139a0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
139b0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65  LITE_OK || (p->e
139c0 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46  rrorAction==OE_F
139d0 61 69 6c 20 26 26 20 21 69 73 53 70 65 63 69 61  ail && !isSpecia
139e0 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20  lError) ){.     
139f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
13a00 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29  dbeCheckFk(p, 1)
13a10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
13a20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13a30 20 20 20 20 20 20 20 20 20 69 66 28 20 4e 45 56           if( NEV
13a40 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29 20  ER(p->readOnly) 
13a50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
13a60 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28  qlite3VdbeLeave(
13a70 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p);.            
13a80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
13a90 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ROR;.          }
13aa0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
13ab0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
13ac0 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20  T_FOREIGNKEY;.  
13ad0 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20 20        }else{ .  
13ae0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61          /* The a
13af0 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
13b00 69 73 20 74 72 75 65 2c 20 74 68 65 20 76 64 62  is true, the vdb
13b10 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73 75  e program was su
13b20 63 63 65 73 73 66 75 6c 20 0a 20 20 20 20 20 20  ccessful .      
13b30 20 20 20 20 2a 2a 20 6f 72 20 68 69 74 20 61 6e      ** or hit an
13b40 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73 74   'OR FAIL' const
13b50 72 61 69 6e 74 20 61 6e 64 20 74 68 65 72 65 20  raint and there 
13b60 61 72 65 20 6e 6f 20 64 65 66 65 72 72 65 64 20  are no deferred 
13b70 66 6f 72 65 69 67 6e 0a 20 20 20 20 20 20 20 20  foreign.        
13b80 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72 61    ** key constra
13b90 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75 70 20  ints to hold up 
13ba0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
13bb0 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63 6f   This means a co
13bc0 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20 20 20  mmit .          
13bd0 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ** is required. 
13be0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
13bf0 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c  = vdbeCommit(db,
13c00 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   p);.        }. 
13c10 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
13c20 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 2d  QLITE_BUSY && p-
13c30 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
13c40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13c50 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  beLeave(p);.    
13c60 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
13c70 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
13c80 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d    }else if( rc!=
13c90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13ca0 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72         p->rc = r
13cb0 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  c;.          sql
13cc0 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
13cd0 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  db, SQLITE_OK);.
13ce0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68            p->nCh
13cf0 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  ange = 0;.      
13d00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13d10 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
13d20 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  Cons = 0;.      
13d30 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
13d40 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20  dImmCons = 0;.  
13d50 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67          db->flag
13d60 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66  s &= ~SQLITE_Def
13d70 65 72 46 4b 73 3b 0a 20 20 20 20 20 20 20 20 20  erFKs;.         
13d80 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e   sqlite3CommitIn
13d90 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62  ternalChanges(db
13da0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
13db0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13dc0 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
13dd0 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
13de0 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  OK);.        p->
13df0 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
13e00 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6e     }.      db->n
13e10 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20  Statement = 0;. 
13e20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74     }else if( eSt
13e30 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a  atementOp==0 ){.
13e40 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
13e50 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d  =SQLITE_OK || p-
13e60 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
13e70 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20  _Fail ){.       
13e80 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
13e90 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
13ea0 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  E;.      }else i
13eb0 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  f( p->errorActio
13ec0 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20  n==OE_Abort ){. 
13ed0 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e         eStatemen
13ee0 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f  tOp = SAVEPOINT_
13ef0 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20  ROLLBACK;.      
13f00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
13f10 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
13f20 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f  l(db, SQLITE_ABO
13f30 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20  RT_ROLLBACK);.  
13f40 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
13f50 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
13f60 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75  ;.        db->au
13f70 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
13f80 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
13f90 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
13fa0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
13fb0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69 73   eStatementOp is
13fc0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
13fd0 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
13fe0 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  saction needs to
13ff0 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69  .    ** be commi
14000 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
14010 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65  ack. Call sqlite
14020 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
14030 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20  ent() to.    ** 
14040 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20 6f  do so. If this o
14050 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e 73  peration returns
14060 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74   an error, and t
14070 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
14080 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f  ment.    ** erro
14090 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45  r code is SQLITE
140a0 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f  _OK or SQLITE_CO
140b0 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20 70  NSTRAINT, then p
140c0 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20 2a  romote the.    *
140d0 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  * current statem
140e0 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ent error code..
140f0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65      */.    if( e
14100 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20  StatementOp ){. 
14110 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14120 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
14130 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e  ent(p, eStatemen
14140 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tOp);.      if( 
14150 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  rc ){.        if
14160 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
14170 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66  OK || (p->rc&0xf
14180 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  f)==SQLITE_CONST
14190 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20 20  RAINT ){.       
141a0 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
141b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
141c0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
141d0 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrMsg);.        
141e0 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
141f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14200 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
14210 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
14220 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
14230 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
14240 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
14250 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64  s(db);.        d
14260 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
14270 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  1;.        p->nC
14280 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
14290 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
142a0 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61  /* If this was a
142b0 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45  n INSERT, UPDATE
142c0 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20 6e   or DELETE and n
142d0 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  o statement tran
142e0 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68  saction.    ** h
142f0 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  as been rolled b
14300 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65 20  ack, update the 
14310 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
14320 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  ion change-count
14330 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  er. .    */.    
14340 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74  if( p->changeCnt
14350 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  On ){.      if( 
14360 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41  eStatementOp!=SA
14370 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
14380 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
14390 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
143a0 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65  s(db, p->nChange
143b0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
143c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
143d0 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62  dbeSetChanges(db
143e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
143f0 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
14400 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
14410 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f  * Release the lo
14420 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  cks */.    sqlit
14430 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a  e3VdbeLeave(p);.
14440 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76    }..  /* We hav
14450 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68  e successfully h
14460 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64  alted and closed
14470 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64   the VM.  Record
14480 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20   this fact. */. 
14490 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b   if( p->pc>=0 ){
144a0 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62 65 41 63  .    db->nVdbeAc
144b0 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20  tive--;.    if( 
144c0 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 20 64  !p->readOnly ) d
144d0 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d 2d 3b  b->nVdbeWrite--;
144e0 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52  .    if( p->bIsR
144f0 65 61 64 65 72 20 29 20 64 62 2d 3e 6e 56 64 62  eader ) db->nVdb
14500 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61 73 73  eRead--;.    ass
14510 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63  ert( db->nVdbeAc
14520 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62 65 52  tive>=db->nVdbeR
14530 65 61 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ead );.    asser
14540 74 28 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64  t( db->nVdbeRead
14550 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  >=db->nVdbeWrite
14560 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
14570 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e 3d  db->nVdbeWrite>=
14580 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61  0 );.  }.  p->ma
14590 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
145a0 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63  _HALT;.  checkAc
145b0 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b  tiveVdbeCnt(db);
145c0 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
145d0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
145e0 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
145f0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f  _NOMEM;.  }..  /
14600 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f  * If the auto-co
14610 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74  mmit flag is set
14620 20 74 6f 20 74 72 75 65 2c 20 74 68 65 6e 20 61   to true, then a
14630 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 65  ny locks that we
14640 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20  re held.  ** by 
14650 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61  connection db ha
14660 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65  ve now been rele
14670 61 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74  ased. Call sqlit
14680 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f  e3ConnectionUnlo
14690 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20  cked() .  ** to 
146a0 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71 75 69  invoke any requi
146b0 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66  red unlock-notif
146c0 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a  y callbacks..  *
146d0 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f  /.  if( db->auto
146e0 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  Commit ){.    sq
146f0 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55  lite3ConnectionU
14700 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d  nlocked(db);.  }
14710 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ..  assert( db->
14720 6e 56 64 62 65 41 63 74 69 76 65 3e 30 20 7c 7c  nVdbeActive>0 ||
14730 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d   db->autoCommit=
14740 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65  =0 || db->nState
14750 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74  ment==0 );.  ret
14760 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49  urn (p->rc==SQLI
14770 54 45 5f 42 55 53 59 20 3f 20 53 51 4c 49 54 45  TE_BUSY ? SQLITE
14780 5f 42 55 53 59 20 3a 20 53 51 4c 49 54 45 5f 4f  _BUSY : SQLITE_O
14790 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61  K);.}.../*.** Ea
147a0 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68  ch VDBE holds th
147b0 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
147c0 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
147d0 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a  te3_step() call.
147e0 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68  ** in p->rc.  Th
147f0 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
14800 74 68 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b  that result back
14810 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a   to SQLITE_OK..*
14820 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
14830 62 65 52 65 73 65 74 53 74 65 70 52 65 73 75 6c  beResetStepResul
14840 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d  t(Vdbe *p){.  p-
14850 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
14860 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74  .}../*.** Copy t
14870 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  he error code an
14880 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  d error message 
14890 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65  belonging to the
148a0 20 56 44 42 45 20 70 61 73 73 65 64 0a 2a 2a 20   VDBE passed.** 
148b0 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
148c0 75 6d 65 6e 74 20 74 6f 20 69 74 73 20 64 61 74  ument to its dat
148d0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28 73 6f  abase handle (so
148e0 20 74 68 61 74 20 74 68 65 79 20 77 69 6c 6c 20   that they will 
148f0 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  be .** returned 
14900 62 79 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  by calls to sqli
14910 74 65 33 5f 65 72 72 63 6f 64 65 28 29 20 61 6e  te3_errcode() an
14920 64 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  d sqlite3_errmsg
14930 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ())..**.** This 
14940 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
14950 74 20 63 6c 65 61 72 20 74 68 65 20 56 44 42 45  t clear the VDBE
14960 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 72 20 6d   error code or m
14970 65 73 73 61 67 65 2c 20 6a 75 73 74 0a 2a 2a 20  essage, just.** 
14980 63 6f 70 69 65 73 20 74 68 65 6d 20 74 6f 20 74  copies them to t
14990 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
149a0 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
149b0 65 33 56 64 62 65 54 72 61 6e 73 66 65 72 45 72  e3VdbeTransferEr
149c0 72 6f 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ror(Vdbe *p){.  
149d0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
149e0 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  >db;.  int rc = 
149f0 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70 2d 3e  p->rc;.  if( p->
14a00 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 75  zErrMsg ){.    u
14a10 38 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  8 mallocFailed =
14a20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
14a30 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  d;.    sqlite3Be
14a40 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
14a50 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70  );.    if( db->p
14a60 45 72 72 3d 3d 30 20 29 20 64 62 2d 3e 70 45 72  Err==0 ) db->pEr
14a70 72 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  r = sqlite3Value
14a80 4e 65 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c  New(db);.    sql
14a90 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
14aa0 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d  db->pErr, -1, p-
14ab0 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45  >zErrMsg, SQLITE
14ac0 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52  _UTF8, SQLITE_TR
14ad0 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
14ae0 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
14af0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 64 62 2d 3e  lloc();.    db->
14b00 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d  mallocFailed = m
14b10 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20  allocFailed;.   
14b20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72   db->errCode = r
14b30 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  c;.  }else{.    
14b40 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
14b50 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75   rc);.  }.  retu
14b60 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  rn rc;.}..#ifdef
14b70 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
14b80 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61  QLLOG./*.** If a
14b90 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  n SQLITE_CONFIG_
14ba0 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73 20 72  SQLLOG hook is r
14bb0 65 67 69 73 74 65 72 65 64 20 61 6e 64 20 74 68  egistered and th
14bc0 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20 72 75  e VM has been ru
14bd0 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69 74  n, .** invoke it
14be0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
14bf0 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f   vdbeInvokeSqllo
14c00 67 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 69 66  g(Vdbe *v){.  if
14c10 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
14c20 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 26 26  onfig.xSqllog &&
14c30 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   v->rc==SQLITE_O
14c40 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26 26 20  K && v->zSql && 
14c50 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  v->pc>=0 ){.    
14c60 63 68 61 72 20 2a 7a 45 78 70 61 6e 64 65 64 20  char *zExpanded 
14c70 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70  = sqlite3VdbeExp
14c80 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a 53 71  andSql(v, v->zSq
14c90 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  l);.    assert( 
14ca0 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  v->db->init.busy
14cb0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  ==0 );.    if( z
14cc0 45 78 70 61 6e 64 65 64 20 29 7b 0a 20 20 20 20  Expanded ){.    
14cd0 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
14ce0 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 0a 20  onfig.xSqllog(. 
14cf0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14d00 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71  GlobalConfig.pSq
14d10 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62 2c 20  llogArg, v->db, 
14d20 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a 20 20 20  zExpanded, 1.   
14d30 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69     );.      sqli
14d40 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c  te3DbFree(v->db,
14d50 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20 20 20   zExpanded);.   
14d60 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23   }.  }.}.#else.#
14d70 20 64 65 66 69 6e 65 20 76 64 62 65 49 6e 76 6f   define vdbeInvo
14d80 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65 6e 64  keSqllog(x).#end
14d90 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  if../*.** Clean 
14da0 75 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20  up a VDBE after 
14db0 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f  execution but do
14dc0 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
14dd0 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a  VDBE just yet..*
14de0 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f  * Write any erro
14df0 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20  r messages into 
14e00 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75  *pzErrMsg.  Retu
14e10 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  rn the result co
14e20 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  de..**.** After 
14e30 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
14e40 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68  run, the VDBE sh
14e50 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f  ould be ready to
14e60 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20   be executed.** 
14e70 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  again..**.** To 
14e80 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68  look at it anoth
14e90 65 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75  er way, this rou
14ea0 74 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20  tine resets the 
14eb0 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20  state of the.** 
14ec0 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
14ed0 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f  from VDBE_MAGIC_
14ee0 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49  RUN or VDBE_MAGI
14ef0 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a  C_HALT back to.*
14f00 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  * VDBE_MAGIC_INI
14f10 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  T..*/.int sqlite
14f20 33 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20  3VdbeReset(Vdbe 
14f30 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
14f40 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62  db;.  db = p->db
14f50 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56  ;..  /* If the V
14f60 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f  M did not run to
14f70 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69   completion or i
14f80 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64  f it encountered
14f90 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20   an.  ** error, 
14fa0 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f  then it might no
14fb0 74 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74  t have been halt
14fc0 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f  ed properly.  So
14fd0 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f   halt.  ** it no
14fe0 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  w..  */.  sqlite
14ff0 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a 20  3VdbeHalt(p);.. 
15000 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45 20   /* If the VDBE 
15010 68 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20  has be run even 
15020 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20  partially, then 
15030 74 72 61 6e 73 66 65 72 20 74 68 65 20 65 72 72  transfer the err
15040 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64  or code.  ** and
15050 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   error message f
15060 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74  rom the VDBE int
15070 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  o the main datab
15080 61 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  ase structure.  
15090 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  But.  ** if the 
150a0 56 44 42 45 20 68 61 73 20 6a 75 73 74 20 62 65  VDBE has just be
150b0 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75  en set to run bu
150c0 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c  t has not actual
150d0 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a  ly executed any.
150e0 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
150f0 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65  s yet, leave the
15100 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 65   main database e
15110 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  rror information
15120 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f   unchanged..  */
15130 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
15140 29 7b 0a 20 20 20 20 76 64 62 65 49 6e 76 6f 6b  ){.    vdbeInvok
15150 65 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20 20 20  eSqllog(p);.    
15160 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73  sqlite3VdbeTrans
15170 66 65 72 45 72 72 6f 72 28 70 29 3b 0a 20 20 20  ferError(p);.   
15180 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
15190 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
151a0 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
151b0 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   0;.    if( p->r
151c0 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e  unOnlyOnce ) p->
151d0 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d  expired = 1;.  }
151e0 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26  else if( p->rc &
151f0 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a  & p->expired ){.
15200 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72      /* The expir
15210 65 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20  ed flag was set 
15220 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f  on the VDBE befo
15230 72 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  re the first cal
15240 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69  l.    ** to sqli
15250 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20  te3_step(). For 
15260 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e  consistency (sin
15270 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  ce sqlite3_step(
15280 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c  ) was.    ** cal
15290 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61  led), set the da
152a0 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20  tabase error in 
152b0 74 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c  this case as wel
152c0 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  l..    */.    sq
152d0 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73  lite3ErrorWithMs
152e0 67 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e  g(db, p->rc, p->
152f0 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a  zErrMsg ? "%s" :
15300 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b   0, p->zErrMsg);
15310 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
15320 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
15330 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d  g);.    p->zErrM
15340 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  sg = 0;.  }..  /
15350 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65  * Reclaim all me
15360 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 65  mory used by the
15370 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65   VDBE.  */.  Cle
15380 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53  anup(p);..  /* S
15390 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e  ave profiling in
153a0 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
153b0 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20  his VDBE run..  
153c0 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  */.#ifdef VDBE_P
153d0 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46  ROFILE.  {.    F
153e0 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e  ILE *out = fopen
153f0 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f  ("vdbe_profile.o
15400 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69  ut", "a");.    i
15410 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20  f( out ){.      
15420 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72  int i;.      fpr
15430 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20  intf(out, "---- 
15440 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ");.      for(i=
15450 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
15460 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
15470 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20  tf(out, "%02x", 
15480 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65  p->aOp[i].opcode
15490 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
154a0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
154b0 6e 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  n");.      if( p
154c0 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20  ->zSql ){.      
154d0 20 20 63 68 61 72 20 63 2c 20 70 63 20 3d 20 30    char c, pc = 0
154e0 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  ;.        fprint
154f0 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20  f(out, "-- ");. 
15500 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
15510 28 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29  (c = p->zSql[i])
15520 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  !=0; i++){.     
15530 20 20 20 20 20 69 66 28 20 70 63 3d 3d 27 5c 6e       if( pc=='\n
15540 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ' ) fprintf(out,
15550 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20   "-- ");.       
15560 20 20 20 70 75 74 63 28 63 2c 20 6f 75 74 29 3b     putc(c, out);
15570 0a 20 20 20 20 20 20 20 20 20 20 70 63 20 3d 20  .          pc = 
15580 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
15590 20 20 20 20 20 69 66 28 20 70 63 21 3d 27 5c 6e       if( pc!='\n
155a0 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ' ) fprintf(out,
155b0 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a   "\n");.      }.
155c0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
155d0 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
155e0 20 20 20 20 20 20 20 63 68 61 72 20 7a 48 64 72         char zHdr
155f0 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 73  [100];.        s
15600 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
15610 73 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20 7a 48  sizeof(zHdr), zH
15620 64 72 2c 20 22 25 36 75 20 25 31 32 6c 6c 75 20  dr, "%6u %12llu 
15630 25 38 6c 6c 75 20 22 2c 0a 20 20 20 20 20 20 20  %8llu ",.       
15640 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
15650 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  t,.           p-
15660 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a  >aOp[i].cycles,.
15670 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
15680 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e  p[i].cnt>0 ? p->
15690 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d  aOp[i].cycles/p-
156a0 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a  >aOp[i].cnt : 0.
156b0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
156c0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
156d0 22 25 73 22 2c 20 7a 48 64 72 29 3b 0a 20 20 20  "%s", zHdr);.   
156e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
156f0 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20  PrintOp(out, i, 
15700 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20  &p->aOp[i]);.   
15710 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73     }.      fclos
15720 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20  e(out);.    }.  
15730 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 69 43  }.#endif.  p->iC
15740 75 72 72 65 6e 74 54 69 6d 65 20 3d 20 30 3b 0a  urrentTime = 0;.
15750 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
15760 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20  E_MAGIC_INIT;.  
15770 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64  return p->rc & d
15780 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a  b->errMask;.}. .
15790 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61  /*.** Clean up a
157a0 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42 45  nd delete a VDBE
157b0 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
157c0 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  .  Return an int
157d0 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a  eger which is.**
157e0 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65   the result code
157f0 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72 72  .  Write any err
15800 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20  or message text 
15810 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a  into *pzErrMsg..
15820 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
15830 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20  beFinalize(Vdbe 
15840 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
15850 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
15860 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
15870 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e  MAGIC_RUN || p->
15880 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
15890 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63  C_HALT ){.    rc
158a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
158b0 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65  set(p);.    asse
158c0 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d  rt( (rc & p->db-
158d0 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b  >errMask)==rc );
158e0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
158f0 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72  beDelete(p);.  r
15900 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15910 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
15920 69 4f 70 20 69 73 20 6c 65 73 73 20 74 68 61 6e  iOp is less than
15930 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e 76 6f   zero, then invo
15940 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  ke the destructo
15950 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75 78  r for.** all aux
15960 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e  iliary data poin
15970 74 65 72 73 20 63 75 72 72 65 6e 74 6c 79 20 63  ters currently c
15980 61 63 68 65 64 20 62 79 20 74 68 65 20 56 4d 20  ached by the VM 
15990 70 61 73 73 65 64 20 61 73 0a 2a 2a 20 74 68 65  passed as.** the
159a0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
159b0 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 4f  .**.** Or, if iO
159c0 70 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  p is greater tha
159d0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
159e0 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 65 73  ro, then the des
159f0 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e  tructor is.** on
15a00 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20 74  ly invoked for t
15a10 68 6f 73 65 20 61 75 78 69 6c 69 61 72 79 20 64  hose auxiliary d
15a20 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63 72 65  ata pointers cre
15a30 61 74 65 64 20 62 79 20 74 68 65 20 75 73 65 72  ated by the user
15a40 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 6e   .** function in
15a50 76 6f 6b 65 64 20 62 79 20 74 68 65 20 4f 50 5f  voked by the OP_
15a60 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20  Function opcode 
15a70 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  at instruction i
15a80 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70 56 64  Op of .** VM pVd
15a90 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65  be, and only the
15aa0 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  n if:.**.**    *
15ab0 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
15ac0 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74  function paramet
15ad0 65 72 20 69 73 20 74 68 65 20 33 32 6e 64 20 6f  er is the 32nd o
15ae0 72 20 6c 61 74 65 72 20 28 63 6f 75 6e 74 69 6e  r later (countin
15af0 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 6c  g.**      from l
15b00 65 66 74 20 74 6f 20 72 69 67 68 74 29 2c 20 6f  eft to right), o
15b10 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65  r.**.**    * the
15b20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
15b30 69 74 20 69 6e 20 61 72 67 75 6d 65 6e 74 20 6d  it in argument m
15b40 61 73 6b 20 69 73 20 63 6c 65 61 72 20 28 77 68  ask is clear (wh
15b50 65 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a 2a  ere the first.**
15b60 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 70        function p
15b70 61 72 61 6d 65 74 65 72 20 63 6f 72 72 65 73 70  arameter corresp
15b80 6f 6e 64 73 20 74 6f 20 62 69 74 20 30 20 65 74  onds to bit 0 et
15b90 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  c.)..*/.void sql
15ba0 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
15bb0 78 44 61 74 61 28 56 64 62 65 20 2a 70 56 64 62  xData(Vdbe *pVdb
15bc0 65 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74 20  e, int iOp, int 
15bd0 6d 61 73 6b 29 7b 0a 20 20 41 75 78 44 61 74 61  mask){.  AuxData
15be0 20 2a 2a 70 70 20 3d 20 26 70 56 64 62 65 2d 3e   **pp = &pVdbe->
15bf0 70 41 75 78 44 61 74 61 3b 0a 20 20 77 68 69 6c  pAuxData;.  whil
15c00 65 28 20 2a 70 70 20 29 7b 0a 20 20 20 20 41 75  e( *pp ){.    Au
15c10 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20 2a 70  xData *pAux = *p
15c20 70 3b 0a 20 20 20 20 69 66 28 20 28 69 4f 70 3c  p;.    if( (iOp<
15c30 30 29 0a 20 20 20 20 20 7c 7c 20 28 70 41 75 78  0).     || (pAux
15c40 2d 3e 69 4f 70 3d 3d 69 4f 70 20 26 26 20 28 70  ->iOp==iOp && (p
15c50 41 75 78 2d 3e 69 41 72 67 3e 33 31 20 7c 7c 20  Aux->iArg>31 || 
15c60 21 28 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49 54  !(mask & MASKBIT
15c70 33 32 28 70 41 75 78 2d 3e 69 41 72 67 29 29 29  32(pAux->iArg)))
15c80 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74  ).    ){.      t
15c90 65 73 74 63 61 73 65 28 20 70 41 75 78 2d 3e 69  estcase( pAux->i
15ca0 41 72 67 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20  Arg==31 );.     
15cb0 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65   if( pAux->xDele
15cc0 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  te ){.        pA
15cd0 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78  ux->xDelete(pAux
15ce0 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d  ->pAux);.      }
15cf0 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 41 75  .      *pp = pAu
15d00 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  x->pNext;.      
15d10 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 56  sqlite3DbFree(pV
15d20 64 62 65 2d 3e 64 62 2c 20 70 41 75 78 29 3b 0a  dbe->db, pAux);.
15d30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15d40 20 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e 65 78   pp= &pAux->pNex
15d50 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  t;.    }.  }.}..
15d60 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d  /*.** Free all m
15d70 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
15d80 20 77 69 74 68 20 74 68 65 20 56 64 62 65 20 70   with the Vdbe p
15d90 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
15da0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  ond argument,.**
15db0 20 65 78 63 65 70 74 20 66 6f 72 20 6f 62 6a 65   except for obje
15dc0 63 74 20 69 74 73 65 6c 66 2c 20 77 68 69 63 68  ct itself, which
15dd0 20 69 73 20 70 72 65 73 65 72 76 65 64 2e 0a 2a   is preserved..*
15de0 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
15df0 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
15e00 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71   function and sq
15e10 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
15e20 29 20 69 73 20 74 68 61 74 0a 2a 2a 20 56 64 62  ) is that.** Vdb
15e30 65 44 65 6c 65 74 65 28 29 20 61 6c 73 6f 20 75  eDelete() also u
15e40 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64 62 65 20  nlinks the Vdbe 
15e50 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66  from the list of
15e60 20 56 4d 73 20 61 73 73 6f 63 69 61 74 65 64 20   VMs associated 
15e70 77 69 74 68 0a 2a 2a 20 74 68 65 20 64 61 74 61  with.** the data
15e80 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
15e90 61 6e 64 20 66 72 65 65 73 20 74 68 65 20 6f 62  and frees the ob
15ea0 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a  ject itself..*/.
15eb0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
15ec0 43 6c 65 61 72 4f 62 6a 65 63 74 28 73 71 6c 69  ClearObject(sqli
15ed0 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70  te3 *db, Vdbe *p
15ee0 29 7b 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20  ){.  SubProgram 
15ef0 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20  *pSub, *pNext;. 
15f00 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
15f10 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d  ( p->db==0 || p-
15f20 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c  >db==db );.  rel
15f30 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
15f40 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a  aVar, p->nVar);.
15f50 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
15f60 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70  y(p->aColName, p
15f70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c  ->nResColumn*COL
15f80 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70  NAME_N);.  for(p
15f90 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b  Sub=p->pProgram;
15fa0 20 70 53 75 62 3b 20 70 53 75 62 3d 70 4e 65 78   pSub; pSub=pNex
15fb0 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
15fc0 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSub->pNext;.   
15fd0 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
15fe0 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20  (db, pSub->aOp, 
15ff0 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20  pSub->nOp);.    
16000 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
16010 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20 66  , pSub);.  }.  f
16020 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b  or(i=p->nzVar-1;
16030 20 69 3e 3d 30 3b 20 69 2d 2d 29 20 73 71 6c 69   i>=0; i--) sqli
16040 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
16050 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a 20 20 73 71  >azVar[i]);.  sq
16060 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
16070 70 2d 3e 61 7a 56 61 72 29 3b 0a 20 20 76 64 62  p->azVar);.  vdb
16080 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c  eFreeOpArray(db,
16090 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29   p->aOp, p->nOp)
160a0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
160b0 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d  e(db, p->aColNam
160c0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
160d0 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29  ree(db, p->zSql)
160e0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
160f0 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b  e(db, p->pFree);
16100 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
16110 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
16120 54 41 54 55 53 0a 20 20 66 6f 72 28 69 3d 30 3b  TATUS.  for(i=0;
16130 20 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20 69 2b 2b   i<p->nScan; i++
16140 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
16150 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61  Free(db, p->aSca
16160 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  n[i].zName);.  }
16170 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
16180 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 29 3b 0a  (db, p->aScan);.
16190 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
161a0 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
161b0 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73   VDBE..*/.void s
161c0 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
161d0 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c  (Vdbe *p){.  sql
161e0 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
161f0 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72   NEVER(p==0) ) r
16200 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d  eturn;.  db = p-
16210 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73  >db;.  assert( s
16220 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
16230 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
16240 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65    sqlite3VdbeCle
16250 61 72 4f 62 6a 65 63 74 28 64 62 2c 20 70 29 3b  arObject(db, p);
16260 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
16270 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d  ){.    p->pPrev-
16280 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
16290 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
162a0 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62  assert( db->pVdb
162b0 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e  e==p );.    db->
162c0 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74  pVdbe = p->pNext
162d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
162e0 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Next ){.    p->p
162f0 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
16300 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d  >pPrev;.  }.  p-
16310 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
16320 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64  GIC_DEAD;.  p->d
16330 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  b = 0;.  sqlite3
16340 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d  DbFree(db, p);.}
16350 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73  ../*.** The curs
16360 6f 72 20 22 70 22 20 68 61 73 20 61 20 70 65 6e  or "p" has a pen
16370 64 69 6e 67 20 73 65 65 6b 20 6f 70 65 72 61 74  ding seek operat
16380 69 6f 6e 20 74 68 61 74 20 68 61 73 20 6e 6f 74  ion that has not
16390 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20 63 61 72   yet been.** car
163a0 72 69 65 64 20 6f 75 74 2e 20 20 53 65 65 6b 20  ried out.  Seek 
163b0 74 68 65 20 63 75 72 73 6f 72 20 6e 6f 77 2e 20  the cursor now. 
163c0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
163d0 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 74  urs, return.** t
163e0 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  he appropriate e
163f0 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
16400 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
16410 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 44  NOINLINE handleD
16420 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 56 64  eferredMoveto(Vd
16430 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  beCursor *p){.  
16440 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66  int res, rc;.#if
16450 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
16460 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
16470 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
16480 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  t;.#endif.  asse
16490 72 74 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d  rt( p->deferredM
164a0 6f 76 65 74 6f 20 29 3b 0a 20 20 61 73 73 65 72  oveto );.  asser
164b0 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b  t( p->isTable );
164c0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43  .  assert( p->eC
164d0 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
164e0 42 54 52 45 45 20 29 3b 0a 20 20 72 63 20 3d 20  BTREE );.  rc = 
164f0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
16500 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 75 63  toUnpacked(p->uc
16510 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e  .pCursor, 0, p->
16520 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c  movetoTarget, 0,
16530 20 26 72 65 73 29 3b 0a 20 20 69 66 28 20 72 63   &res);.  if( rc
16540 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
16550 69 66 28 20 72 65 73 21 3d 30 20 29 20 72 65 74  if( res!=0 ) ret
16560 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
16570 50 54 5f 42 4b 50 54 3b 0a 23 69 66 64 65 66 20  PT_BKPT;.#ifdef 
16580 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71  SQLITE_TEST.  sq
16590 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
165a0 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70  nt++;.#endif.  p
165b0 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
165c0 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65   = 0;.  p->cache
165d0 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
165e0 54 41 4c 45 3b 0a 20 20 72 65 74 75 72 6e 20 53  TALE;.  return S
165f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
16600 2a 2a 20 53 6f 6d 65 74 68 69 6e 67 20 68 61 73  ** Something has
16610 20 6d 6f 76 65 64 20 63 75 72 73 6f 72 20 22 70   moved cursor "p
16620 22 20 6f 75 74 20 6f 66 20 70 6c 61 63 65 2e 20  " out of place. 
16630 20 4d 61 79 62 65 20 74 68 65 20 72 6f 77 20 69   Maybe the row i
16640 74 20 77 61 73 0a 2a 2a 20 70 6f 69 6e 74 65 64  t was.** pointed
16650 20 74 6f 20 77 61 73 20 64 65 6c 65 74 65 64 20   to was deleted 
16660 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 69  out from under i
16670 74 2e 20 20 4f 72 20 6d 61 79 62 65 20 74 68 65  t.  Or maybe the
16680 20 62 74 72 65 65 20 77 61 73 0a 2a 2a 20 72 65   btree was.** re
16690 62 61 6c 61 6e 63 65 64 2e 20 20 57 68 61 74 65  balanced.  Whate
166a0 76 65 72 20 74 68 65 20 63 61 75 73 65 2c 20 74  ver the cause, t
166b0 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20 22 70  ry to restore "p
166c0 22 20 74 6f 20 74 68 65 20 70 6c 61 63 65 20 69  " to the place i
166d0 74 0a 2a 2a 20 69 73 20 73 75 70 70 6f 73 65 64  t.** is supposed
166e0 20 74 6f 20 62 65 20 70 6f 69 6e 74 69 6e 67 2e   to be pointing.
166f0 20 20 49 66 20 74 68 65 20 72 6f 77 20 77 61 73    If the row was
16700 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
16710 6d 20 75 6e 64 65 72 20 74 68 65 0a 2a 2a 20 63  m under the.** c
16720 75 72 73 6f 72 2c 20 73 65 74 20 74 68 65 20 63  ursor, set the c
16730 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74  ursor to point t
16740 6f 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f  o a NULL row..*/
16750 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
16760 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64  TE_NOINLINE hand
16770 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 56 64  leMovedCursor(Vd
16780 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  beCursor *p){.  
16790 69 6e 74 20 69 73 44 69 66 66 65 72 65 6e 74 52  int isDifferentR
167a0 6f 77 2c 20 72 63 3b 0a 20 20 61 73 73 65 72 74  ow, rc;.  assert
167b0 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43  ( p->eCurType==C
167c0 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
167d0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 75 63 2e    assert( p->uc.
167e0 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20  pCursor!=0 );.  
167f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
16800 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76  treeCursorHasMov
16810 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72  ed(p->uc.pCursor
16820 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
16830 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
16840 73 74 6f 72 65 28 70 2d 3e 75 63 2e 70 43 75 72  store(p->uc.pCur
16850 73 6f 72 2c 20 26 69 73 44 69 66 66 65 72 65 6e  sor, &isDifferen
16860 74 52 6f 77 29 3b 0a 20 20 70 2d 3e 63 61 63 68  tRow);.  p->cach
16870 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
16880 53 54 41 4c 45 3b 0a 20 20 69 66 28 20 69 73 44  STALE;.  if( isD
16890 69 66 66 65 72 65 6e 74 52 6f 77 20 29 20 70 2d  ifferentRow ) p-
168a0 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20  >nullRow = 1;.  
168b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
168c0 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 65 6e 73  .** Check to ens
168d0 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
168e0 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 52  sor is valid.  R
168f0 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
16900 72 0a 2a 2a 20 69 66 20 6e 65 65 64 20 62 65 2e  r.** if need be.
16910 20 20 52 65 74 75 72 6e 20 61 6e 79 20 49 2f 4f    Return any I/O
16920 20 65 72 72 6f 72 20 66 72 6f 6d 20 74 68 65 20   error from the 
16930 72 65 73 74 6f 72 65 20 6f 70 65 72 61 74 69 6f  restore operatio
16940 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
16950 33 56 64 62 65 43 75 72 73 6f 72 52 65 73 74 6f  3VdbeCursorResto
16960 72 65 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70  re(VdbeCursor *p
16970 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
16980 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
16990 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 69 66 28  E_BTREE );.  if(
169a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
169b0 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75  sorHasMoved(p->u
169c0 63 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20  c.pCursor) ){.  
169d0 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d    return handleM
169e0 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20  ovedCursor(p);. 
169f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
16a00 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
16a10 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 75  Make sure the cu
16a20 72 73 6f 72 20 70 20 69 73 20 72 65 61 64 79 20  rsor p is ready 
16a30 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
16a40 20 74 68 65 20 72 6f 77 20 74 6f 20 77 68 69 63   the row to whic
16a50 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74  h it.** was last
16a60 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52 65   positioned.  Re
16a70 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
16a80 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75  de if an OOM fau
16a90 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a  lt or I/O error.
16aa0 2a 2a 20 70 72 65 76 65 6e 74 73 20 75 73 20 66  ** prevents us f
16ab0 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20  rom positioning 
16ac0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74  the cursor to it
16ad0 73 20 63 6f 72 72 65 63 74 20 70 6f 73 69 74 69  s correct positi
16ae0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d  on..**.** If a M
16af0 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20  oveTo operation 
16b00 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68  is pending on th
16b10 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20  e given cursor, 
16b20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20  then do that.** 
16b30 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20  MoveTo now.  If 
16b40 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e 64 69  no move is pendi
16b50 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65  ng, check to see
16b60 20 69 66 20 74 68 65 20 72 6f 77 20 68 61 73 20   if the row has 
16b70 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20  been.** deleted 
16b80 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
16b90 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 69 66  he cursor and if
16ba0 20 69 74 20 68 61 73 2c 20 6d 61 72 6b 20 74 68   it has, mark th
16bb0 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55  e row as.** a NU
16bc0 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66  LL row..**.** If
16bd0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
16be0 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
16bf0 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 72  to the correct r
16c00 6f 77 20 61 6e 64 20 74 68 61 74 20 72 6f 77 20  ow and that row 
16c10 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20  has.** not been 
16c20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
16c30 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f   under the curso
16c40 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  r, then this rou
16c50 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
16c60 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
16c70 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28  dbeCursorMoveto(
16c80 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 70 70 2c  VdbeCursor **pp,
16c90 20 69 6e 74 20 2a 70 69 43 6f 6c 29 7b 0a 20 20   int *piCol){.  
16ca0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 20 3d 20  VdbeCursor *p = 
16cb0 2a 70 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 43  *pp;.  if( p->eC
16cc0 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
16cd0 42 54 52 45 45 20 29 7b 0a 20 20 20 20 69 66 28  BTREE ){.    if(
16ce0 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65   p->deferredMove
16cf0 74 6f 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  to ){.      int 
16d00 69 4d 61 70 3b 0a 20 20 20 20 20 20 69 66 28 20  iMap;.      if( 
16d10 70 2d 3e 61 41 6c 74 4d 61 70 20 26 26 20 28 69  p->aAltMap && (i
16d20 4d 61 70 20 3d 20 70 2d 3e 61 41 6c 74 4d 61 70  Map = p->aAltMap
16d30 5b 31 2b 2a 70 69 43 6f 6c 5d 29 3e 30 20 29 7b  [1+*piCol])>0 ){
16d40 0a 20 20 20 20 20 20 20 20 2a 70 70 20 3d 20 70  .        *pp = p
16d50 2d 3e 70 41 6c 74 43 75 72 73 6f 72 3b 0a 20 20  ->pAltCursor;.  
16d60 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69        *piCol = i
16d70 4d 61 70 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  Map - 1;.       
16d80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16d90 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
16da0 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 44 65   return handleDe
16db0 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 70 29 3b  ferredMoveto(p);
16dc0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
16dd0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
16de0 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e  rHasMoved(p->uc.
16df0 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20  pCursor) ){.    
16e00 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d    return handleM
16e10 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20  ovedCursor(p);. 
16e20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
16e30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
16e40 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
16e50 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a  ing functions:.*
16e60 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  *.** sqlite3Vdbe
16e70 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20  SerialType().** 
16e80 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
16e90 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71  lTypeLen().** sq
16ea0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c  lite3VdbeSerialL
16eb0 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  en().** sqlite3V
16ec0 64 62 65 53 65 72 69 61 6c 50 75 74 28 29 0a 2a  dbeSerialPut().*
16ed0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
16ee0 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65  ialGet().**.** e
16ef0 6e 63 61 70 73 75 6c 61 74 65 20 74 68 65 20 63  ncapsulate the c
16f00 6f 64 65 20 74 68 61 74 20 73 65 72 69 61 6c 69  ode that seriali
16f10 7a 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73  zes values for s
16f20 74 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65  torage in SQLite
16f30 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64  .** data and ind
16f40 65 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68  ex records. Each
16f50 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75   serialized valu
16f60 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a  e consists of a.
16f70 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27  ** 'serial-type'
16f80 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64   and a blob of d
16f90 61 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20  ata. The serial 
16fa0 74 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74  type is an 8-byt
16fb0 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e  e unsigned.** in
16fc0 74 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73  teger, stored as
16fd0 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a   a varint..**.**
16fe0 20 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e   In an SQLite in
16ff0 64 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20  dex record, the 
17000 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 73  serial type is s
17010 74 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20 62  tored directly b
17020 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f  efore.** the blo
17030 62 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69  b of data that i
17040 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
17050 2e 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63  . In a table rec
17060 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a  ord, all serial.
17070 2a 2a 20 74 79 70 65 73 20 61 72 65 20 73 74 6f  ** types are sto
17080 72 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74  red at the start
17090 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20   of the record, 
170a0 61 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66  and the blobs of
170b0 20 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20   data at.** the 
170c0 65 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65  end. Hence these
170d0 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77   functions allow
170e0 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68   the caller to h
170f0 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72  andle the.** ser
17100 69 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74  ial-type and dat
17110 61 20 62 6c 6f 62 20 73 65 70 61 72 61 74 65 6c  a blob separatel
17120 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  y..**.** The fol
17130 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73  lowing table des
17140 63 72 69 62 65 73 20 74 68 65 20 76 61 72 69 6f  cribes the vario
17150 75 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73  us storage class
17160 65 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a  es for data:.**.
17170 2a 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70 65  **   serial type
17180 20 20 20 20 20 20 20 20 62 79 74 65 73 20 6f 66          bytes of
17190 20 64 61 74 61 20 20 20 20 20 20 74 79 70 65 0a   data      type.
171a0 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
171b0 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ---     --------
171c0 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d  -------    -----
171d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
171e0 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
171f0 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
17200 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20        NULL.**   
17210 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
17220 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20           1      
17230 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
17240 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20  eger.**      2  
17250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17260 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
17270 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
17280 2a 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20  *      3        
17290 20 20 20 20 20 20 20 20 20 20 20 20 20 33 20 20               3  
172a0 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
172b0 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
172c0 20 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20   4              
172d0 20 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20         4        
172e0 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
172f0 65 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20  er.**      5    
17300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17310 20 36 20 20 20 20 20 20 20 20 20 20 20 20 73 69   6            si
17320 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
17330 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20       6          
17340 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20             8    
17350 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
17360 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37  nteger.**      7
17370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17380 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20       8          
17390 20 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20    IEEE float.** 
173a0 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20       8          
173b0 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
173c0 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20          Integer 
173d0 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20  constant 0.**   
173e0 20 20 20 39 20 20 20 20 20 20 20 20 20 20 20 20     9            
173f0 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
17400 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f        Integer co
17410 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20  nstant 1.**     
17420 31 30 2c 31 31 20 20 20 20 20 20 20 20 20 20 20  10,11           
17430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17440 20 20 20 20 72 65 73 65 72 76 65 64 20 66 6f 72      reserved for
17450 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20   expansion.**   
17460 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20   N>=12 and even 
17470 20 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20        (N-12)/2  
17480 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20        BLOB.**   
17490 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20   N>=13 and odd  
174a0 20 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20        (N-13)/2  
174b0 20 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a        text.**.**
174c0 20 54 68 65 20 38 20 61 6e 64 20 39 20 74 79 70   The 8 and 9 typ
174d0 65 73 20 77 65 72 65 20 61 64 64 65 64 20 69 6e  es were added in
174e0 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72   3.3.0, file for
174f0 6d 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65  mat 4.  Prior ve
17500 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c  rsions.** of SQL
17510 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64  ite will not und
17520 65 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65  erstand those se
17530 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a  rial types..*/..
17540 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
17550 20 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72   serial-type for
17560 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   the value store
17570 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33  d in pMem..*/.u3
17580 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
17590 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65  ialType(Mem *pMe
175a0 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d  m, int file_form
175b0 61 74 2c 20 75 33 32 20 2a 70 4c 65 6e 29 7b 0a  at, u32 *pLen){.
175c0 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d    int flags = pM
175d0 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 75 33 32  em->flags;.  u32
175e0 20 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   n;..  assert( p
175f0 4c 65 6e 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Len!=0 );.  if( 
17600 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29  flags&MEM_Null )
17610 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b  {.    *pLen = 0;
17620 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
17630 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d   }.  if( flags&M
17640 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a  EM_Int ){.    /*
17650 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74   Figure out whet
17660 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c  her to use 1, 2,
17670 20 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73   4, 6 or 8 bytes
17680 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20  . */.#   define 
17690 4d 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 36  MAX_6BYTE ((((i6
176a0 34 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33  4)0x00008000)<<3
176b0 32 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20  2)-1).    i64 i 
176c0 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  = pMem->u.i;.   
176d0 20 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20   u64 u;.    if( 
176e0 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 75 20 3d  i<0 ){.      u =
176f0 20 7e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   ~i;.    }else{.
17700 20 20 20 20 20 20 75 20 3d 20 69 3b 0a 20 20 20        u = i;.   
17710 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32   }.    if( u<=12
17720 37 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  7 ){.      if( (
17730 69 26 31 29 3d 3d 69 20 26 26 20 66 69 6c 65 5f  i&1)==i && file_
17740 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20  format>=4 ){.   
17750 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a       *pLen = 0;.
17760 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 38          return 8
17770 2b 28 75 33 32 29 75 3b 0a 20 20 20 20 20 20 7d  +(u32)u;.      }
17780 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70  else{.        *p
17790 4c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Len = 1;.       
177a0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
177b0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
177c0 20 75 3c 3d 33 32 37 36 37 20 29 7b 20 2a 70 4c   u<=32767 ){ *pL
177d0 65 6e 20 3d 20 32 3b 20 72 65 74 75 72 6e 20 32  en = 2; return 2
177e0 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 38  ; }.    if( u<=8
177f0 33 38 38 36 30 37 20 29 7b 20 2a 70 4c 65 6e 20  388607 ){ *pLen 
17800 3d 20 33 3b 20 72 65 74 75 72 6e 20 33 3b 20 7d  = 3; return 3; }
17810 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37  .    if( u<=2147
17820 34 38 33 36 34 37 20 29 7b 20 2a 70 4c 65 6e 20  483647 ){ *pLen 
17830 3d 20 34 3b 20 72 65 74 75 72 6e 20 34 3b 20 7d  = 4; return 4; }
17840 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f  .    if( u<=MAX_
17850 36 42 59 54 45 20 29 7b 20 2a 70 4c 65 6e 20 3d  6BYTE ){ *pLen =
17860 20 36 3b 20 72 65 74 75 72 6e 20 35 3b 20 7d 0a   6; return 5; }.
17870 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20      *pLen = 8;. 
17880 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d     return 6;.  }
17890 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
178a0 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 2a 70 4c  _Real ){.    *pL
178b0 65 6e 20 3d 20 38 3b 0a 20 20 20 20 72 65 74 75  en = 8;.    retu
178c0 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 7;.  }.  asse
178d0 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61  rt( pMem->db->ma
178e0 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c  llocFailed || fl
178f0 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  ags&(MEM_Str|MEM
17900 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 61 73 73 65  _Blob) );.  asse
17910 72 74 28 20 70 4d 65 6d 2d 3e 6e 3e 3d 30 20 29  rt( pMem->n>=0 )
17920 3b 0a 20 20 6e 20 3d 20 28 75 33 32 29 70 4d 65  ;.  n = (u32)pMe
17930 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67  m->n;.  if( flag
17940 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  s & MEM_Zero ){.
17950 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75      n += pMem->u
17960 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 2a 70  .nZero;.  }.  *p
17970 4c 65 6e 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72  Len = n;.  retur
17980 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20  n ((n*2) + 12 + 
17990 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29  ((flags&MEM_Str)
179a0 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  !=0));.}../*.** 
179b0 54 68 65 20 73 69 7a 65 73 20 66 6f 72 20 73 65  The sizes for se
179c0 72 69 61 6c 20 74 79 70 65 73 20 6c 65 73 73 20  rial types less 
179d0 74 68 61 6e 20 31 32 38 0a 2a 2f 0a 73 74 61 74  than 128.*/.stat
179e0 69 63 20 63 6f 6e 73 74 20 75 38 20 73 71 6c 69  ic const u8 sqli
179f0 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65  te3SmallTypeSize
17a00 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  s[] = {.        
17a10 2f 2a 20 20 30 20 20 20 31 20 20 20 32 20 20 20  /*  0   1   2   
17a20 33 20 20 20 34 20 20 20 35 20 20 20 36 20 20 20  3   4   5   6   
17a30 37 20 20 20 38 20 20 20 39 20 2a 2f 20 20 20 0a  7   8   9 */   .
17a40 2f 2a 20 20 20 30 20 2a 2f 20 20 20 30 2c 20 20  /*   0 */   0,  
17a50 31 2c 20 20 32 2c 20 20 33 2c 20 20 34 2c 20 20  1,  2,  3,  4,  
17a60 36 2c 20 20 38 2c 20 20 38 2c 20 20 30 2c 20 20  6,  8,  8,  0,  
17a70 30 2c 0a 2f 2a 20 20 31 30 20 2a 2f 20 20 20 30  0,./*  10 */   0
17a80 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 31  ,  0,  0,  0,  1
17a90 2c 20 20 31 2c 20 20 32 2c 20 20 32 2c 20 20 33  ,  1,  2,  2,  3
17aa0 2c 20 20 33 2c 0a 2f 2a 20 20 32 30 20 2a 2f 20  ,  3,./*  20 */ 
17ab0 20 20 34 2c 20 20 34 2c 20 20 35 2c 20 20 35 2c    4,  4,  5,  5,
17ac0 20 20 36 2c 20 20 36 2c 20 20 37 2c 20 20 37 2c    6,  6,  7,  7,
17ad0 20 20 38 2c 20 20 38 2c 0a 2f 2a 20 20 33 30 20    8,  8,./*  30 
17ae0 2a 2f 20 20 20 39 2c 20 20 39 2c 20 31 30 2c 20  */   9,  9, 10, 
17af0 31 30 2c 20 31 31 2c 20 31 31 2c 20 31 32 2c 20  10, 11, 11, 12, 
17b00 31 32 2c 20 31 33 2c 20 31 33 2c 0a 2f 2a 20 20  12, 13, 13,./*  
17b10 34 30 20 2a 2f 20 20 31 34 2c 20 31 34 2c 20 31  40 */  14, 14, 1
17b20 35 2c 20 31 35 2c 20 31 36 2c 20 31 36 2c 20 31  5, 15, 16, 16, 1
17b30 37 2c 20 31 37 2c 20 31 38 2c 20 31 38 2c 0a 2f  7, 17, 18, 18,./
17b40 2a 20 20 35 30 20 2a 2f 20 20 31 39 2c 20 31 39  *  50 */  19, 19
17b50 2c 20 32 30 2c 20 32 30 2c 20 32 31 2c 20 32 31  , 20, 20, 21, 21
17b60 2c 20 32 32 2c 20 32 32 2c 20 32 33 2c 20 32 33  , 22, 22, 23, 23
17b70 2c 0a 2f 2a 20 20 36 30 20 2a 2f 20 20 32 34 2c  ,./*  60 */  24,
17b80 20 32 34 2c 20 32 35 2c 20 32 35 2c 20 32 36 2c   24, 25, 25, 26,
17b90 20 32 36 2c 20 32 37 2c 20 32 37 2c 20 32 38 2c   26, 27, 27, 28,
17ba0 20 32 38 2c 0a 2f 2a 20 20 37 30 20 2a 2f 20 20   28,./*  70 */  
17bb0 32 39 2c 20 32 39 2c 20 33 30 2c 20 33 30 2c 20  29, 29, 30, 30, 
17bc0 33 31 2c 20 33 31 2c 20 33 32 2c 20 33 32 2c 20  31, 31, 32, 32, 
17bd0 33 33 2c 20 33 33 2c 0a 2f 2a 20 20 38 30 20 2a  33, 33,./*  80 *
17be0 2f 20 20 33 34 2c 20 33 34 2c 20 33 35 2c 20 33  /  34, 34, 35, 3
17bf0 35 2c 20 33 36 2c 20 33 36 2c 20 33 37 2c 20 33  5, 36, 36, 37, 3
17c00 37 2c 20 33 38 2c 20 33 38 2c 0a 2f 2a 20 20 39  7, 38, 38,./*  9
17c10 30 20 2a 2f 20 20 33 39 2c 20 33 39 2c 20 34 30  0 */  39, 39, 40
17c20 2c 20 34 30 2c 20 34 31 2c 20 34 31 2c 20 34 32  , 40, 41, 41, 42
17c30 2c 20 34 32 2c 20 34 33 2c 20 34 33 2c 0a 2f 2a  , 42, 43, 43,./*
17c40 20 31 30 30 20 2a 2f 20 20 34 34 2c 20 34 34 2c   100 */  44, 44,
17c50 20 34 35 2c 20 34 35 2c 20 34 36 2c 20 34 36 2c   45, 45, 46, 46,
17c60 20 34 37 2c 20 34 37 2c 20 34 38 2c 20 34 38 2c   47, 47, 48, 48,
17c70 0a 2f 2a 20 31 31 30 20 2a 2f 20 20 34 39 2c 20  ./* 110 */  49, 
17c80 34 39 2c 20 35 30 2c 20 35 30 2c 20 35 31 2c 20  49, 50, 50, 51, 
17c90 35 31 2c 20 35 32 2c 20 35 32 2c 20 35 33 2c 20  51, 52, 52, 53, 
17ca0 35 33 2c 0a 2f 2a 20 31 32 30 20 2a 2f 20 20 35  53,./* 120 */  5
17cb0 34 2c 20 35 34 2c 20 35 35 2c 20 35 35 2c 20 35  4, 54, 55, 55, 5
17cc0 36 2c 20 35 36 2c 20 35 37 2c 20 35 37 0a 7d 3b  6, 56, 57, 57.};
17cd0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
17ce0 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
17cf0 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64   data correspond
17d00 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c  ing to the suppl
17d10 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e  ied serial-type.
17d20 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56  .*/.u32 sqlite3V
17d30 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
17d40 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65  (u32 serial_type
17d50 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  ){.  if( serial_
17d60 74 79 70 65 3e 3d 31 32 38 20 29 7b 0a 20 20 20  type>=128 ){.   
17d70 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f   return (serial_
17d80 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65  type-12)/2;.  }e
17d90 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
17da0 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20   serial_type<12 
17db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
17dc0 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65  sqlite3SmallType
17dd0 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70  Sizes[serial_typ
17de0 65 5d 3d 3d 28 73 65 72 69 61 6c 5f 74 79 70 65  e]==(serial_type
17df0 20 2d 20 31 32 29 2f 32 20 29 3b 0a 20 20 20 20   - 12)/2 );.    
17e00 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 6d  return sqlite3Sm
17e10 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72  allTypeSizes[ser
17e20 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d  ial_type];.  }.}
17e30 0a 75 38 20 73 71 6c 69 74 65 33 56 64 62 65 4f  .u8 sqlite3VdbeO
17e40 6e 65 42 79 74 65 53 65 72 69 61 6c 54 79 70 65  neByteSerialType
17e50 4c 65 6e 28 75 38 20 73 65 72 69 61 6c 5f 74 79  Len(u8 serial_ty
17e60 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  pe){.  assert( s
17e70 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 38 20 29  erial_type<128 )
17e80 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
17e90 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73  e3SmallTypeSizes
17ea0 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 20 20  [serial_type];  
17eb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20  .}../*.** If we 
17ec0 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74  are on an archit
17ed0 65 63 74 75 72 65 20 77 69 74 68 20 6d 69 78 65  ecture with mixe
17ee0 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e  d-endian floatin
17ef0 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78  g .** points (ex
17f00 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61  : ARM7) then swa
17f10 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79  p the lower 4 by
17f20 74 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a  tes with the .**
17f30 20 75 70 70 65 72 20 34 20 62 79 74 65 73 2e 20   upper 4 bytes. 
17f40 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
17f50 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f  lt..**.** For mo
17f60 73 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73  st architectures
17f70 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
17f80 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29  p..**.** (later)
17f90 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72 74 65  :  It is reporte
17fa0 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65  d to me that the
17fb0 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72   mixed-endian pr
17fc0 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37  oblem.** on ARM7
17fd0 20 69 73 20 61 6e 20 69 73 73 75 65 20 77 69 74   is an issue wit
17fe0 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20  h GCC, not with 
17ff0 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20  the ARM7 chip.  
18000 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74  It seems.** that
18010 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20   early versions 
18020 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20 74 68  of GCC stored th
18030 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61  e two words of a
18040 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74   64-bit.** float
18050 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72   in the wrong or
18060 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65  der.  And that e
18070 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72  rror has been pr
18080 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72  opagated.** ever
18090 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61   since.  The bla
180a0 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  me is not necess
180b0 61 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20  arily with GCC, 
180c0 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d  though..** GCC m
180d0 69 67 68 74 20 68 61 76 65 20 6a 75 73 74 20 63  ight have just c
180e0 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c  opying the probl
180f0 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20  em from a prior 
18100 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61  compiler..** I a
18110 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74  m also told that
18120 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
18130 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c  of GCC that foll
18140 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a  ow a different.*
18150 2a 20 41 42 49 20 67 65 74 20 74 68 65 20 62 79  * ABI get the by
18160 74 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a  te order right..
18170 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73  **.** Developers
18180 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e   using SQLite on
18190 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20   an ARM7 should 
181a0 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20  compile and run 
181b0 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61  their.** applica
181c0 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c  tion using -DSQL
181d0 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c  ITE_DEBUG=1 at l
181e0 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68  east once.  With
181f0 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65   DEBUG.** enable
18200 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20  d, some asserts 
18210 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72  below will ensur
18220 65 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20  e that the byte 
18230 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61  order of.** floa
18240 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
18250 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a  s is correct..**
18260 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29  .** (2007-08-30)
18270 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74    Frank van Vugt
18280 20 68 61 73 20 73 74 75 64 69 65 64 20 74 68 69   has studied thi
18290 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c  s problem closel
182a0 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e  y.** and has sen
182b0 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74  d his findings t
182c0 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64 65 76  o the SQLite dev
182d0 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a  elopers.  Frank.
182e0 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74 20 73  ** writes that s
182f0 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c  ome Linux kernel
18300 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67  s offer floating
18310 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a   point hardware.
18320 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61  ** emulation tha
18330 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62  t uses only 32-b
18340 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73  it mantissas ins
18350 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a  tead of a full .
18360 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72 65  ** 48-bits as re
18370 71 75 69 72 65 64 20 62 79 20 74 68 65 20 49 45  quired by the IE
18380 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54  EE standard.  (T
18390 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f  his is the.** CO
183a0 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45  NFIG_FPE_FASTFPE
183b0 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75   option.)  On su
183c0 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61  ch systems, floa
183d0 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79  ting point.** by
183e0 74 65 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f  te swapping beco
183f0 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63  mes very complic
18400 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20  ated.  To avoid 
18410 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65  problems,.** the
18420 20 6e 65 63 65 73 73 61 72 79 20 62 79 74 65 20   necessary byte 
18430 73 77 61 70 70 69 6e 67 20 69 73 20 63 61 72 72  swapping is carr
18440 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20  ied out using a 
18450 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a  64-bit integer.*
18460 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20  * rather than a 
18470 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46  64-bit float.  F
18480 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20  rank assures us 
18490 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 68 65  that the code he
184a0 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20  re.** works for 
184b0 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65  him.  We, the de
184c0 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e  velopers, have n
184d0 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e  o way to indepen
184e0 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79  dently.** verify
184f0 20 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b   this, but Frank
18500 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77   seems to know w
18510 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e  hat he is talkin
18520 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65  g about.** so we
18530 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23   trust him..*/.#
18540 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58  ifdef SQLITE_MIX
18550 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f  ED_ENDIAN_64BIT_
18560 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34  FLOAT.static u64
18570 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69   floatSwap(u64 i
18580 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20  n){.  union {.  
18590 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32    u64 r;.    u32
185a0 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20   i[2];.  } u;.  
185b0 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20  u32 t;..  u.r = 
185c0 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d  in;.  t = u.i[0]
185d0 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69  ;.  u.i[0] = u.i
185e0 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20  [1];.  u.i[1] = 
185f0 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b  t;.  return u.r;
18600 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70  .}.# define swap
18610 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
18620 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77  (X)  X = floatSw
18630 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65  ap(X).#else.# de
18640 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e  fine swapMixedEn
18650 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e  dianFloat(X).#en
18660 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  dif../*.** Write
18670 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20   the serialized 
18680 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68  data blob for th
18690 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
186a0 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20  n pMem into .** 
186b0 62 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d  buf. It is assum
186c0 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ed that the call
186d0 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64  er has allocated
186e0 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
186f0 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  e..** Return the
18700 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
18710 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20   written..**.** 
18720 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75  nBuf is the amou
18730 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74  nt of space left
18740 20 69 6e 20 62 75 66 5b 5d 2e 20 20 54 68 65 20   in buf[].  The 
18750 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e  caller is respon
18760 73 69 62 6c 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c  sible.** for all
18770 6f 63 61 74 69 6e 67 20 65 6e 6f 75 67 68 20 73  ocating enough s
18780 70 61 63 65 20 74 6f 20 62 75 66 5b 5d 20 74 6f  pace to buf[] to
18790 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65   hold the entire
187a0 20 66 69 65 6c 64 2c 20 65 78 63 6c 75 73 69 76   field, exclusiv
187b0 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 4d 65 6d  e.** of the pMem
187c0 2d 3e 75 2e 6e 5a 65 72 6f 20 62 79 74 65 73 20  ->u.nZero bytes 
187d0 66 6f 72 20 61 20 4d 45 4d 5f 5a 65 72 6f 20 76  for a MEM_Zero v
187e0 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  alue..**.** Retu
187f0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
18800 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
18810 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66  written into buf
18820 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a  [].  The number.
18830 2a 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  ** of bytes in t
18840 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74  he zero-filled t
18850 61 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20  ail is included 
18860 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  in the return va
18870 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74  lue only.** if t
18880 68 6f 73 65 20 62 79 74 65 73 20 77 65 72 65 20  hose bytes were 
18890 7a 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e  zeroed in buf[].
188a0 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33  .*/ .u32 sqlite3
188b0 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 75 38  VdbeSerialPut(u8
188c0 20 2a 62 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d   *buf, Mem *pMem
188d0 2c 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70  , u32 serial_typ
188e0 65 29 7b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a  e){.  u32 len;..
188f0 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64    /* Integer and
18900 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73   Real */.  if( s
18910 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26  erial_type<=7 &&
18920 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20 29   serial_type>0 )
18930 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20  {.    u64 v;.   
18940 20 75 33 32 20 69 3b 0a 20 20 20 20 69 66 28 20   u32 i;.    if( 
18950 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29  serial_type==7 )
18960 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
18970 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f  sizeof(v)==sizeo
18980 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 29 3b 0a  f(pMem->u.r) );.
18990 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 2c        memcpy(&v,
189a0 20 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 73 69 7a   &pMem->u.r, siz
189b0 65 6f 66 28 76 29 29 3b 0a 20 20 20 20 20 20 73  eof(v));.      s
189c0 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
189d0 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73  oat(v);.    }els
189e0 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 4d 65  e{.      v = pMe
189f0 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20  m->u.i;.    }.  
18a00 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69    len = i = sqli
18a10 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65  te3SmallTypeSize
18a20 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a  s[serial_type];.
18a30 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20      assert( i>0 
18a40 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  );.    do{.     
18a50 20 62 75 66 5b 2d 2d 69 5d 20 3d 20 28 75 38 29   buf[--i] = (u8)
18a60 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20  (v&0xFF);.      
18a70 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 77 68  v >>= 8;.    }wh
18a80 69 6c 65 28 20 69 20 29 3b 0a 20 20 20 20 72 65  ile( i );.    re
18a90 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20  turn len;.  }.. 
18aa0 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c   /* String or bl
18ab0 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69  ob */.  if( seri
18ac0 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20  al_type>=12 ){. 
18ad0 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
18ae0 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61  >n + ((pMem->fla
18af0 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70  gs & MEM_Zero)?p
18b00 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a  Mem->u.nZero:0).
18b10 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
18b20 28 69 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65  (int)sqlite3Vdbe
18b30 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
18b40 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20  rial_type) );.  
18b50 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b    len = pMem->n;
18b60 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e 30 20 29  .    if( len>0 )
18b70 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65   memcpy(buf, pMe
18b80 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  m->z, len);.    
18b90 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a  return len;.  }.
18ba0 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f  .  /* NULL or co
18bb0 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a  nstants 0 or 1 *
18bc0 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  /.  return 0;.}.
18bd0 0a 2f 2a 20 49 6e 70 75 74 20 22 78 22 20 69 73  ./* Input "x" is
18be0 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 75   a sequence of u
18bf0 6e 73 69 67 6e 65 64 20 63 68 61 72 61 63 74 65  nsigned characte
18c00 72 73 20 74 68 61 74 20 72 65 70 72 65 73 65 6e  rs that represen
18c10 74 20 61 0a 2a 2a 20 62 69 67 2d 65 6e 64 69 61  t a.** big-endia
18c20 6e 20 69 6e 74 65 67 65 72 2e 20 20 52 65 74 75  n integer.  Retu
18c30 72 6e 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  rn the equivalen
18c40 74 20 6e 61 74 69 76 65 20 69 6e 74 65 67 65 72  t native integer
18c50 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 4e 45 5f  .*/.#define ONE_
18c60 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28  BYTE_INT(x)    (
18c70 28 69 38 29 28 78 29 5b 30 5d 29 0a 23 64 65 66  (i8)(x)[0]).#def
18c80 69 6e 65 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54  ine TWO_BYTE_INT
18c90 28 78 29 20 20 20 20 28 32 35 36 2a 28 69 38 29  (x)    (256*(i8)
18ca0 28 28 78 29 5b 30 5d 29 7c 28 78 29 5b 31 5d 29  ((x)[0])|(x)[1])
18cb0 0a 23 64 65 66 69 6e 65 20 54 48 52 45 45 5f 42  .#define THREE_B
18cc0 59 54 45 5f 49 4e 54 28 78 29 20 20 28 36 35 35  YTE_INT(x)  (655
18cd0 33 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c  36*(i8)((x)[0])|
18ce0 28 28 78 29 5b 31 5d 3c 3c 38 29 7c 28 78 29 5b  ((x)[1]<<8)|(x)[
18cf0 32 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52  2]).#define FOUR
18d00 5f 42 59 54 45 5f 55 49 4e 54 28 78 29 20 20 28  _BYTE_UINT(x)  (
18d10 28 28 75 33 32 29 28 78 29 5b 30 5d 3c 3c 32 34  ((u32)(x)[0]<<24
18d20 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28  )|((x)[1]<<16)|(
18d30 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33  (x)[2]<<8)|(x)[3
18d40 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f  ]).#define FOUR_
18d50 42 59 54 45 5f 49 4e 54 28 78 29 20 28 31 36 37  BYTE_INT(x) (167
18d60 37 37 32 31 36 2a 28 69 38 29 28 28 78 29 5b 30  77216*(i8)((x)[0
18d70 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c  ])|((x)[1]<<16)|
18d80 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b  ((x)[2]<<8)|(x)[
18d90 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72  3])../*.** Deser
18da0 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20  ialize the data 
18db0 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20  blob pointed to 
18dc0 62 79 20 62 75 66 20 61 73 20 73 65 72 69 61 6c  by buf as serial
18dd0 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70   type serial_typ
18de0 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74  e.** and store t
18df0 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65  he result in pMe
18e00 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  m.  Return the n
18e10 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
18e20 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ead..**.** This 
18e30 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c  function is impl
18e40 65 6d 65 6e 74 65 64 20 61 73 20 74 77 6f 20 73  emented as two s
18e50 65 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65 73  eparate routines
18e60 20 66 6f 72 20 70 65 72 66 6f 72 6d 61 6e 63 65   for performance
18e70 2e 0a 2a 2a 20 54 68 65 20 66 65 77 20 63 61 73  ..** The few cas
18e80 65 73 20 74 68 61 74 20 72 65 71 75 69 72 65 20  es that require 
18e90 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20  local variables 
18ea0 61 72 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69  are broken out i
18eb0 6e 74 6f 20 61 20 73 65 70 61 72 61 74 65 0a 2a  nto a separate.*
18ec0 2a 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61  * routine so tha
18ed0 74 20 69 6e 20 6d 6f 73 74 20 63 61 73 65 73 20  t in most cases 
18ee0 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20  the overhead of 
18ef0 6d 6f 76 69 6e 67 20 74 68 65 20 73 74 61 63 6b  moving the stack
18f00 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 69 73 20 61   pointer.** is a
18f10 76 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73 74 61 74  voided..*/ .stat
18f20 69 63 20 75 33 32 20 53 51 4c 49 54 45 5f 4e 4f  ic u32 SQLITE_NO
18f30 49 4e 4c 49 4e 45 20 73 65 72 69 61 6c 47 65 74  INLINE serialGet
18f40 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  (.  const unsign
18f50 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20  ed char *buf,   
18f60 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64    /* Buffer to d
18f70 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20  eserialize from 
18f80 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f  */.  u32 serial_
18f90 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  type,           
18fa0 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
18fb0 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  e to deserialize
18fc0 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20   */.  Mem *pMem 
18fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fe0 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
18ff0 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75  ll to write valu
19000 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 75  e into */.){.  u
19010 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45  64 x = FOUR_BYTE
19020 5f 55 49 4e 54 28 62 75 66 29 3b 0a 20 20 75 33  _UINT(buf);.  u3
19030 32 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  2 y = FOUR_BYTE_
19040 55 49 4e 54 28 62 75 66 2b 34 29 3b 0a 20 20 78  UINT(buf+4);.  x
19050 20 3d 20 28 78 3c 3c 33 32 29 20 2b 20 79 3b 0a   = (x<<32) + y;.
19060 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
19070 65 3d 3d 36 20 29 7b 0a 20 20 20 20 2f 2a 20 45  e==6 ){.    /* E
19080 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39  VIDENCE-OF: R-29
19090 38 35 31 2d 35 32 32 37 32 20 56 61 6c 75 65 20  851-52272 Value 
190a0 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20  is a big-endian 
190b0 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 74 77  64-bit.    ** tw
190c0 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
190d0 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 70 4d  teger. */.    pM
190e0 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a  em->u.i = *(i64*
190f0 29 26 78 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66  )&x;.    pMem->f
19100 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
19110 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
19120 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 7d  em->u.i<0 );.  }
19130 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49  else{.    /* EVI
19140 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 37 33 34  DENCE-OF: R-5734
19150 33 2d 34 39 31 31 34 20 56 61 6c 75 65 20 69 73  3-49114 Value is
19160 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 49 45   a big-endian IE
19170 45 45 20 37 35 34 2d 32 30 30 38 20 36 34 2d 62  EE 754-2008 64-b
19180 69 74 0a 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69  it.    ** floati
19190 6e 67 20 70 6f 69 6e 74 20 6e 75 6d 62 65 72 2e  ng point number.
191a0 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
191b0 28 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66  (NDEBUG) && !def
191c0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
191d0 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29  _FLOATING_POINT)
191e0 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74  .    /* Verify t
191f0 68 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64  hat integers and
19200 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
19210 76 61 6c 75 65 73 20 75 73 65 20 74 68 65 20 73  values use the s
19220 61 6d 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 20  ame.    ** byte 
19230 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74  order.  Or, that
19240 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44   if SQLITE_MIXED
19250 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c  _ENDIAN_64BIT_FL
19260 4f 41 54 20 69 73 0a 20 20 20 20 2a 2a 20 64 65  OAT is.    ** de
19270 66 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69  fined that 64-bi
19280 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  t floating point
19290 20 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61   values really a
192a0 72 65 20 6d 69 78 65 64 0a 20 20 20 20 2a 2a 20  re mixed.    ** 
192b0 65 6e 64 69 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20  endian..    */. 
192c0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
192d0 75 36 34 20 74 31 20 3d 20 28 28 75 36 34 29 30  u64 t1 = ((u64)0
192e0 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a  x3ff00000)<<32;.
192f0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
19300 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30   double r1 = 1.0
19310 3b 0a 20 20 20 20 75 36 34 20 74 32 20 3d 20 74  ;.    u64 t2 = t
19320 31 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64  1;.    swapMixed
19330 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b  EndianFloat(t2);
19340 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
19350 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28  eof(r1)==sizeof(
19360 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72  t2) && memcmp(&r
19370 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72  1, &t2, sizeof(r
19380 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66  1))==0 );.#endif
19390 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
193a0 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a  eof(x)==8 && siz
193b0 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 3d 3d  eof(pMem->u.r)==
193c0 38 20 29 3b 0a 20 20 20 20 73 77 61 70 4d 69 78  8 );.    swapMix
193d0 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29  edEndianFloat(x)
193e0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d  ;.    memcpy(&pM
193f0 65 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20 73 69 7a  em->u.r, &x, siz
19400 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 70 4d 65  eof(x));.    pMe
19410 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74  m->flags = sqlit
19420 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 75 2e  e3IsNaN(pMem->u.
19430 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20  r) ? MEM_Null : 
19440 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d 0a 20 20  MEM_Real;.  }.  
19450 72 65 74 75 72 6e 20 38 3b 0a 7d 0a 75 33 32 20  return 8;.}.u32 
19460 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
19470 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e  lGet(.  const un
19480 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
19490 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20  ,     /* Buffer 
194a0 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66  to deserialize f
194b0 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72  rom */.  u32 ser
194c0 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20  ial_type,       
194d0 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c         /* Serial
194e0 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61   type to deseria
194f0 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  lize */.  Mem *p
19500 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  Mem             
19510 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
19520 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20  y cell to write 
19530 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b  value into */.){
19540 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61  .  switch( seria
19550 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  l_type ){.    ca
19560 73 65 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65  se 10:   /* Rese
19570 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
19580 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  use */.    case 
19590 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65  11:   /* Reserve
195a0 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65  d for future use
195b0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20   */.    case 0: 
195c0 7b 20 20 2f 2a 20 4e 75 6c 6c 20 2a 2f 0a 20 20  {  /* Null */.  
195d0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
195e0 4f 46 3a 20 52 2d 32 34 30 37 38 2d 30 39 33 37  OF: R-24078-0937
195f0 35 20 56 61 6c 75 65 20 69 73 20 61 20 4e 55 4c  5 Value is a NUL
19600 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  L. */.      pMem
19610 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
19620 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ll;.      break;
19630 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
19640 31 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  1: {.      /* EV
19650 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 38  IDENCE-OF: R-448
19660 38 35 2d 32 35 31 39 36 20 56 61 6c 75 65 20 69  85-25196 Value i
19670 73 20 61 6e 20 38 2d 62 69 74 20 74 77 6f 73 2d  s an 8-bit twos-
19680 63 6f 6d 70 6c 65 6d 65 6e 74 0a 20 20 20 20 20  complement.     
19690 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a   ** integer. */.
196a0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
196b0 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 62  = ONE_BYTE_INT(b
196c0 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  uf);.      pMem-
196d0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
196e0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
196f0 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
19700 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
19710 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
19720 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73  2: { /* 2-byte s
19730 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
19740 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
19750 43 45 2d 4f 46 3a 20 52 2d 34 39 37 39 34 2d 33  CE-OF: R-49794-3
19760 35 30 32 36 20 56 61 6c 75 65 20 69 73 20 61 20  5026 Value is a 
19770 62 69 67 2d 65 6e 64 69 61 6e 20 31 36 2d 62 69  big-endian 16-bi
19780 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d  t.      ** twos-
19790 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67  complement integ
197a0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  er. */.      pMe
197b0 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f 42 59 54  m->u.i = TWO_BYT
197c0 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20  E_INT(buf);.    
197d0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
197e0 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
197f0 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
19800 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
19810 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
19820 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33    case 3: { /* 3
19830 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
19840 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  eger */.      /*
19850 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
19860 33 37 38 33 39 2d 35 34 33 30 31 20 56 61 6c 75  37839-54301 Valu
19870 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61  e is a big-endia
19880 6e 20 32 34 2d 62 69 74 0a 20 20 20 20 20 20 2a  n 24-bit.      *
19890 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  * twos-complemen
198a0 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  t integer. */.  
198b0 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
198c0 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 62  THREE_BYTE_INT(b
198d0 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  uf);.      pMem-
198e0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
198f0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
19900 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
19910 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b  .      return 3;
19920 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
19930 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73  4: { /* 4-byte s
19940 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
19950 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
19960 43 45 2d 4f 46 3a 20 52 2d 30 31 38 34 39 2d 32  CE-OF: R-01849-2
19970 36 30 37 39 20 56 61 6c 75 65 20 69 73 20 61 20  6079 Value is a 
19980 62 69 67 2d 65 6e 64 69 61 6e 20 33 32 2d 62 69  big-endian 32-bi
19990 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d  t.      ** twos-
199a0 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67  complement integ
199b0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  er. */.      pMe
199c0 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59  m->u.i = FOUR_BY
199d0 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 23 69 66  TE_INT(buf);.#if
199e0 64 65 66 20 5f 5f 48 50 5f 63 63 20 0a 20 20 20  def __HP_cc .   
199f0 20 20 20 2f 2a 20 57 6f 72 6b 20 61 72 6f 75 6e     /* Work aroun
19a00 64 20 61 20 73 69 67 6e 2d 65 78 74 65 6e 73 69  d a sign-extensi
19a10 6f 6e 20 62 75 67 20 69 6e 20 74 68 65 20 48 50  on bug in the HP
19a20 20 63 6f 6d 70 69 6c 65 72 20 66 6f 72 20 48 50   compiler for HP
19a30 2f 55 58 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  /UX */.      if(
19a40 20 62 75 66 5b 30 5d 26 30 78 38 30 20 29 20 70   buf[0]&0x80 ) p
19a50 4d 65 6d 2d 3e 75 2e 69 20 7c 3d 20 30 78 66 66  Mem->u.i |= 0xff
19a60 66 66 66 66 66 66 38 30 30 30 30 30 30 30 4c 4c  ffffff80000000LL
19a70 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 70  ;.#endif.      p
19a80 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
19a90 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74  _Int;.      test
19aa0 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
19ab0 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
19ac0 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 4;.    }.    c
19ad0 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79  ase 5: { /* 6-by
19ae0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
19af0 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  r */.      /* EV
19b00 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 30 33  IDENCE-OF: R-503
19b10 38 35 2d 30 39 36 37 34 20 56 61 6c 75 65 20 69  85-09674 Value i
19b20 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 34  s a big-endian 4
19b30 38 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74  8-bit.      ** t
19b40 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69  wos-complement i
19b50 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20  nteger. */.     
19b60 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55   pMem->u.i = FOU
19b70 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b  R_BYTE_UINT(buf+
19b80 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c  2) + (((i64)1)<<
19b90 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54  32)*TWO_BYTE_INT
19ba0 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65  (buf);.      pMe
19bb0 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
19bc0 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  nt;.      testca
19bd0 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20  se( pMem->u.i<0 
19be0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
19bf0 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  6;.    }.    cas
19c00 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65  e 6:   /* 8-byte
19c10 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
19c20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b  */.    case 7: {
19c30 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e   /* IEEE floatin
19c40 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20  g point */.     
19c50 20 2f 2a 20 54 68 65 73 65 20 75 73 65 20 6c 6f   /* These use lo
19c60 63 61 6c 20 76 61 72 69 61 62 6c 65 73 2c 20 73  cal variables, s
19c70 6f 20 64 6f 20 74 68 65 6d 20 69 6e 20 61 20 73  o do them in a s
19c80 65 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65 0a  eparate routine.
19c90 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69        ** to avoi
19ca0 64 20 68 61 76 69 6e 67 20 74 6f 20 6d 6f 76 65  d having to move
19cb0 20 74 68 65 20 66 72 61 6d 65 20 70 6f 69 6e 74   the frame point
19cc0 65 72 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  er in the common
19cd0 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 72   case */.      r
19ce0 65 74 75 72 6e 20 73 65 72 69 61 6c 47 65 74 28  eturn serialGet(
19cf0 62 75 66 2c 73 65 72 69 61 6c 5f 74 79 70 65 2c  buf,serial_type,
19d00 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pMem);.    }.   
19d10 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49   case 8:    /* I
19d20 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20  nteger 0 */.    
19d30 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e  case 9: {  /* In
19d40 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20  teger 1 */.     
19d50 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
19d60 20 52 2d 31 32 39 37 36 2d 32 32 38 39 33 20 56   R-12976-22893 V
19d70 61 6c 75 65 20 69 73 20 74 68 65 20 69 6e 74 65  alue is the inte
19d80 67 65 72 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20  ger 0. */.      
19d90 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
19da0 52 2d 31 38 31 34 33 2d 31 32 31 32 31 20 56 61  R-18143-12121 Va
19db0 6c 75 65 20 69 73 20 74 68 65 20 69 6e 74 65 67  lue is the integ
19dc0 65 72 20 31 2e 20 2a 2f 0a 20 20 20 20 20 20 70  er 1. */.      p
19dd0 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61  Mem->u.i = seria
19de0 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20  l_type-8;.      
19df0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
19e00 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
19e10 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
19e20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
19e30 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
19e40 3a 20 52 2d 31 34 36 30 36 2d 33 31 35 36 34 20  : R-14606-31564 
19e50 56 61 6c 75 65 20 69 73 20 61 20 42 4c 4f 42 20  Value is a BLOB 
19e60 74 68 61 74 20 69 73 20 28 4e 2d 31 32 29 2f 32  that is (N-12)/2
19e70 20 62 79 74 65 73 20 69 6e 0a 20 20 20 20 20 20   bytes in.      
19e80 2a 2a 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20 20  ** length..     
19e90 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   ** EVIDENCE-OF:
19ea0 20 52 2d 32 38 34 30 31 2d 30 30 31 34 30 20 56   R-28401-00140 V
19eb0 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67  alue is a string
19ec0 20 69 6e 20 74 68 65 20 74 65 78 74 20 65 6e 63   in the text enc
19ed0 6f 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20  oding and.      
19ee0 2a 2a 20 28 4e 2d 31 33 29 2f 32 20 62 79 74 65  ** (N-13)/2 byte
19ef0 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a  s in length. */.
19f00 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
19f10 73 74 20 75 31 36 20 61 46 6c 61 67 5b 5d 20 3d  st u16 aFlag[] =
19f20 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f   { MEM_Blob|MEM_
19f30 45 70 68 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d  Ephem, MEM_Str|M
19f40 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20 20 20 20  EM_Ephem };.    
19f50 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61    pMem->z = (cha
19f60 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70  r *)buf;.      p
19f70 4d 65 6d 2d 3e 6e 20 3d 20 28 73 65 72 69 61 6c  Mem->n = (serial
19f80 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20  _type-12)/2;.   
19f90 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
19fa0 20 61 46 6c 61 67 5b 73 65 72 69 61 6c 5f 74 79   aFlag[serial_ty
19fb0 70 65 26 31 5d 3b 0a 20 20 20 20 20 20 72 65 74  pe&1];.      ret
19fc0 75 72 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20  urn pMem->n;.   
19fd0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
19fe0 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  0;.}./*.** This 
19ff0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
1a000 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 75 66 66  to allocate suff
1a010 69 63 69 65 6e 74 20 73 70 61 63 65 20 66 6f 72  icient space for
1a020 20 61 6e 20 55 6e 70 61 63 6b 65 64 52 65 63 6f   an UnpackedReco
1a030 72 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  rd.** structure 
1a040 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
1a050 62 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c  be used with sql
1a060 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
1a070 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65  pack() if.** the
1a080 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1a090 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1a0a0 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
1a0b0 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a  e pKeyInfo..**.*
1a0c0 2a 20 54 68 65 20 73 70 61 63 65 20 69 73 20 65  * The space is e
1a0d0 69 74 68 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  ither allocated 
1a0e0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 4d  using sqlite3DbM
1a0f0 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72 20 66 72  allocRaw() or fr
1a100 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65  om within.** the
1a110 20 75 6e 61 6c 69 67 6e 65 64 20 62 75 66 66 65   unaligned buffe
1a120 72 20 70 61 73 73 65 64 20 76 69 61 20 74 68 65  r passed via the
1a130 20 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72   second and thir
1a140 64 20 61 72 67 75 6d 65 6e 74 73 20 28 70 72 65  d arguments (pre
1a150 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b  sumably.** stack
1a160 20 73 70 61 63 65 29 2e 20 49 66 20 74 68 65 20   space). If the 
1a170 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70  former, then *pp
1a180 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 61  Free is set to a
1a190 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 73 68   pointer that sh
1a1a0 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74  ould.** be event
1a1b0 75 61 6c 6c 79 20 66 72 65 65 64 20 62 79 20 74  ually freed by t
1a1c0 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20  he caller using 
1a1d0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e  sqlite3DbFree().
1a1e0 20 4f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20   Or, if the .** 
1a1f0 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73  allocation comes
1a200 20 66 72 6f 6d 20 74 68 65 20 70 53 70 61 63 65   from the pSpace
1a210 2f 73 7a 53 70 61 63 65 20 62 75 66 66 65 72 2c  /szSpace buffer,
1a220 20 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20   *ppFree is set 
1a230 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72  to NULL.** befor
1a240 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
1a250 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  ** If an OOM err
1a260 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  or occurs, NULL 
1a270 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1a280 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1a290 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63  sqlite3VdbeAlloc
1a2a0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a  UnpackedRecord(.
1a2b0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
1a2c0 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
1a2d0 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e    /* Description
1a2e0 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a   of the record *
1a2f0 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65  /.  char *pSpace
1a300 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a310 20 20 20 20 2f 2a 20 55 6e 61 6c 69 67 6e 65 64      /* Unaligned
1a320 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   space available
1a330 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61 63   */.  int szSpac
1a340 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1a350 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1a360 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62 79 74   pSpace[] in byt
1a370 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  es */.  char **p
1a380 70 46 72 65 65 20 20 20 20 20 20 20 20 20 20 20  pFree           
1a390 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1a3a0 43 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 66 72  Caller should fr
1a3b0 65 65 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20  ee this pointer 
1a3c0 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64  */.){.  Unpacked
1a3d0 52 65 63 6f 72 64 20 2a 70 3b 20 20 20 20 20 20  Record *p;      
1a3e0 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63          /* Unpac
1a3f0 6b 65 64 20 72 65 63 6f 72 64 20 74 6f 20 72 65  ked record to re
1a400 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  turn */.  int nO
1a410 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
1a420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63            /* Inc
1a430 72 65 6d 65 6e 74 20 70 53 70 61 63 65 20 62 79  rement pSpace by
1a440 20 6e 4f 66 66 20 74 6f 20 61 6c 69 67 6e 20 69   nOff to align i
1a450 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  t */.  int nByte
1a460 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a470 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1a480 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72   of bytes requir
1a490 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a 0a 20 20  ed for *p */..  
1a4a0 2f 2a 20 57 65 20 77 61 6e 74 20 74 6f 20 73 68  /* We want to sh
1a4b0 69 66 74 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ift the pointer 
1a4c0 70 53 70 61 63 65 20 75 70 20 73 75 63 68 20 74  pSpace up such t
1a4d0 68 61 74 20 69 74 20 69 73 20 38 2d 62 79 74 65  hat it is 8-byte
1a4e0 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a 20 54   aligned..  ** T
1a4f0 68 75 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  hus, we need to 
1a500 63 61 6c 63 75 6c 61 74 65 20 61 20 76 61 6c 75  calculate a valu
1a510 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77 65 65 6e  e, nOff, between
1a520 20 30 20 61 6e 64 20 37 2c 20 74 6f 20 73 68 69   0 and 7, to shi
1a530 66 74 20 0a 20 20 2a 2a 20 69 74 20 62 79 2e 20  ft .  ** it by. 
1a540 20 49 66 20 70 53 70 61 63 65 20 69 73 20 61 6c   If pSpace is al
1a550 72 65 61 64 79 20 38 2d 62 79 74 65 20 61 6c 69  ready 8-byte ali
1a560 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68 6f 75 6c  gned, nOff shoul
1a570 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a  d be zero..  */.
1a580 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d 20 28 53    nOff = (8 - (S
1a590 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
1a5a0 28 70 53 70 61 63 65 29 20 26 20 37 29 29 20 26  (pSpace) & 7)) &
1a5b0 20 37 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f   7;.  nByte = RO
1a5c0 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61  UND8(sizeof(Unpa
1a5d0 63 6b 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73  ckedRecord)) + s
1a5e0 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79  izeof(Mem)*(pKey
1a5f0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b  Info->nField+1);
1a600 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 73 7a 53  .  if( nByte>szS
1a610 70 61 63 65 2b 6e 4f 66 66 20 29 7b 0a 20 20 20  pace+nOff ){.   
1a620 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65   p = (UnpackedRe
1a630 63 6f 72 64 20 2a 29 73 71 6c 69 74 65 33 44 62  cord *)sqlite3Db
1a640 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e  MallocRaw(pKeyIn
1a650 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a  fo->db, nByte);.
1a660 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20 28 63      *ppFree = (c
1a670 68 61 72 20 2a 29 70 3b 0a 20 20 20 20 69 66 28  har *)p;.    if(
1a680 20 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a   !p ) return 0;.
1a690 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d    }else{.    p =
1a6a0 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64   (UnpackedRecord
1a6b0 2a 29 26 70 53 70 61 63 65 5b 6e 4f 66 66 5d 3b  *)&pSpace[nOff];
1a6c0 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20 30  .    *ppFree = 0
1a6d0 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 61 4d 65 6d  ;.  }..  p->aMem
1a6e0 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63 68 61 72   = (Mem*)&((char
1a6f0 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65  *)p)[ROUND8(size
1a700 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  of(UnpackedRecor
1a710 64 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  d))];.  assert( 
1a720 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
1a730 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 70 2d 3e  rder!=0 );.  p->
1a740 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
1a750 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64  nfo;.  p->nField
1a760 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69   = pKeyInfo->nFi
1a770 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65 74 75 72  eld + 1;.  retur
1a780 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  n p;.}../*.** Gi
1a790 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74  ven the nKey-byt
1a7a0 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20  e encoding of a 
1a7b0 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d  record in pKey[]
1a7c0 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 0a  , populate the .
1a7d0 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  ** UnpackedRecor
1a7e0 64 20 73 74 72 75 63 74 75 72 65 20 69 6e 64 69  d structure indi
1a7f0 63 61 74 65 64 20 62 79 20 74 68 65 20 66 6f 75  cated by the fou
1a800 72 74 68 20 61 72 67 75 6d 65 6e 74 20 77 69 74  rth argument wit
1a810 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  h the.** content
1a820 73 20 6f 66 20 74 68 65 20 64 65 63 6f 64 65 64  s of the decoded
1a830 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69   record..*/ .voi
1a840 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  d sqlite3VdbeRec
1a850 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79  ordUnpack(.  Key
1a860 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
1a870 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
1a880 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65 63  on about the rec
1a890 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20  ord format */.  
1a8a0 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20  int nKey,       
1a8b0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1a8c0 66 20 74 68 65 20 62 69 6e 61 72 79 20 72 65 63  f the binary rec
1a8d0 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  ord */.  const v
1a8e0 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20  oid *pKey,      
1a8f0 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72 65  /* The binary re
1a900 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  cord */.  Unpack
1a910 65 64 52 65 63 6f 72 64 20 2a 70 20 20 20 20 20  edRecord *p     
1a920 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69   /* Populate thi
1a930 73 20 73 74 72 75 63 74 75 72 65 20 62 65 66 6f  s structure befo
1a940 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f  re returning. */
1a950 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  .){.  const unsi
1a960 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20  gned char *aKey 
1a970 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
1a980 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20  d char *)pKey;. 
1a990 20 69 6e 74 20 64 3b 20 0a 20 20 75 33 32 20 69   int d; .  u32 i
1a9a0 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
1a9b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
1a9c0 66 73 65 74 20 69 6e 20 61 4b 65 79 5b 5d 20 74  fset in aKey[] t
1a9d0 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
1a9e0 20 75 31 36 20 75 3b 20 20 20 20 20 20 20 20 20   u16 u;         
1a9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa00 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f   /* Unsigned loo
1aa10 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
1aa20 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20  32 szHdr;.  Mem 
1aa30 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b  *pMem = p->aMem;
1aa40 0a 0a 20 20 70 2d 3e 64 65 66 61 75 6c 74 5f 72  ..  p->default_r
1aa50 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  c = 0;.  assert(
1aa60 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
1aa70 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20  NMENT(pMem) );. 
1aa80 20 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74   idx = getVarint
1aa90 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b  32(aKey, szHdr);
1aaa0 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20  .  d = szHdr;.  
1aab0 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  u = 0;.  while( 
1aac0 69 64 78 3c 73 7a 48 64 72 20 26 26 20 64 3c 3d  idx<szHdr && d<=
1aad0 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75 33 32 20  nKey ){.    u32 
1aae0 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20  serial_type;..  
1aaf0 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69    idx += getVari
1ab00 6e 74 33 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c  nt32(&aKey[idx],
1ab10 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20   serial_type);. 
1ab20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70     pMem->enc = p
1ab30 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20  KeyInfo->enc;.  
1ab40 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65    pMem->db = pKe
1ab50 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f  yInfo->db;.    /
1ab60 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20  * pMem->flags = 
1ab70 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33 56 64 62  0; // sqlite3Vdb
1ab80 65 53 65 72 69 61 6c 47 65 74 28 29 20 77 69 6c  eSerialGet() wil
1ab90 6c 20 73 65 74 20 74 68 69 73 20 66 6f 72 20 75  l set this for u
1aba0 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 73  s */.    pMem->s
1abb0 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20  zMalloc = 0;.   
1abc0 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62   d += sqlite3Vdb
1abd0 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
1abe0 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  [d], serial_type
1abf0 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65  , pMem);.    pMe
1ac00 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20 28 2b 2b  m++;.    if( (++
1ac10 75 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64 20 29 20  u)>=p->nField ) 
1ac20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 61 73 73  break;.  }.  ass
1ac30 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f  ert( u<=pKeyInfo
1ac40 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a  ->nField + 1 );.
1ac50 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b    p->nField = u;
1ac60 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44  .}..#if SQLITE_D
1ac70 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  EBUG./*.** This 
1ac80 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65  function compare
1ac90 73 20 74 77 6f 20 69 6e 64 65 78 20 6f 72 20 74  s two index or t
1aca0 61 62 6c 65 20 72 65 63 6f 72 64 20 6b 65 79 73  able record keys
1acb0 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79   in the same way
1acc0 0a 2a 2a 20 61 73 20 74 68 65 20 73 71 6c 69 74  .** as the sqlit
1acd0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1ace0 61 72 65 28 29 20 72 6f 75 74 69 6e 65 2e 20 55  are() routine. U
1acf0 6e 6c 69 6b 65 20 56 64 62 65 52 65 63 6f 72 64  nlike VdbeRecord
1ad00 43 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a 20 74 68  Compare(),.** th
1ad10 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65  is function dese
1ad20 72 69 61 6c 69 7a 65 73 20 61 6e 64 20 63 6f 6d  rializes and com
1ad30 70 61 72 65 73 20 76 61 6c 75 65 73 20 75 73 69  pares values usi
1ad40 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  ng the.** sqlite
1ad50 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29  3VdbeSerialGet()
1ad60 20 61 6e 64 20 73 71 6c 69 74 65 33 4d 65 6d 43   and sqlite3MemC
1ad70 6f 6d 70 61 72 65 28 29 20 66 75 6e 63 74 69 6f  ompare() functio
1ad80 6e 73 2e 20 49 74 20 69 73 20 75 73 65 64 0a 2a  ns. It is used.*
1ad90 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 73 74  * in assert() st
1ada0 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75  atements to ensu
1adb0 72 65 20 74 68 61 74 20 74 68 65 20 6f 70 74 69  re that the opti
1adc0 6d 69 7a 65 64 20 63 6f 64 65 20 69 6e 0a 2a 2a  mized code in.**
1add0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1ade0 72 64 43 6f 6d 70 61 72 65 28 29 20 72 65 74 75  rdCompare() retu
1adf0 72 6e 73 20 72 65 73 75 6c 74 73 20 77 69 74 68  rns results with
1ae00 20 74 68 65 73 65 20 74 77 6f 20 70 72 69 6d 69   these two primi
1ae10 74 69 76 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  tives..**.** Ret
1ae20 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
1ae30 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72  result of compar
1ae40 69 73 6f 6e 20 69 73 20 65 71 75 69 76 61 6c 65  ison is equivale
1ae50 6e 74 20 74 6f 20 64 65 73 69 72 65 64 52 65 73  nt to desiredRes
1ae60 75 6c 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66  ult..** Return f
1ae70 61 6c 73 65 20 69 66 20 74 68 65 72 65 20 69 73  alse if there is
1ae80 20 61 20 64 69 73 61 67 72 65 65 6d 65 6e 74 2e   a disagreement.
1ae90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
1aea0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1aeb0 44 65 62 75 67 28 0a 20 20 69 6e 74 20 6e 4b 65  Debug(.  int nKe
1aec0 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
1aed0 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b  pKey1, /* Left k
1aee0 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 55 6e  ey */.  const Un
1aef0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
1af00 4b 65 79 32 2c 20 2f 2a 20 52 69 67 68 74 20 6b  Key2, /* Right k
1af10 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 69  ey */.  int desi
1af20 72 65 64 52 65 73 75 6c 74 20 20 20 20 20 20 20  redResult       
1af30 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 65 63 74        /* Correct
1af40 20 61 6e 73 77 65 72 20 2a 2f 0a 29 7b 0a 20 20   answer */.){.  
1af50 75 33 32 20 64 31 3b 20 20 20 20 20 20 20 20 20  u32 d1;         
1af60 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
1af70 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
1af80 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f   data element */
1af90 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20  .  u32 idx1;    
1afa0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1afb0 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
1afc0 65 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65  ext header eleme
1afd0 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64  nt */.  u32 szHd
1afe0 72 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  r1;        /* Nu
1aff0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
1b000 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
1b010 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63   i = 0;.  int rc
1b020 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e   = 0;.  const un
1b030 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65  signed char *aKe
1b040 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  y1 = (const unsi
1b050 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
1b060 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  1;.  KeyInfo *pK
1b070 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65  eyInfo;.  Mem me
1b080 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20  m1;..  pKeyInfo 
1b090 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  = pPKey2->pKeyIn
1b0a0 66 6f 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e  fo;.  if( pKeyIn
1b0b0 66 6f 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74 75  fo->db==0 ) retu
1b0c0 72 6e 20 31 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63  rn 1;.  mem1.enc
1b0d0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
1b0e0 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b  ;.  mem1.db = pK
1b0f0 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a  eyInfo->db;.  /*
1b100 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b   mem1.flags = 0;
1b110 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69    // Will be ini
1b120 74 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c 69  tialized by sqli
1b130 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1b140 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59  () */.  VVA_ONLY
1b150 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20  ( mem1.szMalloc 
1b160 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e  = 0; ) /* Only n
1b170 65 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28  eeded by assert(
1b180 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  ) statements */.
1b190 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20  .  /* Compilers 
1b1a0 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61  may complain tha
1b1b0 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f  t mem1.u.i is po
1b1c0 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74  tentially uninit
1b1d0 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65  ialized..  ** We
1b1e0 20 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a   could initializ
1b1f0 65 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68  e it, as shown h
1b200 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20  ere, to silence 
1b210 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73  those complaints
1b220 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61  ..  ** But in fa
1b230 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c  ct, mem1.u.i wil
1b240 6c 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79  l never actually
1b250 20 62 65 20 75 73 65 64 20 75 6e 69 6e 69 74 69   be used uniniti
1b260 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e  alized, and doin
1b270 67 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65  g .  ** the unne
1b280 63 65 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69  cessary initiali
1b290 7a 61 74 69 6f 6e 20 68 61 73 20 61 20 6d 65 61  zation has a mea
1b2a0 73 75 72 61 62 6c 65 20 6e 65 67 61 74 69 76 65  surable negative
1b2b0 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a   performance.  *
1b2c0 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e 63 65 20  * impact, since 
1b2d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1b2e0 61 20 76 65 72 79 20 68 69 67 68 20 72 75 6e 6e  a very high runn
1b2f0 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65 20  er.  And so, we 
1b300 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69  choose.  ** to i
1b310 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70 69 6c  gnore the compil
1b320 65 72 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20  er warnings and 
1b330 6c 65 61 76 65 20 74 68 69 73 20 76 61 72 69 61  leave this varia
1b340 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  ble uninitialize
1b350 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65  d..  */.  /*  me
1b360 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20  m1.u.i = 0;  // 
1b370 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65  not needed, here
1b380 20 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70   to silence comp
1b390 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a  iler warning */.
1b3a0 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56    .  idx1 = getV
1b3b0 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73  arint32(aKey1, s
1b3c0 7a 48 64 72 31 29 3b 0a 20 20 69 66 28 20 73 7a  zHdr1);.  if( sz
1b3d0 48 64 72 31 3e 39 38 33 30 37 20 29 20 72 65 74  Hdr1>98307 ) ret
1b3e0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1b3f0 50 54 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72  PT;.  d1 = szHdr
1b400 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  1;.  assert( pKe
1b410 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b  yInfo->nField+pK
1b420 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e  eyInfo->nXField>
1b430 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20  =pPKey2->nField 
1b440 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
1b450 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49  .  assert( pKeyI
1b460 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21  nfo->aSortOrder!
1b470 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1b480 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
1b490 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
1b4a0 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20  idx1<=szHdr1 || 
1b4b0 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
1b4c0 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69  do{.    u32 seri
1b4d0 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f  al_type1;..    /
1b4e0 2a 20 52 65 61 64 20 74 68 65 20 73 65 72 69 61  * Read the seria
1b4f0 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68 65 20  l types for the 
1b500 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20  next element in 
1b510 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20  each key. */.   
1b520 20 69 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69   idx1 += getVari
1b530 6e 74 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31  nt32( aKey1+idx1
1b540 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29  , serial_type1 )
1b550 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79  ;..    /* Verify
1b560 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 65   that there is e
1b570 6e 6f 75 67 68 20 6b 65 79 20 73 70 61 63 65 20  nough key space 
1b580 72 65 6d 61 69 6e 69 6e 67 20 74 6f 20 61 76 6f  remaining to avo
1b590 69 64 0a 20 20 20 20 2a 2a 20 61 20 62 75 66 66  id.    ** a buff
1b5a0 65 72 20 6f 76 65 72 72 65 61 64 2e 20 20 54 68  er overread.  Th
1b5b0 65 20 22 64 31 2b 73 65 72 69 61 6c 5f 74 79 70  e "d1+serial_typ
1b5c0 65 31 2b 32 22 20 73 75 62 65 78 70 72 65 73 73  e1+2" subexpress
1b5d0 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ion will.    ** 
1b5e0 61 6c 77 61 79 73 20 62 65 20 67 72 65 61 74 65  always be greate
1b5f0 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
1b600 74 6f 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  to the amount of
1b610 20 72 65 71 75 69 72 65 64 20 6b 65 79 20 73 70   required key sp
1b620 61 63 65 2e 0a 20 20 20 20 2a 2a 20 55 73 65 20  ace..    ** Use 
1b630 74 68 61 74 20 61 70 70 72 6f 78 69 6d 61 74 69  that approximati
1b640 6f 6e 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20  on to avoid the 
1b650 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65 20 63  more expensive c
1b660 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
1b670 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
1b680 79 70 65 4c 65 6e 28 29 20 69 6e 20 74 68 65 20  ypeLen() in the 
1b690 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 20  common case..   
1b6a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 31 2b 73   */.    if( d1+s
1b6b0 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 3e 28 75  erial_type1+2>(u
1b6c0 33 32 29 6e 4b 65 79 31 0a 20 20 20 20 20 26 26  32)nKey1.     &&
1b6d0 20 64 31 2b 73 71 6c 69 74 65 33 56 64 62 65 53   d1+sqlite3VdbeS
1b6e0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
1b6f0 69 61 6c 5f 74 79 70 65 31 29 3e 28 75 33 32 29  ial_type1)>(u32)
1b700 6e 4b 65 79 31 20 0a 20 20 20 20 29 7b 0a 20 20  nKey1 .    ){.  
1b710 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1b720 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74  ..    /* Extract
1b730 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62   the values to b
1b740 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20  e compared..    
1b750 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c  */.    d1 += sql
1b760 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1b770 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65  t(&aKey1[d1], se
1b780 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d  rial_type1, &mem
1b790 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74  1);..    /* Do t
1b7a0 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20  he comparison.  
1b7b0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
1b7c0 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
1b7d0 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e  &mem1, &pPKey2->
1b7e0 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65 79 49 6e 66  aMem[i], pKeyInf
1b7f0 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20  o->aColl[i]);.  
1b800 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
1b810 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d       assert( mem
1b820 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  1.szMalloc==0 );
1b830 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74    /* See comment
1b840 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20   below */.      
1b850 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  if( pKeyInfo->aS
1b860 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20  ortOrder[i] ){. 
1b870 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b         rc = -rc;
1b880 20 20 2f 2a 20 49 6e 76 65 72 74 20 74 68 65 20    /* Invert the 
1b890 72 65 73 75 6c 74 20 66 6f 72 20 44 45 53 43 20  result for DESC 
1b8a0 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20  sort order. */. 
1b8b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
1b8c0 6f 20 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e  o debugCompareEn
1b8d0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b  d;.    }.    i++
1b8e0 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31  ;.  }while( idx1
1b8f0 3c 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b  <szHdr1 && i<pPK
1b900 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a  ey2->nField );..
1b910 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61    /* No memory a
1b920 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65  llocation is eve
1b930 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20  r used on mem1. 
1b940 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e   Prove this usin
1b950 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f  g.  ** the follo
1b960 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20  wing assert().  
1b970 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20  If the assert() 
1b980 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61  fails, it indica
1b990 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72  tes a.  ** memor
1b9a0 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65  y leak and a nee
1b9b0 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65  d to call sqlite
1b9c0 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
1b9d0 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61  &mem1)..  */.  a
1b9e0 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61  ssert( mem1.szMa
1b9f0 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  lloc==0 );..  /*
1ba00 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e   rc==0 here mean
1ba10 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68  s that one of th
1ba20 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f  e keys ran out o
1ba30 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a  f fields and.  *
1ba40 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73  * all the fields
1ba50 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e   up to that poin
1ba60 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65  t were equal. Re
1ba70 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74  turn the default
1ba80 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  _rc.  ** value. 
1ba90 20 2a 2f 0a 20 20 72 63 20 3d 20 70 50 4b 65 79   */.  rc = pPKey
1baa0 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 0a  2->default_rc;..
1bab0 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3a  debugCompareEnd:
1bac0 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65  .  if( desiredRe
1bad0 73 75 6c 74 3d 3d 30 20 26 26 20 72 63 3d 3d 30  sult==0 && rc==0
1bae0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
1baf0 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74  f( desiredResult
1bb00 3c 30 20 26 26 20 72 63 3c 30 20 29 20 72 65 74  <0 && rc<0 ) ret
1bb10 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73  urn 1;.  if( des
1bb20 69 72 65 64 52 65 73 75 6c 74 3e 30 20 26 26 20  iredResult>0 && 
1bb30 72 63 3e 30 20 29 20 72 65 74 75 72 6e 20 31 3b  rc>0 ) return 1;
1bb40 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44  .  if( CORRUPT_D
1bb50 42 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  B ) return 1;.  
1bb60 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  if( pKeyInfo->db
1bb70 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1bb80 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
1bb90 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
1bba0 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55  .#if SQLITE_DEBU
1bbb0 47 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68  G./*.** Count th
1bbc0 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  e number of fiel
1bbd0 64 73 20 28 61 2e 6b 2e 61 2e 20 63 6f 6c 75 6d  ds (a.k.a. colum
1bbe0 6e 73 29 20 69 6e 20 74 68 65 20 72 65 63 6f 72  ns) in the recor
1bbf0 64 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 4b  d given by.** pK
1bc00 65 79 2c 6e 4b 65 79 2e 20 20 54 68 65 20 76 65  ey,nKey.  The ve
1bc10 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20 63  rify that this c
1bc20 6f 75 6e 74 20 69 73 20 6c 65 73 73 20 74 68 61  ount is less tha
1bc30 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
1bc40 65 0a 2a 2a 20 6c 69 6d 69 74 20 67 69 76 65 6e  e.** limit given
1bc50 20 62 79 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46   by pKeyInfo->nF
1bc60 69 65 6c 64 20 2b 20 70 4b 65 79 49 6e 66 6f 2d  ield + pKeyInfo-
1bc70 3e 6e 58 46 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20  >nXField..**.** 
1bc80 49 66 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  If this constrai
1bc90 6e 74 20 69 73 20 6e 6f 74 20 73 61 74 69 73 66  nt is not satisf
1bca0 69 65 64 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ied, it means th
1bcb0 61 74 20 74 68 65 20 68 69 67 68 2d 73 70 65 65  at the high-spee
1bcc0 64 0a 2a 2a 20 76 64 62 65 52 65 63 6f 72 64 43  d.** vdbeRecordC
1bcd0 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64 20  ompareInt() and 
1bce0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1bcf0 65 53 74 72 69 6e 67 28 29 20 72 6f 75 74 69 6e  eString() routin
1bd00 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77  es will.** not w
1bd10 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 20 20  ork correctly.  
1bd20 49 66 20 74 68 69 73 20 61 73 73 65 72 74 28 29  If this assert()
1bd30 20 65 76 65 72 20 66 69 72 65 73 2c 20 69 74 20   ever fires, it 
1bd40 70 72 6f 62 61 62 6c 79 20 6d 65 61 6e 73 0a 2a  probably means.*
1bd50 2a 20 74 68 61 74 20 74 68 65 20 4b 65 79 49 6e  * that the KeyIn
1bd60 66 6f 2e 6e 46 69 65 6c 64 20 6f 72 20 4b 65 79  fo.nField or Key
1bd70 49 6e 66 6f 2e 6e 58 46 69 65 6c 64 20 76 61 6c  Info.nXField val
1bd80 75 65 73 20 77 65 72 65 20 63 6f 6d 70 75 74 65  ues were compute
1bd90 64 0a 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79  d.** incorrectly
1bda0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1bdb0 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64   vdbeAssertField
1bdc0 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74  CountWithinLimit
1bdd0 73 28 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63  s(.  int nKey, c
1bde0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
1bdf0 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
1be00 20 74 6f 20 76 65 72 69 66 79 20 2a 2f 20 0a 20   to verify */ . 
1be10 20 63 6f 6e 73 74 20 4b 65 79 49 6e 66 6f 20 2a   const KeyInfo *
1be20 70 4b 65 79 49 6e 66 6f 20 20 20 20 20 20 20 2f  pKeyInfo       /
1be30 2a 20 43 6f 6d 70 61 72 65 20 73 69 7a 65 20 77  * Compare size w
1be40 69 74 68 20 74 68 69 73 20 4b 65 79 49 6e 66 6f  ith this KeyInfo
1be50 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 46 69   */.){.  int nFi
1be60 65 6c 64 20 3d 20 30 3b 0a 20 20 75 33 32 20 73  eld = 0;.  u32 s
1be70 7a 48 64 72 3b 0a 20 20 75 33 32 20 69 64 78 3b  zHdr;.  u32 idx;
1be80 0a 20 20 75 33 32 20 6e 6f 74 55 73 65 64 3b 0a  .  u32 notUsed;.
1be90 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1bea0 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63   char *aKey = (c
1beb0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1bec0 61 72 2a 29 70 4b 65 79 3b 0a 0a 20 20 69 66 28  ar*)pKey;..  if(
1bed0 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65   CORRUPT_DB ) re
1bee0 74 75 72 6e 3b 0a 20 20 69 64 78 20 3d 20 67 65  turn;.  idx = ge
1bef0 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20  tVarint32(aKey, 
1bf00 73 7a 48 64 72 29 3b 0a 20 20 61 73 73 65 72 74  szHdr);.  assert
1bf10 28 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61  ( nKey>=0 );.  a
1bf20 73 73 65 72 74 28 20 73 7a 48 64 72 3c 3d 28 75  ssert( szHdr<=(u
1bf30 33 32 29 6e 4b 65 79 20 29 3b 0a 20 20 77 68 69  32)nKey );.  whi
1bf40 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20 29 7b  le( idx<szHdr ){
1bf50 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56  .    idx += getV
1bf60 61 72 69 6e 74 33 32 28 61 4b 65 79 2b 69 64 78  arint32(aKey+idx
1bf70 2c 20 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20  , notUsed);.    
1bf80 6e 46 69 65 6c 64 2b 2b 3b 0a 20 20 7d 0a 20 20  nField++;.  }.  
1bf90 61 73 73 65 72 74 28 20 6e 46 69 65 6c 64 20 3c  assert( nField <
1bfa0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  = pKeyInfo->nFie
1bfb0 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46  ld+pKeyInfo->nXF
1bfc0 69 65 6c 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a  ield );.}.#else.
1bfd0 23 20 64 65 66 69 6e 65 20 76 64 62 65 41 73 73  # define vdbeAss
1bfe0 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74  ertFieldCountWit
1bff0 68 69 6e 4c 69 6d 69 74 73 28 41 2c 42 2c 43 29  hinLimits(A,B,C)
1c000 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42  .#endif../*.** B
1c010 6f 74 68 20 2a 70 4d 65 6d 31 20 61 6e 64 20 2a  oth *pMem1 and *
1c020 70 4d 65 6d 32 20 63 6f 6e 74 61 69 6e 20 73 74  pMem2 contain st
1c030 72 69 6e 67 20 76 61 6c 75 65 73 2e 20 43 6f 6d  ring values. Com
1c040 70 61 72 65 20 74 68 65 20 74 77 6f 20 76 61 6c  pare the two val
1c050 75 65 73 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ues.** using the
1c060 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1c070 6e 63 65 20 70 43 6f 6c 6c 2e 20 41 73 20 75 73  nce pColl. As us
1c080 75 61 6c 2c 20 72 65 74 75 72 6e 20 61 20 6e 65  ual, return a ne
1c090 67 61 74 69 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a  gative , zero.**
1c0a0 20 6f 72 20 70 6f 73 69 74 69 76 65 20 76 61 6c   or positive val
1c0b0 75 65 20 69 66 20 2a 70 4d 65 6d 31 20 69 73 20  ue if *pMem1 is 
1c0c0 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
1c0d0 20 74 6f 20 6f 72 20 67 72 65 61 74 65 72 20 74   to or greater t
1c0e0 68 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20  han .** *pMem2, 
1c0f0 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 53 69  respectively. Si
1c100 6d 69 6c 61 72 20 69 6e 20 73 70 69 72 69 74 20  milar in spirit 
1c110 74 6f 20 22 72 63 20 3d 20 28 2a 70 4d 65 6d 31  to "rc = (*pMem1
1c120 29 20 2d 20 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a  ) - (*pMem2);"..
1c130 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
1c140 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69  beCompareMemStri
1c150 6e 67 28 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20  ng(.  const Mem 
1c160 2a 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e 73 74 20  *pMem1,.  const 
1c170 4d 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f  Mem *pMem2,.  co
1c180 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  nst CollSeq *pCo
1c190 6c 6c 2c 0a 20 20 75 38 20 2a 70 72 63 45 72 72  ll,.  u8 *prcErr
1c1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1b0 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 4f        /* If an O
1c1c0 4f 4d 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74  OM occurs, set t
1c1d0 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 2a  o SQLITE_NOMEM *
1c1e0 2f 0a 29 7b 0a 20 20 69 66 28 20 70 4d 65 6d 31  /.){.  if( pMem1
1c1f0 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e  ->enc==pColl->en
1c200 63 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  c ){.    /* The 
1c210 73 74 72 69 6e 67 73 20 61 72 65 20 61 6c 72 65  strings are alre
1c220 61 64 79 20 69 6e 20 74 68 65 20 63 6f 72 72 65  ady in the corre
1c230 63 74 20 65 6e 63 6f 64 69 6e 67 2e 20 20 43 61  ct encoding.  Ca
1c240 6c 6c 20 74 68 65 0a 20 20 20 20 20 2a 2a 20 63  ll the.     ** c
1c250 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
1c260 6f 6e 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 20  on directly */. 
1c270 20 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 2d     return pColl-
1c280 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73  >xCmp(pColl->pUs
1c290 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d  er,pMem1->n,pMem
1c2a0 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d  1->z,pMem2->n,pM
1c2b0 65 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65  em2->z);.  }else
1c2c0 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
1c2d0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 76 31    const void *v1
1c2e0 2c 20 2a 76 32 3b 0a 20 20 20 20 69 6e 74 20 6e  , *v2;.    int n
1c2f0 31 2c 20 6e 32 3b 0a 20 20 20 20 4d 65 6d 20 63  1, n2;.    Mem c
1c300 31 3b 0a 20 20 20 20 4d 65 6d 20 63 32 3b 0a 20  1;.    Mem c2;. 
1c310 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
1c320 6d 49 6e 69 74 28 26 63 31 2c 20 70 4d 65 6d 31  mInit(&c1, pMem1
1c330 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b  ->db, MEM_Null);
1c340 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1c350 4d 65 6d 49 6e 69 74 28 26 63 32 2c 20 70 4d 65  MemInit(&c2, pMe
1c360 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c  m1->db, MEM_Null
1c370 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1c380 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79  beMemShallowCopy
1c390 28 26 63 31 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d  (&c1, pMem1, MEM
1c3a0 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 73 71 6c  _Ephem);.    sql
1c3b0 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c  ite3VdbeMemShall
1c3c0 6f 77 43 6f 70 79 28 26 63 32 2c 20 70 4d 65 6d  owCopy(&c2, pMem
1c3d0 32 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20  2, MEM_Ephem);. 
1c3e0 20 20 20 76 31 20 3d 20 73 71 6c 69 74 65 33 56     v1 = sqlite3V
1c3f0 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74 65  alueText((sqlite
1c400 33 5f 76 61 6c 75 65 2a 29 26 63 31 2c 20 70 43  3_value*)&c1, pC
1c410 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e  oll->enc);.    n
1c420 31 20 3d 20 76 31 3d 3d 30 20 3f 20 30 20 3a 20  1 = v1==0 ? 0 : 
1c430 63 31 2e 6e 3b 0a 20 20 20 20 76 32 20 3d 20 73  c1.n;.    v2 = s
1c440 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28  qlite3ValueText(
1c450 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
1c460 26 63 32 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29  &c2, pColl->enc)
1c470 3b 0a 20 20 20 20 6e 32 20 3d 20 76 32 3d 3d 30  ;.    n2 = v2==0
1c480 20 3f 20 30 20 3a 20 63 32 2e 6e 3b 0a 20 20 20   ? 0 : c2.n;.   
1c490 20 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d   rc = pColl->xCm
1c4a0 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20  p(pColl->pUser, 
1c4b0 6e 31 2c 20 76 31 2c 20 6e 32 2c 20 76 32 29 3b  n1, v1, n2, v2);
1c4c0 0a 20 20 20 20 69 66 28 20 28 76 31 3d 3d 30 20  .    if( (v1==0 
1c4d0 7c 7c 20 76 32 3d 3d 30 29 20 26 26 20 70 72 63  || v2==0) && prc
1c4e0 45 72 72 20 29 20 2a 70 72 63 45 72 72 20 3d 20  Err ) *prcErr = 
1c4f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1c500 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1c510 52 65 6c 65 61 73 65 28 26 63 31 29 3b 0a 20 20  Release(&c1);.  
1c520 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1c530 52 65 6c 65 61 73 65 28 26 63 32 29 3b 0a 20 20  Release(&c2);.  
1c540 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1c550 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
1c560 65 20 74 77 6f 20 62 6c 6f 62 73 2e 20 20 52 65  e two blobs.  Re
1c570 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a  turn negative, z
1c580 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
1c590 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   if the first.**
1c5a0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
1c5b0 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61  qual to, or grea
1c5c0 74 65 72 20 74 68 61 6e 20 74 68 65 20 73 65 63  ter than the sec
1c5d0 6f 6e 64 2c 20 72 65 73 70 65 63 74 69 76 65 6c  ond, respectivel
1c5e0 79 2e 0a 2a 2a 20 49 66 20 6f 6e 65 20 62 6c 6f  y..** If one blo
1c5f0 62 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66  b is a prefix of
1c600 20 74 68 65 20 6f 74 68 65 72 2c 20 74 68 65 6e   the other, then
1c610 20 74 68 65 20 73 68 6f 72 74 65 72 20 69 73 20   the shorter is 
1c620 74 68 65 20 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 73  the lessor..*/.s
1c630 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
1c640 4e 4c 49 4e 45 20 69 6e 74 20 73 71 6c 69 74 65  NLINE int sqlite
1c650 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 63 6f 6e  3BlobCompare(con
1c660 73 74 20 4d 65 6d 20 2a 70 42 31 2c 20 63 6f 6e  st Mem *pB1, con
1c670 73 74 20 4d 65 6d 20 2a 70 42 32 29 7b 0a 20 20  st Mem *pB2){.  
1c680 69 6e 74 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70  int c = memcmp(p
1c690 42 31 2d 3e 7a 2c 20 70 42 32 2d 3e 7a 2c 20 70  B1->z, pB2->z, p
1c6a0 42 31 2d 3e 6e 3e 70 42 32 2d 3e 6e 20 3f 20 70  B1->n>pB2->n ? p
1c6b0 42 32 2d 3e 6e 20 3a 20 70 42 31 2d 3e 6e 29 3b  B2->n : pB1->n);
1c6c0 0a 20 20 69 66 28 20 63 20 29 20 72 65 74 75 72  .  if( c ) retur
1c6d0 6e 20 63 3b 0a 20 20 72 65 74 75 72 6e 20 70 42  n c;.  return pB
1c6e0 31 2d 3e 6e 20 2d 20 70 42 32 2d 3e 6e 3b 0a 7d  1->n - pB2->n;.}
1c6f0 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 63 6f 6d  ../*.** Do a com
1c700 70 61 72 69 73 6f 6e 20 62 65 74 77 65 65 6e 20  parison between 
1c710 61 20 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20  a 64-bit signed 
1c720 69 6e 74 65 67 65 72 20 61 6e 64 20 61 20 36 34  integer and a 64
1c730 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 2d 70 6f  -bit floating-po
1c740 69 6e 74 0a 2a 2a 20 6e 75 6d 62 65 72 2e 20 20  int.** number.  
1c750 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c  Return negative,
1c760 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69   zero, or positi
1c770 76 65 20 69 66 20 74 68 65 20 66 69 72 73 74 20  ve if the first 
1c780 28 69 36 34 29 20 69 73 20 6c 65 73 73 20 74 68  (i64) is less th
1c790 61 6e 2c 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 2c  an,.** equal to,
1c7a0 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
1c7b0 20 74 68 65 20 73 65 63 6f 6e 64 20 28 64 6f 75   the second (dou
1c7c0 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ble)..*/.static 
1c7d0 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 74 46 6c  int sqlite3IntFl
1c7e0 6f 61 74 43 6f 6d 70 61 72 65 28 69 36 34 20 69  oatCompare(i64 i
1c7f0 2c 20 64 6f 75 62 6c 65 20 72 29 7b 0a 20 20 69  , double r){.  i
1c800 66 28 20 73 69 7a 65 6f 66 28 4c 4f 4e 47 44 4f  f( sizeof(LONGDO
1c810 55 42 4c 45 5f 54 59 50 45 29 3e 38 20 29 7b 0a  UBLE_TYPE)>8 ){.
1c820 20 20 20 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54      LONGDOUBLE_T
1c830 59 50 45 20 78 20 3d 20 28 4c 4f 4e 47 44 4f 55  YPE x = (LONGDOU
1c840 42 4c 45 5f 54 59 50 45 29 69 3b 0a 20 20 20 20  BLE_TYPE)i;.    
1c850 69 66 28 20 78 3c 72 20 29 20 72 65 74 75 72 6e  if( x<r ) return
1c860 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 78 3e 72   -1;.    if( x>r
1c870 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20   ) return +1;.  
1c880 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65    return 0;.  }e
1c890 6c 73 65 7b 0a 20 20 20 20 69 36 34 20 79 3b 0a  lse{.    i64 y;.
1c8a0 20 20 20 20 64 6f 75 62 6c 65 20 73 3b 0a 20 20      double s;.  
1c8b0 20 20 69 66 28 20 72 3c 2d 39 32 32 33 33 37 32    if( r<-9223372
1c8c0 30 33 36 38 35 34 37 37 35 38 30 38 2e 30 20 29  036854775808.0 )
1c8d0 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20   return +1;.    
1c8e0 69 66 28 20 72 3e 39 32 32 33 33 37 32 30 33 36  if( r>9223372036
1c8f0 38 35 34 37 37 35 38 30 37 2e 30 20 29 20 72 65  854775807.0 ) re
1c900 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 79 20 3d  turn -1;.    y =
1c910 20 28 69 36 34 29 72 3b 0a 20 20 20 20 69 66 28   (i64)r;.    if(
1c920 20 69 3c 79 20 29 20 72 65 74 75 72 6e 20 2d 31   i<y ) return -1
1c930 3b 0a 20 20 20 20 69 66 28 20 69 3e 79 20 29 7b  ;.    if( i>y ){
1c940 0a 20 20 20 20 20 20 69 66 28 20 79 3d 3d 53 4d  .      if( y==SM
1c950 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 26 26 20  ALLEST_INT64 && 
1c960 72 3e 30 2e 30 20 29 20 72 65 74 75 72 6e 20 2d  r>0.0 ) return -
1c970 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
1c980 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 20  +1;.    }.    s 
1c990 3d 20 28 64 6f 75 62 6c 65 29 69 3b 0a 20 20 20  = (double)i;.   
1c9a0 20 69 66 28 20 73 3c 72 20 29 20 72 65 74 75 72   if( s<r ) retur
1c9b0 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 73 3e  n -1;.    if( s>
1c9c0 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20  r ) return +1;. 
1c9d0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1c9e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
1c9f0 65 20 74 68 65 20 76 61 6c 75 65 73 20 63 6f 6e  e the values con
1ca00 74 61 69 6e 65 64 20 62 79 20 74 68 65 20 74 77  tained by the tw
1ca10 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2c 20  o memory cells, 
1ca20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67  returning.** neg
1ca30 61 74 69 76 65 2c 20 7a 65 72 6f 20 6f 72 20 70  ative, zero or p
1ca40 6f 73 69 74 69 76 65 20 69 66 20 70 4d 65 6d 31  ositive if pMem1
1ca50 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
1ca60 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61  qual to, or grea
1ca70 74 65 72 0a 2a 2a 20 74 68 61 6e 20 70 4d 65 6d  ter.** than pMem
1ca80 32 2e 20 53 6f 72 74 69 6e 67 20 6f 72 64 65 72  2. Sorting order
1ca90 20 69 73 20 4e 55 4c 4c 27 73 20 66 69 72 73 74   is NULL's first
1caa0 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6e 75  , followed by nu
1cab0 6d 62 65 72 73 20 28 69 6e 74 65 67 65 72 73 0a  mbers (integers.
1cac0 2a 2a 20 61 6e 64 20 72 65 61 6c 73 29 20 73 6f  ** and reals) so
1cad0 72 74 65 64 20 6e 75 6d 65 72 69 63 61 6c 6c 79  rted numerically
1cae0 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65  , followed by te
1caf0 78 74 20 6f 72 64 65 72 65 64 20 62 79 20 74 68  xt ordered by th
1cb00 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73  e collating.** s
1cb10 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 61 6e  equence pColl an
1cb20 64 20 66 69 6e 61 6c 6c 79 20 62 6c 6f 62 27 73  d finally blob's
1cb30 20 6f 72 64 65 72 65 64 20 62 79 20 6d 65 6d 63   ordered by memc
1cb40 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20  mp()..**.** Two 
1cb50 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20  NULL values are 
1cb60 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 61 6c  considered equal
1cb70 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
1cb80 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
1cb90 33 4d 65 6d 43 6f 6d 70 61 72 65 28 63 6f 6e 73  3MemCompare(cons
1cba0 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f  t Mem *pMem1, co
1cbb0 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20  nst Mem *pMem2, 
1cbc0 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70  const CollSeq *p
1cbd0 43 6f 6c 6c 29 7b 0a 20 20 69 6e 74 20 66 31 2c  Coll){.  int f1,
1cbe0 20 66 32 3b 0a 20 20 69 6e 74 20 63 6f 6d 62 69   f2;.  int combi
1cbf0 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 20 66 31  ned_flags;..  f1
1cc00 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b   = pMem1->flags;
1cc10 0a 20 20 66 32 20 3d 20 70 4d 65 6d 32 2d 3e 66  .  f2 = pMem2->f
1cc20 6c 61 67 73 3b 0a 20 20 63 6f 6d 62 69 6e 65 64  lags;.  combined
1cc30 5f 66 6c 61 67 73 20 3d 20 66 31 7c 66 32 3b 0a  _flags = f1|f2;.
1cc40 20 20 61 73 73 65 72 74 28 20 28 63 6f 6d 62 69    assert( (combi
1cc50 6e 65 64 5f 66 6c 61 67 73 20 26 20 4d 45 4d 5f  ned_flags & MEM_
1cc60 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b 0a 20 0a  RowSet)==0 );. .
1cc70 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75    /* If one valu
1cc80 65 20 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69 73  e is NULL, it is
1cc90 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6f   less than the o
1cca0 74 68 65 72 2e 20 49 66 20 62 6f 74 68 20 76 61  ther. If both va
1ccb0 6c 75 65 73 0a 20 20 2a 2a 20 61 72 65 20 4e 55  lues.  ** are NU
1ccc0 4c 4c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20  LL, return 0..  
1ccd0 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65  */.  if( combine
1cce0 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c  d_flags&MEM_Null
1ccf0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
1cd00 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28  f2&MEM_Null) - (
1cd10 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20  f1&MEM_Null);.  
1cd20 7d 0a 0a 20 20 2f 2a 20 41 74 20 6c 65 61 73 74  }..  /* At least
1cd30 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20   one of the two 
1cd40 76 61 6c 75 65 73 20 69 73 20 61 20 6e 75 6d 62  values is a numb
1cd50 65 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f  er.  */.  if( co
1cd60 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d 45  mbined_flags&(ME
1cd70 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20  M_Int|MEM_Real) 
1cd80 29 7b 0a 20 20 20 20 69 66 28 20 28 66 31 20 26  ){.    if( (f1 &
1cd90 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d   f2 & MEM_Int)!=
1cda0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
1cdb0 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d  Mem1->u.i < pMem
1cdc0 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20  2->u.i ) return 
1cdd0 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  -1;.      if( pM
1cde0 65 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32  em1->u.i > pMem2
1cdf0 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2b  ->u.i ) return +
1ce00 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
1ce10 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
1ce20 20 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f   (f1 & f2 & MEM_
1ce30 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  Real)!=0 ){.    
1ce40 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72    if( pMem1->u.r
1ce50 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20   < pMem2->u.r ) 
1ce60 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
1ce70 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20   if( pMem1->u.r 
1ce80 3e 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72  > pMem2->u.r ) r
1ce90 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20  eturn +1;.      
1cea0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1ceb0 20 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d 5f      if( (f1&MEM_
1cec0 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Int)!=0 ){.     
1ced0 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 52 65 61   if( (f2&MEM_Rea
1cee0 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)!=0 ){.       
1cef0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49   return sqlite3I
1cf00 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70  ntFloatCompare(p
1cf10 4d 65 6d 31 2d 3e 75 2e 69 2c 20 70 4d 65 6d 32  Mem1->u.i, pMem2
1cf20 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65  ->u.r);.      }e
1cf30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74  lse{.        ret
1cf40 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  urn -1;.      }.
1cf50 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66      }.    if( (f
1cf60 31 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29  1&MEM_Real)!=0 )
1cf70 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66 32 26  {.      if( (f2&
1cf80 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20  MEM_Int)!=0 ){. 
1cf90 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 73         return -s
1cfa0 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f  qlite3IntFloatCo
1cfb0 6d 70 61 72 65 28 70 4d 65 6d 32 2d 3e 75 2e 69  mpare(pMem2->u.i
1cfc0 2c 20 70 4d 65 6d 31 2d 3e 75 2e 72 29 3b 0a 20  , pMem1->u.r);. 
1cfd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1cfe0 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
1cff0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1d000 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 7d 0a   return +1;.  }.
1d010 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c  .  /* If one val
1d020 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 20 61  ue is a string a
1d030 6e 64 20 74 68 65 20 6f 74 68 65 72 20 69 73 20  nd the other is 
1d040 61 20 62 6c 6f 62 2c 20 74 68 65 20 73 74 72 69  a blob, the stri
1d050 6e 67 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a  ng is less..  **
1d060 20 49 66 20 62 6f 74 68 20 61 72 65 20 73 74 72   If both are str
1d070 69 6e 67 73 2c 20 63 6f 6d 70 61 72 65 20 75 73  ings, compare us
1d080 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  ing the collatin
1d090 67 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a  g functions..  *
1d0a0 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64  /.  if( combined
1d0b0 5f 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29  _flags&MEM_Str )
1d0c0 7b 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20  {.    if( (f1 & 
1d0d0 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20  MEM_Str)==0 ){. 
1d0e0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1d0f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 32     }.    if( (f2
1d100 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29   & MEM_Str)==0 )
1d110 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  {.      return -
1d120 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73  1;.    }..    as
1d130 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63  sert( pMem1->enc
1d140 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20 7c 7c 20  ==pMem2->enc || 
1d150 70 4d 65 6d 31 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  pMem1->db->mallo
1d160 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 61  cFailed );.    a
1d170 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e  ssert( pMem1->en
1d180 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  c==SQLITE_UTF8 |
1d190 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  | .            p
1d1a0 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54  Mem1->enc==SQLIT
1d1b0 45 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d 65  E_UTF16LE || pMe
1d1c0 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  m1->enc==SQLITE_
1d1d0 55 54 46 31 36 42 45 20 29 3b 0a 0a 20 20 20 20  UTF16BE );..    
1d1e0 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  /* The collation
1d1f0 20 73 65 71 75 65 6e 63 65 20 6d 75 73 74 20 62   sequence must b
1d200 65 20 64 65 66 69 6e 65 64 20 61 74 20 74 68 69  e defined at thi
1d210 73 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69 66  s point, even if
1d220 0a 20 20 20 20 2a 2a 20 74 68 65 20 75 73 65 72  .    ** the user
1d230 20 64 65 6c 65 74 65 73 20 74 68 65 20 63 6f 6c   deletes the col
1d240 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1d250 61 66 74 65 72 20 74 68 65 20 76 64 62 65 20 70  after the vdbe p
1d260 72 6f 67 72 61 6d 20 69 73 0a 20 20 20 20 2a 2a  rogram is.    **
1d270 20 63 6f 6d 70 69 6c 65 64 20 28 74 68 69 73 20   compiled (this 
1d280 77 61 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 74  was not always t
1d290 68 65 20 63 61 73 65 29 2e 0a 20 20 20 20 2a 2f  he case)..    */
1d2a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 43  .    assert( !pC
1d2b0 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43  oll || pColl->xC
1d2c0 6d 70 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  mp );..    if( p
1d2d0 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65  Coll ){.      re
1d2e0 74 75 72 6e 20 76 64 62 65 43 6f 6d 70 61 72 65  turn vdbeCompare
1d2f0 4d 65 6d 53 74 72 69 6e 67 28 70 4d 65 6d 31 2c  MemString(pMem1,
1d300 20 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20 30   pMem2, pColl, 0
1d310 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  );.    }.    /* 
1d320 49 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  If a NULL pointe
1d330 72 20 77 61 73 20 70 61 73 73 65 64 20 61 73 20  r was passed as 
1d340 74 68 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e 63  the collate func
1d350 74 69 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f 75  tion, fall throu
1d360 67 68 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  gh.    ** to the
1d370 20 62 6c 6f 62 20 63 61 73 65 20 61 6e 64 20 75   blob case and u
1d380 73 65 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f  se memcmp().  */
1d390 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74 68  .  }. .  /* Both
1d3a0 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20   values must be 
1d3b0 62 6c 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65 20  blobs.  Compare 
1d3c0 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20  using memcmp(). 
1d3d0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   */.  return sql
1d3e0 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28  ite3BlobCompare(
1d3f0 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a 7d  pMem1, pMem2);.}
1d400 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72  .../*.** The fir
1d410 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  st argument pass
1d420 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
1d430 69 6f 6e 20 69 73 20 61 20 73 65 72 69 61 6c 2d  ion is a serial-
1d440 74 79 70 65 20 74 68 61 74 0a 2a 2a 20 63 6f 72  type that.** cor
1d450 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 69  responds to an i
1d460 6e 74 65 67 65 72 20 2d 20 61 6c 6c 20 76 61 6c  nteger - all val
1d470 75 65 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e  ues between 1 an
1d480 64 20 39 20 69 6e 63 6c 75 73 69 76 65 20 0a 2a  d 9 inclusive .*
1d490 2a 20 65 78 63 65 70 74 20 37 2e 20 54 68 65 20  * except 7. The 
1d4a0 73 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20 74 6f  second points to
1d4b0 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
1d4c0 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67 65 72 20  ning an integer 
1d4d0 76 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61 6c 69  value.** seriali
1d4e0 7a 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  zed according to
1d4f0 20 73 65 72 69 61 6c 5f 74 79 70 65 2e 20 54 68   serial_type. Th
1d500 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65  is function dese
1d510 72 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64 20  rializes.** and 
1d520 72 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75  returns the valu
1d530 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34  e..*/.static i64
1d540 20 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64   vdbeRecordDecod
1d550 65 49 6e 74 28 75 33 32 20 73 65 72 69 61 6c 5f  eInt(u32 serial_
1d560 74 79 70 65 2c 20 63 6f 6e 73 74 20 75 38 20 2a  type, const u8 *
1d570 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 79 3b 0a  aKey){.  u32 y;.
1d580 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
1d590 54 5f 44 42 20 7c 7c 20 28 73 65 72 69 61 6c 5f  T_DB || (serial_
1d5a0 74 79 70 65 3e 3d 31 20 26 26 20 73 65 72 69 61  type>=1 && seria
1d5b0 6c 5f 74 79 70 65 3c 3d 39 20 26 26 20 73 65 72  l_type<=9 && ser
1d5c0 69 61 6c 5f 74 79 70 65 21 3d 37 29 20 29 3b 0a  ial_type!=7) );.
1d5d0 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c    switch( serial
1d5e0 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  _type ){.    cas
1d5f0 65 20 30 3a 0a 20 20 20 20 63 61 73 65 20 31 3a  e 0:.    case 1:
1d600 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d610 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
1d620 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 4f 4e  .      return ON
1d630 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  E_BYTE_INT(aKey)
1d640 3b 0a 20 20 20 20 63 61 73 65 20 32 3a 0a 20 20  ;.    case 2:.  
1d650 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
1d660 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
1d670 20 20 20 20 72 65 74 75 72 6e 20 54 57 4f 5f 42      return TWO_B
1d680 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1d690 20 20 20 63 61 73 65 20 33 3a 0a 20 20 20 20 20     case 3:.     
1d6a0 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
1d6b0 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
1d6c0 20 72 65 74 75 72 6e 20 54 48 52 45 45 5f 42 59   return THREE_BY
1d6d0 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1d6e0 20 20 63 61 73 65 20 34 3a 20 7b 0a 20 20 20 20    case 4: {.    
1d6f0 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1d700 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1d710 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f    y = FOUR_BYTE_
1d720 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  UINT(aKey);.    
1d730 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28    return (i64)*(
1d740 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d 0a 20  int*)&y;.    }. 
1d750 20 20 20 63 61 73 65 20 35 3a 20 7b 0a 20 20 20     case 5: {.   
1d760 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1d770 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1d780 20 20 20 72 65 74 75 72 6e 20 46 4f 55 52 5f 42     return FOUR_B
1d790 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29  YTE_UINT(aKey+2)
1d7a0 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32   + (((i64)1)<<32
1d7b0 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61  )*TWO_BYTE_INT(a
1d7c0 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Key);.    }.    
1d7d0 63 61 73 65 20 36 3a 20 7b 0a 20 20 20 20 20 20  case 6: {.      
1d7e0 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54  u64 x = FOUR_BYT
1d7f0 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  E_UINT(aKey);.  
1d800 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
1d810 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
1d820 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20      x = (x<<32) 
1d830 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  | FOUR_BYTE_UINT
1d840 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20  (aKey+4);.      
1d850 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69 36  return (i64)*(i6
1d860 34 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  4*)&x;.    }.  }
1d870 0a 0a 20 20 72 65 74 75 72 6e 20 28 73 65 72 69  ..  return (seri
1d880 61 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a 7d 0a  al_type - 8);.}.
1d890 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1d8a0 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68  tion compares th
1d8b0 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73  e two table rows
1d8c0 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64   or index record
1d8d0 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62  s.** specified b
1d8e0 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d  y {nKey1, pKey1}
1d8f0 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49 74   and pPKey2.  It
1d900 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74   returns a negat
1d910 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20  ive, zero.** or 
1d920 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72  positive integer
1d930 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73 73   if key1 is less
1d940 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20   than, equal to 
1d950 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74  or .** greater t
1d960 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20 7b  han key2.  The {
1d970 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65  nKey1, pKey1} ke
1d980 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62  y must be a blob
1d990 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 74  .** created by t
1d9a0 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
1d9b0 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56   opcode of the V
1d9c0 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32  DBE.  The pPKey2
1d9d0 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20  .** key must be 
1d9e0 61 20 70 61 72 73 65 64 20 6b 65 79 20 73 75 63  a parsed key suc
1d9f0 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72  h as obtained fr
1da00 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  om.** sqlite3Vdb
1da10 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a  eParseRecord..**
1da20 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
1da30 62 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  bSkip is non-zer
1da40 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  o, it is assumed
1da50 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
1da60 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20   has already.** 
1da70 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20  determined that 
1da80 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73  the first fields
1da90 20 6f 66 20 74 68 65 20 6b 65 79 73 20 61 72 65   of the keys are
1daa0 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65   equal..**.** Ke
1dab0 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e  y1 and Key2 do n
1dac0 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61  ot have to conta
1dad0 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  in the same numb
1dae0 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 20 49 66  er of fields. If
1daf0 20 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73 20   all .** fields 
1db00 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 62  that appear in b
1db10 6f 74 68 20 6b 65 79 73 20 61 72 65 20 65 71 75  oth keys are equ
1db20 61 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79 32 2d  al, then pPKey2-
1db30 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 73 20 0a  >default_rc is .
1db40 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  ** returned..**.
1db50 2a 2a 20 49 66 20 64 61 74 61 62 61 73 65 20 63  ** If database c
1db60 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 69 73  orruption is dis
1db70 63 6f 76 65 72 65 64 2c 20 73 65 74 20 70 50 4b  covered, set pPK
1db80 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 74 6f 20  ey2->errCode to 
1db90 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  .** SQLITE_CORRU
1dba0 50 54 20 61 6e 64 20 72 65 74 75 72 6e 20 30 2e  PT and return 0.
1dbb0 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   If an OOM error
1dbc0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
1dbd0 20 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e 65 72 72   .** pPKey2->err
1dbe0 43 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 53  Code is set to S
1dbf0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 2c  QLITE_NOMEM and,
1dc00 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55   if it is not NU
1dc10 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c 6f  LL, the.** mallo
1dc20 63 2d 66 61 69 6c 65 64 20 66 6c 61 67 20 73 65  c-failed flag se
1dc30 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61  t on database ha
1dc40 6e 64 6c 65 20 28 70 50 4b 65 79 32 2d 3e 70 4b  ndle (pPKey2->pK
1dc50 65 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a  eyInfo->db)..*/.
1dc60 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52  int sqlite3VdbeR
1dc70 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68  ecordCompareWith
1dc80 53 6b 69 70 28 0a 20 20 69 6e 74 20 6e 4b 65 79  Skip(.  int nKey
1dc90 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
1dca0 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20  Key1,   /* Left 
1dcb0 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  key */.  Unpacke
1dcc0 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c  dRecord *pPKey2,
1dcd0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68           /* Righ
1dce0 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62  t key */.  int b
1dcf0 53 6b 69 70 20 20 20 20 20 20 20 20 20 20 20 20  Skip            
1dd00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
1dd10 20 74 72 75 65 2c 20 73 6b 69 70 20 74 68 65 20   true, skip the 
1dd20 66 69 72 73 74 20 66 69 65 6c 64 20 2a 2f 0a 29  first field */.)
1dd30 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20 20  {.  u32 d1;     
1dd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd50 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
1dd60 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
1dd70 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a  t data element *
1dd80 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
1dd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dda0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1ddb0 6e 65 78 74 20 66 69 65 6c 64 20 74 6f 20 63 6f  next field to co
1ddc0 6d 70 61 72 65 20 2a 2f 0a 20 20 75 33 32 20 73  mpare */.  u32 s
1ddd0 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 20 20  zHdr1;          
1dde0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1ddf0 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 68 65 61  ze of record hea
1de00 64 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  der in bytes */.
1de10 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20    u32 idx1;     
1de20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de30 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66    /* Offset of f
1de40 69 72 73 74 20 74 79 70 65 20 69 6e 20 68 65 61  irst type in hea
1de50 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  der */.  int rc 
1de60 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1de70 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1de80 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d 65  rn value */.  Me
1de90 6d 20 2a 70 52 68 73 20 3d 20 70 50 4b 65 79 32  m *pRhs = pPKey2
1dea0 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f 2a  ->aMem;       /*
1deb0 20 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20 70   Next field of p
1dec0 50 4b 65 79 32 20 74 6f 20 63 6f 6d 70 61 72 65  PKey2 to compare
1ded0 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
1dee0 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32  KeyInfo = pPKey2
1def0 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 63 6f  ->pKeyInfo;.  co
1df00 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1df10 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73  r *aKey1 = (cons
1df20 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1df30 2a 29 70 4b 65 79 31 3b 0a 20 20 4d 65 6d 20 6d  *)pKey1;.  Mem m
1df40 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 62 53  em1;..  /* If bS
1df50 6b 69 70 20 69 73 20 74 72 75 65 2c 20 74 68 65  kip is true, the
1df60 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  n the caller has
1df70 20 61 6c 72 65 61 64 79 20 64 65 74 65 72 6d 69   already determi
1df80 6e 65 64 20 74 68 61 74 20 74 68 65 20 66 69 72  ned that the fir
1df90 73 74 0a 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d  st.  ** two elem
1dfa0 65 6e 74 73 20 69 6e 20 74 68 65 20 6b 65 79 73  ents in the keys
1dfb0 20 61 72 65 20 65 71 75 61 6c 2e 20 46 69 78 20   are equal. Fix 
1dfc0 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 61 63  the various stac
1dfd0 6b 20 76 61 72 69 61 62 6c 65 73 20 73 6f 0a 20  k variables so. 
1dfe0 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 72 6f   ** that this ro
1dff0 75 74 69 6e 65 20 62 65 67 69 6e 73 20 63 6f 6d  utine begins com
1e000 70 61 72 69 6e 67 20 61 74 20 74 68 65 20 73 65  paring at the se
1e010 63 6f 6e 64 20 66 69 65 6c 64 2e 20 2a 2f 0a 20  cond field. */. 
1e020 20 69 66 28 20 62 53 6b 69 70 20 29 7b 0a 20 20   if( bSkip ){.  
1e030 20 20 75 33 32 20 73 31 3b 0a 20 20 20 20 69 64    u32 s1;.    id
1e040 78 31 20 3d 20 31 20 2b 20 67 65 74 56 61 72 69  x1 = 1 + getVari
1e050 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20  nt32(&aKey1[1], 
1e060 73 31 29 3b 0a 20 20 20 20 73 7a 48 64 72 31 20  s1);.    szHdr1 
1e070 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 20 20 20 20  = aKey1[0];.    
1e080 64 31 20 3d 20 73 7a 48 64 72 31 20 2b 20 73 71  d1 = szHdr1 + sq
1e090 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
1e0a0 79 70 65 4c 65 6e 28 73 31 29 3b 0a 20 20 20 20  ypeLen(s1);.    
1e0b0 69 20 3d 20 31 3b 0a 20 20 20 20 70 52 68 73 2b  i = 1;.    pRhs+
1e0c0 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
1e0d0 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74  idx1 = getVarint
1e0e0 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31  32(aKey1, szHdr1
1e0f0 29 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64  );.    d1 = szHd
1e100 72 31 3b 0a 20 20 20 20 69 66 28 20 64 31 3e 28  r1;.    if( d1>(
1e110 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1e120 7b 20 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d  { .      pPKey2-
1e130 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53  >errCode = (u8)S
1e140 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1e150 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  PT;.      return
1e160 20 30 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74 69   0;  /* Corrupti
1e170 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  on */.    }.    
1e180 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 56 56  i = 0;.  }..  VV
1e190 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d  A_ONLY( mem1.szM
1e1a0 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20  alloc = 0; ) /* 
1e1b0 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61  Only needed by a
1e1c0 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
1e1d0 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ts */.  assert( 
1e1e0 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
1e1f0 2d 3e 6e 46 69 65 6c 64 2b 70 50 4b 65 79 32 2d  ->nField+pPKey2-
1e200 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65  >pKeyInfo->nXFie
1e210 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65  ld>=pPKey2->nFie
1e220 6c 64 20 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f  ld .       || CO
1e230 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73  RRUPT_DB );.  as
1e240 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b  sert( pPKey2->pK
1e250 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
1e260 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
1e270 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  t( pPKey2->pKeyI
1e280 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b  nfo->nField>0 );
1e290 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3c  .  assert( idx1<
1e2a0 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55  =szHdr1 || CORRU
1e2b0 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20  PT_DB );.  do{. 
1e2c0 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79     u32 serial_ty
1e2d0 70 65 3b 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20  pe;..    /* RHS 
1e2e0 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f  is an integer */
1e2f0 0a 20 20 20 20 69 66 28 20 70 52 68 73 2d 3e 66  .    if( pRhs->f
1e300 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
1e310 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74  {.      serial_t
1e320 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31  ype = aKey1[idx1
1e330 5d 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ];.      testcas
1e340 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  e( serial_type==
1e350 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  12 );.      if( 
1e360 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20  serial_type>=10 
1e370 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1e380 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  +1;.      }else 
1e390 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
1e3a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1e3b0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
1e3c0 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  se if( serial_ty
1e3d0 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20  pe==7 ){.       
1e3e0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1e3f0 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d  alGet(&aKey1[d1]
1e400 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26  , serial_type, &
1e410 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 72  mem1);.        r
1e420 63 20 3d 20 2d 73 71 6c 69 74 65 33 49 6e 74 46  c = -sqlite3IntF
1e430 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 52 68 73  loatCompare(pRhs
1e440 2d 3e 75 2e 69 2c 20 6d 65 6d 31 2e 75 2e 72 29  ->u.i, mem1.u.r)
1e450 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1e460 20 20 20 20 20 20 20 69 36 34 20 6c 68 73 20 3d         i64 lhs =
1e470 20 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64   vdbeRecordDecod
1e480 65 49 6e 74 28 73 65 72 69 61 6c 5f 74 79 70 65  eInt(serial_type
1e490 2c 20 26 61 4b 65 79 31 5b 64 31 5d 29 3b 0a 20  , &aKey1[d1]);. 
1e4a0 20 20 20 20 20 20 20 69 36 34 20 72 68 73 20 3d         i64 rhs =
1e4b0 20 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20   pRhs->u.i;.    
1e4c0 20 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73 20      if( lhs<rhs 
1e4d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1e4e0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  = -1;.        }e
1e4f0 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73 20  lse if( lhs>rhs 
1e500 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1e510 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = +1;.        }.
1e520 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1e530 20 20 20 2f 2a 20 52 48 53 20 69 73 20 72 65 61     /* RHS is rea
1e540 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66  l */.    else if
1e550 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
1e560 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
1e570 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20    serial_type = 
1e580 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20  aKey1[idx1];.   
1e590 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
1e5a0 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20  pe>=10 ){.      
1e5b0 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
1e5c0 73 20 31 32 20 6f 72 20 67 72 65 61 74 65 72 20  s 12 or greater 
1e5d0 61 72 65 20 73 74 72 69 6e 67 73 20 61 6e 64 20  are strings and 
1e5e0 62 6c 6f 62 73 20 28 67 72 65 61 74 65 72 20 74  blobs (greater t
1e5f0 68 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  han.        ** n
1e600 75 6d 62 65 72 73 29 2e 20 54 79 70 65 73 20 31  umbers). Types 1
1e610 30 20 61 6e 64 20 31 31 20 61 72 65 20 63 75 72  0 and 11 are cur
1e620 72 65 6e 74 6c 79 20 22 72 65 73 65 72 76 65 64  rently "reserved
1e630 20 66 6f 72 20 66 75 74 75 72 65 20 0a 20 20 20   for future .   
1e640 20 20 20 20 20 2a 2a 20 75 73 65 22 2c 20 73 6f       ** use", so
1e650 20 69 74 20 64 6f 65 73 6e 27 74 20 72 65 61 6c   it doesn't real
1e660 6c 79 20 6d 61 74 74 65 72 20 77 68 61 74 20 74  ly matter what t
1e670 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 63 6f  he results of co
1e680 6d 70 61 72 69 6e 67 0a 20 20 20 20 20 20 20 20  mparing.        
1e690 2a 2a 20 74 68 65 6d 20 74 6f 20 6e 75 6d 62 65  ** them to numbe
1e6a0 72 69 63 20 76 61 6c 75 65 73 20 61 72 65 2e 20  ric values are. 
1e6b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
1e6c0 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   +1;.      }else
1e6d0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1e6e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
1e6f0 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  c = -1;.      }e
1e700 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
1e710 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1e720 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65  t(&aKey1[d1], se
1e730 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31  rial_type, &mem1
1e740 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
1e750 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b  erial_type==7 ){
1e760 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d  .          if( m
1e770 65 6d 31 2e 75 2e 72 3c 70 52 68 73 2d 3e 75 2e  em1.u.r<pRhs->u.
1e780 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
1e790 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1e7a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65      }else if( me
1e7b0 6d 31 2e 75 2e 72 3e 70 52 68 73 2d 3e 75 2e 72  m1.u.r>pRhs->u.r
1e7c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e7d0 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20  rc = +1;.       
1e7e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
1e7f0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
1e800 20 3d 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f   = sqlite3IntFlo
1e810 61 74 43 6f 6d 70 61 72 65 28 6d 65 6d 31 2e 75  atCompare(mem1.u
1e820 2e 69 2c 20 70 52 68 73 2d 3e 75 2e 72 29 3b 0a  .i, pRhs->u.r);.
1e830 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e840 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1e850 52 48 53 20 69 73 20 61 20 73 74 72 69 6e 67 20  RHS is a string 
1e860 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  */.    else if( 
1e870 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pRhs->flags & ME
1e880 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 67  M_Str ){.      g
1e890 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
1e8a0 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f  1[idx1], serial_
1e8b0 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73  type);.      tes
1e8c0 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79  tcase( serial_ty
1e8d0 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20  pe==12 );.      
1e8e0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
1e8f0 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  12 ){.        rc
1e900 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
1e910 73 65 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f  se if( !(serial_
1e920 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a  type & 0x01) ){.
1e930 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b          rc = +1;
1e940 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1e950 20 20 20 20 20 20 6d 65 6d 31 2e 6e 20 3d 20 28        mem1.n = (
1e960 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32  serial_type - 12
1e970 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74  ) / 2;.        t
1e980 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d  estcase( (d1+mem
1e990 31 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29  1.n)==(unsigned)
1e9a0 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20  nKey1 );.       
1e9b0 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d   testcase( (d1+m
1e9c0 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69 67  em1.n+1)==(unsig
1e9d0 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20  ned)nKey1 );.   
1e9e0 20 20 20 20 20 69 66 28 20 28 64 31 2b 6d 65 6d       if( (d1+mem
1e9f0 31 2e 6e 29 20 3e 20 28 75 6e 73 69 67 6e 65 64  1.n) > (unsigned
1ea00 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20  )nKey1 ){.      
1ea10 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43      pPKey2->errC
1ea20 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45  ode = (u8)SQLITE
1ea30 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1ea40 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1ea50 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1ea60 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20    /* Corruption 
1ea70 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  */.        }else
1ea80 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61   if( pKeyInfo->a
1ea90 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20  Coll[i] ){.     
1eaa0 20 20 20 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20       mem1.enc = 
1eab0 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
1eac0 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 64 62           mem1.db
1ead0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
1eae0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e  .          mem1.
1eaf0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 3b  flags = MEM_Str;
1eb00 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e  .          mem1.
1eb10 7a 20 3d 20 28 63 68 61 72 2a 29 26 61 4b 65 79  z = (char*)&aKey
1eb20 31 5b 64 31 5d 3b 0a 20 20 20 20 20 20 20 20 20  1[d1];.         
1eb30 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 70 61 72   rc = vdbeCompar
1eb40 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 20 20  eMemString(.    
1eb50 20 20 20 20 20 20 20 20 20 20 26 6d 65 6d 31 2c            &mem1,
1eb60 20 70 52 68 73 2c 20 70 4b 65 79 49 6e 66 6f 2d   pRhs, pKeyInfo-
1eb70 3e 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b 65  >aColl[i], &pPKe
1eb80 79 32 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20  y2->errCode.    
1eb90 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
1eba0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ebb0 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e    int nCmp = MIN
1ebc0 28 6d 65 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e  (mem1.n, pRhs->n
1ebd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
1ebe0 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b  = memcmp(&aKey1[
1ebf0 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43  d1], pRhs->z, nC
1ec00 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  mp);.          i
1ec10 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20  f( rc==0 ) rc = 
1ec20 6d 65 6d 31 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e  mem1.n - pRhs->n
1ec30 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ; .        }.   
1ec40 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1ec50 2f 2a 20 52 48 53 20 69 73 20 61 20 62 6c 6f 62  /* RHS is a blob
1ec60 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28   */.    else if(
1ec70 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d   pRhs->flags & M
1ec80 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20  EM_Blob ){.     
1ec90 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b   getVarint32(&aK
1eca0 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61  ey1[idx1], seria
1ecb0 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74  l_type);.      t
1ecc0 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f  estcase( serial_
1ecd0 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20  type==12 );.    
1ece0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1ecf0 65 3c 31 32 20 7c 7c 20 28 73 65 72 69 61 6c 5f  e<12 || (serial_
1ed00 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a  type & 0x01) ){.
1ed10 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
1ed20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1ed30 20 20 20 20 20 20 69 6e 74 20 6e 53 74 72 20 3d        int nStr =
1ed40 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20   (serial_type - 
1ed50 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20  12) / 2;.       
1ed60 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6e   testcase( (d1+n
1ed70 53 74 72 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29  Str)==(unsigned)
1ed80 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20  nKey1 );.       
1ed90 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6e   testcase( (d1+n
1eda0 53 74 72 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65  Str+1)==(unsigne
1edb0 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20  d)nKey1 );.     
1edc0 20 20 20 69 66 28 20 28 64 31 2b 6e 53 74 72 29     if( (d1+nStr)
1edd0 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65   > (unsigned)nKe
1ede0 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  y1 ){.          
1edf0 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20  pPKey2->errCode 
1ee00 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52  = (u8)SQLITE_COR
1ee10 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
1ee20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1ee30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ee40 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   Corruption */. 
1ee50 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1ee60 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70          int nCmp
1ee70 20 3d 20 4d 49 4e 28 6e 53 74 72 2c 20 70 52 68   = MIN(nStr, pRh
1ee80 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  s->n);.         
1ee90 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b   rc = memcmp(&aK
1eea0 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a  ey1[d1], pRhs->z
1eeb0 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20  , nCmp);.       
1eec0 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72     if( rc==0 ) r
1eed0 63 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d  c = nStr - pRhs-
1eee0 3e 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  >n;.        }.  
1eef0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1ef00 20 2f 2a 20 52 48 53 20 69 73 20 6e 75 6c 6c 20   /* RHS is null 
1ef10 2a 2f 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  */.    else{.   
1ef20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d     serial_type =
1ef30 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20   aKey1[idx1];.  
1ef40 20 20 20 20 72 63 20 3d 20 28 73 65 72 69 61 6c      rc = (serial
1ef50 5f 74 79 70 65 21 3d 30 29 3b 0a 20 20 20 20 7d  _type!=0);.    }
1ef60 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ..    if( rc!=0 
1ef70 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65  ){.      if( pKe
1ef80 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
1ef90 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[i] ){.        
1efa0 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20  rc = -rc;.      
1efb0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
1efc0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1efd0 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
1efe0 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 63 29  ey1, pPKey2, rc)
1eff0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1f000 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d  ( mem1.szMalloc=
1f010 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f  =0 );  /* See co
1f020 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20  mment below */. 
1f030 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1f040 20 20 20 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b 0a      }..    i++;.
1f050 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 20 20      pRhs++;.    
1f060 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62  d1 += sqlite3Vdb
1f070 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
1f080 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
1f090 20 69 64 78 31 20 2b 3d 20 73 71 6c 69 74 65 33   idx1 += sqlite3
1f0a0 56 61 72 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c  VarintLen(serial
1f0b0 5f 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65  _type);.  }while
1f0c0 28 20 69 64 78 31 3c 28 75 6e 73 69 67 6e 65 64  ( idx1<(unsigned
1f0d0 29 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b  )szHdr1 && i<pPK
1f0e0 65 79 32 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64  ey2->nField && d
1f0f0 31 3c 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  1<=(unsigned)nKe
1f100 79 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d  y1 );..  /* No m
1f110 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
1f120 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e   is ever used on
1f130 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68   mem1.  Prove th
1f140 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68  is using.  ** th
1f150 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
1f160 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73  rt().  If the as
1f170 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74  sert() fails, it
1f180 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a   indicates a.  *
1f190 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e  * memory leak an
1f1a0 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c  d a need to call
1f1b0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1f1c0 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 20 20  elease(&mem1).  
1f1d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d  */.  assert( mem
1f1e0 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  1.szMalloc==0 );
1f1f0 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72  ..  /* rc==0 her
1f200 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65  e means that one
1f210 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20   or both of the 
1f220 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20  keys ran out of 
1f230 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20  fields and.  ** 
1f240 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75  all the fields u
1f250 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20  p to that point 
1f260 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75  were equal. Retu
1f270 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72  rn the default_r
1f280 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a  c.  ** value.  *
1f290 2f 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  /.  assert( CORR
1f2a0 55 50 54 5f 44 42 20 0a 20 20 20 20 20 20 20 7c  UPT_DB .       |
1f2b0 7c 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  | vdbeRecordComp
1f2c0 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20  areDebug(nKey1, 
1f2d0 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 70  pKey1, pPKey2, p
1f2e0 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
1f2f0 63 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4b  c) .       || pK
1f300 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c  eyInfo->db->mall
1f310 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20  ocFailed.  );.  
1f320 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d  pPKey2->eqSeen =
1f330 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 4b   1;.  return pPK
1f340 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b  ey2->default_rc;
1f350 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
1f360 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1f370 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
1f380 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
1f390 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a     /* Left key *
1f3a0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
1f3b0 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20  rd *pPKey2      
1f3c0 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79      /* Right key
1f3d0 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20   */.){.  return 
1f3e0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1f3f0 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70  dCompareWithSkip
1f400 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
1f410 50 4b 65 79 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f  PKey2, 0);.}.../
1f420 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1f430 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  on is an optimiz
1f440 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71  ed version of sq
1f450 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1f460 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61  ompare() .** tha
1f470 74 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20  t (a) the first 
1f480 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20  field of pPKey2 
1f490 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 61  is an integer, a
1f4a0 6e 64 20 28 62 29 20 74 68 65 20 0a 2a 2a 20 73  nd (b) the .** s
1f4b0 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61  ize-of-header va
1f4c0 72 69 6e 74 20 61 74 20 74 68 65 20 73 74 61 72  rint at the star
1f4d0 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79  t of (pKey1/nKey
1f4e0 31 29 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e  1) fits in a sin
1f4f0 67 6c 65 0a 2a 2a 20 62 79 74 65 20 28 69 2e 65  gle.** byte (i.e
1f500 2e 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31  . is less than 1
1f510 32 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76  28)..**.** To av
1f520 6f 69 64 20 63 6f 6e 63 65 72 6e 73 20 61 62 6f  oid concerns abo
1f530 75 74 20 62 75 66 66 65 72 20 6f 76 65 72 72 65  ut buffer overre
1f540 61 64 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ads, this routin
1f550 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 0a 2a  e is only used.*
1f560 2a 20 6f 6e 20 73 63 68 65 6d 61 73 20 77 68 65  * on schemas whe
1f570 72 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76  re the maximum v
1f580 61 6c 69 64 20 68 65 61 64 65 72 20 73 69 7a 65  alid header size
1f590 20 69 73 20 36 33 20 62 79 74 65 73 20 6f 72 20   is 63 bytes or 
1f5a0 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  less..*/.static 
1f5b0 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f  int vdbeRecordCo
1f5c0 6d 70 61 72 65 49 6e 74 28 0a 20 20 69 6e 74 20  mpareInt(.  int 
1f5d0 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
1f5e0 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66  d *pKey1, /* Lef
1f5f0 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63  t key */.  Unpac
1f600 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
1f610 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68  2        /* Righ
1f620 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f  t key */.){.  co
1f630 6e 73 74 20 75 38 20 2a 61 4b 65 79 20 3d 20 26  nst u8 *aKey = &
1f640 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79  ((const u8*)pKey
1f650 31 29 5b 2a 28 63 6f 6e 73 74 20 75 38 2a 29 70  1)[*(const u8*)p
1f660 4b 65 79 31 20 26 20 30 78 33 46 5d 3b 0a 20 20  Key1 & 0x3F];.  
1f670 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65 20  int serial_type 
1f680 3d 20 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b  = ((const u8*)pK
1f690 65 79 31 29 5b 31 5d 3b 0a 20 20 69 6e 74 20 72  ey1)[1];.  int r
1f6a0 65 73 3b 0a 20 20 75 33 32 20 79 3b 0a 20 20 75  es;.  u32 y;.  u
1f6b0 36 34 20 78 3b 0a 20 20 69 36 34 20 76 20 3d 20  64 x;.  i64 v = 
1f6c0 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e  pPKey2->aMem[0].
1f6d0 75 2e 69 3b 0a 20 20 69 36 34 20 6c 68 73 3b 0a  u.i;.  i64 lhs;.
1f6e0 0a 20 20 76 64 62 65 41 73 73 65 72 74 46 69 65  .  vdbeAssertFie
1f6f0 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d  ldCountWithinLim
1f700 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  its(nKey1, pKey1
1f710 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  , pPKey2->pKeyIn
1f720 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  fo);.  assert( (
1f730 2a 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d 30 78  *(u8*)pKey1)<=0x
1f740 33 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  3F || CORRUPT_DB
1f750 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65   );.  switch( se
1f760 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
1f770 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d   case 1: { /* 1-
1f780 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
1f790 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73  ger */.      lhs
1f7a0 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28   = ONE_BYTE_INT(
1f7b0 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
1f7c0 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
1f7d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f7e0 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b   }.    case 2: {
1f7f0 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65   /* 2-byte signe
1f800 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1f810 20 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42 59 54     lhs = TWO_BYT
1f820 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1f830 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
1f840 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
1f850 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1f860 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65  e 3: { /* 3-byte
1f870 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
1f880 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54  */.      lhs = T
1f890 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b  HREE_BYTE_INT(aK
1f8a0 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ey);.      testc
1f8b0 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20  ase( lhs<0 );.  
1f8c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f8d0 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f  .    case 4: { /
1f8e0 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 4-byte signed 
1f8f0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
1f900 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   y = FOUR_BYTE_U
1f910 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
1f920 20 6c 68 73 20 3d 20 28 69 36 34 29 2a 28 69 6e   lhs = (i64)*(in
1f930 74 2a 29 26 79 3b 0a 20 20 20 20 20 20 74 65 73  t*)&y;.      tes
1f940 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
1f950 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f960 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b   }.    case 5: {
1f970 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65   /* 6-byte signe
1f980 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1f990 20 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f 42 59     lhs = FOUR_BY
1f9a0 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20  TE_UINT(aKey+2) 
1f9b0 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29  + (((i64)1)<<32)
1f9c0 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b  *TWO_BYTE_INT(aK
1f9d0 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ey);.      testc
1f9e0 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20  ase( lhs<0 );.  
1f9f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1fa00 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b 20 2f  .    case 6: { /
1fa10 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 8-byte signed 
1fa20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
1fa30 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   x = FOUR_BYTE_U
1fa40 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
1fa50 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46   x = (x<<32) | F
1fa60 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
1fa70 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c 68 73  ey+4);.      lhs
1fa80 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20   = *(i64*)&x;.  
1fa90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
1faa0 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
1fab0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1fac0 73 65 20 38 3a 20 0a 20 20 20 20 20 20 6c 68 73  se 8: .      lhs
1fad0 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
1fae0 6b 3b 0a 20 20 20 20 63 61 73 65 20 39 3a 0a 20  k;.    case 9:. 
1faf0 20 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a 20 20       lhs = 1;.  
1fb00 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
1fb10 2f 2a 20 54 68 69 73 20 63 61 73 65 20 63 6f 75  /* This case cou
1fb20 6c 64 20 62 65 20 72 65 6d 6f 76 65 64 20 77 69  ld be removed wi
1fb30 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 74  thout changing t
1fb40 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 72 75  he results of ru
1fb50 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 69  nning.    ** thi
1fb60 73 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64 69 6e  s code. Includin
1fb70 67 20 69 74 20 63 61 75 73 65 73 20 67 63 63 20  g it causes gcc 
1fb80 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 66 61  to generate a fa
1fb90 73 74 65 72 20 73 77 69 74 63 68 20 0a 20 20 20  ster switch .   
1fba0 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28 73   ** statement (s
1fbb0 69 6e 63 65 20 74 68 65 20 72 61 6e 67 65 20 6f  ince the range o
1fbc0 66 20 73 77 69 74 63 68 20 74 61 72 67 65 74 73  f switch targets
1fbd0 20 6e 6f 77 20 73 74 61 72 74 73 20 61 74 20 7a   now starts at z
1fbe0 65 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69  ero and.    ** i
1fbf0 73 20 63 6f 6e 74 69 67 75 6f 75 73 29 20 62 75  s contiguous) bu
1fc00 74 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65  t does not cause
1fc10 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65 20 63   any duplicate c
1fc20 6f 64 65 20 74 6f 20 62 65 20 67 65 6e 65 72 61  ode to be genera
1fc30 74 65 64 0a 20 20 20 20 2a 2a 20 28 61 73 20 67  ted.    ** (as g
1fc40 63 63 20 69 73 20 63 6c 65 76 65 72 20 65 6e 6f  cc is clever eno
1fc50 75 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74  ugh to combine t
1fc60 68 65 20 74 77 6f 20 6c 69 6b 65 20 63 61 73 65  he two like case
1fc70 73 29 2e 20 4f 74 68 65 72 20 0a 20 20 20 20 2a  s). Other .    *
1fc80 2a 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69 67 68  * compilers migh
1fc90 74 20 62 65 20 73 69 6d 69 6c 61 72 2e 20 20 2a  t be similar.  *
1fca0 2f 20 0a 20 20 20 20 63 61 73 65 20 30 3a 20 63  / .    case 0: c
1fcb0 61 73 65 20 37 3a 0a 20 20 20 20 20 20 72 65 74  ase 7:.      ret
1fcc0 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52  urn sqlite3VdbeR
1fcd0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65  ecordCompare(nKe
1fce0 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
1fcf0 32 29 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74  2);..    default
1fd00 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  :.      return s
1fd10 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1fd20 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70  Compare(nKey1, p
1fd30 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 20  Key1, pPKey2);. 
1fd40 20 7d 0a 0a 20 20 69 66 28 20 76 3e 6c 68 73 20   }..  if( v>lhs 
1fd50 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b  ){.    res = pPK
1fd60 65 79 32 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73 65  ey2->r1;.  }else
1fd70 20 69 66 28 20 76 3c 6c 68 73 20 29 7b 0a 20 20   if( v<lhs ){.  
1fd80 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
1fd90 72 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  r2;.  }else if( 
1fda0 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31  pPKey2->nField>1
1fdb0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66   ){.    /* The f
1fdc0 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74  irst fields of t
1fdd0 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20  he two keys are 
1fde0 65 71 75 61 6c 2e 20 43 6f 6d 70 61 72 65 20 74  equal. Compare t
1fdf0 68 65 20 74 72 61 69 6c 69 6e 67 20 0a 20 20 20  he trailing .   
1fe00 20 2a 2a 20 66 69 65 6c 64 73 2e 20 20 2a 2f 0a   ** fields.  */.
1fe10 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65      res = sqlite
1fe20 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1fe30 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31  reWithSkip(nKey1
1fe40 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
1fe50 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   1);.  }else{.  
1fe60 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66    /* The first f
1fe70 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f  ields of the two
1fe80 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 20   keys are equal 
1fe90 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f  and there are no
1fea0 20 74 72 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a   trailing.    **
1feb0 20 66 69 65 6c 64 73 2e 20 52 65 74 75 72 6e 20   fields. Return 
1fec0 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
1fed0 72 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  rc in this case.
1fee0 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 70 50   */.    res = pP
1fef0 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
1ff00 3b 0a 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 71  ;.    pPKey2->eq
1ff10 53 65 65 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  Seen = 1;.  }.. 
1ff20 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63   assert( vdbeRec
1ff30 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
1ff40 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1ff50 4b 65 79 32 2c 20 72 65 73 29 20 29 3b 0a 20 20  Key2, res) );.  
1ff60 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
1ff70 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1ff80 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  on is an optimiz
1ff90 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71  ed version of sq
1ffa0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1ffb0 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61  ompare() .** tha
1ffc0 74 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20  t (a) the first 
1ffd0 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20  field of pPKey2 
1ffe0 69 73 20 61 20 73 74 72 69 6e 67 2c 20 74 68 61  is a string, tha
1fff0 74 20 28 62 29 20 74 68 65 20 66 69 72 73 74 20  t (b) the first 
20000 66 69 65 6c 64 0a 2a 2a 20 75 73 65 73 20 74 68  field.** uses th
20010 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
20020 65 6e 63 65 20 42 49 4e 41 52 59 20 61 6e 64 20  ence BINARY and 
20030 28 63 29 20 74 68 61 74 20 74 68 65 20 73 69 7a  (c) that the siz
20040 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69  e-of-header vari
20050 6e 74 20 0a 2a 2a 20 61 74 20 74 68 65 20 73 74  nt .** at the st
20060 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b  art of (pKey1/nK
20070 65 79 31 29 20 66 69 74 73 20 69 6e 20 61 20 73  ey1) fits in a s
20080 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a 73  ingle byte..*/.s
20090 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65  tatic int vdbeRe
200a0 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e  cordCompareStrin
200b0 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  g(.  int nKey1, 
200c0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
200d0 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a  1, /* Left key *
200e0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
200f0 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20  rd *pPKey2      
20100 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a    /* Right key *
20110 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20  /.){.  const u8 
20120 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20  *aKey1 = (const 
20130 75 38 2a 29 70 4b 65 79 31 3b 0a 20 20 69 6e 74  u8*)pKey1;.  int
20140 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 20 20   serial_type;.  
20150 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73 73 65  int res;..  asse
20160 72 74 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  rt( pPKey2->aMem
20170 5b 30 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  [0].flags & MEM_
20180 53 74 72 20 29 3b 0a 20 20 76 64 62 65 41 73 73  Str );.  vdbeAss
20190 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74  ertFieldCountWit
201a0 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c  hinLimits(nKey1,
201b0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e   pKey1, pPKey2->
201c0 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 67 65 74  pKeyInfo);.  get
201d0 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b  Varint32(&aKey1[
201e0 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29  1], serial_type)
201f0 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  ;.  if( serial_t
20200 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 72 65  ype<12 ){.    re
20210 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 20  s = pPKey2->r1; 
20220 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e       /* (pKey1/n
20230 4b 65 79 31 29 20 69 73 20 61 20 6e 75 6d 62 65  Key1) is a numbe
20240 72 20 6f 72 20 61 20 6e 75 6c 6c 20 2a 2f 0a 20  r or a null */. 
20250 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65 72   }else if( !(ser
20260 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29  ial_type & 0x01)
20270 20 29 7b 20 0a 20 20 20 20 72 65 73 20 3d 20 70   ){ .    res = p
20280 50 4b 65 79 32 2d 3e 72 32 3b 20 20 20 20 20 20  PKey2->r2;      
20290 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29  /* (pKey1/nKey1)
202a0 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20   is a blob */.  
202b0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e  }else{.    int n
202c0 43 6d 70 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74  Cmp;.    int nSt
202d0 72 3b 0a 20 20 20 20 69 6e 74 20 73 7a 48 64 72  r;.    int szHdr
202e0 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 0a 20 20   = aKey1[0];..  
202f0 20 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c    nStr = (serial
20300 5f 74 79 70 65 2d 31 32 29 20 2f 20 32 3b 0a 20  _type-12) / 2;. 
20310 20 20 20 69 66 28 20 28 73 7a 48 64 72 20 2b 20     if( (szHdr + 
20320 6e 53 74 72 29 20 3e 20 6e 4b 65 79 31 20 29 7b  nStr) > nKey1 ){
20330 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65  .      pPKey2->e
20340 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c  rrCode = (u8)SQL
20350 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
20360 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
20370 3b 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69  ;    /* Corrupti
20380 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  on */.    }.    
20390 6e 43 6d 70 20 3d 20 4d 49 4e 28 20 70 50 4b 65  nCmp = MIN( pPKe
203a0 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e  y2->aMem[0].n, n
203b0 53 74 72 20 29 3b 0a 20 20 20 20 72 65 73 20 3d  Str );.    res =
203c0 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 73   memcmp(&aKey1[s
203d0 7a 48 64 72 5d 2c 20 70 50 4b 65 79 32 2d 3e 61  zHdr], pPKey2->a
203e0 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b  Mem[0].z, nCmp);
203f0 0a 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30  ..    if( res==0
20400 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20   ){.      res = 
20410 6e 53 74 72 20 2d 20 70 50 4b 65 79 32 2d 3e 61  nStr - pPKey2->a
20420 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20 20  Mem[0].n;.      
20430 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
20440 20 20 20 20 20 20 69 66 28 20 70 50 4b 65 79 32        if( pPKey2
20450 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20  ->nField>1 ){.  
20460 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 73 71          res = sq
20470 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
20480 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e  ompareWithSkip(n
20490 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
204a0 65 79 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ey2, 1);.       
204b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
204c0 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
204d0 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20  default_rc;.    
204e0 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 71        pPKey2->eq
204f0 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Seen = 1;.      
20500 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
20510 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20  if( res>0 ){.   
20520 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
20530 32 2d 3e 72 32 3b 0a 20 20 20 20 20 20 7d 65 6c  2->r2;.      }el
20540 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20  se{.        res 
20550 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20  = pPKey2->r1;.  
20560 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
20570 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20  if( res>0 ){.   
20580 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
20590 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  >r2;.    }else{.
205a0 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
205b0 79 32 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a 20 20  y2->r1;.    }.  
205c0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64 62  }..  assert( vdb
205d0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65  eRecordCompareDe
205e0 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  bug(nKey1, pKey1
205f0 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29 0a 20  , pPKey2, res). 
20600 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54        || CORRUPT
20610 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  _DB.       || pP
20620 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
20630 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
20640 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  .  );.  return r
20650 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  es;.}../*.** Ret
20660 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
20670 20 61 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52   an sqlite3VdbeR
20680 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63  ecordCompare() c
20690 6f 6d 70 61 74 69 62 6c 65 20 66 75 6e 63 74 69  ompatible functi
206a0 6f 6e 0a 2a 2a 20 73 75 69 74 61 62 6c 65 20 66  on.** suitable f
206b0 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 73 65 72  or comparing ser
206c0 69 61 6c 69 7a 65 64 20 72 65 63 6f 72 64 73 20  ialized records 
206d0 74 6f 20 74 68 65 20 75 6e 70 61 63 6b 65 64 20  to the unpacked 
206e0 72 65 63 6f 72 64 20 70 61 73 73 65 64 0a 2a 2a  record passed.**
206f0 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
20700 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64  ument..*/.Record
20710 43 6f 6d 70 61 72 65 20 73 71 6c 69 74 65 33 56  Compare sqlite3V
20720 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 55  dbeFindCompare(U
20730 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
20740 29 7b 0a 20 20 2f 2a 20 76 61 72 69 6e 74 52 65  ){.  /* varintRe
20750 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29  cordCompareInt()
20760 20 61 6e 64 20 76 61 72 69 6e 74 52 65 63 6f 72   and varintRecor
20770 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29  dCompareString()
20780 20 62 6f 74 68 20 61 73 73 75 6d 65 0a 20 20 2a   both assume.  *
20790 2a 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d  * that the size-
207a0 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74  of-header varint
207b0 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20   that occurs at 
207c0 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
207d0 68 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 66 69  h record.  ** fi
207e0 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62  ts in a single b
207f0 79 74 65 20 28 69 2e 65 2e 20 69 73 20 31 32 37  yte (i.e. is 127
20800 20 6f 72 20 6c 65 73 73 29 2e 20 76 61 72 69 6e   or less). varin
20810 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  tRecordCompareIn
20820 74 28 29 0a 20 20 2a 2a 20 61 6c 73 6f 20 61 73  t().  ** also as
20830 73 75 6d 65 73 20 74 68 61 74 20 69 74 20 69 73  sumes that it is
20840 20 73 61 66 65 20 74 6f 20 6f 76 65 72 72 65 61   safe to overrea
20850 64 20 61 20 62 75 66 66 65 72 20 62 79 20 61 74  d a buffer by at
20860 20 6c 65 61 73 74 20 74 68 65 20 0a 20 20 2a 2a   least the .  **
20870 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73 69 62 6c   maximum possibl
20880 65 20 6c 65 67 61 6c 20 68 65 61 64 65 72 20 73  e legal header s
20890 69 7a 65 20 70 6c 75 73 20 38 20 62 79 74 65 73  ize plus 8 bytes
208a0 2e 20 42 65 63 61 75 73 65 20 74 68 65 72 65 20  . Because there 
208b0 69 73 0a 20 20 2a 2a 20 67 75 61 72 61 6e 74 65  is.  ** guarante
208c0 65 64 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73  ed to be at leas
208d0 74 20 37 34 20 28 62 75 74 20 6e 6f 74 20 31 33  t 74 (but not 13
208e0 36 29 20 62 79 74 65 73 20 6f 66 20 70 61 64 64  6) bytes of padd
208f0 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61  ing following ea
20900 63 68 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 70  ch.  ** buffer p
20910 61 73 73 65 64 20 74 6f 20 76 61 72 69 6e 74 52  assed to varintR
20920 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28  ecordCompareInt(
20930 29 20 74 68 69 73 20 6d 61 6b 65 73 20 69 74 20  ) this makes it 
20940 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 0a 20 20  convenient to.  
20950 2a 2a 20 6c 69 6d 69 74 20 74 68 65 20 73 69 7a  ** limit the siz
20960 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
20970 74 6f 20 36 34 20 62 79 74 65 73 20 69 6e 20 63  to 64 bytes in c
20980 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20 66  ases where the f
20990 69 72 73 74 20 66 69 65 6c 64 0a 20 20 2a 2a 20  irst field.  ** 
209a0 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 20  is an integer.. 
209b0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65 61 73   **.  ** The eas
209c0 69 65 73 74 20 77 61 79 20 74 6f 20 65 6e 66 6f  iest way to enfo
209d0 72 63 65 20 74 68 69 73 20 6c 69 6d 69 74 20 69  rce this limit i
209e0 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 6f 6e  s to consider on
209f0 6c 79 20 72 65 63 6f 72 64 73 20 77 69 74 68 0a  ly records with.
20a00 20 20 2a 2a 20 31 33 20 66 69 65 6c 64 73 20 6f    ** 13 fields o
20a10 72 20 6c 65 73 73 2e 20 49 66 20 74 68 65 20 66  r less. If the f
20a20 69 72 73 74 20 66 69 65 6c 64 20 69 73 20 61 6e  irst field is an
20a30 20 69 6e 74 65 67 65 72 2c 20 74 68 65 20 6d 61   integer, the ma
20a40 78 69 6d 75 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a  ximum legal.  **
20a50 20 68 65 61 64 65 72 20 73 69 7a 65 20 69 73 20   header size is 
20a60 28 31 32 2a 35 20 2b 20 31 20 2b 20 31 29 20 62  (12*5 + 1 + 1) b
20a70 79 74 65 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20  ytes.  */.  if( 
20a80 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  (p->pKeyInfo->nF
20a90 69 65 6c 64 20 2b 20 70 2d 3e 70 4b 65 79 49 6e  ield + p->pKeyIn
20aa0 66 6f 2d 3e 6e 58 46 69 65 6c 64 29 3c 3d 31 33  fo->nXField)<=13
20ab0 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67   ){.    int flag
20ac0 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e 66  s = p->aMem[0].f
20ad0 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20 70 2d  lags;.    if( p-
20ae0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74  >pKeyInfo->aSort
20af0 4f 72 64 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20  Order[0] ){.    
20b00 20 20 70 2d 3e 72 31 20 3d 20 31 3b 0a 20 20 20    p->r1 = 1;.   
20b10 20 20 20 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a 20     p->r2 = -1;. 
20b20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20b30 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20 20 20 20  p->r1 = -1;.    
20b40 20 20 70 2d 3e 72 32 20 3d 20 31 3b 0a 20 20 20    p->r2 = 1;.   
20b50 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67   }.    if( (flag
20b60 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a  s & MEM_Int) ){.
20b70 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62        return vdb
20b80 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  eRecordCompareIn
20b90 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73  t;.    }.    tes
20ba0 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d  tcase( flags & M
20bb0 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 74  EM_Real );.    t
20bc0 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26  estcase( flags &
20bd0 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 20   MEM_Null );.   
20be0 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73   testcase( flags
20bf0 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20   & MEM_Blob );. 
20c00 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
20c10 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e 75  (MEM_Real|MEM_Nu
20c20 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30  ll|MEM_Blob))==0
20c30 20 26 26 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d   && p->pKeyInfo-
20c40 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29 7b 0a  >aColl[0]==0 ){.
20c50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c        assert( fl
20c60 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b  ags & MEM_Str );
20c70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64  .      return vd
20c80 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53  beRecordCompareS
20c90 74 72 69 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 7d  tring;.    }.  }
20ca0 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ..  return sqlit
20cb0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
20cc0 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43  are;.}../*.** pC
20cd0 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20  ur points at an 
20ce0 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65 61  index entry crea
20cf0 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50  ted using the OP
20d00 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
20d10 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  de..** Read the 
20d20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74 20  rowid (the last 
20d30 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63  field in the rec
20d40 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69  ord) and store i
20d50 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20  t in *rowid..** 
20d60 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
20d70 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
20d80 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f  orks, or an erro
20d90 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65  r code otherwise
20da0 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67  ..**.** pCur mig
20db0 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74  ht be pointing t
20dc0 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20  o text obtained 
20dd0 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74 20 64  from a corrupt d
20de0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
20df0 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   So the content 
20e00 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65  cannot be truste
20e10 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72 69 61  d.  Do appropria
20e20 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74 68 65  te checks on the
20e30 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74   content..*/.int
20e40 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52   sqlite3VdbeIdxR
20e50 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62  owid(sqlite3 *db
20e60 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  , BtCursor *pCur
20e70 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20  , i64 *rowid){. 
20e80 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20   i64 nCellKey = 
20e90 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  0;.  int rc;.  u
20ea0 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20  32 szHdr;       
20eb0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
20ec0 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
20ed0 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a  typeRowid;    /*
20ee0 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20   Serial type of 
20ef0 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75  the rowid */.  u
20f00 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20  32 lenRowid;    
20f10 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
20f20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d  rowid */.  Mem m
20f30 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74  , v;..  /* Get t
20f40 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69  he size of the i
20f50 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c  ndex entry.  Onl
20f60 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65  y indices entrie
20f70 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74  s of less.  ** t
20f80 68 61 6e 20 32 47 69 42 20 61 72 65 20 73 75 70  han 2GiB are sup
20f90 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20  port - anything 
20fa0 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20 64 61  large must be da
20fb0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
20fc0 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72  n..  ** Any corr
20fd0 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74  uption is detect
20fe0 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72  ed in sqlite3Btr
20ff0 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
21000 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a  , though, so.  *
21010 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20  * this code can 
21020 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68  safely assume th
21030 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33  at nCellKey is 3
21040 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20  2-bits  .  */.  
21050 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
21060 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
21070 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56 41  d(pCur) );.  VVA
21080 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69  _ONLY(rc =) sqli
21090 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
210a0 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29  pCur, &nCellKey)
210b0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
210c0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20  SQLITE_OK );    
210d0 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61   /* pCur is alwa
210e0 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53  ys valid so KeyS
210f0 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  ize cannot fail 
21100 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43  */.  assert( (nC
21110 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f  ellKey & SQLITE_
21120 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e  MAX_U32)==(u64)n
21130 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a  CellKey );..  /*
21140 20 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d   Read in the com
21150 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66  plete content of
21160 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
21170 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
21180 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c  eMemInit(&m, db,
21190 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   0);.  rc = sqli
211a0 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74  te3VdbeMemFromBt
211b0 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33  ree(pCur, 0, (u3
211c0 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26  2)nCellKey, 1, &
211d0 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  m);.  if( rc ){.
211e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
211f0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64   }..  /* The ind
21200 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65  ex entry must be
21210 67 69 6e 20 77 69 74 68 20 61 20 68 65 61 64 65  gin with a heade
21220 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69  r size */.  (voi
21230 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75  d)getVarint32((u
21240 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a  8*)m.z, szHdr);.
21250 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64    testcase( szHd
21260 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61  r==3 );.  testca
21270 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29  se( szHdr==m.n )
21280 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
21290 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74  (szHdr<3 || (int
212a0 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20  )szHdr>m.n) ){. 
212b0 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69     goto idx_rowi
212c0 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20  d_corruption;.  
212d0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73 74  }..  /* The last
212e0 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e   field of the in
212f0 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61 6e  dex should be an
21300 20 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20 52   integer - the R
21310 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66  OWID..  ** Verif
21320 79 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  y that the last 
21330 65 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73 20  entry really is 
21340 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  an integer. */. 
21350 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74   (void)getVarint
21360 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48  32((u8*)&m.z[szH
21370 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64  dr-1], typeRowid
21380 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
21390 79 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20  ypeRowid==1 );. 
213a0 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
213b0 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73  owid==2 );.  tes
213c0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
213d0 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==3 );.  testcas
213e0 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34 20  e( typeRowid==4 
213f0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
21400 79 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20  ypeRowid==5 );. 
21410 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
21420 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73  owid==6 );.  tes
21430 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
21440 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==8 );.  testcas
21450 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39 20  e( typeRowid==9 
21460 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
21470 79 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c  y(typeRowid<1 ||
21480 20 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20   typeRowid>9 || 
21490 74 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b  typeRowid==7) ){
214a0 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f  .    goto idx_ro
214b0 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a  wid_corruption;.
214c0 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d    }.  lenRowid =
214d0 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
214e0 65 53 69 7a 65 73 5b 74 79 70 65 52 6f 77 69 64  eSizes[typeRowid
214f0 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  ];.  testcase( (
21500 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c  u32)m.n==szHdr+l
21510 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28  enRowid );.  if(
21520 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d   unlikely((u32)m
21530 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69  .n<szHdr+lenRowi
21540 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  d) ){.    goto i
21550 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
21560 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ion;.  }..  /* F
21570 65 74 63 68 20 74 68 65 20 69 6e 74 65 67 65 72  etch the integer
21580 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20   off the end of 
21590 74 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64  the index record
215a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
215b0 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29  eSerialGet((u8*)
215c0 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69  &m.z[m.n-lenRowi
215d0 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26  d], typeRowid, &
215e0 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76  v);.  *rowid = v
215f0 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56  .u.i;.  sqlite3V
21600 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
21610 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
21620 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  TE_OK;..  /* Jum
21630 70 20 68 65 72 65 20 69 66 20 64 61 74 61 62 61  p here if databa
21640 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  se corruption is
21650 20 64 65 74 65 63 74 65 64 20 61 66 74 65 72 20   detected after 
21660 6d 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20  m has been.  ** 
21670 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65  allocated.  Free
21680 20 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e   the m object an
21690 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
216a0 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f  CORRUPT. */.idx_
216b0 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e  rowid_corruption
216c0 3a 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e  :.  testcase( m.
216d0 73 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20  szMalloc!=0 );. 
216e0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
216f0 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
21700 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
21710 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a  UPT_BKPT;.}../*.
21720 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b  ** Compare the k
21730 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ey of the index 
21740 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f  entry that curso
21750 72 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67  r pC is pointing
21760 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74   to against.** t
21770 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e  he key string in
21780 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69   pUnpacked.  Wri
21790 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20  te into *pRes a 
217a0 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69  number.** that i
217b0 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  s negative, zero
217c0 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  , or positive if
217d0 20 70 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e   pC is less than
217e0 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f  , equal to,.** o
217f0 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70  r greater than p
21800 55 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72  Unpacked.  Retur
21810 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
21820 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55  uccess..**.** pU
21830 6e 70 61 63 6b 65 64 20 69 73 20 65 69 74 68 65  npacked is eithe
21840 72 20 63 72 65 61 74 65 64 20 77 69 74 68 6f 75  r created withou
21850 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20  t a rowid or is 
21860 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61  truncated so tha
21870 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68  t it.** omits th
21880 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65  e rowid at the e
21890 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61  nd.  The rowid a
218a0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
218b0 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20   index entry.** 
218c0 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65  is ignored as we
218d0 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73  ll.  Hence, this
218e0 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f   routine only co
218f0 6d 70 61 72 65 73 20 74 68 65 20 70 72 65 66 69  mpares the prefi
21900 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b  xes .** of the k
21910 65 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65  eys prior to the
21920 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f   final rowid, no
21930 74 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  t the entire key
21940 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
21950 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72  VdbeIdxKeyCompar
21960 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
21970 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21980 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
21990 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
219a0 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
219b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
219c0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
219d0 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69   to compare agai
219e0 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  nst */.  Unpacke
219f0 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b  dRecord *pUnpack
21a00 65 64 2c 20 20 20 20 20 20 20 2f 2a 20 55 6e 70  ed,       /* Unp
21a10 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  acked version of
21a20 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 72   key */.  int *r
21a30 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  es              
21a40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
21a50 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ite the comparis
21a60 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  on result here *
21a70 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c  /.){.  i64 nCell
21a80 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Key = 0;.  int r
21a90 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  c;.  BtCursor *p
21aa0 43 75 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20  Cur;.  Mem m;.. 
21ab0 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75   assert( pC->eCu
21ac0 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
21ad0 54 52 45 45 20 29 3b 0a 20 20 70 43 75 72 20 3d  TREE );.  pCur =
21ae0 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b   pC->uc.pCursor;
21af0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
21b00 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
21b10 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20  alid(pCur) );.  
21b20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73  VVA_ONLY(rc =) s
21b30 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
21b40 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b  ze(pCur, &nCellK
21b50 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  ey);.  assert( r
21b60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20  c==SQLITE_OK ); 
21b70 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c     /* pCur is al
21b80 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65  ways valid so Ke
21b90 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69  ySize cannot fai
21ba0 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b  l */.  /* nCellK
21bb0 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  ey will always b
21bc0 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
21bd0 30 78 66 66 66 66 66 66 66 66 20 62 65 63 61 75  0xffffffff becau
21be0 73 65 20 6f 66 20 74 68 65 20 77 61 79 0a 20 20  se of the way.  
21bf0 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50 61 72  ** that btreePar
21c00 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 20  seCellPtr() and 
21c10 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
21c20 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65  32() are impleme
21c30 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43  nted */.  if( nC
21c40 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65  ellKey<=0 || nCe
21c50 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66  llKey>0x7fffffff
21c60 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30   ){.    *res = 0
21c70 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
21c80 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
21c90 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
21ca0 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64  dbeMemInit(&m, d
21cb0 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71  b, 0);.  rc = sq
21cc0 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d  lite3VdbeMemFrom
21cd0 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28  Btree(pCur, 0, (
21ce0 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c  u32)nCellKey, 1,
21cf0 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29   &m);.  if( rc )
21d00 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
21d10 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d 20 73 71  .  }.  *res = sq
21d20 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
21d30 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c  ompare(m.n, m.z,
21d40 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73   pUnpacked);.  s
21d50 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
21d60 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
21d70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
21d80 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
21d90 69 6e 65 20 73 65 74 73 20 74 68 65 20 76 61 6c  ine sets the val
21da0 75 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ue to be returne
21db0 64 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20  d by subsequent 
21dc0 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69  calls to.** sqli
21dd0 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e  te3_changes() on
21de0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
21df0 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76  ndle 'db'. .*/.v
21e00 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
21e10 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  etChanges(sqlite
21e20 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e  3 *db, int nChan
21e30 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  ge){.  assert( s
21e40 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
21e50 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
21e60 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20    db->nChange = 
21e70 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e  nChange;.  db->n
21e80 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e  TotalChange += n
21e90 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Change;.}../*.**
21ea0 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74   Set a flag in t
21eb0 68 65 20 76 64 62 65 20 74 6f 20 75 70 64 61 74  he vdbe to updat
21ec0 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  e the change cou
21ed0 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69 73 20  nter when it is 
21ee0 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20  finalised.** or 
21ef0 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  reset..*/.void s
21f00 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43  qlite3VdbeCountC
21f10 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b  hanges(Vdbe *v){
21f20 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f  .  v->changeCntO
21f30 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n = 1;.}../*.** 
21f40 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65 70 61  Mark every prepa
21f50 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73  red statement as
21f60 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
21f70 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
21f80 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65  ion.** as expire
21f90 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69  d..**.** An expi
21fa0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65  red statement me
21fb0 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69  ans that recompi
21fc0 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74  lation of the st
21fd0 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65  atement is.** re
21fe0 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d  commend.  Statem
21ff0 65 6e 74 73 20 65 78 70 69 72 65 20 77 68 65 6e  ents expire when
22000 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74   things happen t
22010 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a  hat make their.*
22020 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c  * programs obsol
22030 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75  ete.  Removing u
22040 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63  ser-defined func
22050 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69  tions or collati
22060 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c  ng.** sequences,
22070 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20   or changing an 
22080 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75  authorization fu
22090 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74  nction are the t
220a0 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67  ypes of.** thing
220b0 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70  s that make prep
220c0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  ared statements 
220d0 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69  obsolete..*/.voi
220e0 64 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50  d sqlite3ExpireP
220f0 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
22100 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
22110 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72    Vdbe *p;.  for
22120 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20  (p = db->pVdbe; 
22130 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
22140 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d      p->expired =
22150 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
22160 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61   Return the data
22170 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20  base associated 
22180 77 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a  with the Vdbe..*
22190 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74  /.sqlite3 *sqlit
221a0 65 33 56 64 62 65 44 62 28 56 64 62 65 20 2a 76  e3VdbeDb(Vdbe *v
221b0 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64  ){.  return v->d
221c0 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  b;.}../*.** Retu
221d0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
221e0 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  an sqlite3_value
221f0 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
22200 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20  ining the value 
22210 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74  bound.** paramet
22220 65 72 20 69 56 61 72 20 6f 66 20 56 4d 20 76 2e  er iVar of VM v.
22230 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20   Except, if the 
22240 76 61 6c 75 65 20 69 73 20 61 6e 20 53 51 4c 20  value is an SQL 
22250 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  NULL, return .**
22260 20 30 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65   0 instead. Unle
22270 73 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61  ss it is NULL, a
22280 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20 61 66  pply affinity af
22290 66 20 28 6f 6e 65 20 6f 66 20 74 68 65 20 53 51  f (one of the SQ
222a0 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f  LITE_AFF_*.** co
222b0 6e 73 74 61 6e 74 73 29 20 74 6f 20 74 68 65 20  nstants) to the 
222c0 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74  value before ret
222d0 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a  urning it..**.**
222e0 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   The returned va
222f0 6c 75 65 20 6d 75 73 74 20 62 65 20 66 72 65 65  lue must be free
22300 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
22310 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 61 6c  using sqlite3Val
22320 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c  ueFree()..*/.sql
22330 69 74 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69  ite3_value *sqli
22340 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56  te3VdbeGetBoundV
22350 61 6c 75 65 28 56 64 62 65 20 2a 76 2c 20 69 6e  alue(Vdbe *v, in
22360 74 20 69 56 61 72 2c 20 75 38 20 61 66 66 29 7b  t iVar, u8 aff){
22370 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72 3e  .  assert( iVar>
22380 30 20 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  0 );.  if( v ){.
22390 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20      Mem *pMem = 
223a0 26 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d  &v->aVar[iVar-1]
223b0 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70 4d  ;.    if( 0==(pM
223c0 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
223d0 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 73  Null) ){.      s
223e0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52  qlite3_value *pR
223f0 65 74 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  et = sqlite3Valu
22400 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20  eNew(v->db);.   
22410 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20     if( pRet ){. 
22420 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
22430 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a  beMemCopy((Mem *
22440 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20  )pRet, pMem);.  
22450 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
22460 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  ueApplyAffinity(
22470 70 52 65 74 2c 20 61 66 66 2c 20 53 51 4c 49 54  pRet, aff, SQLIT
22480 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20 7d  E_UTF8);.      }
22490 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 52  .      return pR
224a0 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  et;.    }.  }.  
224b0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
224c0 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51 4c  ** Configure SQL
224d0 20 76 61 72 69 61 62 6c 65 20 69 56 61 72 20 73   variable iVar s
224e0 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20 61  o that binding a
224f0 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69 74   new value to it
22500 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73   signals.** to s
22510 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a  qlite3_reoptimiz
22520 65 28 29 20 74 68 61 74 20 72 65 2d 70 72 65 70  e() that re-prep
22530 61 72 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d  aring the statem
22540 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a  ent may result.*
22550 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20 71 75  * in a better qu
22560 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69  ery plan..*/.voi
22570 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
22580 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c  Varmask(Vdbe *v,
22590 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61 73   int iVar){.  as
225a0 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a  sert( iVar>0 );.
225b0 20 20 69 66 28 20 69 56 61 72 3e 33 32 20 29 7b    if( iVar>32 ){
225c0 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20  .    v->expmask 
225d0 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20  = 0xffffffff;.  
225e0 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e 65 78  }else{.    v->ex
225f0 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32 29 31  pmask |= ((u32)1
22600 20 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b 0a 20   << (iVar-1));. 
22610 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
22620 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
22630 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 72 61  LTABLE./*.** Tra
22640 6e 73 66 65 72 20 65 72 72 6f 72 20 6d 65 73 73  nsfer error mess
22650 61 67 65 20 74 65 78 74 20 66 72 6f 6d 20 61 6e  age text from an
22660 20 73 71 6c 69 74 65 33 5f 76 74 61 62 2e 7a 45   sqlite3_vtab.zE
22670 72 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72  rrMsg (text stor
22680 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20  ed.** in memory 
22690 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
226a0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 69 6e  lite3_malloc) in
226b0 74 6f 20 61 20 56 64 62 65 2e 7a 45 72 72 4d 73  to a Vdbe.zErrMs
226c0 67 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a  g (text stored.*
226d0 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  * in memory obta
226e0 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
226f0 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76  3DbMalloc)..*/.v
22700 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61 62 49  oid sqlite3VtabI
22710 6d 70 6f 72 74 45 72 72 6d 73 67 28 56 64 62 65  mportErrmsg(Vdbe
22720 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 74 61   *p, sqlite3_vta
22730 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 69 66 28  b *pVtab){.  if(
22740 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20   pVtab->zErrMsg 
22750 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  ){.    sqlite3 *
22760 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  db = p->db;.    
22770 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
22780 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
22790 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
227a0 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
227b0 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  db, pVtab->zErrM
227c0 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sg);.    sqlite3
227d0 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72  _free(pVtab->zEr
227e0 72 4d 73 67 29 3b 0a 20 20 20 20 70 56 74 61 62  rMsg);.    pVtab
227f0 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
22800 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
22810 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
22820 41 4c 54 41 42 4c 45 20 2a 2f 0a                 ALTABLE */.