/ Hex Artifact Content
Login

Artifact fdfae9e38069e47affdecca2b8991185ff815721:


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: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
19a0: 6f 20 7a 65 72 6f 20 61 20 72 65 67 69 73 74 65  o zero a registe
19b0: 72 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  r.*/.int sqlite3
19c0: 56 64 62 65 5a 65 72 6f 52 65 67 69 73 74 65 72  VdbeZeroRegister
19d0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44  (Vdbe *p, int iD
19e0: 65 73 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  est){.  return s
19f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1a00: 28 70 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (p, OP_Integer, 
1a10: 30 2c 20 69 44 65 73 74 2c 20 30 29 3b 0a 7d 0a  0, iDest, 0);.}.
1a20: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1a30: 63 6f 64 65 20 74 68 61 74 20 69 6e 69 74 69 61  code that initia
1a40: 6c 69 7a 65 73 20 6d 75 6c 74 69 70 6c 65 20 72  lizes multiple r
1a50: 65 67 69 73 74 65 72 73 20 74 6f 20 73 74 72 69  egisters to stri
1a60: 6e 67 20 6f 72 20 69 6e 74 65 67 65 72 0a 2a 2a  ng or integer.**
1a70: 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68 65   constants.  The
1a80: 20 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e   registers begin
1a90: 20 77 69 74 68 20 69 44 65 73 74 20 61 6e 64 20   with iDest and 
1aa0: 69 6e 63 72 65 61 73 65 20 63 6f 6e 73 65 63 75  increase consecu
1ab0: 74 69 76 65 6c 79 2e 0a 2a 2a 20 4f 6e 65 20 72  tively..** One r
1ac0: 65 67 69 73 74 65 72 20 69 73 20 69 6e 69 74 69  egister is initi
1ad0: 61 6c 69 7a 65 64 20 66 6f 72 20 65 61 63 68 20  alized for each 
1ae0: 63 68 61 72 61 63 67 74 65 72 20 69 6e 20 7a 54  characgter in zT
1af0: 79 70 65 73 5b 5d 2e 20 20 46 6f 72 20 65 61 63  ypes[].  For eac
1b00: 68 0a 2a 2a 20 22 73 22 20 63 68 61 72 61 63 74  h.** "s" charact
1b10: 65 72 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2c 20  er in zTypes[], 
1b20: 74 68 65 20 72 65 67 69 73 74 65 72 20 69 73 20  the register is 
1b30: 61 20 73 74 72 69 6e 67 20 69 66 20 74 68 65 20  a string if the 
1b40: 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20 6e  argument is.** n
1b50: 6f 74 20 4e 55 4c 4c 2c 20 6f 72 20 4f 50 5f 4e  ot NULL, or OP_N
1b60: 75 6c 6c 20 69 66 20 74 68 65 20 76 61 6c 75 65  ull if the value
1b70: 20 69 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74   is a null point
1b80: 65 72 2e 20 20 46 6f 72 20 65 61 63 68 20 22 69  er.  For each "i
1b90: 22 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 69  " character.** i
1ba0: 6e 20 7a 54 79 70 65 73 5b 5d 2c 20 74 68 65 20  n zTypes[], the 
1bb0: 72 65 67 69 73 74 65 72 20 69 73 20 69 6e 69 74  register is init
1bc0: 69 61 6c 69 7a 65 64 20 74 6f 20 61 6e 20 69 6e  ialized to an in
1bd0: 74 65 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  teger..*/.void s
1be0: 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c  qlite3VdbeMultiL
1bf0: 6f 61 64 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  oad(Vdbe *p, int
1c00: 20 69 44 65 73 74 2c 20 63 6f 6e 73 74 20 63 68   iDest, const ch
1c10: 61 72 20 2a 7a 54 79 70 65 73 2c 20 2e 2e 2e 29  ar *zTypes, ...)
1c20: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
1c30: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
1c40: 63 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  c;.  va_start(ap
1c50: 2c 20 7a 54 79 70 65 73 29 3b 0a 20 20 66 6f 72  , zTypes);.  for
1c60: 28 69 3d 30 3b 20 28 63 20 3d 20 7a 54 79 70 65  (i=0; (c = zType
1c70: 73 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a  s[i])!=0; i++){.
1c80: 20 20 20 20 69 66 28 20 63 3d 3d 27 73 27 20 29      if( c=='s' )
1c90: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
1ca0: 61 72 20 2a 7a 20 3d 20 76 61 5f 61 72 67 28 61  ar *z = va_arg(a
1cb0: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  p, const char*);
1cc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1cd0: 62 65 41 64 64 4f 70 34 28 70 2c 20 7a 3d 3d 30  beAddOp4(p, z==0
1ce0: 20 3f 20 4f 50 5f 4e 75 6c 6c 20 3a 20 4f 50 5f   ? OP_Null : OP_
1cf0: 53 74 72 69 6e 67 38 2c 20 30 2c 20 69 44 65 73  String8, 0, iDes
1d00: 74 2b 2b 2c 20 30 2c 20 7a 2c 20 30 29 3b 0a 20  t++, 0, z, 0);. 
1d10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d20: 61 73 73 65 72 74 28 20 63 3d 3d 27 69 27 20 29  assert( c=='i' )
1d30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1d40: 64 62 65 41 64 64 4f 70 32 28 70 2c 20 4f 50 5f  dbeAddOp2(p, OP_
1d50: 49 6e 74 65 67 65 72 2c 20 76 61 5f 61 72 67 28  Integer, va_arg(
1d60: 61 70 2c 20 69 6e 74 29 2c 20 69 44 65 73 74 2b  ap, int), iDest+
1d70: 2b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  +);.    }.  }.  
1d80: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f  va_end(ap);.}../
1d90: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f  *.** Add an opco
1da0: 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73  de that includes
1db0: 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73   the p4 value as
1dc0: 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69   a pointer..*/.i
1dd0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
1de0: 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a 70 2c  dOp4(.  Vdbe *p,
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1e00: 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f  dd the opcode to
1e10: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
1e20: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
1e30: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63    /* The new opc
1e40: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c  ode */.  int p1,
1e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e60: 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a  The P1 operand *
1e70: 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20  /.  int p2,     
1e80: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1e90: 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  2 operand */.  i
1ea0: 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20  nt p3,          
1eb0: 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65     /* The P3 ope
1ec0: 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rand */.  const 
1ed0: 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a  char *zP4,    /*
1ee0: 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   The P4 operand 
1ef0: 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20  */.  int p4type 
1f00: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f           /* P4 o
1f10: 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29  perand type */.)
1f20: 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73  {.  int addr = s
1f30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1f40: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
1f50: 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  p3);.  sqlite3Vd
1f60: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64  beChangeP4(p, ad
1f70: 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70 65 29  dr, zP4, p4type)
1f80: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ;.  return addr;
1f90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
1fa0: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63   opcode that inc
1fb0: 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c  ludes the p4 val
1fc0: 75 65 20 77 69 74 68 20 61 20 50 34 5f 49 4e 54  ue with a P4_INT
1fd0: 36 34 20 6f 72 0a 2a 2a 20 50 34 5f 52 45 41 4c  64 or.** P4_REAL
1fe0: 20 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   type..*/.int sq
1ff0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44  lite3VdbeAddOp4D
2000: 75 70 38 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  up8(.  Vdbe *p, 
2010: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
2020: 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20  d the opcode to 
2030: 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74  this VM */.  int
2040: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
2050: 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f   /* The new opco
2060: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20  de */.  int p1, 
2070: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2080: 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f  he P1 operand */
2090: 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20  .  int p2,      
20a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32         /* The P2
20b0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
20c0: 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20  t p3,           
20d0: 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72    /* The P3 oper
20e0: 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  and */.  const u
20f0: 38 20 2a 7a 50 34 2c 20 20 20 20 20 20 2f 2a 20  8 *zP4,      /* 
2100: 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a  The P4 operand *
2110: 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20 20  /.  int p4type  
2120: 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70          /* P4 op
2130: 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b  erand type */.){
2140: 0a 20 20 63 68 61 72 20 2a 70 34 63 6f 70 79 20  .  char *p4copy 
2150: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
2160: 63 52 61 77 28 73 71 6c 69 74 65 33 56 64 62 65  cRaw(sqlite3Vdbe
2170: 44 62 28 70 29 2c 20 38 29 3b 0a 20 20 69 66 28  Db(p), 8);.  if(
2180: 20 70 34 63 6f 70 79 20 29 20 6d 65 6d 63 70 79   p4copy ) memcpy
2190: 28 70 34 63 6f 70 79 2c 20 7a 50 34 2c 20 38 29  (p4copy, zP4, 8)
21a0: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
21b0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c 20  e3VdbeAddOp4(p, 
21c0: 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 2c 20  op, p1, p2, p3, 
21d0: 70 34 63 6f 70 79 2c 20 70 34 74 79 70 65 29 3b  p4copy, p4type);
21e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
21f0: 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 20   OP_ParseSchema 
2200: 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f  opcode.  This ro
2210: 75 74 69 6e 65 20 69 73 20 62 72 6f 6b 65 6e 20  utine is broken 
2220: 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69  out from.** sqli
2230: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 29 20  te3VdbeAddOp4() 
2240: 73 69 6e 63 65 20 69 74 20 6e 65 65 64 73 20 74  since it needs t
2250: 6f 20 61 6c 73 6f 20 6e 65 65 64 73 20 74 6f 20  o also needs to 
2260: 6d 61 72 6b 20 61 6c 6c 20 62 74 72 65 65 73 0a  mark all btrees.
2270: 2a 2a 20 61 73 20 68 61 76 69 6e 67 20 62 65 65  ** as having bee
2280: 6e 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  n used..**.** Th
2290: 65 20 7a 57 68 65 72 65 20 73 74 72 69 6e 67 20  e zWhere string 
22a0: 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f  must have been o
22b0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
22c0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
22d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
22e0: 69 6c 6c 20 74 61 6b 65 20 6f 77 6e 65 72 73 68  ill take ownersh
22f0: 69 70 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61  ip of the alloca
2300: 74 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76  ted memory..*/.v
2310: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 41  oid sqlite3VdbeA
2320: 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28  ddParseSchemaOp(
2330: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 62  Vdbe *p, int iDb
2340: 2c 20 63 68 61 72 20 2a 7a 57 68 65 72 65 29 7b  , char *zWhere){
2350: 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 73 71 6c 69  .  int j;.  sqli
2360: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c  te3VdbeAddOp4(p,
2370: 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c   OP_ParseSchema,
2380: 20 69 44 62 2c 20 30 2c 20 30 2c 20 7a 57 68 65   iDb, 0, 0, zWhe
2390: 72 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  re, P4_DYNAMIC);
23a0: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d  .  for(j=0; j<p-
23b0: 3e 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 20 73  >db->nDb; j++) s
23c0: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
23d0: 72 65 65 28 70 2c 20 6a 29 3b 0a 7d 0a 0a 2f 2a  ree(p, j);.}../*
23e0: 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64  .** Add an opcod
23f0: 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20  e that includes 
2400: 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73 20  the p4 value as 
2410: 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69  an integer..*/.i
2420: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
2430: 64 4f 70 34 49 6e 74 28 0a 20 20 56 64 62 65 20  dOp4Int(.  Vdbe 
2440: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
2450: 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65  * Add the opcode
2460: 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20   to this VM */. 
2470: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
2480: 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20       /* The new 
2490: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  opcode */.  int 
24a0: 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p1,             
24b0: 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e  /* The P1 operan
24c0: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20  d */.  int p2,  
24d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
24e0: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P2 operand */.
24f0: 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20    int p3,       
2500: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20        /* The P3 
2510: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
2520: 20 70 34 20 20 20 20 20 20 20 20 20 20 20 20 20   p4             
2530: 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61   /* The P4 opera
2540: 6e 64 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72  nd as an integer
2550: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64   */.){.  int add
2560: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
2570: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
2580: 20 70 32 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69   p2, p3);.  sqli
2590: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
25a0: 70 2c 20 61 64 64 72 2c 20 53 51 4c 49 54 45 5f  p, addr, SQLITE_
25b0: 49 4e 54 5f 54 4f 5f 50 54 52 28 70 34 29 2c 20  INT_TO_PTR(p4), 
25c0: 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 72 65 74  P4_INT32);.  ret
25d0: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
25e0: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
25f0: 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 66  symbolic label f
2600: 6f 72 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  or an instructio
2610: 6e 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74  n that has yet t
2620: 6f 20 62 65 0a 2a 2a 20 63 6f 64 65 64 2e 20 20  o be.** coded.  
2630: 54 68 65 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62  The symbolic lab
2640: 65 6c 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73  el is really jus
2650: 74 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  t a negative num
2660: 62 65 72 2e 20 20 54 68 65 0a 2a 2a 20 6c 61 62  ber.  The.** lab
2670: 65 6c 20 63 61 6e 20 62 65 20 75 73 65 64 20 61  el can be used a
2680: 73 20 74 68 65 20 50 32 20 76 61 6c 75 65 20 6f  s the P2 value o
2690: 66 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20  f an operation. 
26a0: 20 4c 61 74 65 72 2c 20 77 68 65 6e 0a 2a 2a 20   Later, when.** 
26b0: 74 68 65 20 6c 61 62 65 6c 20 69 73 20 72 65 73  the label is res
26c0: 6f 6c 76 65 64 20 74 6f 20 61 20 73 70 65 63 69  olved to a speci
26d0: 66 69 63 20 61 64 64 72 65 73 73 2c 20 74 68 65  fic address, the
26e0: 20 56 44 42 45 20 77 69 6c 6c 20 73 63 61 6e 0a   VDBE will scan.
26f0: 2a 2a 20 74 68 72 6f 75 67 68 20 69 74 73 20 6f  ** through its o
2700: 70 65 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e  peration list an
2710: 64 20 63 68 61 6e 67 65 20 61 6c 6c 20 76 61 6c  d change all val
2720: 75 65 73 20 6f 66 20 50 32 20 77 68 69 63 68 20  ues of P2 which 
2730: 6d 61 74 63 68 0a 2a 2a 20 74 68 65 20 6c 61 62  match.** the lab
2740: 65 6c 20 69 6e 74 6f 20 74 68 65 20 72 65 73 6f  el into the reso
2750: 6c 76 65 64 20 61 64 64 72 65 73 73 2e 0a 2a 2a  lved address..**
2760: 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 6b 6e 6f  .** The VDBE kno
2770: 77 73 20 74 68 61 74 20 61 20 50 32 20 76 61 6c  ws that a P2 val
2780: 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 62 65  ue is a label be
2790: 63 61 75 73 65 20 6c 61 62 65 6c 73 20 61 72 65  cause labels are
27a0: 0a 2a 2a 20 61 6c 77 61 79 73 20 6e 65 67 61 74  .** always negat
27b0: 69 76 65 20 61 6e 64 20 50 32 20 76 61 6c 75 65  ive and P2 value
27c0: 73 20 61 72 65 20 73 75 70 70 6f 73 65 20 74 6f  s are suppose to
27d0: 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   be non-negative
27e0: 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6e 65  ..** Hence, a ne
27f0: 67 61 74 69 76 65 20 50 32 20 76 61 6c 75 65 20  gative P2 value 
2800: 69 73 20 61 20 6c 61 62 65 6c 20 74 68 61 74 20  is a label that 
2810: 68 61 73 20 79 65 74 20 74 6f 20 62 65 20 72 65  has yet to be re
2820: 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65  solved..**.** Ze
2830: 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ro is returned i
2840: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  f a malloc() fai
2850: 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ls..*/.int sqlit
2860: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
2870: 56 64 62 65 20 2a 76 29 7b 0a 20 20 50 61 72 73  Vdbe *v){.  Pars
2880: 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65  e *p = v->pParse
2890: 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 2d 3e 6e  ;.  int i = p->n
28a0: 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72  Label++;.  asser
28b0: 74 28 20 76 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( v->magic==VDB
28c0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
28d0: 20 20 69 66 28 20 28 69 20 26 20 28 69 2d 31 29    if( (i & (i-1)
28e0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 61  )==0 ){.    p->a
28f0: 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 44  Label = sqlite3D
2900: 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70  bReallocOrFree(p
2910: 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c  ->db, p->aLabel,
2920: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2940: 20 20 20 20 20 20 20 20 20 28 69 2a 32 2b 31 29           (i*2+1)
2950: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65  *sizeof(p->aLabe
2960: 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66  l[0]));.  }.  if
2970: 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20  ( p->aLabel ){. 
2980: 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20     p->aLabel[i] 
2990: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = -1;.  }.  retu
29a0: 72 6e 20 41 44 44 52 28 69 29 3b 0a 7d 0a 0a 2f  rn ADDR(i);.}../
29b0: 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62  *.** Resolve lab
29c0: 65 6c 20 22 78 22 20 74 6f 20 62 65 20 74 68 65  el "x" to be the
29d0: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
29e0: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
29f0: 20 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74   to.** be insert
2a00: 65 64 2e 20 20 54 68 65 20 70 61 72 61 6d 65 74  ed.  The paramet
2a10: 65 72 20 22 78 22 20 6d 75 73 74 20 68 61 76 65  er "x" must have
2a20: 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66   been obtained f
2a30: 72 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63  rom.** a prior c
2a40: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64  all to sqlite3Vd
2a50: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a  beMakeLabel()..*
2a60: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
2a70: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56  beResolveLabel(V
2a80: 64 62 65 20 2a 76 2c 20 69 6e 74 20 78 29 7b 0a  dbe *v, int x){.
2a90: 20 20 50 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e    Parse *p = v->
2aa0: 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 6a 20  pParse;.  int j 
2ab0: 3d 20 41 44 44 52 28 78 29 3b 0a 20 20 61 73 73  = ADDR(x);.  ass
2ac0: 65 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d 3d 56  ert( v->magic==V
2ad0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
2ae0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3c 70 2d  ;.  assert( j<p-
2af0: 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 61 73 73  >nLabel );.  ass
2b00: 65 72 74 28 20 6a 3e 3d 30 20 29 3b 0a 20 20 69  ert( j>=0 );.  i
2b10: 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a  f( p->aLabel ){.
2b20: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d      p->aLabel[j]
2b30: 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 20   = v->nOp;.  }. 
2b40: 20 70 2d 3e 69 46 69 78 65 64 4f 70 20 3d 20 76   p->iFixedOp = v
2b50: 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 7d 0a 0a 2f 2a  ->nOp - 1;.}../*
2b60: 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42  .** Mark the VDB
2b70: 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61  E as one that ca
2b80: 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e  n only be run on
2b90: 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20  e time..*/.void 
2ba0: 73 71 6c 69 74 65 33 56 64 62 65 52 75 6e 4f 6e  sqlite3VdbeRunOn
2bb0: 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a 70 29 7b  lyOnce(Vdbe *p){
2bc0: 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63  .  p->runOnlyOnc
2bd0: 65 20 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64 65 66  e = 1;.}..#ifdef
2be0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a   SQLITE_DEBUG /*
2bf0: 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61   sqlite3AssertMa
2c00: 79 41 62 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a  yAbort() logic *
2c10: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  /../*.** The fol
2c20: 6c 6f 77 69 6e 67 20 74 79 70 65 20 61 6e 64 20  lowing type and 
2c30: 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 75 73 65  function are use
2c40: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
2c50: 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73  ough all opcodes
2c60: 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65 20 6d 61  .** in a Vdbe ma
2c70: 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 65  in program and e
2c80: 61 63 68 20 6f 66 20 74 68 65 20 73 75 62 2d 70  ach of the sub-p
2c90: 72 6f 67 72 61 6d 73 20 28 74 72 69 67 67 65 72  rograms (trigger
2ca0: 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e  s) it may .** in
2cb0: 76 6f 6b 65 20 64 69 72 65 63 74 6c 79 20 6f 72  voke directly or
2cc0: 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 49 74 20   indirectly. It 
2cd0: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61  should be used a
2ce0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
2cf0: 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20     Op *pOp;.**  
2d00: 20 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 65   VdbeOpIter sIte
2d10: 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65  r;.**.**   memse
2d20: 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a  t(&sIter, 0, siz
2d30: 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20  eof(sIter));.** 
2d40: 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 20 20    sIter.v = v;  
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d60: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 76 20 69            // v i
2d70: 73 20 6f 66 20 74 79 70 65 20 56 64 62 65 2a 20  s of type Vdbe* 
2d80: 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 28 70 4f  .**   while( (pO
2d90: 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26  p = opIterNext(&
2da0: 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20  sIter)) ){.**   
2db0: 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e    // Do somethin
2dc0: 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20  g with pOp.**   
2dd0: 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 44 62  }.**   sqlite3Db
2de0: 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65  Free(v->db, sIte
2df0: 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f  r.apSub);.** .*/
2e00: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
2e10: 56 64 62 65 4f 70 49 74 65 72 20 56 64 62 65 4f  VdbeOpIter VdbeO
2e20: 70 49 74 65 72 3b 0a 73 74 72 75 63 74 20 56 64  pIter;.struct Vd
2e30: 62 65 4f 70 49 74 65 72 20 7b 0a 20 20 56 64 62  beOpIter {.  Vdb
2e40: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
2e50: 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20          /* Vdbe 
2e60: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
2e70: 67 68 20 74 68 65 20 6f 70 63 6f 64 65 73 20 6f  gh the opcodes o
2e80: 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61  f */.  SubProgra
2e90: 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20 20 20 20  m **apSub;      
2ea0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75    /* Array of su
2eb0: 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69  bprograms */.  i
2ec0: 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20  nt nSub;        
2ed0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2ee0: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
2ef0: 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74  n apSub */.  int
2f00: 20 69 41 64 64 72 3b 20 20 20 20 20 20 20 20 20   iAddr;         
2f10: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
2f20: 73 73 20 6f 66 20 6e 65 78 74 20 69 6e 73 74 72  ss of next instr
2f30: 75 63 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e  uction to return
2f40: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b 20   */.  int iSub; 
2f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f60: 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f   /* 0 = main pro
2f70: 67 72 61 6d 2c 20 31 20 3d 20 66 69 72 73 74 20  gram, 1 = first 
2f80: 73 75 62 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e  sub-program etc.
2f90: 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70   */.};.static Op
2fa0: 20 2a 6f 70 49 74 65 72 4e 65 78 74 28 56 64 62   *opIterNext(Vdb
2fb0: 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20 20 56  eOpIter *p){.  V
2fc0: 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20  dbe *v = p->v;. 
2fd0: 20 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20   Op *pRet = 0;. 
2fe0: 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20   Op *aOp;.  int 
2ff0: 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  nOp;..  if( p->i
3000: 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a  Sub<=p->nSub ){.
3010: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 53 75 62  .    if( p->iSub
3020: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 4f 70  ==0 ){.      aOp
3030: 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20   = v->aOp;.     
3040: 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20   nOp = v->nOp;. 
3050: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3060: 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70  aOp = p->apSub[p
3070: 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a  ->iSub-1]->aOp;.
3080: 20 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61        nOp = p->a
3090: 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d  pSub[p->iSub-1]-
30a0: 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >nOp;.    }.    
30b0: 61 73 73 65 72 74 28 20 70 2d 3e 69 41 64 64 72  assert( p->iAddr
30c0: 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52 65  <nOp );..    pRe
30d0: 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64  t = &aOp[p->iAdd
30e0: 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64 72  r];.    p->iAddr
30f0: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  ++;.    if( p->i
3100: 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20  Addr==nOp ){.   
3110: 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20     p->iSub++;.  
3120: 20 20 20 20 70 2d 3e 69 41 64 64 72 20 3d 20 30      p->iAddr = 0
3130: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  ;.    }.  .    i
3140: 66 28 20 70 52 65 74 2d 3e 70 34 74 79 70 65 3d  f( pRet->p4type=
3150: 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29  =P4_SUBPROGRAM )
3160: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74  {.      int nByt
3170: 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a  e = (p->nSub+1)*
3180: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
3190: 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  m*);.      int j
31a0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
31b0: 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29   j<p->nSub; j++)
31c0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
31d0: 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d  >apSub[j]==pRet-
31e0: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62  >p4.pProgram ) b
31f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
3200: 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53      if( j==p->nS
3210: 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  ub ){.        p-
3220: 3e 61 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33  >apSub = sqlite3
3230: 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
3240: 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c  v->db, p->apSub,
3250: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20   nByte);.       
3260: 20 69 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29   if( !p->apSub )
3270: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52 65 74  {.          pRet
3280: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
3290: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
32a0: 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b  ->apSub[p->nSub+
32b0: 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50  +] = pRet->p4.pP
32c0: 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20  rogram;.        
32d0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
32e0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52    }..  return pR
32f0: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  et;.}../*.** Che
3300: 63 6b 20 69 66 20 74 68 65 20 70 72 6f 67 72 61  ck if the progra
3310: 6d 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  m stored in the 
3320: 56 4d 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  VM associated wi
3330: 74 68 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a  th pParse may.**
3340: 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20   throw an ABORT 
3350: 65 78 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69  exception (causi
3360: 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ng the statement
3370: 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65  , but not entire
3380: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
3390: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
33a0: 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69  k). This conditi
33b0: 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20 74 68  on is true if th
33c0: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f  e main program o
33d0: 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f  r any.** sub-pro
33e0: 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61  grams contains a
33f0: 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
3400: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  ing:.**.**   *  
3410: 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d  OP_Halt with P1=
3420: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
3430: 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72  T and P2=OE_Abor
3440: 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61  t..**   *  OP_Ha
3450: 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31  ltIfNull with P1
3460: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
3470: 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f  NT and P2=OE_Abo
3480: 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44  rt..**   *  OP_D
3490: 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f  estroy.**   *  O
34a0: 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a  P_VUpdate.**   *
34b0: 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20    OP_VRename.** 
34c0: 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65    *  OP_FkCounte
34d0: 72 20 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d  r with P2==0 (im
34e0: 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
34f0: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a  key constraint).
3500: 2a 2a 20 20 20 2a 20 20 4f 50 5f 43 72 65 61 74  **   *  OP_Creat
3510: 65 54 61 62 6c 65 20 61 6e 64 20 4f 50 5f 49 6e  eTable and OP_In
3520: 69 74 43 6f 72 6f 75 74 69 6e 65 20 28 66 6f 72  itCoroutine (for
3530: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 41 53   CREATE TABLE AS
3540: 20 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a   SELECT ...).**.
3550: 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b 20 74 68  ** Then check th
3560: 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  at the value of 
3570: 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 74 20 69  Parse.mayAbort i
3580: 73 20 74 72 75 65 20 69 66 20 61 6e 0a 2a 2a 20  s true if an.** 
3590: 41 42 4f 52 54 20 6d 61 79 20 62 65 20 74 68 72  ABORT may be thr
35a0: 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  own, or false ot
35b0: 68 65 72 77 69 73 65 2e 20 52 65 74 75 72 6e 20  herwise. Return 
35c0: 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 0a  true if it does.
35d0: 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66 61 6c  ** match, or fal
35e0: 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 54 68  se otherwise. Th
35f0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
3600: 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73  ntended to be us
3610: 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66  ed as.** part of
3620: 20 61 6e 20 61 73 73 65 72 74 20 73 74 61 74 65   an assert state
3630: 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 6f 6d 70  ment in the comp
3640: 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20 74 6f  iler. Similar to
3650: 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74  :.**.**   assert
3660: 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73  ( sqlite3VdbeAss
3670: 65 72 74 4d 61 79 41 62 6f 72 74 28 70 50 61 72  ertMayAbort(pPar
3680: 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72 73  se->pVdbe, pPars
3690: 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29 3b 0a  e->mayAbort) );.
36a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
36b0: 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74  beAssertMayAbort
36c0: 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6d 61  (Vdbe *v, int ma
36d0: 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74 20 68  yAbort){.  int h
36e0: 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20 20 69  asAbort = 0;.  i
36f0: 6e 74 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 20  nt hasFkCounter 
3700: 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 43 72  = 0;.  int hasCr
3710: 65 61 74 65 54 61 62 6c 65 20 3d 20 30 3b 0a 20  eateTable = 0;. 
3720: 20 69 6e 74 20 68 61 73 49 6e 69 74 43 6f 72 6f   int hasInitCoro
3730: 75 74 69 6e 65 20 3d 20 30 3b 0a 20 20 4f 70 20  utine = 0;.  Op 
3740: 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70 49 74  *pOp;.  VdbeOpIt
3750: 65 72 20 73 49 74 65 72 3b 0a 20 20 6d 65 6d 73  er sIter;.  mems
3760: 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69  et(&sIter, 0, si
3770: 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 20 20  zeof(sIter));.  
3780: 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a 20 20  sIter.v = v;..  
3790: 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70  while( (pOp = op
37a0: 49 74 65 72 4e 65 78 74 28 26 73 49 74 65 72 29  IterNext(&sIter)
37b0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )!=0 ){.    int 
37c0: 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70  opcode = pOp->op
37d0: 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 20 6f 70  code;.    if( op
37e0: 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79  code==OP_Destroy
37f0: 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56   || opcode==OP_V
3800: 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65  Update || opcode
3810: 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a 20 20  ==OP_VRename .  
3820: 20 20 20 7c 7c 20 28 28 6f 70 63 6f 64 65 3d 3d     || ((opcode==
3830: 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f 70 63 6f 64  OP_Halt || opcod
3840: 65 3d 3d 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c  e==OP_HaltIfNull
3850: 29 20 0a 20 20 20 20 20 20 26 26 20 28 28 70 4f  ) .      && ((pO
3860: 70 2d 3e 70 31 26 30 78 66 66 29 3d 3d 53 51 4c  p->p1&0xff)==SQL
3870: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26  ITE_CONSTRAINT &
3880: 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62  & pOp->p2==OE_Ab
3890: 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  ort)).    ){.   
38a0: 20 20 20 68 61 73 41 62 6f 72 74 20 3d 20 31 3b     hasAbort = 1;
38b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
38c0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 63 6f    }.    if( opco
38d0: 64 65 3d 3d 4f 50 5f 43 72 65 61 74 65 54 61 62  de==OP_CreateTab
38e0: 6c 65 20 29 20 68 61 73 43 72 65 61 74 65 54 61  le ) hasCreateTa
38f0: 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  ble = 1;.    if(
3900: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74   opcode==OP_Init
3910: 43 6f 72 6f 75 74 69 6e 65 20 29 20 68 61 73 49  Coroutine ) hasI
3920: 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31  nitCoroutine = 1
3930: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
3940: 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
3950: 59 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65  Y.    if( opcode
3960: 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26  ==OP_FkCounter &
3970: 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20  & pOp->p1==0 && 
3980: 70 4f 70 2d 3e 70 32 3d 3d 31 20 29 7b 0a 20 20  pOp->p2==1 ){.  
3990: 20 20 20 20 68 61 73 46 6b 43 6f 75 6e 74 65 72      hasFkCounter
39a0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
39b0: 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  if.  }.  sqlite3
39c0: 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49  DbFree(v->db, sI
39d0: 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20 2f  ter.apSub);..  /
39e0: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
39f0: 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62   hasAbort==mayAb
3a00: 6f 72 74 2e 20 4f 72 20 69 66 20 61 20 6d 61 6c  ort. Or if a mal
3a10: 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75  loc failure occu
3a20: 72 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d 61  rred..  ** If ma
3a30: 6c 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74 68 65  lloc failed, the
3a40: 6e 20 74 68 65 20 77 68 69 6c 65 28 29 20 6c 6f  n the while() lo
3a50: 6f 70 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f 74  op above may not
3a60: 20 68 61 76 65 20 69 74 65 72 61 74 65 64 0a 20   have iterated. 
3a70: 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20   ** through all 
3a80: 6f 70 63 6f 64 65 73 20 61 6e 64 20 68 61 73 41  opcodes and hasA
3a90: 62 6f 72 74 20 6d 61 79 20 62 65 20 73 65 74 20  bort may be set 
3aa0: 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52 65 74  incorrectly. Ret
3ab0: 75 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66 6f  urn.  ** true fo
3ac0: 72 20 74 68 69 73 20 63 61 73 65 20 74 6f 20 70  r this case to p
3ad0: 72 65 76 65 6e 74 20 74 68 65 20 61 73 73 65 72  revent the asser
3ae0: 74 28 29 20 69 6e 20 74 68 65 20 63 61 6c 6c 65  t() in the calle
3af0: 72 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66 72  rs frame.  ** fr
3b00: 6f 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a  om failing.  */.
3b10: 20 20 72 65 74 75 72 6e 20 28 20 76 2d 3e 64 62    return ( v->db
3b20: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
3b30: 7c 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41  | hasAbort==mayA
3b40: 62 6f 72 74 20 7c 7c 20 68 61 73 46 6b 43 6f 75  bort || hasFkCou
3b50: 6e 74 65 72 0a 20 20 20 20 20 20 20 20 20 20 20  nter.           
3b60: 20 20 20 7c 7c 20 28 68 61 73 43 72 65 61 74 65     || (hasCreate
3b70: 54 61 62 6c 65 20 26 26 20 68 61 73 49 6e 69 74  Table && hasInit
3b80: 43 6f 72 6f 75 74 69 6e 65 29 20 29 3b 0a 7d 0a  Coroutine) );.}.
3b90: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
3ba0: 5f 44 45 42 55 47 20 2d 20 74 68 65 20 73 71 6c  _DEBUG - the sql
3bb0: 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f  ite3AssertMayAbo
3bc0: 72 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  rt() function */
3bd0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
3be0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61  tine is called a
3bf0: 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f 64 65 73  fter all opcodes
3c00: 20 68 61 76 65 20 62 65 65 6e 20 69 6e 73 65 72   have been inser
3c10: 74 65 64 2e 20 20 49 74 20 6c 6f 6f 70 73 0a 2a  ted.  It loops.*
3c20: 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 74 68  * through all th
3c30: 65 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 66 69  e opcodes and fi
3c40: 78 65 73 20 75 70 20 73 6f 6d 65 20 64 65 74 61  xes up some deta
3c50: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 28 31 29 20 46  ils..**.** (1) F
3c60: 6f 72 20 65 61 63 68 20 6a 75 6d 70 20 69 6e 73  or each jump ins
3c70: 74 72 75 63 74 69 6f 6e 20 77 69 74 68 20 61 20  truction with a 
3c80: 6e 65 67 61 74 69 76 65 20 50 32 20 76 61 6c 75  negative P2 valu
3c90: 65 20 28 61 20 6c 61 62 65 6c 29 0a 2a 2a 20 20  e (a label).**  
3ca0: 20 20 20 72 65 73 6f 6c 76 65 20 74 68 65 20 50     resolve the P
3cb0: 32 20 76 61 6c 75 65 20 74 6f 20 61 6e 20 61 63  2 value to an ac
3cc0: 74 75 61 6c 20 61 64 64 72 65 73 73 2e 0a 2a 2a  tual address..**
3cd0: 0a 2a 2a 20 28 32 29 20 43 6f 6d 70 75 74 65 20  .** (2) Compute 
3ce0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
3cf0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
3d00: 75 73 65 64 20 62 79 20 61 6e 79 20 53 51 4c 20  used by any SQL 
3d10: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  function.**     
3d20: 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20 76  and store that v
3d30: 61 6c 75 65 20 69 6e 20 2a 70 4d 61 78 46 75 6e  alue in *pMaxFun
3d40: 63 41 72 67 73 2e 0a 2a 2a 0a 2a 2a 20 28 33 29  cArgs..**.** (3)
3d50: 20 55 70 64 61 74 65 20 74 68 65 20 56 64 62 65   Update the Vdbe
3d60: 2e 72 65 61 64 4f 6e 6c 79 20 61 6e 64 20 56 64  .readOnly and Vd
3d70: 62 65 2e 62 49 73 52 65 61 64 65 72 20 66 6c 61  be.bIsReader fla
3d80: 67 73 20 74 6f 20 61 63 63 75 72 61 74 65 6c 79  gs to accurately
3d90: 0a 2a 2a 20 20 20 20 20 69 6e 64 69 63 61 74 65  .**     indicate
3da0: 20 77 68 61 74 20 74 68 65 20 70 72 65 70 61 72   what the prepar
3db0: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 63 74  ed statement act
3dc0: 75 61 6c 6c 79 20 64 6f 65 73 2e 0a 2a 2a 0a 2a  ually does..**.*
3dd0: 2a 20 28 34 29 20 49 6e 69 74 69 61 6c 69 7a 65  * (4) Initialize
3de0: 20 74 68 65 20 70 34 2e 78 41 64 76 61 6e 63 65   the p4.xAdvance
3df0: 20 70 6f 69 6e 74 65 72 20 6f 6e 20 6f 70 63 6f   pointer on opco
3e00: 64 65 73 20 74 68 61 74 20 75 73 65 20 69 74 2e  des that use it.
3e10: 0a 2a 2a 0a 2a 2a 20 28 35 29 20 52 65 63 6c 61  .**.** (5) Recla
3e20: 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  im the memory al
3e30: 6c 6f 63 61 74 65 64 20 66 6f 72 20 73 74 6f 72  located for stor
3e40: 69 6e 67 20 6c 61 62 65 6c 73 2e 0a 2a 2f 0a 73  ing labels..*/.s
3e50: 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c  tatic void resol
3e60: 76 65 50 32 56 61 6c 75 65 73 28 56 64 62 65 20  veP2Values(Vdbe 
3e70: 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e  *p, int *pMaxFun
3e80: 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20 69 3b  cArgs){.  int i;
3e90: 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67 73 20  .  int nMaxArgs 
3ea0: 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 3b  = *pMaxFuncArgs;
3eb0: 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 50 61  .  Op *pOp;.  Pa
3ec0: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d  rse *pParse = p-
3ed0: 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 2a  >pParse;.  int *
3ee0: 61 4c 61 62 65 6c 20 3d 20 70 50 61 72 73 65 2d  aLabel = pParse-
3ef0: 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65  >aLabel;.  p->re
3f00: 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 70 2d  adOnly = 1;.  p-
3f10: 3e 62 49 73 52 65 61 64 65 72 20 3d 20 30 3b 0a  >bIsReader = 0;.
3f20: 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70    for(pOp=p->aOp
3f30: 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e  , i=p->nOp-1; i>
3f40: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b  =0; i--, pOp++){
3f50: 0a 20 20 20 20 75 38 20 6f 70 63 6f 64 65 20 3d  .    u8 opcode =
3f60: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20   pOp->opcode;.. 
3f70: 20 20 20 2f 2a 20 4e 4f 54 45 3a 20 42 65 20 73     /* NOTE: Be s
3f80: 75 72 65 20 74 6f 20 75 70 64 61 74 65 20 6d 6b  ure to update mk
3f90: 6f 70 63 6f 64 65 68 2e 74 63 6c 20 77 68 65 6e  opcodeh.tcl when
3fa0: 20 61 64 64 69 6e 67 20 6f 72 20 72 65 6d 6f 76   adding or remov
3fb0: 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 73 65 73  ing.    ** cases
3fc0: 20 66 72 6f 6d 20 74 68 69 73 20 73 77 69 74 63   from this switc
3fd0: 68 21 20 2a 2f 0a 20 20 20 20 73 77 69 74 63 68  h! */.    switch
3fe0: 28 20 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20 20  ( opcode ){.    
3ff0: 20 20 63 61 73 65 20 4f 50 5f 54 72 61 6e 73 61    case OP_Transa
4000: 63 74 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 20  ction: {.       
4010: 20 69 66 28 20 70 4f 70 2d 3e 70 32 21 3d 30 20   if( pOp->p2!=0 
4020: 29 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  ) p->readOnly = 
4030: 30 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 61  0;.        /* fa
4040: 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 20  ll thru */.     
4050: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50   }.      case OP
4060: 5f 41 75 74 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20  _AutoCommit:.   
4070: 20 20 20 63 61 73 65 20 4f 50 5f 53 61 76 65 70     case OP_Savep
4080: 6f 69 6e 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  oint: {.        
4090: 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 31  p->bIsReader = 1
40a0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
40b0: 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
40c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
40d0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 43  .      case OP_C
40e0: 68 65 63 6b 70 6f 69 6e 74 3a 0a 23 65 6e 64 69  heckpoint:.#endi
40f0: 66 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  f.      case OP_
4100: 56 61 63 75 75 6d 3a 0a 20 20 20 20 20 20 63 61  Vacuum:.      ca
4110: 73 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64  se OP_JournalMod
4120: 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  e: {.        p->
4130: 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20  readOnly = 0;.  
4140: 20 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64        p->bIsRead
4150: 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  er = 1;.        
4160: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  break;.      }.#
4170: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4180: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
4190: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 55        case OP_VU
41a0: 70 64 61 74 65 3a 20 7b 0a 20 20 20 20 20 20 20  pdate: {.       
41b0: 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61   if( pOp->p2>nMa
41c0: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73  xArgs ) nMaxArgs
41d0: 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20   = pOp->p2;.    
41e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
41f0: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50   }.      case OP
4200: 5f 56 46 69 6c 74 65 72 3a 20 7b 0a 20 20 20 20  _VFilter: {.    
4210: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
4220: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f     assert( p->nO
4230: 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20  p - i >= 3 );.  
4240: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
4250: 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50  p[-1].opcode==OP
4260: 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20  _Integer );.    
4270: 20 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e      n = pOp[-1].
4280: 70 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  p1;.        if( 
4290: 6e 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61  n>nMaxArgs ) nMa
42a0: 78 41 72 67 73 20 3d 20 6e 3b 0a 20 20 20 20 20  xArgs = n;.     
42b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
42c0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63  }.#endif.      c
42d0: 61 73 65 20 4f 50 5f 4e 65 78 74 3a 0a 20 20 20  ase OP_Next:.   
42e0: 20 20 20 63 61 73 65 20 4f 50 5f 4e 65 78 74 49     case OP_NextI
42f0: 66 4f 70 65 6e 3a 0a 20 20 20 20 20 20 63 61 73  fOpen:.      cas
4300: 65 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a  e OP_SorterNext:
4310: 20 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e   {.        pOp->
4320: 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73 71  p4.xAdvance = sq
4330: 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 3b 0a  lite3BtreeNext;.
4340: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74          pOp->p4t
4350: 79 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43 45  ype = P4_ADVANCE
4360: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
4370: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
4380: 61 73 65 20 4f 50 5f 50 72 65 76 3a 0a 20 20 20  ase OP_Prev:.   
4390: 20 20 20 63 61 73 65 20 4f 50 5f 50 72 65 76 49     case OP_PrevI
43a0: 66 4f 70 65 6e 3a 20 7b 0a 20 20 20 20 20 20 20  fOpen: {.       
43b0: 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63   pOp->p4.xAdvanc
43c0: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
43d0: 50 72 65 76 69 6f 75 73 3b 0a 20 20 20 20 20 20  Previous;.      
43e0: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
43f0: 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20  P4_ADVANCE;.    
4400: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4410: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4f   }.    }..    pO
4420: 70 2d 3e 6f 70 66 6c 61 67 73 20 3d 20 73 71 6c  p->opflags = sql
4430: 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72  ite3OpcodeProper
4440: 74 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 20  ty[opcode];.    
4450: 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c 61 67  if( (pOp->opflag
4460: 73 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21  s & OPFLG_JUMP)!
4470: 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20  =0 && pOp->p2<0 
4480: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
4490: 20 41 44 44 52 28 70 4f 70 2d 3e 70 32 29 3c 70   ADDR(pOp->p2)<p
44a0: 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 29 3b  Parse->nLabel );
44b0: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d  .      pOp->p2 =
44c0: 20 61 4c 61 62 65 6c 5b 41 44 44 52 28 70 4f 70   aLabel[ADDR(pOp
44d0: 2d 3e 70 32 29 5d 3b 0a 20 20 20 20 7d 0a 20 20  ->p2)];.    }.  
44e0: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
44f0: 65 28 70 2d 3e 64 62 2c 20 70 50 61 72 73 65 2d  e(p->db, pParse-
4500: 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 50 61 72  >aLabel);.  pPar
4510: 73 65 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a  se->aLabel = 0;.
4520: 20 20 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c    pParse->nLabel
4530: 20 3d 20 30 3b 0a 20 20 2a 70 4d 61 78 46 75 6e   = 0;.  *pMaxFun
4540: 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73  cArgs = nMaxArgs
4550: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62  ;.  assert( p->b
4560: 49 73 52 65 61 64 65 72 21 3d 30 20 7c 7c 20 44  IsReader!=0 || D
4570: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e  bMaskAllZero(p->
4580: 62 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a 7d 0a  btreeMask) );.}.
4590: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
45a0: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
45b0: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
45c0: 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64  n to be inserted
45d0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
45e0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
45f0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  Vdbe *p){.  asse
4600: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
4610: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
4620: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70  .  return p->nOp
4630: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66  ;.}../*.** Verif
4640: 79 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20  y that at least 
4650: 4e 20 6f 70 63 6f 64 65 20 73 6c 6f 74 73 20 61  N opcode slots a
4660: 72 65 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  re available in 
4670: 70 20 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61 76  p without.** hav
4680: 69 6e 67 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 6f  ing to malloc fo
4690: 72 20 6d 6f 72 65 20 73 70 61 63 65 20 28 65 78  r more space (ex
46a0: 63 65 70 74 20 77 68 65 6e 20 63 6f 6d 70 69 6c  cept when compil
46b0: 65 64 20 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49  ed using.** SQLI
46c0: 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f  TE_TEST_REALLOC_
46d0: 53 54 52 45 53 53 29 2e 20 20 54 68 69 73 20 69  STRESS).  This i
46e0: 6e 74 65 72 66 61 63 65 20 69 73 20 75 73 65 64  nterface is used
46f0: 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 0a   during testing.
4700: 2a 2a 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  ** to verify tha
4710: 74 20 63 65 72 74 61 69 6e 20 63 61 6c 6c 73 20  t certain calls 
4720: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  to sqlite3VdbeAd
4730: 64 4f 70 4c 69 73 74 28 29 20 63 61 6e 20 6e 65  dOpList() can ne
4740: 76 65 72 0a 2a 2a 20 66 61 69 6c 20 64 75 65 20  ver.** fail due 
4750: 74 6f 20 61 20 4f 4f 4d 20 66 61 75 6c 74 20 61  to a OOM fault a
4760: 6e 64 20 68 65 6e 63 65 20 74 68 61 74 20 74 68  nd hence that th
4770: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66  e return value f
4780: 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  rom.** sqlite3Vd
4790: 62 65 41 64 64 4f 70 4c 69 73 74 28 29 20 77 69  beAddOpList() wi
47a0: 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 6e 6f 6e  ll always be non
47b0: 2d 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 20 64 65  -NULL..*/.#if de
47c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
47d0: 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  UG) && !defined(
47e0: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
47f0: 4c 4f 43 5f 53 54 52 45 53 53 29 0a 76 6f 69 64  LOC_STRESS).void
4800: 20 73 71 6c 69 74 65 33 56 64 62 65 56 65 72 69   sqlite3VdbeVeri
4810: 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72  fyNoMallocRequir
4820: 65 64 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ed(Vdbe *p, int 
4830: 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  N){.  assert( p-
4840: 3e 6e 4f 70 20 2b 20 4e 20 3c 3d 20 70 2d 3e 70  >nOp + N <= p->p
4850: 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20  Parse->nOpAlloc 
4860: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
4870: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
4880: 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
4890: 65 72 20 74 6f 20 74 68 65 20 61 72 72 61 79 20  er to the array 
48a0: 6f 66 20 6f 70 63 6f 64 65 73 20 61 73 73 6f 63  of opcodes assoc
48b0: 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68  iated with.** th
48c0: 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73  e Vdbe passed as
48d0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
48e0: 65 6e 74 2e 20 49 74 20 69 73 20 74 68 65 20 63  ent. It is the c
48f0: 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62  allers responsib
4900: 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61  ility.** to arra
4910: 6e 67 65 20 66 6f 72 20 74 68 65 20 72 65 74 75  nge for the retu
4920: 72 6e 65 64 20 61 72 72 61 79 20 74 6f 20 62 65  rned array to be
4930: 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
4940: 64 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20  d using the .** 
4950: 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
4960: 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ) function..**.*
4970: 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * Before returni
4980: 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20 73 65 74  ng, *pnOp is set
4990: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
49a0: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
49b0: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72   returned.** arr
49c0: 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78  ay. Also, *pnMax
49d0: 41 72 67 20 69 73 20 73 65 74 20 74 6f 20 74 68  Arg is set to th
49e0: 65 20 6c 61 72 67 65 72 20 6f 66 20 69 74 73 20  e larger of its 
49f0: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61 6e  current value an
4a00: 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  d .** the number
4a10: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
4a20: 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20  he Vdbe.apArg[] 
4a30: 61 72 72 61 79 20 72 65 71 75 69 72 65 64 20 74  array required t
4a40: 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 0a 2a  o execute the .*
4a50: 2a 20 72 65 74 75 72 6e 65 64 20 70 72 6f 67 72  * returned progr
4a60: 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73  am..*/.VdbeOp *s
4a70: 71 6c 69 74 65 33 56 64 62 65 54 61 6b 65 4f 70  qlite3VdbeTakeOp
4a80: 41 72 72 61 79 28 56 64 62 65 20 2a 70 2c 20 69  Array(Vdbe *p, i
4a90: 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70  nt *pnOp, int *p
4aa0: 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56 64 62 65  nMaxArg){.  Vdbe
4ab0: 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70  Op *aOp = p->aOp
4ac0: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 4f 70 20  ;.  assert( aOp 
4ad0: 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  && !p->db->mallo
4ae0: 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a  cFailed );..  /*
4af0: 20 43 68 65 63 6b 20 74 68 61 74 20 73 71 6c 69   Check that sqli
4b00: 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
4b10: 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65  () was not calle
4b20: 64 20 6f 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a  d on this VM */.
4b30: 20 20 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b    assert( DbMask
4b40: 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65  AllZero(p->btree
4b50: 4d 61 73 6b 29 20 29 3b 0a 0a 20 20 72 65 73 6f  Mask) );..  reso
4b60: 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 70  lveP2Values(p, p
4b70: 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f  nMaxArg);.  *pnO
4b80: 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d  p = p->nOp;.  p-
4b90: 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74 75  >aOp = 0;.  retu
4ba0: 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aOp;.}../*.**
4bb0: 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73   Add a whole lis
4bc0: 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20  t of operations 
4bd0: 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  to the operation
4be0: 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20   stack.  Return 
4bf0: 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20  a.** pointer to 
4c00: 74 68 65 20 66 69 72 73 74 20 6f 70 65 72 61 74  the first operat
4c10: 69 6f 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a  ion inserted..**
4c20: 0a 2a 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 50 32 20  .** Non-zero P2 
4c30: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 6a 75 6d  arguments to jum
4c40: 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61  p instructions a
4c50: 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  re automatically
4c60: 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 73 6f 20   adjusted.** so 
4c70: 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20 74 61  that the jump ta
4c80: 72 67 65 74 20 69 73 20 72 65 6c 61 74 69 76 65  rget is relative
4c90: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 6f 70   to the first op
4ca0: 65 72 61 74 69 6f 6e 20 69 6e 73 65 72 74 65 64  eration inserted
4cb0: 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c  ..*/.VdbeOp *sql
4cc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
4cd0: 74 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  t(.  Vdbe *p,   
4ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cf0: 20 20 2f 2a 20 41 64 64 20 6f 70 63 6f 64 65 73    /* Add opcodes
4d00: 20 74 6f 20 74 68 65 20 70 72 65 70 61 72 65 64   to the prepared
4d10: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
4d20: 69 6e 74 20 6e 4f 70 2c 20 20 20 20 20 20 20 20  int nOp,        
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4d40: 4e 75 6d 62 65 72 20 6f 66 20 6f 70 63 6f 64 65  Number of opcode
4d50: 73 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 56 64  s to add */.  Vd
4d60: 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a  beOpList const *
4d70: 61 4f 70 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  aOp,       /* Th
4d80: 65 20 6f 70 63 6f 64 65 73 20 74 6f 20 62 65 20  e opcodes to be 
4d90: 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  added */.  int i
4da0: 4c 69 6e 65 6e 6f 20 20 20 20 20 20 20 20 20 20  Lineno          
4db0: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63          /* Sourc
4dc0: 65 2d 66 69 6c 65 20 6c 69 6e 65 20 6e 75 6d 62  e-file line numb
4dd0: 65 72 20 6f 66 20 66 69 72 73 74 20 6f 70 63 6f  er of first opco
4de0: 64 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  de */.){.  int i
4df0: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74  ;.  VdbeOp *pOut
4e00: 2c 20 2a 70 46 69 72 73 74 3b 0a 20 20 61 73 73  , *pFirst;.  ass
4e10: 65 72 74 28 20 6e 4f 70 3e 30 20 29 3b 0a 20 20  ert( nOp>0 );.  
4e20: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
4e30: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
4e40: 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f  T );.  if( p->nO
4e50: 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 70 50 61  p + nOp > p->pPa
4e60: 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26  rse->nOpAlloc &&
4e70: 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70 2c 20   growOpArray(p, 
4e80: 6e 4f 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75  nOp) ){.    retu
4e90: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 46 69 72  rn 0;.  }.  pFir
4ea0: 73 74 20 3d 20 70 4f 75 74 20 3d 20 26 70 2d 3e  st = pOut = &p->
4eb0: 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 0a 20 20 66  aOp[p->nOp];.  f
4ec0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69  or(i=0; i<nOp; i
4ed0: 2b 2b 2c 20 61 4f 70 2b 2b 2c 20 70 4f 75 74 2b  ++, aOp++, pOut+
4ee0: 2b 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 6f 70  +){.    pOut->op
4ef0: 63 6f 64 65 20 3d 20 61 4f 70 2d 3e 6f 70 63 6f  code = aOp->opco
4f00: 64 65 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 31  de;.    pOut->p1
4f10: 20 3d 20 61 4f 70 2d 3e 70 31 3b 0a 20 20 20 20   = aOp->p1;.    
4f20: 70 4f 75 74 2d 3e 70 32 20 3d 20 61 4f 70 2d 3e  pOut->p2 = aOp->
4f30: 70 32 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  p2;.    assert( 
4f40: 61 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20  aOp->p2>=0 );.  
4f50: 20 20 69 66 28 20 28 73 71 6c 69 74 65 33 4f 70    if( (sqlite3Op
4f60: 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 61 4f 70  codeProperty[aOp
4f70: 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c  ->opcode] & OPFL
4f80: 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 61 4f  G_JUMP)!=0 && aO
4f90: 70 2d 3e 70 32 3e 30 20 29 7b 0a 20 20 20 20 20  p->p2>0 ){.     
4fa0: 20 70 4f 75 74 2d 3e 70 32 20 2b 3d 20 70 2d 3e   pOut->p2 += p->
4fb0: 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nOp;.    }.    p
4fc0: 4f 75 74 2d 3e 70 33 20 3d 20 61 4f 70 2d 3e 70  Out->p3 = aOp->p
4fd0: 33 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 74  3;.    pOut->p4t
4fe0: 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44  ype = P4_NOTUSED
4ff0: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70  ;.    pOut->p4.p
5000: 20 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e   = 0;.    pOut->
5010: 70 35 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  p5 = 0;.#ifdef S
5020: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50  QLITE_ENABLE_EXP
5030: 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20  LAIN_COMMENTS.  
5040: 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74    pOut->zComment
5050: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 0;.#endif.#if
5060: 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f  def SQLITE_VDBE_
5070: 43 4f 56 45 52 41 47 45 0a 20 20 20 20 70 4f 75  COVERAGE.    pOu
5080: 74 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c  t->iSrcLine = iL
5090: 69 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20  ineno+i;.#else. 
50a0: 20 20 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f     (void)iLineno
50b0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
50c0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
50d0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67   if( p->db->flag
50e0: 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
50f0: 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
5100: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
5110: 69 6e 74 4f 70 28 30 2c 20 69 2b 70 2d 3e 6e 4f  intOp(0, i+p->nO
5120: 70 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 70 2d 3e  p, &p->aOp[i+p->
5130: 6e 4f 70 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  nOp]);.    }.#en
5140: 64 69 66 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70  dif.  }.  p->nOp
5150: 20 2b 3d 20 6e 4f 70 3b 0a 20 20 72 65 74 75 72   += nOp;.  retur
5160: 6e 20 70 46 69 72 73 74 3b 0a 7d 0a 0a 23 69 66  n pFirst;.}..#if
5170: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
5180: 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
5190: 53 54 41 54 55 53 29 0a 2f 2a 0a 2a 2a 20 41 64  STATUS)./*.** Ad
51a0: 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68  d an entry to th
51b0: 65 20 61 72 72 61 79 20 6f 66 20 63 6f 75 6e 74  e array of count
51c0: 65 72 73 20 6d 61 6e 61 67 65 64 20 62 79 20 73  ers managed by s
51d0: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e  qlite3_stmt_scan
51e0: 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a 76 6f 69  status()..*/.voi
51f0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 63 61  d sqlite3VdbeSca
5200: 6e 53 74 61 74 75 73 28 0a 20 20 56 64 62 65 20  nStatus(.  Vdbe 
5210: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
5220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 4d             /* VM
5230: 20 74 6f 20 61 64 64 20 73 63 61 6e 73 74 61 74   to add scanstat
5240: 75 73 28 29 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  us() to */.  int
5250: 20 61 64 64 72 45 78 70 6c 61 69 6e 2c 20 20 20   addrExplain,   
5260: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5270: 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 45 78  Address of OP_Ex
5280: 70 6c 61 69 6e 20 28 6f 72 20 30 29 20 2a 2f 0a  plain (or 0) */.
5290: 20 20 69 6e 74 20 61 64 64 72 4c 6f 6f 70 2c 20    int addrLoop, 
52a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52b0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
52c0: 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 20  loop counter */ 
52d0: 0a 20 20 69 6e 74 20 61 64 64 72 56 69 73 69 74  .  int addrVisit
52e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
52f0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
5300: 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 63 6f   rows visited co
5310: 75 6e 74 65 72 20 2a 2f 0a 20 20 4c 6f 67 45 73  unter */.  LogEs
5320: 74 20 6e 45 73 74 2c 20 20 20 20 20 20 20 20 20  t nEst,         
5330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73             /* Es
5340: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
5350: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 2a 2f  f output rows */
5360: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5370: 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  Name            
5380: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61     /* Name of ta
5390: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 62 65 69  ble or index bei
53a0: 6e 67 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 29 7b  ng scanned */.){
53b0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28  .  int nByte = (
53c0: 70 2d 3e 6e 53 63 61 6e 2b 31 29 20 2a 20 73 69  p->nScan+1) * si
53d0: 7a 65 6f 66 28 53 63 61 6e 53 74 61 74 75 73 29  zeof(ScanStatus)
53e0: 3b 0a 20 20 53 63 61 6e 53 74 61 74 75 73 20 2a  ;.  ScanStatus *
53f0: 61 4e 65 77 3b 0a 20 20 61 4e 65 77 20 3d 20 28  aNew;.  aNew = (
5400: 53 63 61 6e 53 74 61 74 75 73 2a 29 73 71 6c 69  ScanStatus*)sqli
5410: 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e  te3DbRealloc(p->
5420: 64 62 2c 20 70 2d 3e 61 53 63 61 6e 2c 20 6e 42  db, p->aScan, nB
5430: 79 74 65 29 3b 0a 20 20 69 66 28 20 61 4e 65 77  yte);.  if( aNew
5440: 20 29 7b 0a 20 20 20 20 53 63 61 6e 53 74 61 74   ){.    ScanStat
5450: 75 73 20 2a 70 4e 65 77 20 3d 20 26 61 4e 65 77  us *pNew = &aNew
5460: 5b 70 2d 3e 6e 53 63 61 6e 2b 2b 5d 3b 0a 20 20  [p->nScan++];.  
5470: 20 20 70 4e 65 77 2d 3e 61 64 64 72 45 78 70 6c    pNew->addrExpl
5480: 61 69 6e 20 3d 20 61 64 64 72 45 78 70 6c 61 69  ain = addrExplai
5490: 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64  n;.    pNew->add
54a0: 72 4c 6f 6f 70 20 3d 20 61 64 64 72 4c 6f 6f 70  rLoop = addrLoop
54b0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72  ;.    pNew->addr
54c0: 56 69 73 69 74 20 3d 20 61 64 64 72 56 69 73 69  Visit = addrVisi
54d0: 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 45 73  t;.    pNew->nEs
54e0: 74 20 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 4e  t = nEst;.    pN
54f0: 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ew->zName = sqli
5500: 74 65 33 44 62 53 74 72 44 75 70 28 70 2d 3e 64  te3DbStrDup(p->d
5510: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  b, zName);.    p
5520: 2d 3e 61 53 63 61 6e 20 3d 20 61 4e 65 77 3b 0a  ->aScan = aNew;.
5530: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
5540: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
5550: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6f 70 63  value of the opc
5560: 6f 64 65 2c 20 6f 72 20 50 31 2c 20 50 32 2c 20  ode, or P1, P2, 
5570: 50 33 2c 20 6f 72 20 50 35 20 6f 70 65 72 61 6e  P3, or P5 operan
5580: 64 73 0a 2a 2a 20 66 6f 72 20 61 20 73 70 65 63  ds.** for a spec
5590: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
55a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
55b0: 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64  3VdbeChangeOpcod
55c0: 65 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61  e(Vdbe *p, u32 a
55d0: 64 64 72 2c 20 75 38 20 69 4e 65 77 4f 70 63 6f  ddr, u8 iNewOpco
55e0: 64 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  de){.  sqlite3Vd
55f0: 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d  beGetOp(p,addr)-
5600: 3e 6f 70 63 6f 64 65 20 3d 20 69 4e 65 77 4f 70  >opcode = iNewOp
5610: 63 6f 64 65 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  code;.}.void sql
5620: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
5630: 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64  (Vdbe *p, u32 ad
5640: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
5650: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
5660: 28 70 2c 61 64 64 72 29 2d 3e 70 31 20 3d 20 76  (p,addr)->p1 = v
5670: 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74  al;.}.void sqlit
5680: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 56  e3VdbeChangeP2(V
5690: 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72  dbe *p, u32 addr
56a0: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71  , int val){.  sq
56b0: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70  lite3VdbeGetOp(p
56c0: 2c 61 64 64 72 29 2d 3e 70 32 20 3d 20 76 61 6c  ,addr)->p2 = val
56d0: 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
56e0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 56 64 62  VdbeChangeP3(Vdb
56f0: 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20  e *p, u32 addr, 
5700: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69  int val){.  sqli
5710: 74 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61  te3VdbeGetOp(p,a
5720: 64 64 72 29 2d 3e 70 33 20 3d 20 76 61 6c 3b 0a  ddr)->p3 = val;.
5730: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
5740: 62 65 43 68 61 6e 67 65 50 35 28 56 64 62 65 20  beChangeP5(Vdbe 
5750: 2a 70 2c 20 75 38 20 70 35 29 7b 0a 20 20 69 66  *p, u8 p5){.  if
5760: 28 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  ( !p->db->malloc
5770: 46 61 69 6c 65 64 20 29 20 70 2d 3e 61 4f 70 5b  Failed ) p->aOp[
5780: 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20 70  p->nOp-1].p5 = p
5790: 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  5;.}../*.** Chan
57a0: 67 65 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e  ge the P2 operan
57b0: 64 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e  d of instruction
57c0: 20 61 64 64 72 20 73 6f 20 74 68 61 74 20 69 74   addr so that it
57d0: 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
57e0: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
57f0: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
5800: 6e 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a  n to be coded..*
5810: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
5820: 62 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20  beJumpHere(Vdbe 
5830: 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20  *p, int addr){. 
5840: 20 70 2d 3e 70 50 61 72 73 65 2d 3e 69 46 69 78   p->pParse->iFix
5850: 65 64 4f 70 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20  edOp = p->nOp - 
5860: 31 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  1;.  sqlite3Vdbe
5870: 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64 72  ChangeP2(p, addr
5880: 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f  , p->nOp);.}.../
5890: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75  *.** If the inpu
58a0: 74 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74  t FuncDef struct
58b0: 75 72 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c  ure is ephemeral
58c0: 2c 20 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20  , then free it. 
58d0: 20 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44   If.** the FuncD
58e0: 65 66 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d  ef is not epherm
58f0: 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68  al, then do noth
5900: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
5910: 6f 69 64 20 66 72 65 65 45 70 68 65 6d 65 72 61  oid freeEphemera
5920: 6c 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65  lFunction(sqlite
5930: 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a  3 *db, FuncDef *
5940: 70 44 65 66 29 7b 0a 20 20 69 66 28 20 41 4c 57  pDef){.  if( ALW
5950: 41 59 53 28 70 44 65 66 29 20 26 26 20 28 70 44  AYS(pDef) && (pD
5960: 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
5970: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45  SQLITE_FUNC_EPHE
5980: 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  M)!=0 ){.    sql
5990: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
59a0: 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  Def);.  }.}..sta
59b0: 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65  tic void vdbeFre
59c0: 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33  eOpArray(sqlite3
59d0: 20 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a   *, Op *, int);.
59e0: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
59f0: 50 34 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65  P4 value if nece
5a00: 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssary..*/.static
5a10: 20 76 6f 69 64 20 66 72 65 65 50 34 28 73 71 6c   void freeP4(sql
5a20: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 70 34  ite3 *db, int p4
5a30: 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b  type, void *p4){
5a40: 0a 20 20 69 66 28 20 70 34 20 29 7b 0a 20 20 20  .  if( p4 ){.   
5a50: 20 61 73 73 65 72 74 28 20 64 62 20 29 3b 0a 20   assert( db );. 
5a60: 20 20 20 73 77 69 74 63 68 28 20 70 34 74 79 70     switch( p4typ
5a70: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
5a80: 50 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20  P4_FUNCCTX: {.  
5a90: 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65        freeEpheme
5aa0: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ralFunction(db, 
5ab0: 28 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  ((sqlite3_contex
5ac0: 74 2a 29 70 34 29 2d 3e 70 46 75 6e 63 29 3b 0a  t*)p4)->pFunc);.
5ad0: 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20          /* Fall 
5ae0: 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 74 68 65  through into the
5af0: 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20   next case */.  
5b00: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
5b10: 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20 20 20   P4_REAL:.      
5b20: 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20  case P4_INT64:. 
5b30: 20 20 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e       case P4_DYN
5b40: 41 4d 49 43 3a 0a 20 20 20 20 20 20 63 61 73 65  AMIC:.      case
5b50: 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a   P4_INTARRAY: {.
5b60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
5b70: 62 46 72 65 65 28 64 62 2c 20 70 34 29 3b 0a 20  bFree(db, p4);. 
5b80: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5b90: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
5ba0: 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20   P4_KEYINFO: {. 
5bb0: 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70         if( db->p
5bc0: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29  nBytesFreed==0 )
5bd0: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
5be0: 6e 72 65 66 28 28 4b 65 79 49 6e 66 6f 2a 29 70  nref((KeyInfo*)p
5bf0: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  4);.        brea
5c00: 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65  k;.      }.#ifde
5c10: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
5c20: 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20  CURSOR_HINTS.   
5c30: 20 20 20 63 61 73 65 20 50 34 5f 45 58 50 52 3a     case P4_EXPR:
5c40: 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
5c50: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
5c60: 20 28 45 78 70 72 2a 29 70 34 29 3b 0a 20 20 20   (Expr*)p4);.   
5c70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5c80: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
5c90: 20 63 61 73 65 20 50 34 5f 4d 50 52 49 4e 54 46   case P4_MPRINTF
5ca0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
5cb0: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
5cc0: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 5f 66 72  ==0 ) sqlite3_fr
5cd0: 65 65 28 70 34 29 3b 0a 20 20 20 20 20 20 20 20  ee(p4);.        
5ce0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
5cf0: 20 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e       case P4_FUN
5d00: 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 20 20  CDEF: {.        
5d10: 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e  freeEphemeralFun
5d20: 63 74 69 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44  ction(db, (FuncD
5d30: 65 66 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20  ef*)p4);.       
5d40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
5d50: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45        case P4_ME
5d60: 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  M: {.        if(
5d70: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
5d80: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
5d90: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
5da0: 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  ee((sqlite3_valu
5db0: 65 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20  e*)p4);.        
5dc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
5dd0: 20 4d 65 6d 20 2a 70 20 3d 20 28 4d 65 6d 2a 29   Mem *p = (Mem*)
5de0: 70 34 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  p4;.          if
5df0: 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20  ( p->szMalloc ) 
5e00: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5e10: 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20  , p->zMalloc);. 
5e20: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
5e30: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20  DbFree(db, p);. 
5e40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5e50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
5e60: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 56 54        case P4_VT
5e70: 41 42 20 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  AB : {.        i
5e80: 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  f( db->pnBytesFr
5e90: 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  eed==0 ) sqlite3
5ea0: 56 74 61 62 55 6e 6c 6f 63 6b 28 28 56 54 61 62  VtabUnlock((VTab
5eb0: 6c 65 20 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  le *)p4);.      
5ec0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
5ed0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
5ee0: 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 73 70 61  .** Free the spa
5ef0: 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ce allocated for
5f00: 20 61 4f 70 20 61 6e 64 20 61 6e 79 20 70 34 20   aOp and any p4 
5f10: 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65 64  values allocated
5f20: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63 6f   for the.** opco
5f30: 64 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  des contained wi
5f40: 74 68 69 6e 2e 20 49 66 20 61 4f 70 20 69 73 20  thin. If aOp is 
5f50: 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73 20 61  not NULL it is a
5f60: 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69  ssumed to contai
5f70: 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69 65  n .** nOp entrie
5f80: 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  s. .*/.static vo
5f90: 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  id vdbeFreeOpArr
5fa0: 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ay(sqlite3 *db, 
5fb0: 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f 70  Op *aOp, int nOp
5fc0: 29 7b 0a 20 20 69 66 28 20 61 4f 70 20 29 7b 0a  ){.  if( aOp ){.
5fd0: 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20      Op *pOp;.   
5fe0: 20 66 6f 72 28 70 4f 70 3d 61 4f 70 3b 20 70 4f   for(pOp=aOp; pO
5ff0: 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20 70 4f 70  p<&aOp[nOp]; pOp
6000: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
6010: 4f 70 2d 3e 70 34 74 79 70 65 20 29 20 66 72 65  Op->p4type ) fre
6020: 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74  eP4(db, pOp->p4t
6030: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
6040: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
6050: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
6060: 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 73 71 6c  MMENTS.      sql
6070: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
6080: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23  Op->zComment);.#
6090: 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d  endif     .    }
60a0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
60b0: 46 72 65 65 28 64 62 2c 20 61 4f 70 29 3b 0a 7d  Free(db, aOp);.}
60c0: 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65  ../*.** Link the
60d0: 20 53 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a 65   SubProgram obje
60e0: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
60f0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
6100: 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
6110: 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56 64 62 65  .** list at Vdbe
6120: 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e 20 54 68  .pSubProgram. Th
6130: 69 73 20 6c 69 73 74 20 69 73 20 75 73 65 64 20  is list is used 
6140: 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73 75  to delete all su
6150: 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a  b-program.** obj
6160: 65 63 74 73 20 77 68 65 6e 20 74 68 65 20 56 4d  ects when the VM
6170: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65   is no longer re
6180: 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  quired..*/.void 
6190: 73 71 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b 53  sqlite3VdbeLinkS
61a0: 75 62 50 72 6f 67 72 61 6d 28 56 64 62 65 20 2a  ubProgram(Vdbe *
61b0: 70 56 64 62 65 2c 20 53 75 62 50 72 6f 67 72 61  pVdbe, SubProgra
61c0: 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65 78  m *p){.  p->pNex
61d0: 74 20 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f 67  t = pVdbe->pProg
61e0: 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70 50  ram;.  pVdbe->pP
61f0: 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f  rogram = p;.}../
6200: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
6210: 6f 70 63 6f 64 65 20 61 74 20 61 64 64 72 20 69  opcode at addr i
6220: 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a 69  nto OP_Noop.*/.i
6230: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  nt sqlite3VdbeCh
6240: 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20  angeToNoop(Vdbe 
6250: 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20  *p, int addr){. 
6260: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
6270: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
6280: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
6290: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64   0;.  assert( ad
62a0: 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d  dr>=0 && addr<p-
62b0: 3e 6e 4f 70 20 29 3b 0a 20 20 70 4f 70 20 3d 20  >nOp );.  pOp = 
62c0: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
62d0: 20 66 72 65 65 50 34 28 70 2d 3e 64 62 2c 20 70   freeP4(p->db, p
62e0: 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d  Op->p4type, pOp-
62f0: 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70  >p4.p);.  pOp->p
6300: 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53  4type = P4_NOTUS
6310: 45 44 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 7a 20  ED;.  pOp->p4.z 
6320: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f  = 0;.  pOp->opco
6330: 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  de = OP_Noop;.  
6340: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
6350: 2a 2a 20 49 66 20 74 68 65 20 6c 61 73 74 20 6f  ** If the last o
6360: 70 63 6f 64 65 20 69 73 20 22 6f 70 22 20 61 6e  pcode is "op" an
6370: 64 20 69 74 20 69 73 20 6e 6f 74 20 61 20 6a 75  d it is not a ju
6380: 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2c 0a  mp destination,.
6390: 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 69  ** then remove i
63a0: 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20  t.  Return true 
63b0: 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 61  if and only if a
63c0: 6e 20 6f 70 63 6f 64 65 20 77 61 73 20 72 65 6d  n opcode was rem
63d0: 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oved..*/.int sql
63e0: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 50 72  ite3VdbeDeletePr
63f0: 69 6f 72 4f 70 63 6f 64 65 28 56 64 62 65 20 2a  iorOpcode(Vdbe *
6400: 70 2c 20 75 38 20 6f 70 29 7b 0a 20 20 69 66 28  p, u8 op){.  if(
6410: 20 28 70 2d 3e 6e 4f 70 2d 31 29 3e 28 70 2d 3e   (p->nOp-1)>(p->
6420: 70 50 61 72 73 65 2d 3e 69 46 69 78 65 64 4f 70  pParse->iFixedOp
6430: 29 20 26 26 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  ) && p->aOp[p->n
6440: 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 6f 70  Op-1].opcode==op
6450: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
6460: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6470: 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70  ToNoop(p, p->nOp
6480: 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  -1);.  }else{.  
6490: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
64a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
64b0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
64c0: 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P4 operand for 
64d0: 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72  a specific instr
64e0: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
64f0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75  routine is usefu
6500: 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70  l when a large p
6510: 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64  rogram is loaded
6520: 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69   from a.** stati
6530: 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71  c array using sq
6540: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
6550: 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74  st but we want t
6560: 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20  o make a.** few 
6570: 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f  minor changes to
6580: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a   the program..**
6590: 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e  .** If n>=0 then
65a0: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
65b0: 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e  is dynamic, mean
65c0: 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79 20  ing that a copy 
65d0: 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67  of.** the string
65e0: 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65   is made into me
65f0: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
6600: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
6610: 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20  c()..** A value 
6620: 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f  of n==0 means co
6630: 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34 20  py bytes of zP4 
6640: 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64  up to and includ
6650: 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 74  ing the.** first
6660: 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 20   null byte.  If 
6670: 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b  n>0 then copy n+
6680: 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a  1 bytes of zP4..
6690: 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c  ** .** Other val
66a0: 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54 41  ues of n (P4_STA
66b0: 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20  TIC, P4_COLLSEQ 
66c0: 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20 74  etc.) indicate t
66d0: 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a  hat zP4 points.*
66e0: 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f 72  * to a string or
66f0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
6700: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
6710: 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20 6c   exist for the l
6720: 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68  ifetime of.** th
6730: 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73 65  e Vdbe. In these
6740: 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a 75   cases we can ju
6750: 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e  st copy the poin
6760: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64  ter..**.** If ad
6770: 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67 65  dr<0 then change
6780: 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20   P4 on the most 
6790: 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65  recently inserte
67a0: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  d instruction..*
67b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 51  /.static void SQ
67c0: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 64  LITE_NOINLINE vd
67d0: 62 65 43 68 61 6e 67 65 50 34 46 75 6c 6c 28 0a  beChangeP4Full(.
67e0: 20 20 56 64 62 65 20 2a 70 2c 0a 20 20 4f 70 20    Vdbe *p,.  Op 
67f0: 2a 70 4f 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68  *pOp,.  const ch
6800: 61 72 20 2a 7a 50 34 2c 0a 20 20 69 6e 74 20 6e  ar *zP4,.  int n
6810: 0a 29 7b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70  .){.  if( pOp->p
6820: 34 74 79 70 65 20 29 7b 0a 20 20 20 20 66 72 65  4type ){.    fre
6830: 65 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e  eP4(p->db, pOp->
6840: 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e  p4type, pOp->p4.
6850: 70 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  p);.    pOp->p4t
6860: 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70  ype = 0;.    pOp
6870: 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 7d 0a  ->p4.p = 0;.  }.
6880: 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20    if( n<0 ){.   
6890: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
68a0: 67 65 50 34 28 70 2c 20 28 69 6e 74 29 28 70 4f  geP4(p, (int)(pO
68b0: 70 20 2d 20 70 2d 3e 61 4f 70 29 2c 20 7a 50 34  p - p->aOp), zP4
68c0: 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , n);.  }else{. 
68d0: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20     if( n==0 ) n 
68e0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
68f0: 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d  0(zP4);.    pOp-
6900: 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44  >p4.z = sqlite3D
6910: 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20  bStrNDup(p->db, 
6920: 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70  zP4, n);.    pOp
6930: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59  ->p4type = P4_DY
6940: 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  NAMIC;.  }.}.voi
6950: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
6960: 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69  ngeP4(Vdbe *p, i
6970: 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63  nt addr, const c
6980: 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29  har *zP4, int n)
6990: 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73  {.  Op *pOp;.  s
69a0: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73  qlite3 *db;.  as
69b0: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
69c0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
69d0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
69e0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
69f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
6a00: 61 4f 70 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  aOp!=0 || db->ma
6a10: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
6a20: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
6a30: 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 28 20  iled ){.    if( 
6a40: 6e 21 3d 50 34 5f 56 54 41 42 20 29 20 66 72 65  n!=P4_VTAB ) fre
6a50: 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64  eP4(db, n, (void
6a60: 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 29  *)*(char**)&zP4)
6a70: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
6a80: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  }.  assert( p->n
6a90: 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  Op>0 );.  assert
6aa0: 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b  ( addr<p->nOp );
6ab0: 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b  .  if( addr<0 ){
6ac0: 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e  .    addr = p->n
6ad0: 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f  Op - 1;.  }.  pO
6ae0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  p = &p->aOp[addr
6af0: 5d 3b 0a 20 20 69 66 28 20 6e 3e 3d 30 20 7c 7c  ];.  if( n>=0 ||
6b00: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a   pOp->p4type ){.
6b10: 20 20 20 20 76 64 62 65 43 68 61 6e 67 65 50 34      vdbeChangeP4
6b20: 46 75 6c 6c 28 70 2c 20 70 4f 70 2c 20 7a 50 34  Full(p, pOp, zP4
6b30: 2c 20 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , n);.    return
6b40: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 50  ;.  }.  if( n==P
6b50: 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f  4_INT32 ){.    /
6b60: 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 73  * Note: this cas
6b70: 74 20 69 73 20 73 61 66 65 2c 20 62 65 63 61 75  t is safe, becau
6b80: 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64 61  se the origin da
6b90: 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e 20  ta point was an 
6ba0: 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  int.    ** that 
6bb0: 77 61 73 20 63 61 73 74 20 74 6f 20 61 20 28 63  was cast to a (c
6bc0: 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f  onst char *). */
6bd0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d  .    pOp->p4.i =
6be0: 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49   SQLITE_PTR_TO_I
6bf0: 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70  NT(zP4);.    pOp
6c00: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49 4e  ->p4type = P4_IN
6c10: 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  T32;.  }else if(
6c20: 20 7a 50 34 21 3d 30 20 29 7b 0a 20 20 20 20 61   zP4!=0 ){.    a
6c30: 73 73 65 72 74 28 20 6e 3c 30 20 29 3b 0a 20 20  ssert( n<0 );.  
6c40: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76    pOp->p4.p = (v
6c50: 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f  oid*)zP4;.    pO
6c60: 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69 67  p->p4type = (sig
6c70: 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 20 20  ned char)n;.    
6c80: 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29  if( n==P4_VTAB )
6c90: 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b   sqlite3VtabLock
6ca0: 28 28 56 54 61 62 6c 65 2a 29 7a 50 34 29 3b 0a  ((VTable*)zP4);.
6cb0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
6cc0: 20 74 68 65 20 50 34 20 6f 6e 20 74 68 65 20 6d   the P4 on the m
6cd0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
6ce0: 65 64 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 65  ed opcode to the
6cf0: 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74 68 65   KeyInfo for the
6d00: 0a 2a 2a 20 69 6e 64 65 78 20 67 69 76 65 6e 2e  .** index given.
6d10: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6d20: 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
6d30: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
6d40: 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
6d50: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
6d60: 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
6d70: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( v!=0 );.  ass
6d80: 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a  ert( pIdx!=0 );.
6d90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
6da0: 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68  ngeP4(v, -1, (ch
6db0: 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e  ar*)sqlite3KeyIn
6dc0: 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65  foOfIndex(pParse
6dd0: 2c 20 70 49 64 78 29 2c 0a 20 20 20 20 20 20 20  , pIdx),.       
6de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
6df0: 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 7d 0a 0a 23  4_KEYINFO);.}..#
6e00: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
6e10: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
6e20: 45 4e 54 53 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ENTS./*.** Chang
6e30: 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e  e the comment on
6e40: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
6e50: 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63  ly coded instruc
6e60: 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73  tion.  Or.** ins
6e70: 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20  ert a No-op and 
6e80: 61 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  add the comment 
6e90: 74 6f 20 74 68 61 74 20 6e 65 77 20 69 6e 73 74  to that new inst
6ea0: 72 75 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a  ruction.  This.*
6eb0: 2a 20 6d 61 6b 65 73 20 74 68 65 20 63 6f 64 65  * makes the code
6ec0: 20 65 61 73 69 65 72 20 74 6f 20 72 65 61 64 20   easier to read 
6ed0: 64 75 72 69 6e 67 20 64 65 62 75 67 67 69 6e 67  during debugging
6ee0: 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20  .  None of this 
6ef0: 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20  happens.** in a 
6f00: 70 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64  production build
6f10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6f20: 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 56 64   vdbeVComment(Vd
6f30: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
6f40: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c  r *zFormat, va_l
6f50: 69 73 74 20 61 70 29 7b 0a 20 20 61 73 73 65 72  ist ap){.  asser
6f60: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70  t( p->nOp>0 || p
6f70: 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73  ->aOp==0 );.  as
6f80: 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20  sert( p->aOp==0 
6f90: 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  || p->aOp[p->nOp
6fa0: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20  -1].zComment==0 
6fb0: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
6fc0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
6fd0: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61 73  p->nOp ){.    as
6fe0: 73 65 72 74 28 20 70 2d 3e 61 4f 70 20 29 3b 0a  sert( p->aOp );.
6ff0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
7000: 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b  e(p->db, p->aOp[
7010: 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65  p->nOp-1].zComme
7020: 6e 74 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  nt);.    p->aOp[
7030: 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65  p->nOp-1].zComme
7040: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  nt = sqlite3VMPr
7050: 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72  intf(p->db, zFor
7060: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a  mat, ap);.  }.}.
7070: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
7080: 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  Comment(Vdbe *p,
7090: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
70a0: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
70b0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20  _list ap;.  if( 
70c0: 70 20 29 7b 0a 20 20 20 20 76 61 5f 73 74 61 72  p ){.    va_star
70d0: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
70e0: 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74      vdbeVComment
70f0: 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  (p, zFormat, ap)
7100: 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29  ;.    va_end(ap)
7110: 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  ;.  }.}.void sql
7120: 69 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  ite3VdbeNoopComm
7130: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
7140: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
7150: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
7160: 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b  t ap;.  if( p ){
7170: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7180: 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f  AddOp0(p, OP_Noo
7190: 70 29 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74  p);.    va_start
71a0: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
71b0: 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28     vdbeVComment(
71c0: 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  p, zFormat, ap);
71d0: 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  .    va_end(ap);
71e0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f  .  }.}.#endif  /
71f0: 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  * NDEBUG */..#if
7200: 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f  def SQLITE_VDBE_
7210: 43 4f 56 45 52 41 47 45 0a 2f 2a 0a 2a 2a 20 53  COVERAGE./*.** S
7220: 65 74 20 74 68 65 20 76 61 6c 75 65 20 69 66 20  et the value if 
7230: 74 68 65 20 69 53 72 63 4c 69 6e 65 20 66 69 65  the iSrcLine fie
7240: 6c 64 20 66 6f 72 20 74 68 65 20 70 72 65 76 69  ld for the previ
7250: 6f 75 73 6c 79 20 63 6f 64 65 64 20 69 6e 73 74  ously coded inst
7260: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
7270: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4c   sqlite3VdbeSetL
7280: 69 6e 65 4e 75 6d 62 65 72 28 56 64 62 65 20 2a  ineNumber(Vdbe *
7290: 76 2c 20 69 6e 74 20 69 4c 69 6e 65 29 7b 0a 20  v, int iLine){. 
72a0: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
72b0: 70 28 76 2c 2d 31 29 2d 3e 69 53 72 63 4c 69 6e  p(v,-1)->iSrcLin
72c0: 65 20 3d 20 69 4c 69 6e 65 3b 0a 7d 0a 23 65 6e  e = iLine;.}.#en
72d0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 56 44  dif /* SQLITE_VD
72e0: 42 45 5f 43 4f 56 45 52 41 47 45 20 2a 2f 0a 0a  BE_COVERAGE */..
72f0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
7300: 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69   opcode for a gi
7310: 76 65 6e 20 61 64 64 72 65 73 73 2e 20 20 49 66  ven address.  If
7320: 20 74 68 65 20 61 64 64 72 65 73 73 20 69 73 20   the address is 
7330: 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75  -1, then.** retu
7340: 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  rn the most rece
7350: 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 6f 70  ntly inserted op
7360: 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  code..**.** If a
7370: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
7380: 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  on error has occ
7390: 75 72 72 65 64 20 70 72 69 6f 72 20 74 6f 20 74  urred prior to t
73a0: 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68  he calling of th
73b0: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74  is.** routine, t
73c0: 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  hen a pointer to
73d0: 20 61 20 64 75 6d 6d 79 20 56 64 62 65 4f 70 20   a dummy VdbeOp 
73e0: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
73f0: 2e 20 20 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a  .  That opcode.*
7400: 2a 20 69 73 20 72 65 61 64 61 62 6c 65 20 62 75  * is readable bu
7410: 74 20 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c 20  t not writable, 
7420: 74 68 6f 75 67 68 20 69 74 20 69 73 20 63 61 73  though it is cas
7430: 74 20 74 6f 20 61 20 77 72 69 74 61 62 6c 65 20  t to a writable 
7440: 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65  value..** The re
7450: 74 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20  turn of a dummy 
7460: 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68  opcode allows th
7470: 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e  e call to contin
7480: 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a  ue functioning.*
7490: 2a 20 61 66 74 65 72 20 61 6e 20 4f 4f 4d 20 66  * after an OOM f
74a0: 61 75 6c 74 20 77 69 74 68 6f 75 74 20 68 61 76  ault without hav
74b0: 69 6e 67 20 74 6f 20 63 68 65 63 6b 20 74 6f 20  ing to check to 
74c0: 73 65 65 20 69 66 20 74 68 65 20 72 65 74 75 72  see if the retur
74d0: 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20  n from .** this 
74e0: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76 61 6c  routine is a val
74f0: 69 64 20 70 6f 69 6e 74 65 72 2e 20 20 42 75 74  id pointer.  But
7500: 20 62 65 63 61 75 73 65 20 74 68 65 20 64 75 6d   because the dum
7510: 6d 79 2e 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a  my.opcode is 0,.
7520: 2a 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65  ** dummy will ne
7530: 76 65 72 20 62 65 20 77 72 69 74 74 65 6e 20 74  ver be written t
7540: 6f 2e 20 20 54 68 69 73 20 69 73 20 76 65 72 69  o.  This is veri
7550: 66 69 65 64 20 62 79 20 63 6f 64 65 20 69 6e 73  fied by code ins
7560: 70 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62  pection and.** b
7570: 79 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 56  y running with V
7580: 61 6c 67 72 69 6e 64 2e 0a 2a 2f 0a 56 64 62 65  algrind..*/.Vdbe
7590: 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47  Op *sqlite3VdbeG
75a0: 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  etOp(Vdbe *p, in
75b0: 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38  t addr){.  /* C8
75c0: 39 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74  9 specifies that
75d0: 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 22 64   the constant "d
75e0: 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65 20 69 6e  ummy" will be in
75f0: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c  itialized to all
7600: 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69  .  ** zeros, whi
7610: 63 68 20 69 73 20 63 6f 72 72 65 63 74 2e 20 20  ch is correct.  
7620: 4d 53 56 43 20 67 65 6e 65 72 61 74 65 73 20 61  MSVC generates a
7630: 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74   warning, nevert
7640: 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61  heless. */.  sta
7650: 74 69 63 20 56 64 62 65 4f 70 20 64 75 6d 6d 79  tic VdbeOp dummy
7660: 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65  ;  /* Ignore the
7670: 20 4d 53 56 43 20 77 61 72 6e 69 6e 67 20 61 62   MSVC warning ab
7680: 6f 75 74 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a  out no initializ
7690: 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  er */.  assert( 
76a0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
76b0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
76c0: 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20  f( addr<0 ){.   
76d0: 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d   addr = p->nOp -
76e0: 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   1;.  }.  assert
76f0: 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64  ( (addr>=0 && ad
7700: 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d  dr<p->nOp) || p-
7710: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
7720: 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  d );.  if( p->db
7730: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7740: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 56 64  {.    return (Vd
7750: 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20  beOp*)&dummy;.  
7760: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
7770: 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  n &p->aOp[addr];
7780: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69  .  }.}..#if defi
7790: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
77a0: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
77b0: 54 53 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  TS)./*.** Return
77c0: 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75   an integer valu
77d0: 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  e for one of the
77e0: 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74   parameters to t
77f0: 68 65 20 6f 70 63 6f 64 65 20 70 4f 70 0a 2a 2a  he opcode pOp.**
7800: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 63   determined by c
7810: 68 61 72 61 63 74 65 72 20 63 2e 0a 2a 2f 0a 73  haracter c..*/.s
7820: 74 61 74 69 63 20 69 6e 74 20 74 72 61 6e 73 6c  tatic int transl
7830: 61 74 65 50 28 63 68 61 72 20 63 2c 20 63 6f 6e  ateP(char c, con
7840: 73 74 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 69  st Op *pOp){.  i
7850: 66 28 20 63 3d 3d 27 31 27 20 29 20 72 65 74 75  f( c=='1' ) retu
7860: 72 6e 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 66  rn pOp->p1;.  if
7870: 28 20 63 3d 3d 27 32 27 20 29 20 72 65 74 75 72  ( c=='2' ) retur
7880: 6e 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69 66 28  n pOp->p2;.  if(
7890: 20 63 3d 3d 27 33 27 20 29 20 72 65 74 75 72 6e   c=='3' ) return
78a0: 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20   pOp->p3;.  if( 
78b0: 63 3d 3d 27 34 27 20 29 20 72 65 74 75 72 6e 20  c=='4' ) return 
78c0: 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 72 65 74  pOp->p4.i;.  ret
78d0: 75 72 6e 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a  urn pOp->p5;.}..
78e0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
78f0: 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20 22  string for the "
7900: 63 6f 6d 6d 65 6e 74 22 20 66 69 65 6c 64 20 6f  comment" field o
7910: 66 20 61 20 56 44 42 45 20 6f 70 63 6f 64 65 20  f a VDBE opcode 
7920: 6c 69 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  listing..**.** T
7930: 68 65 20 53 79 6e 6f 70 73 69 73 3a 20 66 69 65  he Synopsis: fie
7940: 6c 64 20 69 6e 20 63 6f 6d 6d 65 6e 74 73 20 69  ld in comments i
7950: 6e 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75  n the vdbe.c sou
7960: 72 63 65 20 66 69 6c 65 20 67 65 74 73 20 63 6f  rce file gets co
7970: 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 61 6e  nverted.** to an
7980: 20 65 78 74 72 61 20 73 74 72 69 6e 67 20 74 68   extra string th
7990: 61 74 20 69 73 20 61 70 70 65 6e 64 65 64 20 74  at is appended t
79a0: 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4f 70 63  o the sqlite3Opc
79b0: 6f 64 65 4e 61 6d 65 28 29 2e 20 20 49 6e 20 74  odeName().  In t
79c0: 68 65 0a 2a 2a 20 61 62 73 65 6e 63 65 20 6f 66  he.** absence of
79d0: 20 6f 74 68 65 72 20 63 6f 6d 6d 65 6e 74 73 2c   other comments,
79e0: 20 74 68 69 73 20 73 79 6e 6f 70 73 69 73 20 62   this synopsis b
79f0: 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6d 6d 65  ecomes the comme
7a00: 6e 74 20 6f 6e 20 74 68 65 20 6f 70 63 6f 64 65  nt on the opcode
7a10: 2e 0a 2a 2a 20 53 6f 6d 65 20 74 72 61 6e 73 6c  ..** Some transl
7a20: 61 74 69 6f 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a  ation occurs:.**
7a30: 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 22 20 20  .**       "PX"  
7a40: 20 20 20 20 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a      ->  "r[X]".*
7a50: 2a 20 20 20 20 20 20 20 22 50 58 40 50 59 22 20  *       "PX@PY" 
7a60: 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 2d    ->  "r[X..X+Y-
7a70: 31 5d 22 20 20 6f 72 20 22 72 5b 78 5d 22 20 69  1]"  or "r[x]" i
7a80: 66 20 79 20 69 73 20 30 20 6f 72 20 31 0a 2a 2a  f y is 0 or 1.**
7a90: 20 20 20 20 20 20 20 22 50 58 40 50 59 2b 31 22         "PX@PY+1"
7aa0: 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 5d 22   ->  "r[X..X+Y]"
7ab0: 20 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66      or "r[x]" if
7ac0: 20 79 20 69 73 20 30 0a 2a 2a 20 20 20 20 20 20   y is 0.**      
7ad0: 20 22 50 59 2e 2e 50 59 22 20 20 2d 3e 20 20 22   "PY..PY"  ->  "
7ae0: 72 5b 58 2e 2e 59 5d 22 20 20 20 20 20 20 6f 72  r[X..Y]"      or
7af0: 20 22 72 5b 78 5d 22 20 69 66 20 79 3c 3d 78 0a   "r[x]" if y<=x.
7b00: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69  */.static int di
7b10: 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 0a 20 20  splayComment(.  
7b20: 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 2c 20 20  const Op *pOp,  
7b30: 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65     /* The opcode
7b40: 20 74 6f 20 62 65 20 63 6f 6d 6d 65 6e 74 65 64   to be commented
7b50: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
7b60: 20 2a 7a 50 34 2c 20 20 20 2f 2a 20 50 72 65 76   *zP4,   /* Prev
7b70: 69 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65 64 20  iously obtained 
7b80: 76 61 6c 75 65 20 66 6f 72 20 50 34 20 2a 2f 0a  value for P4 */.
7b90: 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 20    char *zTemp,  
7ba0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65       /* Write re
7bb0: 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 20 20 69  sult here */.  i
7bc0: 6e 74 20 6e 54 65 6d 70 20 20 20 20 20 20 20 20  nt nTemp        
7bd0: 20 20 2f 2a 20 53 70 61 63 65 20 61 76 61 69 6c    /* Space avail
7be0: 61 62 6c 65 20 69 6e 20 7a 54 65 6d 70 5b 5d 20  able in zTemp[] 
7bf0: 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
7c00: 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63  ar *zOpName;.  c
7c10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6e 6f  onst char *zSyno
7c20: 70 73 69 73 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e  psis;.  int nOpN
7c30: 61 6d 65 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a  ame;.  int ii, j
7c40: 6a 3b 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 73  j;.  zOpName = s
7c50: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
7c60: 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20  (pOp->opcode);. 
7c70: 20 6e 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74   nOpName = sqlit
7c80: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 4e 61  e3Strlen30(zOpNa
7c90: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4f 70 4e 61  me);.  if( zOpNa
7ca0: 6d 65 5b 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29 7b  me[nOpName+1] ){
7cb0: 0a 20 20 20 20 69 6e 74 20 73 65 65 6e 43 6f 6d  .    int seenCom
7cc0: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 63   = 0;.    char c
7cd0: 3b 0a 20 20 20 20 7a 53 79 6e 6f 70 73 69 73 20  ;.    zSynopsis 
7ce0: 3d 20 7a 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f 70  = zOpName += nOp
7cf0: 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 20 20 66 6f  Name + 1;.    fo
7d00: 72 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54  r(ii=jj=0; jj<nT
7d10: 65 6d 70 2d 31 20 26 26 20 28 63 20 3d 20 7a 53  emp-1 && (c = zS
7d20: 79 6e 6f 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b  ynopsis[ii])!=0;
7d30: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66   ii++){.      if
7d40: 28 20 63 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20  ( c=='P' ){.    
7d50: 20 20 20 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69      c = zSynopsi
7d60: 73 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20  s[++ii];.       
7d70: 20 69 66 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20   if( c=='4' ){. 
7d80: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7d90: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d  _snprintf(nTemp-
7da0: 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25  jj, zTemp+jj, "%
7db0: 73 22 2c 20 7a 50 34 29 3b 0a 20 20 20 20 20 20  s", zP4);.      
7dc0: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
7dd0: 58 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  X' ){.          
7de0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
7df0: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70  (nTemp-jj, zTemp
7e00: 2b 6a 6a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e  +jj, "%s", pOp->
7e10: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20  zComment);.     
7e20: 20 20 20 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31       seenCom = 1
7e30: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
7e40: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76  .          int v
7e50: 31 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 63  1 = translateP(c
7e60: 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20  , pOp);.        
7e70: 20 20 69 6e 74 20 76 32 3b 0a 20 20 20 20 20 20    int v2;.      
7e80: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7e90: 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a  intf(nTemp-jj, z
7ea0: 54 65 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76  Temp+jj, "%d", v
7eb0: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  1);.          if
7ec0: 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70  ( strncmp(zSynop
7ed0: 73 69 73 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20  sis+ii+1, "@P", 
7ee0: 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  2)==0 ){.       
7ef0: 20 20 20 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20       ii += 3;.  
7f00: 20 20 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20            jj += 
7f10: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
7f20: 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20  zTemp+jj);.     
7f30: 20 20 20 20 20 20 20 76 32 20 3d 20 74 72 61 6e         v2 = tran
7f40: 73 6c 61 74 65 50 28 7a 53 79 6e 6f 70 73 69 73  slateP(zSynopsis
7f50: 5b 69 69 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20  [ii], pOp);.    
7f60: 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 6e          if( strn
7f70: 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69  cmp(zSynopsis+ii
7f80: 2b 31 2c 22 2b 31 22 2c 32 29 3d 3d 30 20 29 7b  +1,"+1",2)==0 ){
7f90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
7fa0: 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  i += 2;.        
7fb0: 20 20 20 20 20 20 76 32 2b 2b 3b 0a 20 20 20 20        v2++;.    
7fc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7fd0: 20 20 20 20 20 20 69 66 28 20 76 32 3e 31 20 29        if( v2>1 )
7fe0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
7ff0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
8000: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70  (nTemp-jj, zTemp
8010: 2b 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20 76 31 2b  +jj, "..%d", v1+
8020: 76 32 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20  v2-1);.         
8030: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
8040: 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70  else if( strncmp
8050: 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c  (zSynopsis+ii+1,
8060: 20 22 2e 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26   "..P3", 4)==0 &
8070: 26 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a  & pOp->p3==0 ){.
8080: 20 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b              ii +
8090: 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 4;.          }
80a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
80b0: 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33     jj += sqlite3
80c0: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a  Strlen30(zTemp+j
80d0: 6a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  j);.      }else{
80e0: 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a  .        zTemp[j
80f0: 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20  j++] = c;.      
8100: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
8110: 21 73 65 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e  !seenCom && jj<n
8120: 54 65 6d 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a  Temp-5 && pOp->z
8130: 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20  Comment ){.     
8140: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
8150: 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d  f(nTemp-jj, zTem
8160: 70 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f  p+jj, "; %s", pO
8170: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20  p->zComment);.  
8180: 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65      jj += sqlite
8190: 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b  3Strlen30(zTemp+
81a0: 6a 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  jj);.    }.    i
81b0: 66 28 20 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54  f( jj<nTemp ) zT
81c0: 65 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d  emp[jj] = 0;.  }
81d0: 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43  else if( pOp->zC
81e0: 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71  omment ){.    sq
81f0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
8200: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73  Temp, zTemp, "%s
8210: 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  ", pOp->zComment
8220: 29 3b 0a 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69  );.    jj = sqli
8230: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d  te3Strlen30(zTem
8240: 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p);.  }else{.   
8250: 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20   zTemp[0] = 0;. 
8260: 20 20 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20     jj = 0;.  }. 
8270: 20 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65   return jj;.}.#e
8280: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
8290: 45 42 55 47 20 2a 2f 0a 0a 23 69 66 20 56 44 42  EBUG */..#if VDB
82a0: 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 26 26 20  E_DISPLAY_P4 && 
82b0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
82c0: 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e  NABLE_CURSOR_HIN
82d0: 54 53 29 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c  TS)./*.** Transl
82e0: 61 74 65 20 74 68 65 20 50 34 2e 70 45 78 70 72  ate the P4.pExpr
82f0: 20 76 61 6c 75 65 20 66 6f 72 20 61 6e 20 4f 50   value for an OP
8300: 5f 43 75 72 73 6f 72 48 69 6e 74 20 6f 70 63 6f  _CursorHint opco
8310: 64 65 20 69 6e 74 6f 20 74 65 78 74 0a 2a 2a 20  de into text.** 
8320: 74 68 61 74 20 63 61 6e 20 62 65 20 64 69 73 70  that can be disp
8330: 6c 61 79 65 64 20 69 6e 20 74 68 65 20 50 34 20  layed in the P4 
8340: 63 6f 6c 75 6d 6e 20 6f 66 20 45 58 50 4c 41 49  column of EXPLAI
8350: 4e 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73 74 61  N output..*/.sta
8360: 74 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79  tic void display
8370: 50 34 45 78 70 72 28 53 74 72 41 63 63 75 6d 20  P4Expr(StrAccum 
8380: 2a 70 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  *p, Expr *pExpr)
8390: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
83a0: 7a 4f 70 20 3d 20 30 3b 0a 20 20 73 77 69 74 63  zOp = 0;.  switc
83b0: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
83c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
83d0: 4e 47 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  NG:.      sqlite
83e0: 33 58 50 72 69 6e 74 66 28 70 2c 20 22 25 51 22  3XPrintf(p, "%Q"
83f0: 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
8400: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
8410: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
8420: 45 47 45 52 3a 0a 20 20 20 20 20 20 73 71 6c 69  EGER:.      sqli
8430: 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22 25  te3XPrintf(p, "%
8440: 64 22 2c 20 70 45 78 70 72 2d 3e 75 2e 69 56 61  d", pExpr->u.iVa
8450: 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  lue);.      brea
8460: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  k;.    case TK_N
8470: 55 4c 4c 3a 0a 20 20 20 20 20 20 73 71 6c 69 74  ULL:.      sqlit
8480: 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22 4e 55  e3XPrintf(p, "NU
8490: 4c 4c 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  LL");.      brea
84a0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  k;.    case TK_R
84b0: 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20  EGISTER: {.     
84c0: 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
84d0: 70 2c 20 22 72 5b 25 64 5d 22 2c 20 70 45 78 70  p, "r[%d]", pExp
84e0: 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  r->iTable);.    
84f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
8500: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
8510: 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  N: {.      if( p
8520: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
8530: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8540: 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22 72 6f  e3XPrintf(p, "ro
8550: 77 69 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c  wid");.      }el
8560: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
8570: 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22 63  te3XPrintf(p, "c
8580: 25 64 22 2c 20 28 69 6e 74 29 70 45 78 70 72 2d  %d", (int)pExpr-
8590: 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  >iColumn);.     
85a0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
85b0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
85c0: 4b 5f 4c 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_LT:      zOp =
85d0: 20 22 4c 54 22 3b 20 20 20 20 20 20 62 72 65 61   "LT";      brea
85e0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  k;.    case TK_L
85f0: 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c  E:      zOp = "L
8600: 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  E";      break;.
8610: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20      case TK_GT: 
8620: 20 20 20 20 20 7a 4f 70 20 3d 20 22 47 54 22 3b       zOp = "GT";
8630: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8640: 20 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20   case TK_GE:    
8650: 20 20 7a 4f 70 20 3d 20 22 47 45 22 3b 20 20 20    zOp = "GE";   
8660: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8670: 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 7a  se TK_NE:      z
8680: 4f 70 20 3d 20 22 4e 45 22 3b 20 20 20 20 20 20  Op = "NE";      
8690: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
86a0: 54 4b 5f 45 51 3a 20 20 20 20 20 20 7a 4f 70 20  TK_EQ:      zOp 
86b0: 3d 20 22 45 51 22 3b 20 20 20 20 20 20 62 72 65  = "EQ";      bre
86c0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
86d0: 49 53 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22  IS:      zOp = "
86e0: 49 53 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  IS";      break;
86f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
8700: 4f 54 3a 20 20 20 7a 4f 70 20 3d 20 22 49 53 4e  OT:   zOp = "ISN
8710: 4f 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  OT";   break;.  
8720: 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 20    case TK_AND:  
8730: 20 20 20 7a 4f 70 20 3d 20 22 41 4e 44 22 3b 20     zOp = "AND"; 
8740: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
8750: 61 73 65 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20  ase TK_OR:      
8760: 7a 4f 70 20 3d 20 22 4f 52 22 3b 20 20 20 20 20  zOp = "OR";     
8770: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8780: 20 54 4b 5f 50 4c 55 53 3a 20 20 20 20 7a 4f 70   TK_PLUS:    zOp
8790: 20 3d 20 22 41 44 44 22 3b 20 20 20 20 20 62 72   = "ADD";     br
87a0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
87b0: 5f 53 54 41 52 3a 20 20 20 20 7a 4f 70 20 3d 20  _STAR:    zOp = 
87c0: 22 4d 55 4c 22 3b 20 20 20 20 20 62 72 65 61 6b  "MUL";     break
87d0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49  ;.    case TK_MI
87e0: 4e 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22 53 55  NUS:   zOp = "SU
87f0: 42 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  B";     break;. 
8800: 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 20     case TK_REM: 
8810: 20 20 20 20 7a 4f 70 20 3d 20 22 52 45 4d 22 3b      zOp = "REM";
8820: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8830: 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20  case TK_BITAND: 
8840: 20 7a 4f 70 20 3d 20 22 42 49 54 41 4e 44 22 3b   zOp = "BITAND";
8850: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8860: 65 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20 7a 4f  e TK_BITOR:   zO
8870: 70 20 3d 20 22 42 49 54 4f 52 22 3b 20 20 20 62  p = "BITOR";   b
8880: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8890: 4b 5f 53 4c 41 53 48 3a 20 20 20 7a 4f 70 20 3d  K_SLASH:   zOp =
88a0: 20 22 44 49 56 22 3b 20 20 20 20 20 62 72 65 61   "DIV";     brea
88b0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  k;.    case TK_L
88c0: 53 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20 22 4c  SHIFT:  zOp = "L
88d0: 53 48 49 46 54 22 3b 20 20 62 72 65 61 6b 3b 0a  SHIFT";  break;.
88e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49      case TK_RSHI
88f0: 46 54 3a 20 20 7a 4f 70 20 3d 20 22 52 53 48 49  FT:  zOp = "RSHI
8900: 46 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  FT";  break;.   
8910: 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a   case TK_CONCAT:
8920: 20 20 7a 4f 70 20 3d 20 22 43 4f 4e 43 41 54 22    zOp = "CONCAT"
8930: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
8940: 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a  se TK_UMINUS:  z
8950: 4f 70 20 3d 20 22 4d 49 4e 55 53 22 3b 20 20 20  Op = "MINUS";   
8960: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8970: 54 4b 5f 55 50 4c 55 53 3a 20 20 20 7a 4f 70 20  TK_UPLUS:   zOp 
8980: 3d 20 22 50 4c 55 53 22 3b 20 20 20 20 62 72 65  = "PLUS";    bre
8990: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
89a0: 42 49 54 4e 4f 54 3a 20 20 7a 4f 70 20 3d 20 22  BITNOT:  zOp = "
89b0: 42 49 54 4e 4f 54 22 3b 20 20 62 72 65 61 6b 3b  BITNOT";  break;
89c0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
89d0: 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 4e 4f 54  :     zOp = "NOT
89e0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
89f0: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
8a00: 3a 20 20 7a 4f 70 20 3d 20 22 49 53 4e 55 4c 4c  :  zOp = "ISNULL
8a10: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";  break;.    c
8a20: 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
8a30: 7a 4f 70 20 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b  zOp = "NOTNULL";
8a40: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66   break;..    def
8a50: 61 75 6c 74 3a 0a 20 20 20 20 20 20 73 71 6c 69  ault:.      sqli
8a60: 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22 25  te3XPrintf(p, "%
8a70: 73 22 2c 20 22 65 78 70 72 22 29 3b 0a 20 20 20  s", "expr");.   
8a80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
8a90: 20 69 66 28 20 7a 4f 70 20 29 7b 0a 20 20 20 20   if( zOp ){.    
8aa0: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70  sqlite3XPrintf(p
8ab0: 2c 20 22 25 73 28 22 2c 20 7a 4f 70 29 3b 0a 20  , "%s(", zOp);. 
8ac0: 20 20 20 64 69 73 70 6c 61 79 50 34 45 78 70 72     displayP4Expr
8ad0: 28 70 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  (p, pExpr->pLeft
8ae0: 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  );.    if( pExpr
8af0: 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ->pRight ){.    
8b00: 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
8b10: 6d 41 70 70 65 6e 64 28 70 2c 20 22 2c 22 2c 20  mAppend(p, ",", 
8b20: 31 29 3b 0a 20 20 20 20 20 20 64 69 73 70 6c 61  1);.      displa
8b30: 79 50 34 45 78 70 72 28 70 2c 20 70 45 78 70 72  yP4Expr(p, pExpr
8b40: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  ->pRight);.    }
8b50: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41  .    sqlite3StrA
8b60: 63 63 75 6d 41 70 70 65 6e 64 28 70 2c 20 22 29  ccumAppend(p, ")
8b70: 22 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ", 1);.  }.}.#en
8b80: 64 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53 50  dif /* VDBE_DISP
8b90: 4c 41 59 5f 50 34 20 26 26 20 64 65 66 69 6e 65  LAY_P4 && define
8ba0: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
8bb0: 43 55 52 53 4f 52 5f 48 49 4e 54 53 29 20 2a 2f  CURSOR_HINTS) */
8bc0: 0a 0a 0a 23 69 66 20 56 44 42 45 5f 44 49 53 50  ...#if VDBE_DISP
8bd0: 4c 41 59 5f 50 34 0a 2f 2a 0a 2a 2a 20 43 6f 6d  LAY_P4./*.** Com
8be0: 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 74 68  pute a string th
8bf0: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
8c00: 20 50 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f   P4 parameter fo
8c10: 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20  r an opcode..** 
8c20: 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e  Use zTemp for an
8c30: 79 20 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f  y required tempo
8c40: 72 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63  rary buffer spac
8c50: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  e..*/.static cha
8c60: 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20  r *displayP4(Op 
8c70: 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d  *pOp, char *zTem
8c80: 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20  p, int nTemp){. 
8c90: 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65   char *zP4 = zTe
8ca0: 6d 70 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 78  mp;.  StrAccum x
8cb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d  ;.  assert( nTem
8cc0: 70 3e 3d 32 30 20 29 3b 0a 20 20 73 71 6c 69 74  p>=20 );.  sqlit
8cd0: 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26  e3StrAccumInit(&
8ce0: 78 2c 20 30 2c 20 7a 54 65 6d 70 2c 20 6e 54 65  x, 0, zTemp, nTe
8cf0: 6d 70 2c 20 30 29 3b 0a 20 20 73 77 69 74 63 68  mp, 0);.  switch
8d00: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b  ( pOp->p4type ){
8d10: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59  .    case P4_KEY
8d20: 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e  INFO: {.      in
8d30: 74 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e  t j;.      KeyIn
8d40: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70  fo *pKeyInfo = p
8d50: 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b  Op->p4.pKeyInfo;
8d60: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
8d70: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
8d80: 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  der!=0 );.      
8d90: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
8da0: 78 2c 20 22 6b 28 25 64 22 2c 20 70 4b 65 79 49  x, "k(%d", pKeyI
8db0: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20  nfo->nField);.  
8dc0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
8dd0: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b  KeyInfo->nField;
8de0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43   j++){.        C
8df0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
8e00: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
8e10: 6a 5d 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  j];.        cons
8e20: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20  t char *zColl = 
8e30: 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a  pColl ? pColl->z
8e40: 4e 61 6d 65 20 3a 20 22 22 3b 0a 20 20 20 20 20  Name : "";.     
8e50: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43     if( strcmp(zC
8e60: 6f 6c 6c 2c 20 22 42 49 4e 41 52 59 22 29 3d 3d  oll, "BINARY")==
8e70: 30 20 29 20 7a 43 6f 6c 6c 20 3d 20 22 42 22 3b  0 ) zColl = "B";
8e80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8e90: 58 50 72 69 6e 74 66 28 26 78 2c 20 22 2c 25 73  XPrintf(&x, ",%s
8ea0: 25 73 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  %s", pKeyInfo->a
8eb0: 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 3f 20 22  SortOrder[j] ? "
8ec0: 2d 22 20 3a 20 22 22 2c 20 7a 43 6f 6c 6c 29 3b  -" : "", zColl);
8ed0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
8ee0: 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
8ef0: 70 65 6e 64 28 26 78 2c 20 22 29 22 2c 20 31 29  pend(&x, ")", 1)
8f00: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
8f10: 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
8f20: 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52  TE_ENABLE_CURSOR
8f30: 5f 48 49 4e 54 53 0a 20 20 20 20 63 61 73 65 20  _HINTS.    case 
8f40: 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20  P4_EXPR: {.     
8f50: 20 64 69 73 70 6c 61 79 50 34 45 78 70 72 28 26   displayP4Expr(&
8f60: 78 2c 20 70 4f 70 2d 3e 70 34 2e 70 45 78 70 72  x, pOp->p4.pExpr
8f70: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
8f80: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
8f90: 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51   case P4_COLLSEQ
8fa0: 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  : {.      CollSe
8fb0: 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e  q *pColl = pOp->
8fc0: 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  p4.pColl;.      
8fd0: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
8fe0: 78 2c 20 22 28 25 2e 32 30 73 29 22 2c 20 70 43  x, "(%.20s)", pC
8ff0: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
9000: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9010: 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43      case P4_FUNC
9020: 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e  DEF: {.      Fun
9030: 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70  cDef *pDef = pOp
9040: 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20  ->p4.pFunc;.    
9050: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
9060: 28 26 78 2c 20 22 25 73 28 25 64 29 22 2c 20 70  (&x, "%s(%d)", p
9070: 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66  Def->zName, pDef
9080: 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62  ->nArg);.      b
9090: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 64  reak;.    }.#ifd
90a0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
90b0: 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43      case P4_FUNC
90c0: 43 54 58 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e  CTX: {.      Fun
90d0: 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70  cDef *pDef = pOp
90e0: 2d 3e 70 34 2e 70 43 74 78 2d 3e 70 46 75 6e 63  ->p4.pCtx->pFunc
90f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58  ;.      sqlite3X
9100: 50 72 69 6e 74 66 28 26 78 2c 20 22 25 73 28 25  Printf(&x, "%s(%
9110: 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65  d)", pDef->zName
9120: 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20  , pDef->nArg);. 
9130: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9140: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
9150: 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20  e P4_INT64: {.  
9160: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
9170: 74 66 28 26 78 2c 20 22 25 6c 6c 64 22 2c 20 2a  tf(&x, "%lld", *
9180: 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a 20  pOp->p4.pI64);. 
9190: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
91a0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e  }.    case P4_IN
91b0: 54 33 32 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  T32: {.      sql
91c0: 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20  ite3XPrintf(&x, 
91d0: 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29  "%d", pOp->p4.i)
91e0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
91f0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
9200: 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73  _REAL: {.      s
9210: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78  qlite3XPrintf(&x
9220: 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d  , "%.16g", *pOp-
9230: 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20  >p4.pReal);.    
9240: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
9250: 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20     case P4_MEM: 
9260: 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65  {.      Mem *pMe
9270: 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d  m = pOp->p4.pMem
9280: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
9290: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ->flags & MEM_St
92a0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34  r ){.        zP4
92b0: 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20   = pMem->z;.    
92c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
92d0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
92e0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
92f0: 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20  ite3XPrintf(&x, 
9300: 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e  "%lld", pMem->u.
9310: 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  i);.      }else 
9320: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
9330: 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  & MEM_Real ){.  
9340: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
9350: 69 6e 74 66 28 26 78 2c 20 22 25 2e 31 36 67 22  intf(&x, "%.16g"
9360: 2c 20 70 4d 65 6d 2d 3e 75 2e 72 29 3b 0a 20 20  , pMem->u.r);.  
9370: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
9380: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
9390: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Null ){.        
93a0: 7a 50 34 20 3d 20 22 4e 55 4c 4c 22 3b 0a 20 20  zP4 = "NULL";.  
93b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
93c0: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
93d0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f  >flags & MEM_Blo
93e0: 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 34  b );.        zP4
93f0: 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20   = "(blob)";.   
9400: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
9410: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
9420: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
9430: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73  UALTABLE.    cas
9440: 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20  e P4_VTAB: {.   
9450: 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20     sqlite3_vtab 
9460: 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34  *pVtab = pOp->p4
9470: 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20  .pVtab->pVtab;. 
9480: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
9490: 6e 74 66 28 26 78 2c 20 22 76 74 61 62 3a 25 70  ntf(&x, "vtab:%p
94a0: 22 2c 20 70 56 74 61 62 29 3b 0a 20 20 20 20 20  ", pVtab);.     
94b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
94c0: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34  ndif.    case P4
94d0: 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20  _INTARRAY: {.   
94e0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
94f0: 69 6e 74 20 2a 61 69 20 3d 20 70 4f 70 2d 3e 70  int *ai = pOp->p
9500: 34 2e 61 69 3b 0a 20 20 20 20 20 20 69 6e 74 20  4.ai;.      int 
9510: 6e 20 3d 20 61 69 5b 30 5d 3b 20 20 20 2f 2a 20  n = ai[0];   /* 
9520: 54 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e  The first elemen
9530: 74 20 6f 66 20 61 6e 20 49 4e 54 41 52 52 41 59  t of an INTARRAY
9540: 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 0a 20   is always the. 
9550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9560: 20 20 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20 6f        ** count o
9570: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
9580: 65 6c 65 6d 65 6e 74 73 20 74 6f 20 66 6f 6c 6c  elements to foll
9590: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  ow */.      for(
95a0: 69 3d 31 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=1; i<n; i++){.
95b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58          sqlite3X
95c0: 50 72 69 6e 74 66 28 26 78 2c 20 22 2c 25 64 22  Printf(&x, ",%d"
95d0: 2c 20 61 69 5b 69 5d 29 3b 0a 20 20 20 20 20 20  , ai[i]);.      
95e0: 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d  }.      zTemp[0]
95f0: 20 3d 20 27 5b 27 3b 0a 20 20 20 20 20 20 73 71   = '[';.      sq
9600: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
9610: 65 6e 64 28 26 78 2c 20 22 5d 22 2c 20 31 29 3b  end(&x, "]", 1);
9620: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9630: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
9640: 53 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20  SUBPROGRAM: {.  
9650: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
9660: 74 66 28 26 78 2c 20 22 70 72 6f 67 72 61 6d 22  tf(&x, "program"
9670: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
9680: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
9690: 34 5f 41 44 56 41 4e 43 45 3a 20 7b 0a 20 20 20  4_ADVANCE: {.   
96a0: 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b     zTemp[0] = 0;
96b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
96c0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
96d0: 20 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d 20 70   {.      zP4 = p
96e0: 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20  Op->p4.z;.      
96f0: 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20  if( zP4==0 ){.  
9700: 20 20 20 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d        zP4 = zTem
9710: 70 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70  p;.        zTemp
9720: 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [0] = 0;.      }
9730: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
9740: 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69  ite3StrAccumFini
9750: 73 68 28 26 78 29 3b 0a 20 20 61 73 73 65 72 74  sh(&x);.  assert
9760: 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65  ( zP4!=0 );.  re
9770: 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64  turn zP4;.}.#end
9780: 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c  if /* VDBE_DISPL
9790: 41 59 5f 50 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  AY_P4 */../*.** 
97a0: 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56  Declare to the V
97b0: 64 62 65 20 74 68 61 74 20 74 68 65 20 42 54 72  dbe that the BTr
97c0: 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d  ee object at db-
97d0: 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e  >aDb[i] is used.
97e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70 61  .**.** The prepa
97f0: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6e  red statements n
9800: 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e 20 61  eed to know in a
9810: 64 76 61 6e 63 65 20 74 68 65 20 63 6f 6d 70 6c  dvance the compl
9820: 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20 61 74  ete set of.** at
9830: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
9840: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
9850: 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20 74 68  e.  A mask of th
9860: 65 73 65 20 64 61 74 61 62 61 73 65 73 0a 2a 2a  ese databases.**
9870: 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 69   is maintained i
9880: 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2e 20  n p->btreeMask. 
9890: 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b   The p->lockMask
98a0: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 75   value is the su
98b0: 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62 74  bset of.** p->bt
98c0: 72 65 65 4d 61 73 6b 20 6f 66 20 64 61 74 61 62  reeMask of datab
98d0: 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 72  ases that will r
98e0: 65 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e 0a 2a  equire a lock..*
98f0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
9900: 62 65 55 73 65 73 42 74 72 65 65 28 56 64 62 65  beUsesBtree(Vdbe
9910: 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61   *p, int i){.  a
9920: 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
9930: 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69  <p->db->nDb && i
9940: 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 79 44 62  <(int)sizeof(yDb
9950: 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73  Mask)*8 );.  ass
9960: 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a 65  ert( i<(int)size
9970: 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29  of(p->btreeMask)
9980: 2a 38 20 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65  *8 );.  DbMaskSe
9990: 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20  t(p->btreeMask, 
99a0: 69 29 3b 0a 20 20 69 66 28 20 69 21 3d 31 20 26  i);.  if( i!=1 &
99b0: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 68  & sqlite3BtreeSh
99c0: 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e 61 44  arable(p->db->aD
99d0: 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20  b[i].pBt) ){.   
99e0: 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 6c 6f   DbMaskSet(p->lo
99f0: 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 7d 0a  ckMask, i);.  }.
9a00: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
9a10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
9a20: 45 44 5f 43 41 43 48 45 29 0a 2f 2a 0a 2a 2a 20  ED_CACHE)./*.** 
9a30: 49 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d  If SQLite is com
9a40: 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f 72 74  piled to support
9a50: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
9a60: 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74 68 72  de and to be thr
9a70: 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73  eadsafe,.** this
9a80: 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e 73   routine obtains
9a90: 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63   the mutex assoc
9aa0: 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20  iated with each 
9ab0: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
9ac0: 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62  re.** that may b
9ad0: 65 20 61 63 63 65 73 73 65 64 20 62 79 20 74 68  e accessed by th
9ae0: 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61  e VM passed as a
9af0: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64  n argument. In d
9b00: 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a  oing so it also.
9b10: 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74 53 68  ** sets the BtSh
9b20: 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f  ared.db member o
9b30: 66 20 65 61 63 68 20 6f 66 20 74 68 65 20 42 74  f each of the Bt
9b40: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
9b50: 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74  s, ensuring.** t
9b60: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  hat the correct 
9b70: 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
9b80: 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64  lback is invoked
9b90: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
9ba0: 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73  .** If SQLite is
9bb0: 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20   not threadsafe 
9bc0: 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f 72 74  but does support
9bd0: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
9be0: 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69  de, then.** sqli
9bf0: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 20  te3BtreeEnter() 
9c00: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65  is invoked to se
9c10: 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64  t the BtShared.d
9c20: 62 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f  b variables.** o
9c30: 66 20 61 6c 6c 20 6f 66 20 42 74 53 68 61 72 65  f all of BtShare
9c40: 64 20 73 74 72 75 63 74 75 72 65 73 20 61 63 63  d structures acc
9c50: 65 73 73 69 62 6c 65 20 76 69 61 20 74 68 65 20  essible via the 
9c60: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
9c70: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77  .** associated w
9c80: 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a  ith the VM..**.*
9c90: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e  * If SQLite is n
9ca0: 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 61 6e  ot threadsafe an
9cb0: 64 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  d does not suppo
9cc0: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  rt shared-cache 
9cd0: 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75  mode, this.** fu
9ce0: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
9cf0: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e  p..**.** The p->
9d00: 62 74 72 65 65 4d 61 73 6b 20 66 69 65 6c 64 20  btreeMask field 
9d10: 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20  is a bitmask of 
9d20: 61 6c 6c 20 62 74 72 65 65 73 20 74 68 61 74 20  all btrees that 
9d30: 74 68 65 20 70 72 65 70 61 72 65 64 20 0a 2a 2a  the prepared .**
9d40: 20 73 74 61 74 65 6d 65 6e 74 20 70 20 77 69 6c   statement p wil
9d50: 6c 20 65 76 65 72 20 75 73 65 2e 20 20 4c 65 74  l ever use.  Let
9d60: 20 4e 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72   N be the number
9d70: 20 6f 66 20 62 69 74 73 20 69 6e 20 70 2d 3e 62   of bits in p->b
9d80: 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72  treeMask.** corr
9d90: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72  esponding to btr
9da0: 65 65 73 20 74 68 61 74 20 75 73 65 20 73 68 61  ees that use sha
9db0: 72 65 64 20 63 61 63 68 65 2e 20 20 54 68 65 6e  red cache.  Then
9dc0: 20 74 68 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a   the runtime of.
9dd0: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
9de0: 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20  is N*N.  But as 
9df0: 4e 20 69 73 20 72 61 72 65 6c 79 20 6d 6f 72 65  N is rarely more
9e00: 20 74 68 61 6e 20 31 2c 20 74 68 69 73 20 73 68   than 1, this sh
9e10: 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61  ould not.** be a
9e20: 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69   problem..*/.voi
9e30: 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74  d sqlite3VdbeEnt
9e40: 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  er(Vdbe *p){.  i
9e50: 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt i;.  sqlite3 
9e60: 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a  *db;.  Db *aDb;.
9e70: 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28    int nDb;.  if(
9e80: 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70   DbMaskAllZero(p
9e90: 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65  ->lockMask) ) re
9ea0: 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f  turn;  /* The co
9eb0: 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64  mmon case */.  d
9ec0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62  b = p->db;.  aDb
9ed0: 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44   = db->aDb;.  nD
9ee0: 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66  b = db->nDb;.  f
9ef0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69  or(i=0; i<nDb; i
9f00: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d  ++){.    if( i!=
9f10: 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28  1 && DbMaskTest(
9f20: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26  p->lockMask,i) &
9f30: 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e  & ALWAYS(aDb[i].
9f40: 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  pBt!=0) ){.     
9f50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
9f60: 65 72 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a  er(aDb[i].pBt);.
9f70: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
9f80: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
9f90: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
9fa0: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51  RED_CACHE) && SQ
9fb0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
9fc0: 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61  0./*.** Unlock a
9fd0: 6c 6c 20 6f 66 20 74 68 65 20 62 74 72 65 65 73  ll of the btrees
9fe0: 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b   previously lock
9ff0: 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20  ed by a call to 
a000: 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
a010: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  ()..*/.static SQ
a020: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
a030: 69 64 20 76 64 62 65 4c 65 61 76 65 28 56 64 62  id vdbeLeave(Vdb
a040: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
a050: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
a060: 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20   Db *aDb;.  int 
a070: 6e 44 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  nDb;.  db = p->d
a080: 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61  b;.  aDb = db->a
a090: 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e  Db;.  nDb = db->
a0a0: 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  nDb;.  for(i=0; 
a0b0: 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<nDb; i++){.   
a0c0: 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d   if( i!=1 && DbM
a0d0: 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d  askTest(p->lockM
a0e0: 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53  ask,i) && ALWAYS
a0f0: 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20  (aDb[i].pBt!=0) 
a100: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
a110: 42 74 72 65 65 4c 65 61 76 65 28 61 44 62 5b 69  BtreeLeave(aDb[i
a120: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  ].pBt);.    }.  
a130: 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
a140: 56 64 62 65 4c 65 61 76 65 28 56 64 62 65 20 2a  VdbeLeave(Vdbe *
a150: 70 29 7b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b  p){.  if( DbMask
a160: 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d  AllZero(p->lockM
a170: 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20  ask) ) return;  
a180: 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
a190: 73 65 20 2a 2f 0a 20 20 76 64 62 65 4c 65 61 76  se */.  vdbeLeav
a1a0: 65 28 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  e(p);.}.#endif..
a1b0: 23 69 66 20 64 65 66 69 6e 65 64 28 56 44 42 45  #if defined(VDBE
a1c0: 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66  _PROFILE) || def
a1d0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
a1e0: 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  G)./*.** Print a
a1f0: 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20   single opcode. 
a200: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
a210: 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67   used for debugg
a220: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69  ing only..*/.voi
a230: 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  d sqlite3VdbePri
a240: 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c  ntOp(FILE *pOut,
a250: 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70   int pc, Op *pOp
a260: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a  ){.  char *zP4;.
a270: 20 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b    char zPtr[50];
a280: 0a 20 20 63 68 61 72 20 7a 43 6f 6d 5b 31 30 30  .  char zCom[100
a290: 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ];.  static cons
a2a0: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31  t char *zFormat1
a2b0: 20 3d 20 22 25 34 64 20 25 2d 31 33 73 20 25 34   = "%4d %-13s %4
a2c0: 64 20 25 34 64 20 25 34 64 20 25 2d 31 33 73 20  d %4d %4d %-13s 
a2d0: 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66  %.2X %s\n";.  if
a2e0: 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74  ( pOut==0 ) pOut
a2f0: 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34   = stdout;.  zP4
a300: 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70   = displayP4(pOp
a310: 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a  , zPtr, sizeof(z
a320: 50 74 72 29 29 3b 0a 23 69 66 64 65 66 20 53 51  Ptr));.#ifdef SQ
a330: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
a340: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 64  AIN_COMMENTS.  d
a350: 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f  isplayComment(pO
a360: 70 2c 20 7a 50 34 2c 20 7a 43 6f 6d 2c 20 73 69  p, zP4, zCom, si
a370: 7a 65 6f 66 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c  zeof(zCom));.#el
a380: 73 65 0a 20 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30  se.  zCom[0] = 0
a390: 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 4e 42  ;.#endif.  /* NB
a3a0: 3a 20 20 54 68 65 20 73 71 6c 69 74 65 33 4f 70  :  The sqlite3Op
a3b0: 63 6f 64 65 4e 61 6d 65 28 29 20 66 75 6e 63 74  codeName() funct
a3c0: 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
a3d0: 65 64 20 62 79 20 63 6f 64 65 20 63 72 65 61 74  ed by code creat
a3e0: 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6d  ed.  ** by the m
a3f0: 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 61 6e 64  kopcodeh.awk and
a400: 20 6d 6b 6f 70 63 6f 64 65 63 2e 61 77 6b 20 73   mkopcodec.awk s
a410: 63 72 69 70 74 73 20 77 68 69 63 68 20 65 78 74  cripts which ext
a420: 72 61 63 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e  ract the.  ** in
a430: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
a440: 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65  he vdbe.c source
a450: 20 74 65 78 74 20 2a 2f 0a 20 20 66 70 72 69 6e   text */.  fprin
a460: 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74  tf(pOut, zFormat
a470: 31 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71  1, pc, .      sq
a480: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
a490: 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f  pOp->opcode), pO
a4a0: 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20  p->p1, pOp->p2, 
a4b0: 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f  pOp->p3, zP4, pO
a4c0: 70 2d 3e 70 35 2c 0a 20 20 20 20 20 20 7a 43 6f  p->p5,.      zCo
a4d0: 6d 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68 28  m.  );.  fflush(
a4e0: 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  pOut);.}.#endif.
a4f0: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
a500: 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d  n array of N Mem
a510: 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61   elements.*/.sta
a520: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
a530: 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c  MemArray(Mem *p,
a540: 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70   int N){.  if( p
a550: 20 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d   && N ){.    Mem
a560: 20 2a 70 45 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a   *pEnd = &p[N];.
a570: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
a580: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20  = p->db;.    u8 
a590: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20  malloc_failed = 
a5a0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a5b0: 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e  ;.    if( db->pn
a5c0: 42 79 74 65 73 46 72 65 65 64 20 29 7b 0a 20 20  BytesFreed ){.  
a5d0: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
a5e0: 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20  if( p->szMalloc 
a5f0: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
a600: 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b  db, p->zMalloc);
a610: 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 28  .      }while( (
a620: 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20  ++p)<pEnd );.   
a630: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
a640: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 61  .    do{.      a
a650: 73 73 65 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d  ssert( (&p[1])==
a660: 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d  pEnd || p[0].db=
a670: 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20  =p[1].db );.    
a680: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
a690: 33 56 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76  3VdbeCheckMemInv
a6a0: 61 72 69 61 6e 74 73 28 70 29 20 29 3b 0a 0a 20  ariants(p) );.. 
a6b0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f       /* This blo
a6c0: 63 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20  ck is really an 
a6d0: 69 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e 20  inlined version 
a6e0: 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  of sqlite3VdbeMe
a6f0: 6d 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20 20  mRelease().     
a700: 20 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20 61   ** that takes a
a710: 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20  dvantage of the 
a720: 66 61 63 74 20 74 68 61 74 20 74 68 65 20 6d 65  fact that the me
a730: 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65 20  mory cell value 
a740: 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 69  is .      ** bei
a750: 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  ng set to NULL a
a760: 66 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20 61  fter releasing a
a770: 6e 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f 75  ny dynamic resou
a780: 72 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  rces..      **. 
a790: 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73 74       ** The just
a7a0: 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64 75  ification for du
a7b0: 70 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20 69  plicating code i
a7c0: 73 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e 67  s that according
a7d0: 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 61   to .      ** ca
a7e0: 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63 61  llgrind, this ca
a7f0: 75 73 65 73 20 61 20 63 65 72 74 61 69 6e 20 74  uses a certain t
a800: 65 73 74 20 63 61 73 65 20 74 6f 20 68 69 74 20  est case to hit 
a810: 74 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20 20  the CPU 4.7 .   
a820: 20 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65     ** percent le
a830: 73 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20 67  ss (x86 linux, g
a840: 63 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32  cc version 4.1.2
a850: 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20 0a  , -O6) than if .
a860: 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
a870: 4d 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65 72  MemRelease() wer
a880: 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65  e called from he
a890: 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74 68  re. With -O2, th
a8a0: 69 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a  is jumps.      *
a8b0: 2a 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e 74  * to 6.6 percent
a8c0: 2e 20 54 68 65 20 74 65 73 74 20 63 61 73 65 20  . The test case 
a8d0: 69 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30 30  is inserting 100
a8e0: 30 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74 61  0 rows into a ta
a8f0: 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77 69  ble .      ** wi
a900: 74 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75 73  th no indexes us
a910: 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72 65  ing a single pre
a920: 70 61 72 65 64 20 49 4e 53 45 52 54 20 73 74 61  pared INSERT sta
a930: 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a  tement, bind() .
a940: 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73        ** and res
a950: 65 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61 72  et(). Inserts ar
a960: 65 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20 61  e grouped into a
a970: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
a980: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 65 73      */.      tes
a990: 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20  tcase( p->flags 
a9a0: 26 20 4d 45 4d 5f 41 67 67 20 29 3b 0a 20 20 20  & MEM_Agg );.   
a9b0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
a9c0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20  flags & MEM_Dyn 
a9d0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
a9e0: 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45  e( p->flags & ME
a9f0: 4d 5f 46 72 61 6d 65 20 29 3b 0a 20 20 20 20 20  M_Frame );.     
aa00: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c   testcase( p->fl
aa10: 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74  ags & MEM_RowSet
aa20: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   );.      if( p-
aa30: 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c  >flags&(MEM_Agg|
aa40: 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d  MEM_Dyn|MEM_Fram
aa50: 65 7c 4d 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b  e|MEM_RowSet) ){
aa60: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
aa70: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
aa80: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
aa90: 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29  f( p->szMalloc )
aaa0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
aab0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
aac0: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20  Malloc);.       
aad0: 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30   p->szMalloc = 0
aae0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
aaf0: 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f   p->flags = MEM_
ab00: 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 7d  Undefined;.    }
ab10: 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e  while( (++p)<pEn
ab20: 64 20 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c  d );.    db->mal
ab30: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c  locFailed = mall
ab40: 6f 63 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d  oc_failed;.  }.}
ab50: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
ab60: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
ab70: 74 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e  t and its conten
ab80: 74 73 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62  ts. VdbeFrame ob
ab90: 6a 65 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  jects are.** all
aba0: 6f 63 61 74 65 64 20 62 79 20 74 68 65 20 4f 50  ocated by the OP
abb0: 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20  _Program opcode 
abc0: 69 6e 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  in sqlite3VdbeEx
abd0: 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ec()..*/.void sq
abe0: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65  lite3VdbeFrameDe
abf0: 6c 65 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a  lete(VdbeFrame *
ac00: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d  p){.  int i;.  M
ac10: 65 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46  em *aMem = VdbeF
ac20: 72 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64  rameMem(p);.  Vd
ac30: 62 65 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72  beCursor **apCsr
ac40: 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a   = (VdbeCursor *
ac50: 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c  *)&aMem[p->nChil
ac60: 64 4d 65 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  dMem];.  for(i=0
ac70: 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72  ; i<p->nChildCsr
ac80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
ac90: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
aca0: 72 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d  r(p->v, apCsr[i]
acb0: 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  );.  }.  release
acc0: 4d 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20 70  MemArray(aMem, p
acd0: 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20  ->nChildMem);.  
ace0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
acf0: 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23  >v->db, p);.}..#
ad00: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ad10: 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a  IT_EXPLAIN./*.**
ad20: 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20   Give a listing 
ad30: 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69  of the program i
ad40: 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  n the virtual ma
ad50: 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  chine..**.** The
ad60: 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68   interface is th
ad70: 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65  e same as sqlite
ad80: 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 75  3VdbeExec().  Bu
ad90: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  t instead of.** 
ada0: 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65  running the code
adb0: 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65  , it invokes the
adc0: 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66   callback once f
add0: 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  or each instruct
ade0: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61  ion..** This fea
adf0: 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20  ture is used to 
ae00: 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41  implement "EXPLA
ae10: 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  IN"..**.** When 
ae20: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65  p->explain==1, e
ae30: 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ach instruction 
ae40: 69 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65 6e  is listed.  When
ae50: 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  .** p->explain==
ae60: 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61  2, only OP_Expla
ae70: 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  in instructions 
ae80: 61 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20 74  are listed and t
ae90: 68 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77  hese.** are show
aea0: 6e 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74  n in a different
aeb0: 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70   format.  p->exp
aec0: 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64 20  lain==2 is used 
aed0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20  to implement.** 
aee0: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
aef0: 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  AN..**.** When p
af00: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69  ->explain==1, fi
af10: 72 73 74 20 74 68 65 20 6d 61 69 6e 20 70 72 6f  rst the main pro
af20: 67 72 61 6d 20 69 73 20 6c 69 73 74 65 64 2c 20  gram is listed, 
af30: 74 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20  then each of.** 
af40: 74 68 65 20 74 72 69 67 67 65 72 20 73 75 62 70  the trigger subp
af50: 72 6f 67 72 61 6d 73 20 61 72 65 20 6c 69 73 74  rograms are list
af60: 65 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a  ed one by one..*
af70: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
af80: 65 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70  eList(.  Vdbe *p
af90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afa0: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a     /* The VDBE *
afb0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b  /.){.  int nRow;
afc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
afe0: 74 6f 70 20 77 68 65 6e 20 72 6f 77 20 63 6f 75  top when row cou
aff0: 6e 74 20 72 65 61 63 68 65 73 20 74 68 69 73 20  nt reaches this 
b000: 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20  */.  int nSub = 
b010: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
b020: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
b030: 62 65 72 20 6f 66 20 73 75 62 2d 76 64 62 65 73  ber of sub-vdbes
b040: 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a   seen so far */.
b050: 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61    SubProgram **a
b060: 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  pSub = 0;       
b070: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
b080: 6f 66 20 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a  of sub-vdbes */.
b090: 20 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b    Mem *pSub = 0;
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 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
b0c0: 20 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79   cell hold array
b0d0: 20 6f 66 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a   of subprogs */.
b0e0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
b0f0: 70 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20  p->db;          
b100: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
b110: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
b120: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  n */.  int i;   
b130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b140: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
b150: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
b160: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
b170: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
b180: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
b190: 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  code */.  Mem *p
b1a0: 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31  Mem = &p->aMem[1
b1b0: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
b1c0: 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f 66 20 72  * First Mem of r
b1d0: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20  esult set */..  
b1e0: 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61  assert( p->expla
b1f0: 69 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  in );.  assert( 
b200: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
b210: 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73  AGIC_RUN );.  as
b220: 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
b230: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
b240: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20  =SQLITE_BUSY || 
b250: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
b260: 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65  MEM );..  /* Eve
b270: 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70  n though this op
b280: 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73  code does not us
b290: 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67  e dynamic string
b2a0: 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72  s for.  ** the r
b2b0: 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f  esult, result co
b2c0: 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65  lumns may become
b2d0: 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20   dynamic if the 
b2e0: 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20  user calls.  ** 
b2f0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
b300: 65 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67  ext16(), causing
b310: 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74   a translation t
b320: 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e  o UTF-16 encodin
b330: 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73  g..  */.  releas
b340: 65 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20  eMemArray(pMem, 
b350: 38 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74  8);.  p->pResult
b360: 53 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Set = 0;..  if( 
b370: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
b380: 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  MEM ){.    /* Th
b390: 69 73 20 68 61 70 70 65 6e 73 20 69 66 20 61 20  is happens if a 
b3a0: 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20  malloc() inside 
b3b0: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
b3c0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20  3_column_text() 
b3d0: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
b3e0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28  3_column_text16(
b3f0: 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20  ) failed.  */.  
b400: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
b410: 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ed = 1;.    retu
b420: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
b430: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  .  }..  /* When 
b440: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  the number of ou
b450: 74 70 75 74 20 72 6f 77 73 20 72 65 61 63 68 65  tput rows reache
b460: 73 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65 61  s nRow, that mea
b470: 6e 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74  ns the.  ** list
b480: 69 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65 64  ing has finished
b490: 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 74 65   and sqlite3_ste
b4a0: 70 28 29 20 73 68 6f 75 6c 64 20 72 65 74 75 72  p() should retur
b4b0: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20  n SQLITE_DONE.. 
b4c0: 20 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68 65 20   ** nRow is the 
b4d0: 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  sum of the numbe
b4e0: 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
b4f0: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70   main program, p
b500: 6c 75 73 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d  lus.  ** the sum
b510: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
b520: 66 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72  f rows in all tr
b530: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
b540: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20  s encountered.  
b550: 2a 2a 20 73 6f 20 66 61 72 2e 20 20 54 68 65 20  ** so far.  The 
b560: 6e 52 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c 20  nRow value will 
b570: 69 6e 63 72 65 61 73 65 20 61 73 20 6e 65 77 20  increase as new 
b580: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
b590: 61 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63  ams are.  ** enc
b5a0: 6f 75 6e 74 65 72 65 64 2c 20 62 75 74 20 70 2d  ountered, but p-
b5b0: 3e 70 63 20 77 69 6c 6c 20 65 76 65 6e 74 75 61  >pc will eventua
b5c0: 6c 6c 79 20 63 61 74 63 68 20 75 70 20 74 6f 20  lly catch up to 
b5d0: 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f  nRow..  */.  nRo
b5e0: 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66  w = p->nOp;.  if
b5f0: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20  ( p->explain==1 
b600: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69  ){.    /* The fi
b610: 72 73 74 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c  rst 8 memory cel
b620: 6c 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20  ls are used for 
b630: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
b640: 20 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20 20   So we will.    
b650: 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68  ** commandeer th
b660: 65 20 39 74 68 20 63 65 6c 6c 20 74 6f 20 75 73  e 9th cell to us
b670: 65 20 61 73 20 73 74 6f 72 61 67 65 20 66 6f 72  e as storage for
b680: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69   an array of poi
b690: 6e 74 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20  nters.    ** to 
b6a0: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
b6b0: 61 6d 73 2e 20 20 54 68 65 20 56 44 42 45 20 69  ams.  The VDBE i
b6c0: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
b6d0: 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 39 0a  have at least 9.
b6e0: 20 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a      ** cells.  *
b6f0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
b700: 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70  >nMem>9 );.    p
b710: 53 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39  Sub = &p->aMem[9
b720: 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  ];.    if( pSub-
b730: 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20  >flags&MEM_Blob 
b740: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74  ){.      /* On t
b750: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
b760: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c   sqlite3_step(),
b770: 20 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20   pSub will hold 
b780: 61 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20  a NULL.  It is. 
b790: 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69       ** initiali
b7a0: 7a 65 64 20 74 6f 20 61 20 42 4c 4f 42 20 62 79  zed to a BLOB by
b7b0: 20 74 68 65 20 50 34 5f 53 55 42 50 52 4f 47 52   the P4_SUBPROGR
b7c0: 41 4d 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f  AM processing lo
b7d0: 67 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20  gic below */.   
b7e0: 20 20 20 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e     nSub = pSub->
b7f0: 6e 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b  n/sizeof(Vdbe*);
b800: 0a 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28  .      apSub = (
b810: 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53  SubProgram **)pS
b820: 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20  ub->z;.    }.   
b830: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
b840: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52  ; i++){.      nR
b850: 6f 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e  ow += apSub[i]->
b860: 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  nOp;.    }.  }..
b870: 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d    do{.    i = p-
b880: 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28  >pc++;.  }while(
b890: 20 69 3c 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78   i<nRow && p->ex
b8a0: 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61  plain==2 && p->a
b8b0: 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50  Op[i].opcode!=OP
b8c0: 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66  _Explain );.  if
b8d0: 28 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20  ( i>=nRow ){.   
b8e0: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
b8f0: 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  OK;.    rc = SQL
b900: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73  ITE_DONE;.  }els
b910: 65 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49  e if( db->u1.isI
b920: 6e 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20  nterrupted ){.  
b930: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
b940: 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20  _INTERRUPT;.    
b950: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
b960: 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  R;.    sqlite3Vd
b970: 62 65 45 72 72 6f 72 28 70 2c 20 73 71 6c 69 74  beError(p, sqlit
b980: 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29  e3ErrStr(p->rc))
b990: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
b9a0: 68 61 72 20 2a 7a 50 34 3b 0a 20 20 20 20 4f 70  har *zP4;.    Op
b9b0: 20 2a 70 4f 70 3b 0a 20 20 20 20 69 66 28 20 69   *pOp;.    if( i
b9c0: 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20  <p->nOp ){.     
b9d0: 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c   /* The output l
b9e0: 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d  ine number is sm
b9f0: 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20  all enough that 
ba00: 77 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20  we are still in 
ba10: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69  the.      ** mai
ba20: 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20  n program. */.  
ba30: 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f      pOp = &p->aO
ba40: 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  p[i];.    }else{
ba50: 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65  .      /* We are
ba60: 20 63 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69   currently listi
ba70: 6e 67 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20  ng subprograms. 
ba80: 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63   Figure out whic
ba90: 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20  h one and.      
baa0: 2a 2a 20 70 69 63 6b 20 75 70 20 74 68 65 20 61  ** pick up the a
bab0: 70 70 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64  ppropriate opcod
bac0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  e. */.      int 
bad0: 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d  j;.      i -= p-
bae0: 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28  >nOp;.      for(
baf0: 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d  j=0; i>=apSub[j]
bb00: 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nOp; j++){.   
bb10: 20 20 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b       i -= apSub[
bb20: 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d  j]->nOp;.      }
bb30: 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70  .      pOp = &ap
bb40: 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a  Sub[j]->aOp[i];.
bb50: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
bb60: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20  >explain==1 ){. 
bb70: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
bb80: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
bb90: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b    pMem->u.i = i;
bba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbc0: 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74  /* Program count
bbd0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
bbe0: 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d 65  ++;.  .      pMe
bbf0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
bc00: 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45  tatic|MEM_Str|ME
bc10: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d  M_Term;.      pM
bc20: 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73  em->z = (char*)s
bc30: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
bc40: 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f  (pOp->opcode); /
bc50: 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  * Opcode */.    
bc60: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
bc70: 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d  z!=0 );.      pM
bc80: 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53  em->n = sqlite3S
bc90: 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29  trlen30(pMem->z)
bca0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ;.      pMem->en
bcb0: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
bcc0: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  .      pMem++;..
bcd0: 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e        /* When an
bce0: 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f   OP_Program opco
bcf0: 64 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 20  de is encounter 
bd00: 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65  (the only opcode
bd10: 20 74 68 61 74 20 68 61 73 0a 20 20 20 20 20 20   that has.      
bd20: 2a 2a 20 61 20 50 34 5f 53 55 42 50 52 4f 47 52  ** a P4_SUBPROGR
bd30: 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20 65 78  AM argument), ex
bd40: 70 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66  pand the size of
bd50: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 73 75   the array of su
bd60: 62 70 72 6f 67 72 61 6d 73 0a 20 20 20 20 20 20  bprograms.      
bd70: 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d  ** kept in p->aM
bd80: 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20  em[9].z to hold 
bd90: 74 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d 20  the new program 
bda0: 2d 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20  - assuming this 
bdb0: 73 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20 20  subprogram.     
bdc0: 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65   ** has not alre
bdd0: 61 64 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20  ady been seen.. 
bde0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
bdf0: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
be00: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a  4_SUBPROGRAM ){.
be10: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74          int nByt
be20: 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a  e = (nSub+1)*siz
be30: 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29  eof(SubProgram*)
be40: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b  ;.        int j;
be50: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
be60: 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a  ; j<nSub; j++){.
be70: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 70            if( ap
be80: 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e  Sub[j]==pOp->p4.
be90: 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b  pProgram ) break
bea0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
beb0: 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20      if( j==nSub 
bec0: 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71  && SQLITE_OK==sq
bed0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77  lite3VdbeMemGrow
bee0: 28 70 53 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53  (pSub, nByte, nS
bef0: 75 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  ub!=0) ){.      
bf00: 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62      apSub = (Sub
bf10: 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d  Program **)pSub-
bf20: 3e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70  >z;.          ap
bf30: 53 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f  Sub[nSub++] = pO
bf40: 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a  p->p4.pProgram;.
bf50: 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e            pSub->
bf60: 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f  flags |= MEM_Blo
bf70: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 75  b;.          pSu
bf80: 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65  b->n = nSub*size
bf90: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b  of(SubProgram*);
bfa0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
bfb0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d   }.    }..    pM
bfc0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
bfd0: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  Int;.    pMem->u
bfe0: 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20  .i = pOp->p1;   
bff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c000: 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a         /* P1 */.
c010: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
c020: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
c030: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
c040: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b  ->u.i = pOp->p2;
c050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20            /* P2 
c070: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  */.    pMem++;..
c080: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
c090: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
c0a0: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
c0b0: 70 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p3;             
c0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c0d0: 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b  P3 */.    pMem++
c0e0: 3b 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ;..    if( sqlit
c0f0: 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e  e3VdbeMemClearAn
c100: 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 31 30  dResize(pMem, 10
c110: 30 29 20 29 7b 20 2f 2a 20 50 34 20 2a 2f 0a 20  0) ){ /* P4 */. 
c120: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
c130: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c140: 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
c150: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
c160: 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66     }.    pMem->f
c170: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d  lags = MEM_Str|M
c180: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 50 34  EM_Term;.    zP4
c190: 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70   = displayP4(pOp
c1a0: 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 70 4d 65 6d 2d  , pMem->z, pMem-
c1b0: 3e 73 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  >szMalloc);.    
c1c0: 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a  if( zP4!=pMem->z
c1d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c1e0: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70  3VdbeMemSetStr(p
c1f0: 4d 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20 53 51  Mem, zP4, -1, SQ
c200: 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20  LITE_UTF8, 0);. 
c210: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c220: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21  assert( pMem->z!
c230: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  =0 );.      pMem
c240: 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ->n = sqlite3Str
c250: 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  len30(pMem->z);.
c260: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
c270: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
c280: 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b     }.    pMem++;
c290: 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70  ..    if( p->exp
c2a0: 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20  lain==1 ){.     
c2b0: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
c2c0: 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a  MemClearAndResiz
c2d0: 65 28 70 4d 65 6d 2c 20 34 29 20 29 7b 0a 20 20  e(pMem, 4) ){.  
c2e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
c2f0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
c300: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  d );.        ret
c310: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
c320: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c330: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
c340: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
c350: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
c360: 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  2;.      sqlite3
c370: 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65  _snprintf(3, pMe
c380: 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f  m->z, "%.2x", pO
c390: 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20  p->p5);   /* P5 
c3a0: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  */.      pMem->e
c3b0: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
c3c0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ;.      pMem++;.
c3d0: 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45    .#ifdef SQLITE
c3e0: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
c3f0: 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 69  COMMENTS.      i
c400: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
c410: 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28  mClearAndResize(
c420: 70 4d 65 6d 2c 20 35 30 30 29 20 29 7b 0a 20 20  pMem, 500) ){.  
c430: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
c440: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
c450: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  d );.        ret
c460: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
c470: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c480: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
c490: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
c4a0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
c4b0: 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70  displayComment(p
c4c0: 4f 70 2c 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a  Op, zP4, pMem->z
c4d0: 2c 20 35 30 30 29 3b 0a 20 20 20 20 20 20 70 4d  , 500);.      pM
c4e0: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
c4f0: 5f 55 54 46 38 3b 0a 23 65 6c 73 65 0a 20 20 20  _UTF8;.#else.   
c500: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
c510: 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20   MEM_Null;      
c520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c530: 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 23   /* Comment */.#
c540: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
c550: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d   p->nResColumn =
c560: 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61   8 - 4*(p->expla
c570: 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 70 52  in-1);.    p->pR
c580: 65 73 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61  esultSet = &p->a
c590: 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 72  Mem[1];.    p->r
c5a0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
c5b0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
c5c0: 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OW;.  }.  return
c5d0: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
c5e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
c5f0: 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20  LAIN */..#ifdef 
c600: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
c610: 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c  ** Print the SQL
c620: 20 74 68 61 74 20 77 61 73 20 75 73 65 64 20 74   that was used t
c630: 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56 44 42  o generate a VDB
c640: 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f  E program..*/.vo
c650: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  id sqlite3VdbePr
c660: 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b  intSql(Vdbe *p){
c670: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
c680: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a   = 0;.  if( p->z
c690: 53 71 6c 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70  Sql ){.    z = p
c6a0: 2d 3e 7a 53 71 6c 3b 0a 20 20 7d 65 6c 73 65 20  ->zSql;.  }else 
c6b0: 69 66 28 20 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b  if( p->nOp>=1 ){
c6c0: 0a 20 20 20 20 63 6f 6e 73 74 20 56 64 62 65 4f  .    const VdbeO
c6d0: 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  p *pOp = &p->aOp
c6e0: 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 4f 70  [0];.    if( pOp
c6f0: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69  ->opcode==OP_Ini
c700: 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d  t && pOp->p4.z!=
c710: 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 70  0 ){.      z = p
c720: 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20  Op->p4.z;.      
c730: 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73  while( sqlite3Is
c740: 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b  space(*z) ) z++;
c750: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
c760: 20 7a 20 29 20 70 72 69 6e 74 66 28 22 53 51 4c   z ) printf("SQL
c770: 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d  : [%s]\n", z);.}
c780: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
c790: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
c7a0: 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69  T_TRACE) && defi
c7b0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
c7c0: 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a  E_IOTRACE)./*.**
c7d0: 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43   Print an IOTRAC
c7e0: 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e  E message showin
c7f0: 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a  g SQL content..*
c800: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
c810: 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62  beIOTraceSql(Vdb
c820: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70  e *p){.  int nOp
c830: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62   = p->nOp;.  Vdb
c840: 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20  eOp *pOp;.  if( 
c850: 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d  sqlite3IoTrace==
c860: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
c870: 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e  ( nOp<1 ) return
c880: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
c890: 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d  p[0];.  if( pOp-
c8a0: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74  >opcode==OP_Init
c8b0: 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30   && pOp->p4.z!=0
c8c0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   ){.    int i, j
c8d0: 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30  ;.    char z[100
c8e0: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0];.    sqlite3_
c8f0: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
c900: 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70  z), z, "%s", pOp
c910: 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72  ->p4.z);.    for
c920: 28 69 3d 30 3b 20 73 71 6c 69 74 65 33 49 73 73  (i=0; sqlite3Iss
c930: 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29  pace(z[i]); i++)
c940: 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  {}.    for(j=0; 
c950: 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
c960: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 73    if( sqlite3Iss
c970: 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20  pace(z[i]) ){.  
c980: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d        if( z[i-1]
c990: 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20  !=' ' ){.       
c9a0: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b     z[j++] = ' ';
c9b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c9c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c9d0: 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20  z[j++] = z[i];. 
c9e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
c9f0: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73   z[j] = 0;.    s
ca00: 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28 22 53  qlite3IoTrace("S
ca10: 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20  QL %s\n", z);.  
ca20: 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53  }.}.#endif /* !S
ca30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
ca40: 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
ca50: 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a  E_IOTRACE */../*
ca60: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
ca70: 74 68 69 73 20 6f 62 6a 65 63 74 20 64 65 73 63  this object desc
ca80: 72 69 62 65 73 20 62 75 6c 6b 20 6d 65 6d 6f 72  ribes bulk memor
ca90: 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  y available for 
caa0: 75 73 65 0a 2a 2a 20 62 79 20 73 75 62 63 6f 6d  use.** by subcom
cab0: 70 6f 6e 65 6e 74 73 20 6f 66 20 61 20 70 72 65  ponents of a pre
cac0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
cad0: 20 20 53 70 61 63 65 20 69 73 20 61 6c 6c 6f 63    Space is alloc
cae0: 61 74 65 64 20 6f 75 74 0a 2a 2a 20 6f 66 20 61  ated out.** of a
caf0: 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 6f   ReusableSpace o
cb00: 62 6a 65 63 74 20 62 79 20 74 68 65 20 61 6c 6c  bject by the all
cb10: 6f 63 53 70 61 63 65 28 29 20 72 6f 75 74 69 6e  ocSpace() routin
cb20: 65 20 62 65 6c 6f 77 2e 0a 2a 2f 0a 73 74 72 75  e below..*/.stru
cb30: 63 74 20 52 65 75 73 61 62 6c 65 53 70 61 63 65  ct ReusableSpace
cb40: 20 7b 0a 20 20 75 38 20 2a 70 53 70 61 63 65 3b   {.  u8 *pSpace;
cb50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 76 61            /* Ava
cb60: 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f  ilable memory */
cb70: 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20  .  int nFree;   
cb80: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
cb90: 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6d 65   of available me
cba0: 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  mory */.  int nN
cbb0: 65 65 64 65 64 3b 20 20 20 20 20 20 20 20 20 2f  eeded;         /
cbc0: 2a 20 54 6f 74 61 6c 20 62 79 74 65 73 20 74 68  * Total bytes th
cbd0: 61 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  at could not be 
cbe0: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 7d 3b 0a  allocated */.};.
cbf0: 0a 2f 2a 20 54 72 79 20 74 6f 20 61 6c 6c 6f 63  ./* Try to alloc
cc00: 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20  ate nByte bytes 
cc10: 6f 66 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65  of 8-byte aligne
cc20: 64 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 66 6f  d bulk memory fo
cc30: 72 20 70 42 75 66 0a 2a 2a 20 66 72 6f 6d 20 74  r pBuf.** from t
cc40: 68 65 20 52 65 75 73 61 62 6c 65 53 70 61 63 65  he ReusableSpace
cc50: 20 6f 62 6a 65 63 74 2e 20 20 52 65 74 75 72 6e   object.  Return
cc60: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
cc70: 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 6d  e allocated.** m
cc80: 65 6d 6f 72 79 20 6f 6e 20 73 75 63 63 65 73 73  emory on success
cc90: 2e 20 20 49 66 20 69 6e 73 75 66 66 69 63 69 65  .  If insufficie
cca0: 6e 74 20 6d 65 6d 6f 72 79 20 69 73 20 61 76 61  nt memory is ava
ccb0: 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 0a 2a 2a  ilable in the.**
ccc0: 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 6f   ReusableSpace o
ccd0: 62 6a 65 63 74 2c 20 69 6e 63 72 65 61 73 65 20  bject, increase 
cce0: 74 68 65 20 52 65 75 73 61 62 6c 65 53 70 61 63  the ReusableSpac
ccf0: 65 2e 6e 4e 65 65 64 65 64 0a 2a 2a 20 76 61 6c  e.nNeeded.** val
cd00: 75 65 20 62 79 20 74 68 65 20 61 6d 6f 75 6e 74  ue by the amount
cd10: 20 6e 65 65 64 65 64 20 61 6e 64 20 72 65 74 75   needed and retu
cd20: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  rn NULL..**.** I
cd30: 66 20 70 42 75 66 20 69 73 20 6e 6f 74 20 69 6e  f pBuf is not in
cd40: 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68  itially NULL, th
cd50: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  at means that th
cd60: 65 20 6d 65 6d 6f 72 79 20 68 61 73 20 61 6c 72  e memory has alr
cd70: 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c  eady.** been all
cd80: 6f 63 61 74 65 64 20 62 79 20 61 20 70 72 69 6f  ocated by a prio
cd90: 72 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  r call to this r
cda0: 6f 75 74 69 6e 65 2c 20 73 6f 20 6a 75 73 74 20  outine, so just 
cdb0: 72 65 74 75 72 6e 20 61 20 63 6f 70 79 0a 2a 2a  return a copy.**
cdc0: 20 6f 66 20 70 42 75 66 20 61 6e 64 20 6c 65 61   of pBuf and lea
cdd0: 76 65 20 52 65 75 73 61 62 6c 65 53 70 61 63 65  ve ReusableSpace
cde0: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
cdf0: 2a 20 54 68 69 73 20 61 6c 6c 6f 63 61 74 6f 72  * This allocator
ce00: 20 69 73 20 65 6d 70 6c 6f 79 65 64 20 74 6f 20   is employed to 
ce10: 72 65 70 75 72 70 6f 73 65 20 75 6e 75 73 65 64  repurpose unused
ce20: 20 73 6c 6f 74 73 20 61 74 20 74 68 65 20 65 6e   slots at the en
ce30: 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 70 63 6f  d of the.** opco
ce40: 64 65 20 61 72 72 61 79 20 6f 66 20 70 72 65 70  de array of prep
ce50: 61 72 65 64 20 73 74 61 74 65 20 66 6f 72 20 6f  ared state for o
ce60: 74 68 65 72 20 6d 65 6d 6f 72 79 20 6e 65 65 64  ther memory need
ce70: 73 20 6f 66 20 74 68 65 20 70 72 65 70 61 72 65  s of the prepare
ce80: 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a  d.** statement..
ce90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
cea0: 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20 73 74  allocSpace(.  st
ceb0: 72 75 63 74 20 52 65 75 73 61 62 6c 65 53 70 61  ruct ReusableSpa
cec0: 63 65 20 2a 70 2c 20 20 2f 2a 20 42 75 6c 6b 20  ce *p,  /* Bulk 
ced0: 6d 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65  memory available
cee0: 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   for allocation 
cef0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  */.  void *pBuf,
cf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cf10: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 70  * Pointer to a p
cf20: 72 69 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  rior allocation 
cf30: 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 20  */.  int nByte  
cf40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cf50: 2a 20 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72  * Bytes of memor
cf60: 79 20 6e 65 65 64 65 64 20 2a 2f 0a 29 7b 0a 20  y needed */.){. 
cf70: 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
cf80: 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 2d  YTE_ALIGNMENT(p-
cf90: 3e 70 53 70 61 63 65 29 20 29 3b 0a 20 20 69 66  >pSpace) );.  if
cfa0: 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20  ( pBuf==0 ){.   
cfb0: 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28   nByte = ROUND8(
cfc0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
cfd0: 6e 42 79 74 65 20 3c 3d 20 70 2d 3e 6e 46 72 65  nByte <= p->nFre
cfe0: 65 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 46  e ){.      p->nF
cff0: 72 65 65 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20  ree -= nByte;.  
d000: 20 20 20 20 70 42 75 66 20 3d 20 26 70 2d 3e 70      pBuf = &p->p
d010: 53 70 61 63 65 5b 70 2d 3e 6e 46 72 65 65 5d 3b  Space[p->nFree];
d020: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d030: 20 20 70 2d 3e 6e 4e 65 65 64 65 64 20 2b 3d 20    p->nNeeded += 
d040: 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  nByte;.    }.  }
d050: 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
d060: 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
d070: 70 42 75 66 29 20 29 3b 0a 20 20 72 65 74 75 72  pBuf) );.  retur
d080: 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pBuf;.}../*.**
d090: 20 52 65 77 69 6e 64 20 74 68 65 20 56 44 42 45   Rewind the VDBE
d0a0: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67   back to the beg
d0b0: 69 6e 6e 69 6e 67 20 69 6e 20 70 72 65 70 61 72  inning in prepar
d0c0: 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e  ation for.** run
d0d0: 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64  ning it..*/.void
d0e0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69   sqlite3VdbeRewi
d0f0: 6e 64 28 56 64 62 65 20 2a 70 29 7b 0a 23 69 66  nd(Vdbe *p){.#if
d100: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
d110: 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
d120: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a  d(VDBE_PROFILE).
d130: 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a    int i;.#endif.
d140: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
d150: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
d160: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
d170: 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54  _INIT );..  /* T
d180: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61  here should be a
d190: 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f  t least one opco
d1a0: 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  de..  */.  asser
d1b0: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a  t( p->nOp>0 );..
d1c0: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67    /* Set the mag
d1d0: 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43  ic to VDBE_MAGIC
d1e0: 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68  _RUN sooner rath
d1f0: 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a  er than later. *
d200: 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  /.  p->magic = V
d210: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a  DBE_MAGIC_RUN;..
d220: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
d230: 42 55 47 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69  BUG.  for(i=1; i
d240: 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a  <p->nMem; i++){.
d250: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
d260: 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62  Mem[i].db==p->db
d270: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   );.  }.#endif. 
d280: 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70   p->pc = -1;.  p
d290: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
d2a0: 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69  ;.  p->errorActi
d2b0: 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20  on = OE_Abort;. 
d2c0: 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
d2d0: 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d  .  p->cacheCtr =
d2e0: 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74   1;.  p->minWrit
d2f0: 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35  eFileFormat = 25
d300: 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65  5;.  p->iStateme
d310: 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b  nt = 0;.  p->nFk
d320: 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a  Constraint = 0;.
d330: 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46  #ifdef VDBE_PROF
d340: 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ILE.  for(i=0; i
d350: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
d360: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
d370: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f 70   = 0;.    p->aOp
d380: 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a  [i].cycles = 0;.
d390: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
d3a0: 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76 69  .** Prepare a vi
d3b0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f  rtual machine fo
d3c0: 72 20 65 78 65 63 75 74 69 6f 6e 20 66 6f 72 20  r execution for 
d3d0: 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  the first time a
d3e0: 66 74 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e 67  fter.** creating
d3f0: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
d400: 68 69 6e 65 2e 20 20 54 68 69 73 20 69 6e 76 6f  hine.  This invo
d410: 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75 63 68  lves things such
d420: 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e  .** as allocatin
d430: 67 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20  g registers and 
d440: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
d450: 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72   program counter
d460: 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56  ..** After the V
d470: 44 42 45 20 68 61 73 20 62 65 20 70 72 65 70 70  DBE has be prepp
d480: 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78  ed, it can be ex
d490: 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72  ecuted by one or
d4a0: 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74   more.** calls t
d4b0: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  o sqlite3VdbeExe
d4c0: 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  c().  .**.** Thi
d4d0: 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
d4e0: 65 20 63 61 6c 6c 65 64 20 65 78 61 63 74 6c 79  e called exactly
d4f0: 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20 76 69   once on each vi
d500: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a  rtual machine..*
d510: 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75  * After this rou
d520: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
d530: 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20 22  he VM has been "
d540: 70 61 63 6b 61 67 65 64 22 20 61 6e 64 20 69 73  packaged" and is
d550: 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75 6e   ready.** to run
d560: 2e 20 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  .  After this ro
d570: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
d580: 20 66 75 72 74 68 65 72 20 63 61 6c 6c 73 20 74   further calls t
d590: 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  o .** sqlite3Vdb
d5a0: 65 41 64 64 4f 70 28 29 20 66 75 6e 63 74 69 6f  eAddOp() functio
d5b0: 6e 73 20 61 72 65 20 70 72 6f 68 69 62 69 74 65  ns are prohibite
d5c0: 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
d5d0: 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20   disconnects.** 
d5e0: 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68  the Vdbe from th
d5f0: 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 74  e Parse object t
d600: 68 61 74 20 68 65 6c 70 65 64 20 67 65 6e 65 72  hat helped gener
d610: 61 74 65 20 69 74 20 73 6f 20 74 68 61 74 20 74  ate it so that t
d620: 68 65 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 62  he.** the Vdbe b
d630: 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70 65  ecomes an indepe
d640: 6e 64 65 6e 74 20 65 6e 74 69 74 79 20 61 6e 64  ndent entity and
d650: 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
d660: 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73 74  t can be.** dest
d670: 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65  royed..**.** Use
d680: 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65   the sqlite3Vdbe
d690: 52 65 77 69 6e 64 28 29 20 70 72 6f 63 65 64 75  Rewind() procedu
d6a0: 72 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20  re to restore a 
d6b0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
d6c0: 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20 69  back.** to its i
d6d0: 6e 69 74 69 61 6c 20 73 74 61 74 65 20 61 66 74  nitial state aft
d6e0: 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 72  er it has been r
d6f0: 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  un..*/.void sqli
d700: 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79  te3VdbeMakeReady
d710: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
d720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d730: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a     /* The VDBE *
d740: 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
d750: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
d760: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
d770: 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71  ntext */.){.  sq
d780: 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
d790: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d7a0: 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
d7b0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
d7c0: 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20 20   nVar;          
d7d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
d7e0: 75 6d 62 65 72 20 6f 66 20 70 61 72 61 6d 65 74  umber of paramet
d7f0: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65  ers */.  int nMe
d800: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
d810: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
d820: 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20 72  r of VM memory r
d830: 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e  egisters */.  in
d840: 74 20 6e 43 75 72 73 6f 72 3b 20 20 20 20 20 20  t nCursor;      
d850: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d860: 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  Number of cursor
d870: 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  s required */.  
d880: 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20  int nArg;       
d890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d8a0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
d8b0: 6d 65 6e 74 73 20 69 6e 20 73 75 62 70 72 6f 67  ments in subprog
d8c0: 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  rams */.  int nO
d8d0: 6e 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  nce;            
d8e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
d8f0: 65 72 20 6f 66 20 4f 50 5f 4f 6e 63 65 20 69 6e  er of OP_Once in
d900: 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  structions */.  
d910: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
d920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d930: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
d940: 2f 0a 20 20 73 74 72 75 63 74 20 52 65 75 73 61  /.  struct Reusa
d950: 62 6c 65 53 70 61 63 65 20 78 3b 20 20 20 20 20  bleSpace x;     
d960: 20 20 20 2f 2a 20 52 65 75 73 61 62 6c 65 20 62     /* Reusable b
d970: 75 6c 6b 20 6d 65 6d 6f 72 79 20 2a 2f 0a 0a 20  ulk memory */.. 
d980: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
d990: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
d9a0: 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  p>0 );.  assert(
d9b0: 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20   pParse!=0 );.  
d9c0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
d9d0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
d9e0: 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  T );.  assert( p
d9f0: 50 61 72 73 65 3d 3d 70 2d 3e 70 50 61 72 73 65  Parse==p->pParse
da00: 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62   );.  db = p->db
da10: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
da20: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
da30: 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50 61 72  );.  nVar = pPar
da40: 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d  se->nVar;.  nMem
da50: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   = pParse->nMem;
da60: 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20 70 50 61  .  nCursor = pPa
da70: 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72  rse->nTab;.  nAr
da80: 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78  g = pParse->nMax
da90: 41 72 67 3b 0a 20 20 6e 4f 6e 63 65 20 3d 20 70  Arg;.  nOnce = p
daa0: 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 3b 0a 20 20  Parse->nOnce;.  
dab0: 69 66 28 20 6e 4f 6e 63 65 3d 3d 30 20 29 20 6e  if( nOnce==0 ) n
dac0: 4f 6e 63 65 20 3d 20 31 3b 20 2f 2a 20 45 6e 73  Once = 1; /* Ens
dad0: 75 72 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ure at least one
dae0: 20 62 79 74 65 20 69 6e 20 70 2d 3e 61 4f 6e 63   byte in p->aOnc
daf0: 65 46 6c 61 67 5b 5d 20 2a 2f 0a 20 20 0a 20 20  eFlag[] */.  .  
db00: 2f 2a 20 46 6f 72 20 65 61 63 68 20 63 75 72 73  /* For each curs
db10: 6f 72 20 72 65 71 75 69 72 65 64 2c 20 61 6c 73  or required, als
db20: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65 6d  o allocate a mem
db30: 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79  ory cell. Memory
db40: 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d 65  .  ** cells (nMe
db50: 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d  m+1-nCursor)..nM
db60: 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20 77  em, inclusive, w
db70: 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65  ill never be use
db80: 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 76 64  d by.  ** the vd
db90: 62 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73 74  be program. Inst
dba0: 65 61 64 20 74 68 65 79 20 61 72 65 20 75 73 65  ead they are use
dbb0: 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  d to allocate me
dbc0: 6d 6f 72 79 20 66 6f 72 0a 20 20 2a 2a 20 56 64  mory for.  ** Vd
dbd0: 62 65 43 75 72 73 6f 72 2f 42 74 43 75 72 73 6f  beCursor/BtCurso
dbe0: 72 20 73 74 72 75 63 74 75 72 65 73 2e 20 54 68  r structures. Th
dbf0: 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79  e blob of memory
dc00: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
dc10: 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 30 20   .  ** cursor 0 
dc20: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d  is stored in mem
dc30: 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d  ory cell nMem. M
dc40: 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d  emory cell (nMem
dc50: 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20  -1).  ** stores 
dc60: 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f  the blob of memo
dc70: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
dc80: 74 68 20 63 75 72 73 6f 72 20 31 2c 20 65 74 63  th cursor 1, etc
dc90: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20  ..  **.  ** See 
dca0: 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75  also: allocateCu
dcb0: 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e  rsor()..  */.  n
dcc0: 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a  Mem += nCursor;.
dcd0: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
dce0: 20 68 6f 77 20 6d 75 63 68 20 72 65 75 73 61 62   how much reusab
dcf0: 6c 65 20 6d 65 6d 6f 72 79 20 69 73 20 61 76 61  le memory is ava
dd00: 69 6c 61 62 6c 65 20 61 74 20 74 68 65 20 65 6e  ilable at the en
dd10: 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6f 70  d of the.  ** op
dd20: 63 6f 64 65 20 61 72 72 61 79 2e 20 20 54 68 69  code array.  Thi
dd30: 73 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 77  s extra memory w
dd40: 69 6c 6c 20 62 65 20 72 65 61 6c 6c 6f 63 61 74  ill be reallocat
dd50: 65 64 20 66 6f 72 20 6f 74 68 65 72 20 65 6c 65  ed for other ele
dd60: 6d 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68  ments.  ** of th
dd70: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
dd80: 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 20 3d  ment..  */.  n =
dd90: 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4f   ROUND8(sizeof(O
dda0: 70 29 2a 70 2d 3e 6e 4f 70 29 3b 20 20 20 20 20  p)*p->nOp);     
ddb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
ddc0: 73 20 6f 66 20 6f 70 63 6f 64 65 20 6d 65 6d 6f  s of opcode memo
ddd0: 72 79 20 75 73 65 64 20 2a 2f 0a 20 20 78 2e 70  ry used */.  x.p
dde0: 53 70 61 63 65 20 3d 20 26 28 28 75 38 2a 29 70  Space = &((u8*)p
ddf0: 2d 3e 61 4f 70 29 5b 6e 5d 3b 20 20 20 20 20 20  ->aOp)[n];      
de00: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73           /* Unus
de10: 65 64 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79  ed opcode memory
de20: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 45 49   */.  assert( EI
de30: 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
de40: 4e 54 28 78 2e 70 53 70 61 63 65 29 20 29 3b 0a  NT(x.pSpace) );.
de50: 20 20 78 2e 6e 46 72 65 65 20 3d 20 52 4f 55 4e    x.nFree = ROUN
de60: 44 44 4f 57 4e 38 28 70 50 61 72 73 65 2d 3e 73  DDOWN8(pParse->s
de70: 7a 4f 70 41 6c 6c 6f 63 20 2d 20 6e 29 3b 20 20  zOpAlloc - n);  
de80: 2f 2a 20 42 79 74 65 73 20 6f 66 20 75 6e 75 73  /* Bytes of unus
de90: 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 61  ed memory */.  a
dea0: 73 73 65 72 74 28 20 78 2e 6e 46 72 65 65 3e 3d  ssert( x.nFree>=
deb0: 30 20 29 3b 0a 20 20 69 66 28 20 78 2e 6e 46 72  0 );.  if( x.nFr
dec0: 65 65 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73  ee>0 ){.    mems
ded0: 65 74 28 78 2e 70 53 70 61 63 65 2c 20 30 2c 20  et(x.pSpace, 0, 
dee0: 78 2e 6e 46 72 65 65 29 3b 0a 20 20 20 20 61 73  x.nFree);.    as
def0: 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
df00: 5f 41 4c 49 47 4e 4d 45 4e 54 28 26 78 2e 70 53  _ALIGNMENT(&x.pS
df10: 70 61 63 65 5b 78 2e 6e 46 72 65 65 5d 29 20 29  pace[x.nFree]) )
df20: 3b 0a 20 20 7d 0a 0a 20 20 72 65 73 6f 6c 76 65  ;.  }..  resolve
df30: 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72  P2Values(p, &nAr
df40: 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d  g);.  p->usesStm
df50: 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 28  tJournal = (u8)(
df60: 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57  pParse->isMultiW
df70: 72 69 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e  rite && pParse->
df80: 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20 69 66 28  mayAbort);.  if(
df90: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
dfa0: 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20   && nMem<10 ){. 
dfb0: 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20     nMem = 10;.  
dfc0: 7d 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d  }.  p->expired =
dfd0: 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79   0;..  /* Memory
dfe0: 20 66 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20   for registers, 
dff0: 70 61 72 61 6d 65 74 65 72 73 2c 20 63 75 72 73  parameters, curs
e000: 6f 72 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f  or, etc, is allo
e010: 63 61 74 65 64 20 69 6e 20 6f 6e 65 20 6f 72 20  cated in one or 
e020: 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65 73 2e  two.  ** passes.
e030: 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 70    On the first p
e040: 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f 20 72  ass, we try to r
e050: 65 75 73 65 20 75 6e 75 73 65 64 20 6d 65 6d 6f  euse unused memo
e060: 72 79 20 61 74 20 74 68 65 20 0a 20 20 2a 2a 20  ry at the .  ** 
e070: 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64  end of the opcod
e080: 65 20 61 72 72 61 79 2e 20 20 49 66 20 77 65 20  e array.  If we 
e090: 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73 61  are unable to sa
e0a0: 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 79  tisfy all memory
e0b0: 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 6d 65 6e  .  ** requiremen
e0c0: 74 73 20 62 79 20 72 65 75 73 69 6e 67 20 74 68  ts by reusing th
e0d0: 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20 74  e opcode array t
e0e0: 61 69 6c 2c 20 74 68 65 6e 20 74 68 65 20 73 65  ail, then the se
e0f0: 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20 77  cond.  ** pass w
e100: 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65 20  ill fill in the 
e110: 72 65 6d 61 69 6e 64 65 72 20 75 73 69 6e 67 20  remainder using 
e120: 61 20 66 72 65 73 68 20 6d 65 6d 6f 72 79 20 61  a fresh memory a
e130: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a  llocation.  .  *
e140: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d  *.  ** This two-
e150: 70 61 73 73 20 61 70 70 72 6f 61 63 68 20 74 68  pass approach th
e160: 61 74 20 72 65 75 73 65 73 20 61 73 20 6d 75 63  at reuses as muc
e170: 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73  h memory as poss
e180: 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74  ible from.  ** t
e190: 68 65 20 6c 65 66 74 6f 76 65 72 20 6d 65 6d 6f  he leftover memo
e1a0: 72 79 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ry at the end of
e1b0: 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61   the opcode arra
e1c0: 79 2e 20 20 54 68 69 73 20 63 61 6e 20 73 69 67  y.  This can sig
e1d0: 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20  nificantly.  ** 
e1e0: 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f 75 6e  reduce the amoun
e1f0: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64  t of memory held
e200: 20 62 79 20 61 20 70 72 65 70 61 72 65 64 20 73   by a prepared s
e210: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  tatement..  */. 
e220: 20 64 6f 20 7b 0a 20 20 20 20 78 2e 6e 4e 65 65   do {.    x.nNee
e230: 64 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  ded = 0;.    p->
e240: 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63  aMem = allocSpac
e250: 65 28 26 78 2c 20 70 2d 3e 61 4d 65 6d 2c 20 6e  e(&x, p->aMem, n
e260: 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29  Mem*sizeof(Mem))
e270: 3b 0a 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20  ;.    p->aVar = 
e280: 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70  allocSpace(&x, p
e290: 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a  ->aVar, nVar*siz
e2a0: 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 20 20 70  eof(Mem));.    p
e2b0: 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53  ->apArg = allocS
e2c0: 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 70 41 72  pace(&x, p->apAr
e2d0: 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d  g, nArg*sizeof(M
e2e0: 65 6d 2a 29 29 3b 0a 20 20 20 20 70 2d 3e 61 70  em*));.    p->ap
e2f0: 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Csr = allocSpace
e300: 28 26 78 2c 20 70 2d 3e 61 70 43 73 72 2c 20 6e  (&x, p->apCsr, n
e310: 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64  Cursor*sizeof(Vd
e320: 62 65 43 75 72 73 6f 72 2a 29 29 3b 0a 20 20 20  beCursor*));.   
e330: 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20   p->aOnceFlag = 
e340: 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70  allocSpace(&x, p
e350: 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 6e 4f 6e  ->aOnceFlag, nOn
e360: 63 65 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ce);.#ifdef SQLI
e370: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53  TE_ENABLE_STMT_S
e380: 43 41 4e 53 54 41 54 55 53 0a 20 20 20 20 70 2d  CANSTATUS.    p-
e390: 3e 61 6e 45 78 65 63 20 3d 20 61 6c 6c 6f 63 53  >anExec = allocS
e3a0: 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 6e 45 78  pace(&x, p->anEx
e3b0: 65 63 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f  ec, p->nOp*sizeo
e3c0: 66 28 69 36 34 29 29 3b 0a 23 65 6e 64 69 66 0a  f(i64));.#endif.
e3d0: 20 20 20 20 69 66 28 20 78 2e 6e 4e 65 65 64 65      if( x.nNeede
e3e0: 64 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  d==0 ) break;.  
e3f0: 20 20 78 2e 70 53 70 61 63 65 20 3d 20 70 2d 3e    x.pSpace = p->
e400: 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44  pFree = sqlite3D
e410: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
e420: 78 2e 6e 4e 65 65 64 65 64 29 3b 0a 20 20 20 20  x.nNeeded);.    
e430: 78 2e 6e 46 72 65 65 20 3d 20 78 2e 6e 4e 65 65  x.nFree = x.nNee
e440: 64 65 64 3b 0a 20 20 7d 77 68 69 6c 65 28 20 21  ded;.  }while( !
e450: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e460: 20 29 3b 0a 0a 20 20 70 2d 3e 6e 43 75 72 73 6f   );..  p->nCurso
e470: 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 70  r = nCursor;.  p
e480: 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 6e 4f  ->nOnceFlag = nO
e490: 6e 63 65 3b 0a 20 20 69 66 28 20 70 2d 3e 61 56  nce;.  if( p->aV
e4a0: 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61  ar ){.    p->nVa
e4b0: 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72 3b  r = (ynVar)nVar;
e4c0: 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c  .    for(n=0; n<
e4d0: 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20  nVar; n++){.    
e4e0: 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61    p->aVar[n].fla
e4f0: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
e500: 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e       p->aVar[n].
e510: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20  db = db;.    }. 
e520: 20 7d 0a 20 20 70 2d 3e 6e 7a 56 61 72 20 3d 20   }.  p->nzVar = 
e530: 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3b 0a 20  pParse->nzVar;. 
e540: 20 70 2d 3e 61 7a 56 61 72 20 3d 20 70 50 61 72   p->azVar = pPar
e550: 73 65 2d 3e 61 7a 56 61 72 3b 0a 20 20 70 50 61  se->azVar;.  pPa
e560: 72 73 65 2d 3e 6e 7a 56 61 72 20 3d 20 20 30 3b  rse->nzVar =  0;
e570: 0a 20 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  .  pParse->azVar
e580: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 61   = 0;.  if( p->a
e590: 4d 65 6d 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4d  Mem ){.    p->aM
e5a0: 65 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20 20 20  em--;           
e5b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d             /* aM
e5c0: 65 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31  em[] goes from 1
e5d0: 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 70 2d  ..nMem */.    p-
e5e0: 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20  >nMem = nMem;   
e5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e600: 20 20 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20         not from 
e610: 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20  0..nMem-1 */.   
e620: 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65   for(n=1; n<=nMe
e630: 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70  m; n++){.      p
e640: 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20  ->aMem[n].flags 
e650: 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b  = MEM_Undefined;
e660: 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e  .      p->aMem[n
e670: 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d  ].db = db;.    }
e680: 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70 6c 61 69  .  }.  p->explai
e690: 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  n = pParse->expl
e6a0: 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ain;.  sqlite3Vd
e6b0: 62 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a  beRewind(p);.}..
e6c0: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44  /*.** Close a VD
e6d0: 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65  BE cursor and re
e6e0: 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65  lease all the re
e6f0: 73 6f 75 72 63 65 73 20 74 68 61 74 20 63 75 72  sources that cur
e700: 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20  sor .** happens 
e710: 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64  to hold..*/.void
e720: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
e730: 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20  Cursor(Vdbe *p, 
e740: 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29  VdbeCursor *pCx)
e750: 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29  {.  if( pCx==0 )
e760: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
e770: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 78 2d  }.  assert( pCx-
e780: 3e 70 42 74 3d 3d 30 20 7c 7c 20 70 43 78 2d 3e  >pBt==0 || pCx->
e790: 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
e7a0: 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 73 77 69  E_BTREE );.  swi
e7b0: 74 63 68 28 20 70 43 78 2d 3e 65 43 75 72 54 79  tch( pCx->eCurTy
e7c0: 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 43  pe ){.    case C
e7d0: 55 52 54 59 50 45 5f 53 4f 52 54 45 52 3a 20 7b  URTYPE_SORTER: {
e7e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e7f0: 62 65 53 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d  beSorterClose(p-
e800: 3e 64 62 2c 20 70 43 78 29 3b 0a 20 20 20 20 20  >db, pCx);.     
e810: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
e820: 20 20 63 61 73 65 20 43 55 52 54 59 50 45 5f 42    case CURTYPE_B
e830: 54 52 45 45 3a 20 7b 0a 20 20 20 20 20 20 69 66  TREE: {.      if
e840: 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20  ( pCx->pBt ){.  
e850: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
e860: 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74  eeClose(pCx->pBt
e870: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  );.        /* Th
e880: 65 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77  e pCx->pCursor w
e890: 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74  ill be close aut
e8a0: 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69  omatically, if i
e8b0: 74 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20  t exists, by.   
e8c0: 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c       ** the call
e8d0: 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20   above. */.     
e8e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e8f0: 61 73 73 65 72 74 28 20 70 43 78 2d 3e 75 63 2e  assert( pCx->uc.
e900: 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20  pCursor!=0 );.  
e910: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
e920: 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43  eeCloseCursor(pC
e930: 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a  x->uc.pCursor);.
e940: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
e950: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
e960: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
e970: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
e980: 63 61 73 65 20 43 55 52 54 59 50 45 5f 56 54 41  case CURTYPE_VTA
e990: 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  B: {.      sqlit
e9a0: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
e9b0: 70 56 43 75 72 20 3d 20 70 43 78 2d 3e 75 63 2e  pVCur = pCx->uc.
e9c0: 70 56 43 75 72 3b 0a 20 20 20 20 20 20 63 6f 6e  pVCur;.      con
e9d0: 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  st sqlite3_modul
e9e0: 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 56 43  e *pModule = pVC
e9f0: 75 72 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75  ur->pVtab->pModu
ea00: 6c 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  le;.      assert
ea10: 28 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e  ( pVCur->pVtab->
ea20: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20  nRef>0 );.      
ea30: 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52  pVCur->pVtab->nR
ea40: 65 66 2d 2d 3b 0a 20 20 20 20 20 20 70 4d 6f 64  ef--;.      pMod
ea50: 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 43 75  ule->xClose(pVCu
ea60: 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  r);.      break;
ea70: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
ea80: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
ea90: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 69 6e 20   all cursors in 
eaa0: 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d  the current fram
eab0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
eac0: 64 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e  d closeCursorsIn
ead0: 46 72 61 6d 65 28 56 64 62 65 20 2a 70 29 7b 0a  Frame(Vdbe *p){.
eae0: 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29    if( p->apCsr )
eaf0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
eb00: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
eb10: 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20  Cursor; i++){.  
eb20: 20 20 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a      VdbeCursor *
eb30: 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d  pC = p->apCsr[i]
eb40: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 20 29  ;.      if( pC )
eb50: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
eb60: 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28  3VdbeFreeCursor(
eb70: 70 2c 20 70 43 29 3b 0a 20 20 20 20 20 20 20 20  p, pC);.        
eb80: 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b  p->apCsr[i] = 0;
eb90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
eba0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79   }.}../*.** Copy
ebb0: 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72   the values stor
ebc0: 65 64 20 69 6e 20 74 68 65 20 56 64 62 65 46 72  ed in the VdbeFr
ebd0: 61 6d 65 20 73 74 72 75 63 74 75 72 65 20 74 6f  ame structure to
ebe0: 20 69 74 73 20 56 64 62 65 2e 20 54 68 69 73 0a   its Vdbe. This.
ebf0: 2a 2a 20 69 73 20 75 73 65 64 2c 20 66 6f 72 20  ** is used, for 
ec00: 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20  example, when a 
ec10: 74 72 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67  trigger sub-prog
ec20: 72 61 6d 20 69 73 20 68 61 6c 74 65 64 20 74 6f  ram is halted to
ec30: 20 72 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74   restore.** cont
ec40: 72 6f 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e 20  rol to the main 
ec50: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20  program..*/.int 
ec60: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
ec70: 52 65 73 74 6f 72 65 28 56 64 62 65 46 72 61 6d  Restore(VdbeFram
ec80: 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56 64  e *pFrame){.  Vd
ec90: 62 65 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e  be *v = pFrame->
eca0: 76 3b 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f 72  v;.  closeCursor
ecb0: 73 49 6e 46 72 61 6d 65 28 76 29 3b 0a 23 69 66  sInFrame(v);.#if
ecc0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
ecd0: 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
ece0: 53 0a 20 20 76 2d 3e 61 6e 45 78 65 63 20 3d 20  S.  v->anExec = 
ecf0: 70 46 72 61 6d 65 2d 3e 61 6e 45 78 65 63 3b 0a  pFrame->anExec;.
ed00: 23 65 6e 64 69 66 0a 20 20 76 2d 3e 61 4f 6e 63  #endif.  v->aOnc
ed10: 65 46 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e  eFlag = pFrame->
ed20: 61 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e  aOnceFlag;.  v->
ed30: 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 72 61  nOnceFlag = pFra
ed40: 6d 65 2d 3e 6e 4f 6e 63 65 46 6c 61 67 3b 0a 20  me->nOnceFlag;. 
ed50: 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65   v->aOp = pFrame
ed60: 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20  ->aOp;.  v->nOp 
ed70: 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20  = pFrame->nOp;. 
ed80: 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d   v->aMem = pFram
ed90: 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d  e->aMem;.  v->nM
eda0: 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65  em = pFrame->nMe
edb0: 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d 20  m;.  v->apCsr = 
edc0: 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20  pFrame->apCsr;. 
edd0: 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46   v->nCursor = pF
ede0: 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20  rame->nCursor;. 
edf0: 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69   v->db->lastRowi
ee00: 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74  d = pFrame->last
ee10: 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61  Rowid;.  v->nCha
ee20: 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43  nge = pFrame->nC
ee30: 68 61 6e 67 65 3b 0a 20 20 76 2d 3e 64 62 2d 3e  hange;.  v->db->
ee40: 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65  nChange = pFrame
ee50: 2d 3e 6e 44 62 43 68 61 6e 67 65 3b 0a 20 20 72  ->nDbChange;.  r
ee60: 65 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63  eturn pFrame->pc
ee70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
ee80: 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a   all cursors..**
ee90: 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65  .** Also release
eea0: 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d   any dynamic mem
eeb0: 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68 65 20  ory held by the 
eec0: 56 4d 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61  VM in the Vdbe.a
eed0: 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63  Mem memory .** c
eee0: 65 6c 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20  ell array. This 
eef0: 69 73 20 6e 65 63 65 73 73 61 72 79 20 61 73 20  is necessary as 
ef00: 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
ef10: 61 72 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69  array may contai
ef20: 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f  n.** pointers to
ef30: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
ef40: 74 73 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e  ts, which may in
ef50: 20 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f   turn contain po
ef60: 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65  inters to.** ope
ef70: 6e 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74  n cursors..*/.st
ef80: 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41  atic void closeA
ef90: 6c 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a  llCursors(Vdbe *
efa0: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72  p){.  if( p->pFr
efb0: 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46  ame ){.    VdbeF
efc0: 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20  rame *pFrame;.  
efd0: 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e    for(pFrame=p->
efe0: 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e  pFrame; pFrame->
eff0: 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d  pParent; pFrame=
f000: 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29  pFrame->pParent)
f010: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
f020: 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46  eFrameRestore(pF
f030: 72 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70 46  rame);.    p->pF
f040: 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d  rame = 0;.    p-
f050: 3e 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  >nFrame = 0;.  }
f060: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 46  .  assert( p->nF
f070: 72 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 63 6c 6f  rame==0 );.  clo
f080: 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65  seCursorsInFrame
f090: 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d  (p);.  if( p->aM
f0a0: 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  em ){.    releas
f0b0: 65 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d  eMemArray(&p->aM
f0c0: 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b  em[1], p->nMem);
f0d0: 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d  .  }.  while( p-
f0e0: 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20 20  >pDelFrame ){.  
f0f0: 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 44 65    VdbeFrame *pDe
f100: 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65  l = p->pDelFrame
f110: 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46 72 61  ;.    p->pDelFra
f120: 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72 65  me = pDel->pPare
f130: 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  nt;.    sqlite3V
f140: 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28 70  dbeFrameDelete(p
f150: 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Del);.  }..  /* 
f160: 44 65 6c 65 74 65 20 61 6e 79 20 61 75 78 64 61  Delete any auxda
f170: 74 61 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d  ta allocations m
f180: 61 64 65 20 62 79 20 74 68 65 20 56 4d 20 2a 2f  ade by the VM */
f190: 0a 20 20 69 66 28 20 70 2d 3e 70 41 75 78 44 61  .  if( p->pAuxDa
f1a0: 74 61 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  ta ) sqlite3Vdbe
f1b0: 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 70 2c  DeleteAuxData(p,
f1c0: 20 2d 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72   -1, 0);.  asser
f1d0: 74 28 20 70 2d 3e 70 41 75 78 44 61 74 61 3d 3d  t( p->pAuxData==
f1e0: 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  0 );.}../*.** Cl
f1f0: 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66  ean up the VM af
f200: 74 65 72 20 61 20 73 69 6e 67 6c 65 20 72 75 6e  ter a single run
f210: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
f220: 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70   Cleanup(Vdbe *p
f230: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
f240: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65   = p->db;..#ifde
f250: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
f260: 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73 65   /* Execute asse
f270: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
f280: 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
f290: 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20  he Vdbe.apCsr[] 
f2a0: 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61  and .  ** Vdbe.a
f2b0: 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76  Mem[] arrays hav
f2c0: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  e already been c
f2d0: 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20  leaned up.  */. 
f2e0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d   int i;.  if( p-
f2f0: 3e 61 70 43 73 72 20 29 20 66 6f 72 28 69 3d 30  >apCsr ) for(i=0
f300: 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20  ; i<p->nCursor; 
f310: 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e  i++) assert( p->
f320: 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20  apCsr[i]==0 );. 
f330: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a   if( p->aMem ){.
f340: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d      for(i=1; i<=
f350: 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73  p->nMem; i++) as
f360: 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d  sert( p->aMem[i]
f370: 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 55 6e 64 65  .flags==MEM_Unde
f380: 66 69 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e  fined );.  }.#en
f390: 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 44 62  dif..  sqlite3Db
f3a0: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
f3b0: 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d  Msg);.  p->zErrM
f3c0: 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65  sg = 0;.  p->pRe
f3d0: 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a  sultSet = 0;.}..
f3e0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75  /*.** Set the nu
f3f0: 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
f400: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c  olumns that will
f410: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
f420: 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74  this SQL.** stat
f430: 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e  ement. This is n
f440: 6f 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c  ow set at compil
f450: 65 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74  e time, rather t
f460: 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78  han during.** ex
f470: 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76  ecution of the v
f480: 64 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74  dbe program so t
f490: 68 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  hat sqlite3_colu
f4a0: 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a  mn_count() can.*
f4b0: 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61  * be called on a
f4c0: 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  n SQL statement 
f4d0: 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73  before sqlite3_s
f4e0: 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tep()..*/.void s
f4f0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
f500: 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e  Cols(Vdbe *p, in
f510: 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20  t nResColumn){. 
f520: 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a   Mem *pColName;.
f530: 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
f540: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
f550: 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
f560: 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20  ay(p->aColName, 
f570: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f  p->nResColumn*CO
f580: 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69  LNAME_N);.  sqli
f590: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
f5a0: 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20  >aColName);.  n 
f5b0: 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c  = nResColumn*COL
f5c0: 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65  NAME_N;.  p->nRe
f5d0: 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e  sColumn = (u16)n
f5e0: 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e  ResColumn;.  p->
f5f0: 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e  aColName = pColN
f600: 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69  ame = (Mem*)sqli
f610: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
f620: 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a  db, sizeof(Mem)*
f630: 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43  n );.  if( p->aC
f640: 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75  olName==0 ) retu
f650: 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d  rn;.  while( n--
f660: 20 3e 20 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c   > 0 ){.    pCol
f670: 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  Name->flags = ME
f680: 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c  M_Null;.    pCol
f690: 4e 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62  Name->db = p->db
f6a0: 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b  ;.    pColName++
f6b0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
f6c0: 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  et the name of t
f6d0: 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e  he idx'th column
f6e0: 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
f6f0: 62 79 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  by the SQL state
f700: 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d  ment..** zName m
f710: 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72  ust be a pointer
f720: 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e   to a nul termin
f730: 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a  ated string..**.
f740: 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73  ** This call mus
f750: 74 20 62 65 20 6d 61 64 65 20 61 66 74 65 72 20  t be made after 
f760: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
f770: 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28  3VdbeSetNumCols(
f780: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e  )..**.** The fin
f790: 61 6c 20 70 61 72 61 6d 65 74 65 72 2c 20 78 44  al parameter, xD
f7a0: 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65 20  el, must be one 
f7b0: 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  of SQLITE_DYNAMI
f7c0: 43 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  C, SQLITE_STATIC
f7d0: 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54 52  .** or SQLITE_TR
f7e0: 41 4e 53 49 45 4e 54 2e 20 49 66 20 69 74 20 69  ANSIENT. If it i
f7f0: 73 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  s SQLITE_DYNAMIC
f800: 2c 20 74 68 65 6e 20 74 68 65 20 62 75 66 66 65  , then the buffe
f810: 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20  r pointed.** to 
f820: 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65  by zName will be
f830: 20 66 72 65 65 64 20 62 79 20 73 71 6c 69 74 65   freed by sqlite
f840: 33 44 62 46 72 65 65 28 29 20 77 68 65 6e 20 74  3DbFree() when t
f850: 68 65 20 76 64 62 65 20 69 73 20 64 65 73 74 72  he vdbe is destr
f860: 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oyed..*/.int sql
f870: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
f880: 6d 65 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  me(.  Vdbe *p,  
f890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8a0: 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 62         /* Vdbe b
f8b0: 65 69 6e 67 20 63 6f 6e 66 69 67 75 72 65 64 20  eing configured 
f8c0: 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20  */.  int idx,   
f8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8e0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
f8f0: 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61  f column zName a
f900: 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69  pplies to */.  i
f910: 6e 74 20 76 61 72 2c 20 20 20 20 20 20 20 20 20  nt var,         
f920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f930: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f  /* One of the CO
f940: 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74  LNAME_* constant
f950: 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  s */.  const cha
f960: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20  r *zName,       
f970: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
f980: 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e  er to buffer con
f990: 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a  taining name */.
f9a0: 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76    void (*xDel)(v
f9b0: 6f 69 64 2a 29 20 20 20 20 20 20 20 20 20 20 20  oid*)           
f9c0: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e     /* Memory man
f9d0: 61 67 65 6d 65 6e 74 20 73 74 72 61 74 65 67 79  agement strategy
f9e0: 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b   for zName */.){
f9f0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
fa00: 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73   *pColName;.  as
fa10: 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65  sert( idx<p->nRe
fa20: 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73  sColumn );.  ass
fa30: 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45  ert( var<COLNAME
fa40: 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64  _N );.  if( p->d
fa50: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
fa60: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
fa70: 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53  zName || xDel!=S
fa80: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b  QLITE_DYNAMIC );
fa90: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
faa0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
fab0: 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e  assert( p->aColN
fac0: 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c  ame!=0 );.  pCol
fad0: 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c  Name = &(p->aCol
fae0: 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e  Name[idx+var*p->
faf0: 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20  nResColumn]);.  
fb00: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
fb10: 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61  MemSetStr(pColNa
fb20: 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53  me, zName, -1, S
fb30: 51 4c 49 54 45 5f 55 54 46 38 2c 20 78 44 65 6c  QLITE_UTF8, xDel
fb40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
fb50: 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20  =0 || !zName || 
fb60: 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73  (pColName->flags
fb70: 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b  &MEM_Term)!=0 );
fb80: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
fb90: 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72  ./*.** A read or
fba0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
fbb0: 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  on may or may no
fbc0: 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20 64  t be active on d
fbd0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a  atabase handle.*
fbe0: 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61 6e 73  * db. If a trans
fbf0: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
fc00: 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20  , commit it. If 
fc10: 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20 77 72  there is a.** wr
fc20: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
fc30: 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68  spanning more th
fc40: 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20  an one database 
fc50: 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69  file, this routi
fc60: 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72 65  ne.** takes care
fc70: 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
fc80: 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e  ournal trickery.
fc90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
fca0: 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65  dbeCommit(sqlite
fcb0: 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b  3 *db, Vdbe *p){
fcc0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
fcd0: 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20  nTrans = 0;  /* 
fce0: 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61  Number of databa
fcf0: 73 65 73 20 77 69 74 68 20 61 6e 20 61 63 74 69  ses with an acti
fd00: 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ve write-transac
fd10: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  tion */.  int rc
fd20: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
fd30: 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20  int needXcommit 
fd40: 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  = 0;..#ifdef SQL
fd50: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
fd60: 54 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20  TABLE.  /* With 
fd70: 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c  this option, sql
fd80: 69 74 65 33 56 74 61 62 53 79 6e 63 28 29 20 69  ite3VtabSync() i
fd90: 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20  s defined to be 
fda0: 73 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c  simply .  ** SQL
fdb0: 49 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e  ITE_OK so p is n
fdc0: 6f 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20  ot used. .  */. 
fdd0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
fde0: 52 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  R(p);.#endif..  
fdf0: 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20  /* Before doing 
fe00: 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 63  anything else, c
fe10: 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29 20  all the xSync() 
fe20: 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79  callback for any
fe30: 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f  .  ** virtual mo
fe40: 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69 74  dule tables writ
fe50: 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61 6e  ten in this tran
fe60: 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68 61  saction. This ha
fe70: 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e  s to.  ** be don
fe80: 65 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d 69  e before determi
fe90: 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61 20 6d  ning whether a m
fea0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
feb0: 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71 75  le is .  ** requ
fec0: 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79 6e  ired, as an xSyn
fed0: 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79  c() callback may
fee0: 20 61 64 64 20 61 6e 20 61 74 74 61 63 68 65 64   add an attached
fef0: 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 74   database.  ** t
ff00: 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
ff10: 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  n..  */.  rc = s
ff20: 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 64  qlite3VtabSync(d
ff30: 62 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  b, p);..  /* Thi
ff40: 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65  s loop determine
ff50: 73 20 28 61 29 20 69 66 20 74 68 65 20 63 6f 6d  s (a) if the com
ff60: 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20  mit hook should 
ff70: 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20  be invoked and. 
ff80: 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e 79   ** (b) how many
ff90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
ffa0: 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65 20  have open write 
ffb0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f  transactions, no
ffc0: 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e  t .  ** includin
ffd0: 67 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  g the temp datab
ffe0: 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70 6f  ase. (b) is impo
fff0: 72 74 61 6e 74 20 62 65 63 61 75 73 65 20 69 66  rtant because if
10000 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a   more than .  **
10010 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
10020 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 77  le has an open w
10030 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
10040 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  , a master journ
10050 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20  al.  ** file is 
10060 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20  required for an 
10070 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20  atomic commit.. 
10080 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20   */ .  for(i=0; 
10090 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
100a0 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
100b0 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42  { .    Btree *pB
100c0 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
100d0 42 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  Bt;.    if( sqli
100e0 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
100f0 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  s(pBt) ){.      
10100 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b  needXcommit = 1;
10110 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d 31 20  .      if( i!=1 
10120 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20  ) nTrans++;.    
10130 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
10140 74 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ter(pBt);.      
10150 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
10160 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 73  rExclusiveLock(s
10170 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
10180 28 70 42 74 29 29 3b 0a 20 20 20 20 20 20 73 71  (pBt));.      sq
10190 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
101a0 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pBt);.    }.  }.
101b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
101c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
101d0 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
101e0 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  If there are any
101f0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
10200 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f  ons at all, invo
10210 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f  ke the commit ho
10220 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64  ok */.  if( need
10230 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78  Xcommit && db->x
10240 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29  CommitCallback )
10250 7b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78  {.    rc = db->x
10260 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64  CommitCallback(d
10270 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a  b->pCommitArg);.
10280 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
10290 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
102a0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d  E_CONSTRAINT_COM
102b0 4d 49 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  MITHOOK;.    }. 
102c0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d   }..  /* The sim
102d0 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f  ple case - no mo
102e0 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61  re than one data
102f0 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63  base file (not c
10300 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a  ounting the.  **
10310 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 29 20   TEMP database) 
10320 68 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  has a transactio
10330 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68 65 72  n active.   Ther
10340 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72  e is no need for
10350 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72   the.  ** master
10360 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20  -journal..  **. 
10370 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72   ** If the retur
10380 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74  n value of sqlit
10390 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
103a0 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c  me() is a zero l
103b0 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e  ength.  ** strin
103c0 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  g, it means the 
103d0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73  main database is
103e0 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74   :memory: or a t
103f0 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20  emp file.  In . 
10400 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77 65   ** that case we
10410 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20   do not support 
10420 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c  atomic multi-fil
10430 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73  e commits, so us
10440 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70  e the .  ** simp
10450 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f  le case then too
10460 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d  ..  */.  if( 0==
10470 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
10480 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
10490 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  ilename(db->aDb[
104a0 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e  0].pBt)).   || n
104b0 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20  Trans<=1.  ){.  
104c0 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
104d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
104e0 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
104f0 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
10500 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
10510 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
10520 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
10530 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
10540 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29  PhaseOne(pBt, 0)
10550 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10560 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63  .    /* Do the c
10570 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c  ommit only if al
10580 6c 20 64 61 74 61 62 61 73 65 73 20 73 75 63 63  l databases succ
10590 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74  essfully complet
105a0 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20  e phase 1. .    
105b0 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65  ** If one of the
105c0 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73   BtreeCommitPhas
105d0 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69  eOne() calls fai
105e0 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ls, this indicat
105f0 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20  es an.    ** IO 
10600 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65  error while dele
10610 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
10620 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ng a journal fil
10630 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c  e. It is unlikel
10640 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f  y,.    ** but co
10650 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74  uld happen. In t
10660 68 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e  his case abandon
10670 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20   processing and 
10680 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
10690 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
106a0 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
106b0 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
106c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
106d0 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
106e0 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
106f0 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
10700 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10710 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
10720 54 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20 20  Two(pBt, 0);.   
10730 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
10740 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
10750 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10760 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b  3VtabCommit(db);
10770 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
10780 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73   The complex cas
10790 65 20 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d  e - There is a m
107a0 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d  ulti-file write-
107b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
107c0 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65  ve..  ** This re
107d0 71 75 69 72 65 73 20 61 20 6d 61 73 74 65 72 20  quires a master 
107e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
107f0 65 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e 73  ensure the trans
10800 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63  action is.  ** c
10810 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 61  ommitted atomica
10820 6c 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  lly..  */.#ifnde
10830 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  f SQLITE_OMIT_DI
10840 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20  SKIO.  else{.   
10850 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
10860 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20  fs = db->pVfs;. 
10870 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20     int needSync 
10880 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  = 0;.    char *z
10890 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a  Master = 0;   /*
108a0 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74   File-name for t
108b0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
108c0 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f  l */.    char co
108d0 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d  nst *zMainFile =
108e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
108f0 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62  Filename(db->aDb
10900 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71  [0].pBt);.    sq
10910 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73  lite3_file *pMas
10920 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34  ter = 0;.    i64
10930 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
10940 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 69 6e   int res;.    in
10950 74 20 72 65 74 72 79 43 6f 75 6e 74 20 3d 20 30  t retryCount = 0
10960 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61 69 6e 46  ;.    int nMainF
10970 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c  ile;..    /* Sel
10980 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ect a master jou
10990 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a  rnal file name *
109a0 2f 0a 20 20 20 20 6e 4d 61 69 6e 46 69 6c 65 20  /.    nMainFile 
109b0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
109c0 30 28 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20  0(zMainFile);.  
109d0 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69    zMaster = sqli
109e0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
109f0 25 73 2d 6d 6a 58 58 58 58 58 58 39 58 58 7a 22  %s-mjXXXXXX9XXz"
10a00 2c 20 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20  , zMainFile);.  
10a10 20 20 69 66 28 20 7a 4d 61 73 74 65 72 3d 3d 30    if( zMaster==0
10a20 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
10a30 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 64 6f 20 7b  _NOMEM;.    do {
10a40 0a 20 20 20 20 20 20 75 33 32 20 69 52 61 6e 64  .      u32 iRand
10a50 6f 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65  om;.      if( re
10a60 74 72 79 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  tryCount ){.    
10a70 20 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75      if( retryCou
10a80 6e 74 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20  nt>100 ){.      
10a90 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
10aa0 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a  SQLITE_FULL, "MJ
10ab0 20 64 65 6c 65 74 65 3a 20 25 73 22 2c 20 7a 4d   delete: %s", zM
10ac0 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
10ad0 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
10ae0 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
10af0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62   0);.          b
10b00 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
10b10 6c 73 65 20 69 66 28 20 72 65 74 72 79 43 6f 75  lse if( retryCou
10b20 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  nt==1 ){.       
10b30 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
10b40 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20  QLITE_FULL, "MJ 
10b50 63 6f 6c 6c 69 64 65 3a 20 25 73 22 2c 20 7a 4d  collide: %s", zM
10b60 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
10b70 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
10b80 72 65 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20  retryCount++;.  
10b90 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
10ba0 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 52  omness(sizeof(iR
10bb0 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d  andom), &iRandom
10bc0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10bd0 5f 73 6e 70 72 69 6e 74 66 28 31 33 2c 20 26 7a  _snprintf(13, &z
10be0 4d 61 73 74 65 72 5b 6e 4d 61 69 6e 46 69 6c 65  Master[nMainFile
10bf0 5d 2c 20 22 2d 6d 6a 25 30 36 58 39 25 30 32 58  ], "-mj%06X9%02X
10c00 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
10c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c20 20 20 28 69 52 61 6e 64 6f 6d 3e 3e 38 29 26 30    (iRandom>>8)&0
10c30 78 66 66 66 66 66 66 2c 20 69 52 61 6e 64 6f 6d  xffffff, iRandom
10c40 26 30 78 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a  &0xff);.      /*
10c50 20 54 68 65 20 61 6e 74 69 70 65 6e 75 6c 74 69   The antipenulti
10c60 6d 61 74 65 20 63 68 61 72 61 63 74 65 72 20 6f  mate character o
10c70 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
10c80 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 0a 20  rnal name must. 
10c90 20 20 20 20 20 2a 2a 20 62 65 20 22 39 22 20 74       ** be "9" t
10ca0 6f 20 61 76 6f 69 64 20 6e 61 6d 65 20 63 6f 6c  o avoid name col
10cb0 6c 69 73 69 6f 6e 73 20 77 68 65 6e 20 75 73 69  lisions when usi
10cc0 6e 67 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73  ng 8+3 filenames
10cd0 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
10ce0 74 28 20 7a 4d 61 73 74 65 72 5b 73 71 6c 69 74  t( zMaster[sqlit
10cf0 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74  e3Strlen30(zMast
10d00 65 72 29 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a 20  er)-3]=='9' );. 
10d10 20 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65       sqlite3File
10d20 53 75 66 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c  Suffix3(zMainFil
10d30 65 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  e, zMaster);.   
10d40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
10d50 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d  sAccess(pVfs, zM
10d60 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43  aster, SQLITE_AC
10d70 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65  CESS_EXISTS, &re
10d80 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  s);.    }while( 
10d90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
10da0 20 72 65 73 20 29 3b 0a 20 20 20 20 69 66 28 20   res );.    if( 
10db0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10dc0 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74  .      /* Open t
10dd0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10de0 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  l. */.      rc =
10df0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61   sqlite3OsOpenMa
10e00 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74  lloc(pVfs, zMast
10e10 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20  er, &pMaster, . 
10e20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
10e30 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
10e40 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
10e50 45 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  E|.          SQL
10e60 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
10e70 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  VE|SQLITE_OPEN_M
10e80 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30  ASTER_JOURNAL, 0
10e90 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
10ea0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
10eb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
10ec0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
10ed0 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
10ee0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
10ef0 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  }. .    /* Write
10f00 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63   the name of eac
10f10 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  h database file 
10f20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
10f30 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a  on into the new.
10f40 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f      ** master jo
10f50 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61  urnal file. If a
10f60 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61  n error occurs a
10f70 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f  t this point clo
10f80 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65  se.    ** and de
10f90 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
10fa0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c  journal file. Al
10fb0 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c  l the individual
10fc0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20   journal files. 
10fd0 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65     ** still have
10fe0 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d   'null' as the m
10ff0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
11000 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77  inter, so they w
11010 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20  ill roll.    ** 
11020 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74  back independent
11030 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72 65 20  ly if a failure 
11040 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20  occurs..    */. 
11050 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
11060 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
11070 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
11080 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
11090 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
110a0 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
110b0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
110c0 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c  char const *zFil
110d0 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
110e0 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70  GetJournalname(p
110f0 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Bt);.        if(
11100 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20   zFile==0 ){.   
11110 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
11120 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50    /* Ignore TEMP
11130 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61   and :memory: da
11140 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20  tabases */.     
11150 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
11160 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30  ert( zFile[0]!=0
11170 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
11180 21 6e 65 65 64 53 79 6e 63 20 26 26 20 21 73 71  !needSync && !sq
11190 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69  lite3BtreeSyncDi
111a0 73 61 62 6c 65 64 28 70 42 74 29 20 29 7b 0a 20  sabled(pBt) ){. 
111b0 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e           needSyn
111c0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
111d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
111e0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d 61  lite3OsWrite(pMa
111f0 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c  ster, zFile, sql
11200 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
11210 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a  le)+1, offset);.
11220 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b          offset +
11230 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
11240 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20  0(zFile)+1;.    
11250 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11260 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11270 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
11280 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  eFree(pMaster);.
11290 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
112a0 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
112b0 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
112c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
112d0 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
112e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
112f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
11300 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
11310 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  .    /* Sync the
11320 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11330 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f 43  file. If the IOC
11340 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64 65  AP_SEQUENTIAL de
11350 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67  vice.    ** flag
11360 20 69 73 20 73 65 74 20 74 68 69 73 20 69 73 20   is set this is 
11370 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20  not required..  
11380 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 65    */.    if( nee
11390 64 53 79 6e 63 20 0a 20 20 20 20 20 26 26 20 30  dSync .     && 0
113a0 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69  ==(sqlite3OsDevi
113b0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
113c0 73 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54  s(pMaster)&SQLIT
113d0 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
113e0 41 4c 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49  AL).     && SQLI
113f0 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
11400 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74  ite3OsSync(pMast
11410 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  er, SQLITE_SYNC_
11420 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a  NORMAL)).    ){.
11430 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
11440 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72  loseFree(pMaster
11450 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11460 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
11470 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
11480 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
11490 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
114a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
114b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e     }..    /* Syn
114c0 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c  c all the db fil
114d0 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  es involved in t
114e0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
114f0 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20  The same call.  
11500 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61    ** sets the ma
11510 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
11520 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64  nter in each ind
11530 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e  ividual journal.
11540 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72   If.    ** an er
11550 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c  ror occurs here,
11560 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   do not delete t
11570 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
11580 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  l file..    **. 
11590 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72     ** If the err
115a0 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
115b0 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
115c0 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
115d0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
115e0 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65  eOne(), then the
115f0 72 65 20 69 73 20 61 20 63 68 61 6e 63 65 20 74  re is a chance t
11600 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d  hat the.    ** m
11610 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
11620 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61  le will be orpha
11630 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e  ned. But we cann
11640 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20  ot delete it,.  
11650 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65    ** in case the
11660 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11670 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72  file name was wr
11680 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
11690 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69  ournal.    ** fi
116a0 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 61  le before the fa
116b0 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a  ilure occurred..
116c0 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
116d0 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
116e0 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
116f0 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
11700 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
11710 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
11720 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
11730 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
11740 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
11750 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29  ne(pBt, zMaster)
11760 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11770 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
11780 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
11790 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
117a0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a  =SQLITE_BUSY );.
117b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
117c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
117d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
117e0 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
117f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
11800 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65  }..    /* Delete
11810 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
11820 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63  nal file. This c
11830 6f 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73  ommits the trans
11840 61 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20  action. After.  
11850 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20    ** doing this 
11860 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 73  the directory is
11870 20 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65   synced again be
11880 66 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64  fore any individ
11890 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  ual.    ** trans
118a0 61 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65  action files are
118b0 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
118c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
118d0 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
118e0 7a 4d 61 73 74 65 72 2c 20 6e 65 65 64 53 79 6e  zMaster, needSyn
118f0 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  c);.    sqlite3D
11900 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
11910 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20  r);.    zMaster 
11920 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20  = 0;.    if( rc 
11930 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
11940 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
11950 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20  * All files and 
11960 64 69 72 65 63 74 6f 72 69 65 73 20 68 61 76 65  directories have
11970 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79   already been sy
11980 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c  nced, so the fol
11990 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61  lowing.    ** ca
119a0 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74  lls to sqlite3Bt
119b0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
119c0 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f  o() are only clo
119d0 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20  sing files and. 
119e0 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f     ** deleting o
119f0 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75  r truncating jou
11a00 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68  rnals. If someth
11a10 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77  ing goes wrong w
11a20 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73  hile.    ** this
11a30 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65   is happening we
11a40 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61   don't really ca
11a50 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74  re. The integrit
11a60 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  y of the.    ** 
11a70 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
11a80 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74 65 65  lready guarantee
11a90 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61  d, but some stra
11aa0 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c  y 'cold' journal
11ab0 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20  s.    ** may be 
11ac0 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65  lying around. Re
11ad0 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  turning an error
11ae0 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70   code won't help
11af0 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f   matters..    */
11b00 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d  .    disable_sim
11b10 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
11b20 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  ();.    sqlite3B
11b30 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
11b40 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ();.    for(i=0;
11b50 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
11b60 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
11b70 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
11b80 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
11b90 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pBt ){.        s
11ba0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
11bb0 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 31  tPhaseTwo(pBt, 1
11bc0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
11bd0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
11be0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
11bf0 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61     enable_simula
11c00 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
11c10 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61  ..    sqlite3Vta
11c20 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d  bCommit(db);.  }
11c30 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
11c40 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  n rc;.}../* .** 
11c50 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
11c60 63 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c  cks that the sql
11c70 69 74 65 33 2e 6e 56 64 62 65 41 63 74 69 76 65  ite3.nVdbeActive
11c80 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a   count variable.
11c90 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e  ** matches the n
11ca0 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73 20  umber of vdbe's 
11cb0 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69  in the list sqli
11cc0 74 65 33 2e 70 56 64 62 65 20 74 68 61 74 20 61  te3.pVdbe that a
11cd0 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  re.** currently 
11ce0 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72  active. An asser
11cf0 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68  tion fails if th
11d00 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20  e two counts do 
11d10 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68  not match..** Th
11d20 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61  is is an interna
11d30 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c  l self-check onl
11d40 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e  y - it is not an
11d50 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65   essential proce
11d60 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a  ssing.** step..*
11d70 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e  *.** This is a n
11d80 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69  o-op if NDEBUG i
11d90 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69  s defined..*/.#i
11da0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61  fndef NDEBUG.sta
11db0 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63  tic void checkAc
11dc0 74 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69  tiveVdbeCnt(sqli
11dd0 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65  te3 *db){.  Vdbe
11de0 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d   *p;.  int cnt =
11df0 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65   0;.  int nWrite
11e00 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52 65 61   = 0;.  int nRea
11e10 64 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d  d = 0;.  p = db-
11e20 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28  >pVdbe;.  while(
11e30 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71   p ){.    if( sq
11e40 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73 79 28  lite3_stmt_busy(
11e50 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 70  (sqlite3_stmt*)p
11e60 29 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b  ) ){.      cnt++
11e70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  ;.      if( p->r
11e80 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72  eadOnly==0 ) nWr
11e90 69 74 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ite++;.      if(
11ea0 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20   p->bIsReader ) 
11eb0 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nRead++;.    }. 
11ec0 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b     p = p->pNext;
11ed0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63  .  }.  assert( c
11ee0 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62 65 41 63 74  nt==db->nVdbeAct
11ef0 69 76 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ive );.  assert(
11f00 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 6e 56 64   nWrite==db->nVd
11f10 62 65 57 72 69 74 65 20 29 3b 0a 20 20 61 73 73  beWrite );.  ass
11f20 65 72 74 28 20 6e 52 65 61 64 3d 3d 64 62 2d 3e  ert( nRead==db->
11f30 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 7d 0a 23  nVdbeRead );.}.#
11f40 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65  else.#define che
11f50 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
11f60 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
11f70 20 49 66 20 74 68 65 20 56 64 62 65 20 70 61 73   If the Vdbe pas
11f80 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
11f90 20 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64   argument opened
11fa0 20 61 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61   a statement-tra
11fb0 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f  nsaction,.** clo
11fc0 73 65 20 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d  se it now. Argum
11fd0 65 6e 74 20 65 4f 70 20 6d 75 73 74 20 62 65 20  ent eOp must be 
11fe0 65 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54  either SAVEPOINT
11ff0 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20  _ROLLBACK or.** 
12000 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
12010 45 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45  E. If it is SAVE
12020 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
12030 74 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65  then the stateme
12040 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  nt.** transactio
12050 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
12060 2e 20 49 66 20 65 4f 70 20 69 73 20 53 41 56 45  . If eOp is SAVE
12070 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74  POINT_RELEASE, t
12080 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61 74  hen the .** stat
12090 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
120a0 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a  n is committed..
120b0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65  **.** If an IO e
120c0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
120d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
120e0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
120f0 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68  eturned. .** Oth
12100 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
12110 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12120 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
12130 6e 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  nt(Vdbe *p, int 
12140 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  eOp){.  sqlite3 
12150 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64  *const db = p->d
12160 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  b;.  int rc = SQ
12170 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49  LITE_OK;..  /* I
12180 66 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20  f p->iStatement 
12190 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
121a0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20  zero, then this 
121b0 56 64 62 65 20 6f 70 65 6e 65 64 20 61 20 0a 20  Vdbe opened a . 
121c0 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72   ** statement tr
121d0 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 73  ansaction that s
121e0 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20  hould be closed 
121f0 68 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79 20 65  here. The only e
12200 78 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  xception.  ** is
12210 20 74 68 61 74 20 61 6e 20 49 4f 20 65 72 72 6f   that an IO erro
12220 72 20 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72  r may have occur
12230 72 65 64 2c 20 63 61 75 73 69 6e 67 20 61 6e 20  red, causing an 
12240 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61  emergency rollba
12250 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73  ck..  ** In this
12260 20 63 61 73 65 20 28 64 62 2d 3e 6e 53 74 61 74   case (db->nStat
12270 65 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e 64 20 74  ement==0), and t
12280 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20  here is nothing 
12290 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66  to do..  */.  if
122a0 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  ( db->nStatement
122b0 20 26 26 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e   && p->iStatemen
122c0 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ){.    int i;.
122d0 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 53      const int iS
122e0 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53  avepoint = p->iS
122f0 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20  tatement-1;..   
12300 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53 41   assert( eOp==SA
12310 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
12320 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49   || eOp==SAVEPOI
12330 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 20  NT_RELEASE);.   
12340 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74   assert( db->nSt
12350 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 20  atement>0 );.   
12360 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61   assert( p->iSta
12370 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74  tement==(db->nSt
12380 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76  atement+db->nSav
12390 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 20 20  epoint) );..    
123a0 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
123b0 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
123c0 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54   int rc2 = SQLIT
123d0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74 72 65  E_OK;.      Btre
123e0 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
123f0 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
12400 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
12410 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50    if( eOp==SAVEP
12420 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
12430 0a 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d  .          rc2 =
12440 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
12450 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45  epoint(pBt, SAVE
12460 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
12470 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
12480 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
12490 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f  f( rc2==SQLITE_O
124a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
124b0 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  c2 = sqlite3Btre
124c0 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20  eSavepoint(pBt, 
124d0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
124e0 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  E, iSavepoint);.
124f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12500 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
12510 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
12520 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20   rc = rc2;.     
12530 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
12540 20 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74 61 74   }.    db->nStat
12550 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e  ement--;.    p->
12560 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  iStatement = 0;.
12570 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
12580 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12590 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  if( eOp==SAVEPOI
125a0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
125b0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
125c0 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74  te3VtabSavepoint
125d0 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  (db, SAVEPOINT_R
125e0 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f  OLLBACK, iSavepo
125f0 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  int);.      }.  
12600 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
12610 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
12620 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
12630 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53  bSavepoint(db, S
12640 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
12650 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
12660 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
12670 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74    /* If the stat
12680 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
12690 6e 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  n is being rolle
126a0 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73  d back, also res
126b0 74 6f 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a  tore the .    **
126c0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
126d0 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74  s deferred const
126e0 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f  raint counter to
126f0 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 68 61   the value it ha
12700 64 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74  d when .    ** t
12710 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
12720 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65  nsaction was ope
12730 6e 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ned.  */.    if(
12740 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
12750 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
12760 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43    db->nDeferredC
12770 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65  ons = p->nStmtDe
12780 66 43 6f 6e 73 3b 0a 20 20 20 20 20 20 64 62 2d  fCons;.      db-
12790 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
127a0 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49  s = p->nStmtDefI
127b0 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20  mmCons;.    }.  
127c0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
127d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
127e0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
127f0 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
12800 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65  on opened by the
12810 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 68 61   database .** ha
12820 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  ndle associated 
12830 77 69 74 68 20 74 68 65 20 56 4d 20 70 61 73 73  with the VM pass
12840 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
12850 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65  t is about to be
12860 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20   .** committed. 
12870 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
12880 73 74 61 6e 64 69 6e 67 20 64 65 66 65 72 72 65  standing deferre
12890 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  d foreign key co
128a0 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c  nstraint.** viol
128b0 61 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53  ations, return S
128c0 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68  QLITE_ERROR. Oth
128d0 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
128e0 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  K..**.** If ther
128f0 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
12900 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20  g FK violations 
12910 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
12920 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51  n returns .** SQ
12930 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73 65 74 20  LITE_ERROR, set 
12940 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
12950 65 20 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43  e VM to SQLITE_C
12960 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47  ONSTRAINT_FOREIG
12970 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72 69 74  NKEY.** and writ
12980 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
12990 67 65 20 74 6f 20 69 74 2e 20 54 68 65 6e 20 72  ge to it. Then r
129a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
129b0 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  OR..*/.#ifndef S
129c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
129d0 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74  GN_KEY.int sqlit
129e0 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 56 64  e3VdbeCheckFk(Vd
129f0 62 65 20 2a 70 2c 20 69 6e 74 20 64 65 66 65 72  be *p, int defer
12a00 72 65 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  red){.  sqlite3 
12a10 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  *db = p->db;.  i
12a20 66 28 20 28 64 65 66 65 72 72 65 64 20 26 26 20  f( (deferred && 
12a30 28 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f  (db->nDeferredCo
12a40 6e 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  ns+db->nDeferred
12a50 49 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20 20 20  ImmCons)>0) .   
12a60 7c 7c 20 28 21 64 65 66 65 72 72 65 64 20 26 26  || (!deferred &&
12a70 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e   p->nFkConstrain
12a80 74 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70  t>0) .  ){.    p
12a90 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  ->rc = SQLITE_CO
12aa0 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e  NSTRAINT_FOREIGN
12ab0 4b 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f  KEY;.    p->erro
12ac0 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f  rAction = OE_Abo
12ad0 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  rt;.    sqlite3V
12ae0 64 62 65 45 72 72 6f 72 28 70 2c 20 22 46 4f 52  dbeError(p, "FOR
12af0 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61  EIGN KEY constra
12b00 69 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 20  int failed");.  
12b10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12b20 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
12b30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
12b40 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
12b50 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
12b60 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61  alled the when a
12b70 20 56 44 42 45 20 74 72 69 65 73 20 74 6f 20 68   VDBE tries to h
12b80 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44 42  alt.  If the VDB
12b90 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68  E.** has made ch
12ba0 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20  anges and is in 
12bb0 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c  autocommit mode,
12bc0 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f   then commit tho
12bd0 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20  se.** changes.  
12be0 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73  If a rollback is
12bf0 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f   needed, then do
12c00 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a   the rollback..*
12c10 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12c20 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61  e is the only wa
12c30 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74  y to move the st
12c40 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d  ate of a VM from
12c50 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  .** SQLITE_MAGIC
12c60 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d  _RUN to SQLITE_M
12c70 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69  AGIC_HALT.  It i
12c80 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a  s harmless to.**
12c90 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20   call this on a 
12ca0 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74 68  VM that is in th
12cb0 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48  e SQLITE_MAGIC_H
12cc0 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ALT state..**.**
12cd0 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
12ce0 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63   code.  If the c
12cf0 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20  ommit could not 
12d00 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65  complete because
12d10 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74   of.** lock cont
12d20 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53  ention, return S
12d30 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20  QLITE_BUSY.  If 
12d40 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
12d50 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d  eturned, it.** m
12d60 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64  eans the close d
12d70 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e  id not happen an
12d80 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  d needs to be re
12d90 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  peated..*/.int s
12da0 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 56  qlite3VdbeHalt(V
12db0 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dbe *p){.  int r
12dc0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
12dd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
12de0 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72 61 6e  ed to store tran
12df0 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63 6f 64  sient return cod
12e00 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  es */.  sqlite3 
12e10 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  *db = p->db;..  
12e20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
12e30 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f   contains the lo
12e40 67 69 63 20 74 68 61 74 20 64 65 74 65 72 6d 69  gic that determi
12e50 6e 65 73 20 69 66 20 61 20 73 74 61 74 65 6d 65  nes if a stateme
12e60 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73  nt or.  ** trans
12e70 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63  action will be c
12e80 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
12e90 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73  ed back as a res
12ea0 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ult of the.  ** 
12eb0 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69  execution of thi
12ec0 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  s virtual machin
12ed0 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  e. .  **.  ** If
12ee0 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
12ef0 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63  owing errors occ
12f00 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ur:.  **.  **   
12f10 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20    SQLITE_NOMEM. 
12f20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49   **     SQLITE_I
12f30 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51  OERR.  **     SQ
12f40 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20  LITE_FULL.  **  
12f50 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52     SQLITE_INTERR
12f60 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  UPT.  **.  ** Th
12f70 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  en the internal 
12f80 63 61 63 68 65 20 6d 69 67 68 74 20 68 61 76 65  cache might have
12f90 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e   been left in an
12fa0 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20   inconsistent.  
12fb0 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65  ** state.  We ne
12fc0 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ed to rollback t
12fd0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
12fe0 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65  nsaction, if the
12ff0 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20  re is.  ** one, 
13000 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  or the complete 
13010 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74  transaction if t
13020 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65  here is no state
13030 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
13040 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d  ..  */..  if( p-
13050 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
13060 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
13070 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
13080 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f 6e 63   }.  if( p->aOnc
13090 65 46 6c 61 67 20 29 20 6d 65 6d 73 65 74 28 70  eFlag ) memset(p
130a0 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 30 2c 20  ->aOnceFlag, 0, 
130b0 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 29 3b 0a 20  p->nOnceFlag);. 
130c0 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
130d0 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61  (p);.  if( p->ma
130e0 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic!=VDBE_MAGIC_
130f0 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  RUN ){.    retur
13100 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
13110 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  .  checkActiveVd
13120 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a  beCnt(db);..  /*
13130 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f   No commit or ro
13140 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66  llback needed if
13150 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76   the program nev
13160 65 72 20 73 74 61 72 74 65 64 20 6f 72 20 69 66  er started or if
13170 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74   the.  ** SQL st
13180 61 74 65 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74  atement does not
13190 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 61   read or write a
131a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
131b0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
131c0 3d 30 20 26 26 20 70 2d 3e 62 49 73 52 65 61 64  =0 && p->bIsRead
131d0 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72  er ){.    int mr
131e0 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20  c;   /* Primary 
131f0 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  error code from 
13200 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74  p->rc */.    int
13210 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
13220 30 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65  0;.    int isSpe
13230 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20  cialError;      
13240 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
13250 74 72 75 65 20 69 66 20 61 20 27 73 70 65 63 69  true if a 'speci
13260 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20  al' error */..  
13270 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74    /* Lock all bt
13280 72 65 65 73 20 75 73 65 64 20 62 79 20 74 68 65  rees used by the
13290 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
132a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74    sqlite3VdbeEnt
132b0 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  er(p);..    /* C
132c0 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20  heck for one of 
132d0 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f  the special erro
132e0 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20  rs */.    mrc = 
132f0 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20  p->rc & 0xff;.  
13300 20 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72    isSpecialError
13310 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   = mrc==SQLITE_N
13320 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c  OMEM || mrc==SQL
13330 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20  ITE_IOERR.      
13340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
13350 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e  | mrc==SQLITE_IN
13360 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d  TERRUPT || mrc==
13370 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
13380 20 69 66 28 20 69 73 53 70 65 63 69 61 6c 45 72   if( isSpecialEr
13390 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ror ){.      /* 
133a0 49 66 20 74 68 65 20 71 75 65 72 79 20 77 61 73  If the query was
133b0 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74   read-only and t
133c0 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  he error code is
133d0 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
133e0 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20  T, .      ** no 
133f0 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65  rollback is nece
13400 73 73 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65  ssary. Otherwise
13410 2c 20 61 74 20 6c 65 61 73 74 20 61 20 73 61 76  , at least a sav
13420 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a  epoint .      **
13430 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
13440 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t be rolled back
13450 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
13460 64 61 74 61 62 61 73 65 20 74 6f 20 61 20 0a 20  database to a . 
13470 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65       ** consiste
13480 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20  nt state..      
13490 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e  **.      ** Even
134a0 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   if the statemen
134b0 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20  t is read-only, 
134c0 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
134d0 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20  to perform.     
134e0 20 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20   ** a statement 
134f0 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  or transaction r
13500 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f  ollback operatio
13510 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20  n. If the error 
13520 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72  .      ** occurr
13530 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  ed while writing
13540 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   to the journal,
13550 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20   sub-journal or 
13560 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
13570 2a 20 66 69 6c 65 20 61 73 20 70 61 72 74 20 6f  * file as part o
13580 66 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 66  f an effort to f
13590 72 65 65 20 75 70 20 63 61 63 68 65 20 73 70 61  ree up cache spa
135a0 63 65 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e  ce (see function
135b0 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 53  .      ** pagerS
135c0 74 72 65 73 73 28 29 20 69 6e 20 70 61 67 65 72  tress() in pager
135d0 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63  .c), the rollbac
135e0 6b 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  k is required to
135f0 20 72 65 73 74 6f 72 65 20 0a 20 20 20 20 20 20   restore .      
13600 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  ** the pager to 
13610 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61  a consistent sta
13620 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  te..      */.   
13630 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f     if( !p->readO
13640 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49  nly || mrc!=SQLI
13650 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a  TE_INTERRUPT ){.
13660 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 72 63          if( (mrc
13670 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c  ==SQLITE_NOMEM |
13680 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55  | mrc==SQLITE_FU
13690 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74  LL) && p->usesSt
136a0 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  mtJournal ){.   
136b0 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e         eStatemen
136c0 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f  tOp = SAVEPOINT_
136d0 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20  ROLLBACK;.      
136e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
136f0 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72     /* We are for
13700 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  ced to roll back
13710 20 74 68 65 20 61 63 74 69 76 65 20 74 72 61 6e   the active tran
13720 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20  saction. Before 
13730 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  doing.          
13740 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79  ** so, abort any
13750 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
13760 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75  s this handle cu
13770 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69  rrently has acti
13780 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ve..          */
13790 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
137a0 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
137b0 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  , SQLITE_ABORT_R
137c0 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20  OLLBACK);.      
137d0 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65      sqlite3Close
137e0 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a  Savepoints(db);.
137f0 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75            db->au
13800 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
13810 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e          p->nChan
13820 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ge = 0;.        
13830 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
13840 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  .    /* Check fo
13850 72 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65  r immediate fore
13860 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f  ign key violatio
13870 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ns. */.    if( p
13880 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
13890 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
138a0 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30  VdbeCheckFk(p, 0
138b0 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
138c0 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63  /* If the auto-c
138d0 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65  ommit flag is se
138e0 74 20 61 6e 64 20 74 68 69 73 20 69 73 20 74 68  t and this is th
138f0 65 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 77 72  e only active wr
13900 69 74 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c  iter .    ** VM,
13910 20 74 68 65 6e 20 77 65 20 64 6f 20 65 69 74 68   then we do eith
13920 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72  er a commit or r
13930 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63  ollback of the c
13940 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
13950 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  on. .    **.    
13960 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c  ** Note: This bl
13970 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66  ock also runs if
13980 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63   one of the spec
13990 69 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c  ial errors handl
139a0 65 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  ed .    ** above
139b0 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a   has occurred. .
139c0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
139d0 73 71 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e  sqlite3VtabInSyn
139e0 63 28 64 62 29 20 0a 20 20 20 20 20 26 26 20 64  c(db) .     && d
139f0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20  b->autoCommit . 
13a00 20 20 20 20 26 26 20 64 62 2d 3e 6e 56 64 62 65      && db->nVdbe
13a10 57 72 69 74 65 3d 3d 28 70 2d 3e 72 65 61 64 4f  Write==(p->readO
13a20 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a  nly==0) .    ){.
13a30 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
13a40 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70  =SQLITE_OK || (p
13a50 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f  ->errorAction==O
13a60 45 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70 65  E_Fail && !isSpe
13a70 63 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20  cialError) ){.  
13a80 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13a90 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c  e3VdbeCheckFk(p,
13aa0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
13ab0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13ac0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
13ad0 4e 45 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c  NEVER(p->readOnl
13ae0 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  y) ){.          
13af0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61    sqlite3VdbeLea
13b00 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ve(p);.         
13b10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13b20 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
13b30 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
13b40 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   = SQLITE_CONSTR
13b50 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b  AINT_FOREIGNKEY;
13b60 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20  .        }else{ 
13b70 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
13b80 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
13b90 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 20  ag is true, the 
13ba0 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73  vdbe program was
13bb0 20 73 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20   successful .   
13bc0 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74         ** or hit
13bd0 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f   an 'OR FAIL' co
13be0 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65  nstraint and the
13bf0 72 65 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72  re are no deferr
13c00 65 64 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20  ed foreign.     
13c10 20 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73       ** key cons
13c20 74 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20  traints to hold 
13c30 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  up the transacti
13c40 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61  on. This means a
13c50 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20   commit .       
13c60 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65     ** is require
13c70 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  d. */.          
13c80 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28  rc = vdbeCommit(
13c90 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  db, p);.        
13ca0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
13cb0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
13cc0 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a   p->readOnly ){.
13cd0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13ce0 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
13cf0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
13d00 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
13d10 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
13d20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
13d30 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
13d40 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  = rc;.          
13d50 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
13d60 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  ll(db, SQLITE_OK
13d70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  );.          p->
13d80 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
13d90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13da0 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72        db->nDefer
13db0 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20  redCons = 0;.   
13dc0 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65         db->nDefe
13dd0 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b  rredImmCons = 0;
13de0 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66  .          db->f
13df0 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
13e00 44 65 66 65 72 46 4b 73 3b 0a 20 20 20 20 20 20  DeferFKs;.      
13e10 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69      sqlite3Commi
13e20 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  tInternalChanges
13e30 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  (db);.        }.
13e40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13e50 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
13e60 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
13e70 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20  TE_OK);.        
13e80 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
13e90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62        }.      db
13ea0 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->nStatement = 0
13eb0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
13ec0 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20  eStatementOp==0 
13ed0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
13ee0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
13ef0 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d   p->errorAction=
13f00 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20  =OE_Fail ){.    
13f10 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70      eStatementOp
13f20 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c   = SAVEPOINT_REL
13f30 45 41 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  EASE;.      }els
13f40 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63  e if( p->errorAc
13f50 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  tion==OE_Abort )
13f60 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65  {.        eState
13f70 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49  mentOp = SAVEPOI
13f80 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  NT_ROLLBACK;.   
13f90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13fa0 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
13fb0 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
13fc0 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b  ABORT_ROLLBACK);
13fd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13fe0 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28  CloseSavepoints(
13ff0 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  db);.        db-
14000 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
14010 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61  .        p->nCha
14020 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  nge = 0;.      }
14030 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
14040 20 49 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70   If eStatementOp
14050 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
14060 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  en a statement t
14070 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73  ransaction needs
14080 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f   to.    ** be co
14090 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65  mmitted or rolle
140a0 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c  d back. Call sql
140b0 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61  ite3VdbeCloseSta
140c0 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20  tement() to.    
140d0 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69  ** do so. If thi
140e0 73 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75  s operation retu
140f0 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e  rns an error, an
14100 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  d the current st
14110 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65  atement.    ** e
14120 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c  rror code is SQL
14130 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45  ITE_OK or SQLITE
14140 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65  _CONSTRAINT, the
14150 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20  n promote the.  
14160 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61    ** current sta
14170 74 65 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f 64  tement error cod
14180 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
14190 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29  ( eStatementOp )
141a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
141b0 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61  ite3VdbeCloseSta
141c0 74 65 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65  tement(p, eState
141d0 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69  mentOp);.      i
141e0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
141f0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
14200 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26  TE_OK || (p->rc&
14210 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f  0xff)==SQLITE_CO
14220 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20  NSTRAINT ){.    
14230 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
14240 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
14250 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
14260 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  >zErrMsg);.     
14270 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20       p->zErrMsg 
14280 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
14290 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
142a0 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
142b0 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
142c0 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ACK);.        sq
142d0 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
142e0 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ints(db);.      
142f0 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
14300 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 1;.        p-
14310 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
14320 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
14330 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61     /* If this wa
14340 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44  s an INSERT, UPD
14350 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e  ATE or DELETE an
14360 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74  d no statement t
14370 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a  ransaction.    *
14380 2a 20 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65  * has been rolle
14390 64 20 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74  d back, update t
143a0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
143b0 65 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f  ection change-co
143c0 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20  unter. .    */. 
143d0 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65     if( p->change
143e0 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69  CntOn ){.      i
143f0 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21  f( eStatementOp!
14400 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
14410 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ACK ){.        s
14420 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
14430 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61  nges(db, p->nCha
14440 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nge);.      }els
14450 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
14460 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
14470 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  (db, 0);.      }
14480 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67  .      p->nChang
14490 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  e = 0;.    }..  
144a0 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
144b0 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71   locks */.    sq
144c0 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70  lite3VdbeLeave(p
144d0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20  );.  }..  /* We 
144e0 68 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c  have successfull
144f0 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f  y halted and clo
14500 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63  sed the VM.  Rec
14510 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a  ord this fact. *
14520 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
14530 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62   ){.    db->nVdb
14540 65 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69  eActive--;.    i
14550 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20  f( !p->readOnly 
14560 29 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  ) db->nVdbeWrite
14570 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 62  --;.    if( p->b
14580 49 73 52 65 61 64 65 72 20 29 20 64 62 2d 3e 6e  IsReader ) db->n
14590 56 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20  VdbeRead--;.    
145a0 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62  assert( db->nVdb
145b0 65 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64  eActive>=db->nVd
145c0 62 65 52 65 61 64 20 29 3b 0a 20 20 20 20 61 73  beRead );.    as
145d0 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 52  sert( db->nVdbeR
145e0 65 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72  ead>=db->nVdbeWr
145f0 69 74 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ite );.    asser
14600 74 28 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74  t( db->nVdbeWrit
14610 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d  e>=0 );.  }.  p-
14620 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
14630 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63  GIC_HALT;.  chec
14640 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64  kActiveVdbeCnt(d
14650 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d  b);.  if( p->db-
14660 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
14670 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
14680 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
14690 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f    /* If the auto
146a0 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  -commit flag is 
146b0 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65  set to true, the
146c0 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74  n any locks that
146d0 20 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20   were held.  ** 
146e0 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  by connection db
146f0 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72   have now been r
14700 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71  eleased. Call sq
14710 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55  lite3ConnectionU
14720 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20  nlocked() .  ** 
14730 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65  to invoke any re
14740 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f  quired unlock-no
14750 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a  tify callbacks..
14760 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61    */.  if( db->a
14770 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  utoCommit ){.   
14780 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
14790 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a  onUnlocked(db);.
147a0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64    }..  assert( d
147b0 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 30  b->nVdbeActive>0
147c0 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d   || db->autoComm
147d0 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74  it==0 || db->nSt
147e0 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20  atement==0 );.  
147f0 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53  return (p->rc==S
14800 51 4c 49 54 45 5f 42 55 53 59 20 3f 20 53 51 4c  QLITE_BUSY ? SQL
14810 49 54 45 5f 42 55 53 59 20 3a 20 53 51 4c 49 54  ITE_BUSY : SQLIT
14820 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  E_OK);.}.../*.**
14830 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73   Each VDBE holds
14840 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
14850 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73  he most recent s
14860 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61  qlite3_step() ca
14870 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20  ll.** in p->rc. 
14880 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
14890 74 73 20 74 68 61 74 20 72 65 73 75 6c 74 20 62  ts that result b
148a0 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  ack to SQLITE_OK
148b0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
148c0 33 56 64 62 65 52 65 73 65 74 53 74 65 70 52 65  3VdbeResetStepRe
148d0 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  sult(Vdbe *p){. 
148e0 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
148f0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  OK;.}../*.** Cop
14900 79 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  y the error code
14910 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61   and error messa
14920 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
14930 74 68 65 20 56 44 42 45 20 70 61 73 73 65 64 0a  the VDBE passed.
14940 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ** as the first 
14950 61 72 67 75 6d 65 6e 74 20 74 6f 20 69 74 73 20  argument to its 
14960 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
14970 28 73 6f 20 74 68 61 74 20 74 68 65 79 20 77 69  (so that they wi
14980 6c 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e  ll be .** return
14990 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  ed by calls to s
149a0 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 29  qlite3_errcode()
149b0 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 65 72 72   and sqlite3_err
149c0 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  msg())..**.** Th
149d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
149e0 20 6e 6f 74 20 63 6c 65 61 72 20 74 68 65 20 56   not clear the V
149f0 44 42 45 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  DBE error code o
14a00 72 20 6d 65 73 73 61 67 65 2c 20 6a 75 73 74 0a  r message, just.
14a10 2a 2a 20 63 6f 70 69 65 73 20 74 68 65 6d 20 74  ** copies them t
14a20 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  o the database h
14a30 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  andle..*/.int sq
14a40 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 66 65  lite3VdbeTransfe
14a50 72 45 72 72 6f 72 28 56 64 62 65 20 2a 70 29 7b  rError(Vdbe *p){
14a60 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
14a70 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63   p->db;.  int rc
14a80 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20   = p->rc;.  if( 
14a90 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  p->zErrMsg ){.  
14aa0 20 20 75 38 20 6d 61 6c 6c 6f 63 46 61 69 6c 65    u8 mallocFaile
14ab0 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  d = db->mallocFa
14ac0 69 6c 65 64 3b 0a 20 20 20 20 73 71 6c 69 74 65  iled;.    sqlite
14ad0 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
14ae0 6f 63 28 29 3b 0a 20 20 20 20 69 66 28 20 64 62  oc();.    if( db
14af0 2d 3e 70 45 72 72 3d 3d 30 20 29 20 64 62 2d 3e  ->pErr==0 ) db->
14b00 70 45 72 72 20 3d 20 73 71 6c 69 74 65 33 56 61  pErr = sqlite3Va
14b10 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20 20  lueNew(db);.    
14b20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
14b30 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c  tr(db->pErr, -1,
14b40 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c   p->zErrMsg, SQL
14b50 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
14b60 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
14b70 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
14b80 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 64  nMalloc();.    d
14b90 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
14ba0 3d 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a  = mallocFailed;.
14bb0 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20      db->errCode 
14bc0 3d 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = rc;.  }else{. 
14bd0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
14be0 64 62 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72  db, rc);.  }.  r
14bf0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
14c00 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
14c10 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49  E_SQLLOG./*.** I
14c20 66 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46  f an SQLITE_CONF
14c30 49 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69  IG_SQLLOG hook i
14c40 73 20 72 65 67 69 73 74 65 72 65 64 20 61 6e 64  s registered and
14c50 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e   the VM has been
14c60 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65   run, .** invoke
14c70 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76   it..*/.static v
14c80 6f 69 64 20 76 64 62 65 49 6e 76 6f 6b 65 53 71  oid vdbeInvokeSq
14c90 6c 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b 0a 20  llog(Vdbe *v){. 
14ca0 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
14cb0 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
14cc0 20 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54   && v->rc==SQLIT
14cd0 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20  E_OK && v->zSql 
14ce0 26 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  && v->pc>=0 ){. 
14cf0 20 20 20 63 68 61 72 20 2a 7a 45 78 70 61 6e 64     char *zExpand
14d00 65 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ed = sqlite3Vdbe
14d10 45 78 70 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e  ExpandSql(v, v->
14d20 7a 53 71 6c 29 3b 0a 20 20 20 20 61 73 73 65 72  zSql);.    asser
14d30 74 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62  t( v->db->init.b
14d40 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  usy==0 );.    if
14d50 28 20 7a 45 78 70 61 6e 64 65 64 20 29 7b 0a 20  ( zExpanded ){. 
14d60 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
14d70 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
14d80 28 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  (.          sqli
14d90 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
14da0 70 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64  pSqllogArg, v->d
14db0 62 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a  b, zExpanded, 1.
14dc0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73        );.      s
14dd0 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e  qlite3DbFree(v->
14de0 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a  db, zExpanded);.
14df0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73      }.  }.}.#els
14e00 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 49  e.# define vdbeI
14e10 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23  nvokeSqllog(x).#
14e20 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  endif../*.** Cle
14e30 61 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74  an up a VDBE aft
14e40 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74  er execution but
14e50 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   do not delete t
14e60 68 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74  he VDBE just yet
14e70 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65  ..** Write any e
14e80 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e  rror messages in
14e90 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52  to *pzErrMsg.  R
14ea0 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
14eb0 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74   code..**.** Aft
14ec0 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
14ed0 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45  is run, the VDBE
14ee0 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79   should be ready
14ef0 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a   to be executed.
14f00 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ** again..**.** 
14f10 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e  To look at it an
14f20 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 20  other way, this 
14f30 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 74  routine resets t
14f40 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a  he state of the.
14f50 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ** virtual machi
14f60 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47  ne from VDBE_MAG
14f70 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d  IC_RUN or VDBE_M
14f80 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74  AGIC_HALT back t
14f90 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f  o.** VDBE_MAGIC_
14fa0 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  INIT..*/.int sql
14fb0 69 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64  ite3VdbeReset(Vd
14fc0 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
14fd0 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d  3 *db;.  db = p-
14fe0 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  >db;..  /* If th
14ff0 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e  e VM did not run
15000 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f   to completion o
15010 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65  r if it encounte
15020 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f  red an.  ** erro
15030 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74  r, then it might
15040 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68   not have been h
15050 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20  alted properly. 
15060 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74   So halt.  ** it
15070 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c   now..  */.  sql
15080 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b  ite3VdbeHalt(p);
15090 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44  ..  /* If the VD
150a0 42 45 20 68 61 73 20 62 65 20 72 75 6e 20 65 76  BE has be run ev
150b0 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68  en partially, th
150c0 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20  en transfer the 
150d0 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20  error code.  ** 
150e0 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  and error messag
150f0 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20  e from the VDBE 
15100 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61  into the main da
15110 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
15120 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74  .  But.  ** if t
15130 68 65 20 56 44 42 45 20 68 61 73 20 6a 75 73 74  he VDBE has just
15140 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e   been set to run
15150 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74   but has not act
15160 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61  ually executed a
15170 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74  ny.  ** instruct
15180 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20  ions yet, leave 
15190 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
151a0 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74  e error informat
151b0 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20  ion unchanged.. 
151c0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
151d0 3d 30 20 29 7b 0a 20 20 20 20 76 64 62 65 49 6e  =0 ){.    vdbeIn
151e0 76 6f 6b 65 53 71 6c 6c 6f 67 28 70 29 3b 0a 20  vokeSqllog(p);. 
151f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72     sqlite3VdbeTr
15200 61 6e 73 66 65 72 45 72 72 6f 72 28 70 29 3b 0a  ansferError(p);.
15210 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
15220 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
15230 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73  );.    p->zErrMs
15240 67 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  g = 0;.    if( p
15250 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20  ->runOnlyOnce ) 
15260 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a  p->expired = 1;.
15270 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72    }else if( p->r
15280 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20  c && p->expired 
15290 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78  ){.    /* The ex
152a0 70 69 72 65 64 20 66 6c 61 67 20 77 61 73 20 73  pired flag was s
152b0 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62  et on the VDBE b
152c0 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
152d0 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73  call.    ** to s
152e0 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46  qlite3_step(). F
152f0 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28  or consistency (
15300 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74  since sqlite3_st
15310 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20  ep() was.    ** 
15320 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65  called), set the
15330 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20   database error 
15340 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 73 20  in this case as 
15350 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  well..    */.   
15360 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74   sqlite3ErrorWit
15370 68 4d 73 67 28 64 62 2c 20 70 2d 3e 72 63 2c 20  hMsg(db, p->rc, 
15380 70 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 22 25 73  p->zErrMsg ? "%s
15390 22 20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73  " : 0, p->zErrMs
153a0 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  g);.    sqlite3D
153b0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
153c0 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45  rMsg);.    p->zE
153d0 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a  rrMsg = 0;.  }..
153e0 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c    /* Reclaim all
153f0 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
15400 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20  the VDBE.  */.  
15410 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f  Cleanup(p);..  /
15420 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67  * Save profiling
15430 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
15440 6d 20 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e  m this VDBE run.
15450 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42  .  */.#ifdef VDB
15460 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20  E_PROFILE.  {.  
15470 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f    FILE *out = fo
15480 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c  pen("vdbe_profil
15490 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20  e.out", "a");.  
154a0 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20    if( out ){.   
154b0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
154c0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  fprintf(out, "--
154d0 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72  -- ");.      for
154e0 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
154f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70  i++){.        fp
15500 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78  rintf(out, "%02x
15510 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  ", p->aOp[i].opc
15520 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ode);.      }.  
15530 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
15540 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 69 66   "\n");.      if
15550 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20  ( p->zSql ){.   
15560 20 20 20 20 20 63 68 61 72 20 63 2c 20 70 63 20       char c, pc 
15570 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 70 72  = 0;.        fpr
15580 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29  intf(out, "-- ")
15590 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
155a0 30 3b 20 28 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b  0; (c = p->zSql[
155b0 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20  i])!=0; i++){.  
155c0 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d          if( pc==
155d0 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f  '\n' ) fprintf(o
155e0 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20  ut, "-- ");.    
155f0 20 20 20 20 20 20 70 75 74 63 28 63 2c 20 6f 75        putc(c, ou
15600 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 63  t);.          pc
15610 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = c;.        }.
15620 20 20 20 20 20 20 20 20 69 66 28 20 70 63 21 3d          if( pc!=
15630 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f  '\n' ) fprintf(o
15640 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ut, "\n");.     
15650 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
15660 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
15670 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a  {.        char z
15680 48 64 72 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20  Hdr[100];.      
15690 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
156a0 74 66 28 73 69 7a 65 6f 66 28 7a 48 64 72 29 2c  tf(sizeof(zHdr),
156b0 20 7a 48 64 72 2c 20 22 25 36 75 20 25 31 32 6c   zHdr, "%6u %12l
156c0 6c 75 20 25 38 6c 6c 75 20 22 2c 0a 20 20 20 20  lu %8llu ",.    
156d0 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
156e0 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20  .cnt,.          
156f0 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
15700 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  s,.           p-
15710 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20  >aOp[i].cnt>0 ? 
15720 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
15730 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a  /p->aOp[i].cnt :
15740 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20   0.        );.  
15750 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
15760 74 2c 20 22 25 73 22 2c 20 7a 48 64 72 29 3b 0a  t, "%s", zHdr);.
15770 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15780 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20  dbePrintOp(out, 
15790 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a  i, &p->aOp[i]);.
157a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63        }.      fc
157b0 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d  lose(out);.    }
157c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d  .  }.#endif.  p-
157d0 3e 69 43 75 72 72 65 6e 74 54 69 6d 65 20 3d 20  >iCurrentTime = 
157e0 30 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  0;.  p->magic = 
157f0 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b  VDBE_MAGIC_INIT;
15800 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20  .  return p->rc 
15810 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d  & db->errMask;.}
15820 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  . ./*.** Clean u
15830 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56  p and delete a V
15840 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74  DBE after execut
15850 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ion.  Return an 
15860 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
15870 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63  .** the result c
15880 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20  ode.  Write any 
15890 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65  error message te
158a0 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73  xt into *pzErrMs
158b0 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
158c0 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64  3VdbeFinalize(Vd
158d0 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  be *p){.  int rc
158e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
158f0 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  if( p->magic==VD
15900 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20  BE_MAGIC_RUN || 
15910 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
15920 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20  AGIC_HALT ){.   
15930 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
15940 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61  eReset(p);.    a
15950 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e  ssert( (rc & p->
15960 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63  db->errMask)==rc
15970 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   );.  }.  sqlite
15980 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a  3VdbeDelete(p);.
15990 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
159a0 2f 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  /*.** If paramet
159b0 65 72 20 69 4f 70 20 69 73 20 6c 65 73 73 20 74  er iOp is less t
159c0 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69  han zero, then i
159d0 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75  nvoke the destru
159e0 63 74 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20  ctor for.** all 
159f0 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 70  auxiliary data p
15a00 6f 69 6e 74 65 72 73 20 63 75 72 72 65 6e 74 6c  ointers currentl
15a10 79 20 63 61 63 68 65 64 20 62 79 20 74 68 65 20  y cached by the 
15a20 56 4d 20 70 61 73 73 65 64 20 61 73 0a 2a 2a 20  VM passed as.** 
15a30 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
15a40 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66  nt..**.** Or, if
15a50 20 69 4f 70 20 69 73 20 67 72 65 61 74 65 72 20   iOp is greater 
15a60 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
15a70 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
15a80 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a  destructor is.**
15a90 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f   only invoked fo
15aa0 72 20 74 68 6f 73 65 20 61 75 78 69 6c 69 61 72  r those auxiliar
15ab0 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20  y data pointers 
15ac0 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20 75  created by the u
15ad0 73 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ser .** function
15ae0 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20   invoked by the 
15af0 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f  OP_Function opco
15b00 64 65 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f  de at instructio
15b10 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20  n iOp of .** VM 
15b20 70 56 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20  pVdbe, and only 
15b30 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  then if:.**.**  
15b40 20 20 2a 20 74 68 65 20 61 73 73 6f 63 69 61 74    * the associat
15b50 65 64 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61  ed function para
15b60 6d 65 74 65 72 20 69 73 20 74 68 65 20 33 32 6e  meter is the 32n
15b70 64 20 6f 72 20 6c 61 74 65 72 20 28 63 6f 75 6e  d or later (coun
15b80 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f  ting.**      fro
15b90 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 29  m left to right)
15ba0 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  , or.**.**    * 
15bb0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
15bc0 67 20 62 69 74 20 69 6e 20 61 72 67 75 6d 65 6e  g bit in argumen
15bd0 74 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 20  t mask is clear 
15be0 28 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74  (where the first
15bf0 0a 2a 2a 20 20 20 20 20 20 66 75 6e 63 74 69 6f  .**      functio
15c00 6e 20 70 61 72 61 6d 65 74 65 72 20 63 6f 72 72  n parameter corr
15c10 65 73 70 6f 6e 64 73 20 74 6f 20 62 69 74 20 30  esponds to bit 0
15c20 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20   etc.)..*/.void 
15c30 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
15c40 65 41 75 78 44 61 74 61 28 56 64 62 65 20 2a 70  eAuxData(Vdbe *p
15c50 56 64 62 65 2c 20 69 6e 74 20 69 4f 70 2c 20 69  Vdbe, int iOp, i
15c60 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 41 75 78 44  nt mask){.  AuxD
15c70 61 74 61 20 2a 2a 70 70 20 3d 20 26 70 56 64 62  ata **pp = &pVdb
15c80 65 2d 3e 70 41 75 78 44 61 74 61 3b 0a 20 20 77  e->pAuxData;.  w
15c90 68 69 6c 65 28 20 2a 70 70 20 29 7b 0a 20 20 20  hile( *pp ){.   
15ca0 20 41 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d   AuxData *pAux =
15cb0 20 2a 70 70 3b 0a 20 20 20 20 69 66 28 20 28 69   *pp;.    if( (i
15cc0 4f 70 3c 30 29 0a 20 20 20 20 20 7c 7c 20 28 70  Op<0).     || (p
15cd0 41 75 78 2d 3e 69 4f 70 3d 3d 69 4f 70 20 26 26  Aux->iOp==iOp &&
15ce0 20 28 70 41 75 78 2d 3e 69 41 72 67 3e 33 31 20   (pAux->iArg>31 
15cf0 7c 7c 20 21 28 6d 61 73 6b 20 26 20 4d 41 53 4b  || !(mask & MASK
15d00 42 49 54 33 32 28 70 41 75 78 2d 3e 69 41 72 67  BIT32(pAux->iArg
15d10 29 29 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  )))).    ){.    
15d20 20 20 74 65 73 74 63 61 73 65 28 20 70 41 75 78    testcase( pAux
15d30 2d 3e 69 41 72 67 3d 3d 33 31 20 29 3b 0a 20 20  ->iArg==31 );.  
15d40 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44      if( pAux->xD
15d50 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20  elete ){.       
15d60 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70   pAux->xDelete(p
15d70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20  Aux->pAux);.    
15d80 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20    }.      *pp = 
15d90 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pAux->pNext;.   
15da0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
15db0 28 70 56 64 62 65 2d 3e 64 62 2c 20 70 41 75 78  (pVdbe->db, pAux
15dc0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
15dd0 20 20 20 20 70 70 3d 20 26 70 41 75 78 2d 3e 70      pp= &pAux->p
15de0 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
15df0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c  }../*.** Free al
15e00 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  l memory associa
15e10 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62  ted with the Vdb
15e20 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
15e30 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
15e40 0a 2a 2a 20 65 78 63 65 70 74 20 66 6f 72 20 6f  .** except for o
15e50 62 6a 65 63 74 20 69 74 73 65 6c 66 2c 20 77 68  bject itself, wh
15e60 69 63 68 20 69 73 20 70 72 65 73 65 72 76 65 64  ich is preserved
15e70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..**.** The diff
15e80 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
15e90 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
15ea0 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
15eb0 74 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a 20  te() is that.** 
15ec0 56 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c 73  VdbeDelete() als
15ed0 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64  o unlinks the Vd
15ee0 62 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74  be from the list
15ef0 20 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61 74   of VMs associat
15f00 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 64  ed with.** the d
15f10 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
15f20 6f 6e 20 61 6e 64 20 66 72 65 65 73 20 74 68 65  on and frees the
15f30 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a   object itself..
15f40 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
15f50 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 73  dbeClearObject(s
15f60 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65  qlite3 *db, Vdbe
15f70 20 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f 67 72   *p){.  SubProgr
15f80 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74  am *pSub, *pNext
15f90 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  ;.  int i;.  ass
15fa0 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c  ert( p->db==0 ||
15fb0 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20   p->db==db );.  
15fc0 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
15fd0 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72  p->aVar, p->nVar
15fe0 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  );.  releaseMemA
15ff0 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
16000 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
16010 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f  COLNAME_N);.  fo
16020 72 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72  r(pSub=p->pProgr
16030 61 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70  am; pSub; pSub=p
16040 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
16050 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a   = pSub->pNext;.
16060 20 20 20 20 76 64 62 65 46 72 65 65 4f 70 41 72      vdbeFreeOpAr
16070 72 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f  ray(db, pSub->aO
16080 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20  p, pSub->nOp);. 
16090 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
160a0 28 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a  (db, pSub);.  }.
160b0 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61 72    for(i=p->nzVar
160c0 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 20 73  -1; i>=0; i--) s
160d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
160e0 20 70 2d 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a 20   p->azVar[i]);. 
160f0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
16100 62 2c 20 70 2d 3e 61 7a 56 61 72 29 3b 0a 20 20  b, p->azVar);.  
16110 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
16120 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e  db, p->aOp, p->n
16130 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  Op);.  sqlite3Db
16140 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c  Free(db, p->aCol
16150 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
16160 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53  DbFree(db, p->zS
16170 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ql);.  sqlite3Db
16180 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65  Free(db, p->pFre
16190 65 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  e);.#ifdef SQLIT
161a0 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
161b0 41 4e 53 54 41 54 55 53 0a 20 20 66 6f 72 28 69  ANSTATUS.  for(i
161c0 3d 30 3b 20 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20  =0; i<p->nScan; 
161d0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
161e0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
161f0 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  Scan[i].zName);.
16200 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
16210 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e  ree(db, p->aScan
16220 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  );.#endif.}../*.
16230 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
16240 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69  ire VDBE..*/.voi
16250 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
16260 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ete(Vdbe *p){.  
16270 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20  sqlite3 *db;..  
16280 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
16290 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d  ) return;.  db =
162a0 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
162b0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
162c0 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
162d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
162e0 43 6c 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20  ClearObject(db, 
162f0 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  p);.  if( p->pPr
16300 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72  ev ){.    p->pPr
16310 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
16320 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Next;.  }else{. 
16330 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70     assert( db->p
16340 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64  Vdbe==p );.    d
16350 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e  b->pVdbe = p->pN
16360 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
16370 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
16380 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
16390 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20   p->pPrev;.  }. 
163a0 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
163b0 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70  _MAGIC_DEAD;.  p
163c0 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69  ->db = 0;.  sqli
163d0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
163e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63  ;.}../*.** The c
163f0 75 72 73 6f 72 20 22 70 22 20 68 61 73 20 61 20  ursor "p" has a 
16400 70 65 6e 64 69 6e 67 20 73 65 65 6b 20 6f 70 65  pending seek ope
16410 72 61 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20  ration that has 
16420 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20  not yet been.** 
16430 63 61 72 72 69 65 64 20 6f 75 74 2e 20 20 53 65  carried out.  Se
16440 65 6b 20 74 68 65 20 63 75 72 73 6f 72 20 6e 6f  ek the cursor no
16450 77 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  w.  If an error 
16460 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a  occurs, return.*
16470 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  * the appropriat
16480 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
16490 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
164a0 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64  TE_NOINLINE hand
164b0 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  leDeferredMoveto
164c0 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
164d0 0a 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a  .  int res, rc;.
164e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
164f0 53 54 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  ST.  extern int 
16500 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
16510 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61  ount;.#endif.  a
16520 73 73 65 72 74 28 20 70 2d 3e 64 65 66 65 72 72  ssert( p->deferr
16530 65 64 4d 6f 76 65 74 6f 20 29 3b 0a 20 20 61 73  edMoveto );.  as
16540 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65  sert( p->isTable
16550 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
16560 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
16570 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 72 63  PE_BTREE );.  rc
16580 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
16590 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d  ovetoUnpacked(p-
165a0 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20  >uc.pCursor, 0, 
165b0 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c  p->movetoTarget,
165c0 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 69 66 28   0, &res);.  if(
165d0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
165e0 0a 20 20 69 66 28 20 72 65 73 21 3d 30 20 29 20  .  if( res!=0 ) 
165f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
16600 52 52 55 50 54 5f 42 4b 50 54 3b 0a 23 69 66 64  RRUPT_BKPT;.#ifd
16610 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
16620 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
16630 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
16640 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76    p->deferredMov
16650 65 74 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61  eto = 0;.  p->ca
16660 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
16670 45 5f 53 54 41 4c 45 3b 0a 20 20 72 65 74 75 72  E_STALE;.  retur
16680 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
16690 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e 67 20  /*.** Something 
166a0 68 61 73 20 6d 6f 76 65 64 20 63 75 72 73 6f 72  has moved cursor
166b0 20 22 70 22 20 6f 75 74 20 6f 66 20 70 6c 61 63   "p" out of plac
166c0 65 2e 20 20 4d 61 79 62 65 20 74 68 65 20 72 6f  e.  Maybe the ro
166d0 77 20 69 74 20 77 61 73 0a 2a 2a 20 70 6f 69 6e  w it was.** poin
166e0 74 65 64 20 74 6f 20 77 61 73 20 64 65 6c 65 74  ted to was delet
166f0 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
16700 72 20 69 74 2e 20 20 4f 72 20 6d 61 79 62 65 20  r it.  Or maybe 
16710 74 68 65 20 62 74 72 65 65 20 77 61 73 0a 2a 2a  the btree was.**
16720 20 72 65 62 61 6c 61 6e 63 65 64 2e 20 20 57 68   rebalanced.  Wh
16730 61 74 65 76 65 72 20 74 68 65 20 63 61 75 73 65  atever the cause
16740 2c 20 74 72 79 20 74 6f 20 72 65 73 74 6f 72 65  , try to restore
16750 20 22 70 22 20 74 6f 20 74 68 65 20 70 6c 61 63   "p" to the plac
16760 65 20 69 74 0a 2a 2a 20 69 73 20 73 75 70 70 6f  e it.** is suppo
16770 73 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 69  sed to be pointi
16780 6e 67 2e 20 20 49 66 20 74 68 65 20 72 6f 77 20  ng.  If the row 
16790 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20  was deleted out 
167a0 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 0a 2a  from under the.*
167b0 2a 20 63 75 72 73 6f 72 2c 20 73 65 74 20 74 68  * cursor, set th
167c0 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
167d0 74 20 74 6f 20 61 20 4e 55 4c 4c 20 72 6f 77 2e  t to a NULL row.
167e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
167f0 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68  QLITE_NOINLINE h
16800 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72  andleMovedCursor
16810 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
16820 0a 20 20 69 6e 74 20 69 73 44 69 66 66 65 72 65  .  int isDiffere
16830 6e 74 52 6f 77 2c 20 72 63 3b 0a 20 20 61 73 73  ntRow, rc;.  ass
16840 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65  ert( p->eCurType
16850 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
16860 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
16870 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b  uc.pCursor!=0 );
16880 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
16890 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
168a0 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72  Moved(p->uc.pCur
168b0 73 6f 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  sor) );.  rc = s
168c0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
168d0 72 52 65 73 74 6f 72 65 28 70 2d 3e 75 63 2e 70  rRestore(p->uc.p
168e0 43 75 72 73 6f 72 2c 20 26 69 73 44 69 66 66 65  Cursor, &isDiffe
168f0 72 65 6e 74 52 6f 77 29 3b 0a 20 20 70 2d 3e 63  rentRow);.  p->c
16900 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
16910 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 20  HE_STALE;.  if( 
16920 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 20 29  isDifferentRow )
16930 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b   p->nullRow = 1;
16940 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16950 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
16960 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
16970 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e  cursor is valid.
16980 20 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75    Restore the cu
16990 72 73 6f 72 0a 2a 2a 20 69 66 20 6e 65 65 64 20  rsor.** if need 
169a0 62 65 2e 20 20 52 65 74 75 72 6e 20 61 6e 79 20  be.  Return any 
169b0 49 2f 4f 20 65 72 72 6f 72 20 66 72 6f 6d 20 74  I/O error from t
169c0 68 65 20 72 65 73 74 6f 72 65 20 6f 70 65 72 61  he restore opera
169d0 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
169e0 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 52 65  ite3VdbeCursorRe
169f0 73 74 6f 72 65 28 56 64 62 65 43 75 72 73 6f 72  store(VdbeCursor
16a00 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
16a10 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  p->eCurType==CUR
16a20 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
16a30 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
16a40 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70  CursorHasMoved(p
16a50 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29 7b  ->uc.pCursor) ){
16a60 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64  .    return hand
16a70 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29  leMovedCursor(p)
16a80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
16a90 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
16aa0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
16ab0 20 63 75 72 73 6f 72 20 70 20 69 73 20 72 65 61   cursor p is rea
16ac0 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  dy to read or wr
16ad0 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77  ite the row to w
16ae0 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c  hich it.** was l
16af0 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20  ast positioned. 
16b00 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
16b10 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20   code if an OOM 
16b20 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72  fault or I/O err
16b30 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75  or.** prevents u
16b40 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69  s from positioni
16b50 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ng the cursor to
16b60 20 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73   its correct pos
16b70 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ition..**.** If 
16b80 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69  a MoveTo operati
16b90 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e  on is pending on
16ba0 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
16bb0 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a  r, then do that.
16bc0 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20  ** MoveTo now.  
16bd0 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65  If no move is pe
16be0 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20  nding, check to 
16bf0 73 65 65 20 69 66 20 74 68 65 20 72 6f 77 20 68  see if the row h
16c00 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74  as been.** delet
16c10 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
16c20 72 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64  r the cursor and
16c30 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b   if it has, mark
16c40 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61   the row as.** a
16c50 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a   NULL row..**.**
16c60 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
16c70 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
16c80 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  ng to the correc
16c90 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72  t row and that r
16ca0 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65  ow has.** not be
16cb0 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  en deleted out f
16cc0 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75  rom under the cu
16cd0 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20  rsor, then this 
16ce0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
16cf0 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
16d00 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65  e3VdbeCursorMove
16d10 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a  to(VdbeCursor **
16d20 70 70 2c 20 69 6e 74 20 2a 70 69 43 6f 6c 29 7b  pp, int *piCol){
16d30 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
16d40 20 3d 20 2a 70 70 3b 0a 20 20 69 66 28 20 70 2d   = *pp;.  if( p-
16d50 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
16d60 50 45 5f 42 54 52 45 45 20 29 7b 0a 20 20 20 20  PE_BTREE ){.    
16d70 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d  if( p->deferredM
16d80 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 20 20 69  oveto ){.      i
16d90 6e 74 20 69 4d 61 70 3b 0a 20 20 20 20 20 20 69  nt iMap;.      i
16da0 66 28 20 70 2d 3e 61 41 6c 74 4d 61 70 20 26 26  f( p->aAltMap &&
16db0 20 28 69 4d 61 70 20 3d 20 70 2d 3e 61 41 6c 74   (iMap = p->aAlt
16dc0 4d 61 70 5b 31 2b 2a 70 69 43 6f 6c 5d 29 3e 30  Map[1+*piCol])>0
16dd0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 20   ){.        *pp 
16de0 3d 20 70 2d 3e 70 41 6c 74 43 75 72 73 6f 72 3b  = p->pAltCursor;
16df0 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c 20  .        *piCol 
16e00 3d 20 69 4d 61 70 20 2d 20 31 3b 0a 20 20 20 20  = iMap - 1;.    
16e10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16e20 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
16e30 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c      return handl
16e40 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28  eDeferredMoveto(
16e50 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  p);.    }.    if
16e60 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
16e70 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e  rsorHasMoved(p->
16e80 75 63 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20  uc.pCursor) ){. 
16e90 20 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64       return hand
16ea0 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29  leMovedCursor(p)
16eb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
16ec0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16ed0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
16ee0 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  lowing functions
16ef0 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56  :.**.** sqlite3V
16f00 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a  dbeSerialType().
16f10 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
16f20 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a  rialTypeLen().**
16f30 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
16f40 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74  alLen().** sqlit
16f50 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
16f60 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
16f70 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a  SerialGet().**.*
16f80 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68  * encapsulate th
16f90 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72 69  e code that seri
16fa0 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f  alizes values fo
16fb0 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c  r storage in SQL
16fc0 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20  ite.** data and 
16fd0 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45  index records. E
16fe0 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76  ach serialized v
16ff0 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  alue consists of
17000 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79   a.** 'serial-ty
17010 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f  pe' and a blob o
17020 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72 69  f data. The seri
17030 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d  al type is an 8-
17040 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a  byte unsigned.**
17050 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64   integer, stored
17060 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   as a varint..**
17070 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65  .** In an SQLite
17080 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74   index record, t
17090 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
170a0 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c  s stored directl
170b0 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  y before.** the 
170c0 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61  blob of data tha
170d0 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  t it corresponds
170e0 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20   to. In a table 
170f0 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69  record, all seri
17100 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20  al.** types are 
17110 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74  stored at the st
17120 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72  art of the recor
17130 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73  d, and the blobs
17140 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74   of data at.** t
17150 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68  he end. Hence th
17160 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c  ese functions al
17170 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74  low the caller t
17180 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20  o handle the.** 
17190 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20  serial-type and 
171a0 64 61 74 61 20 62 6c 6f 62 20 73 65 70 61 72 61  data blob separa
171b0 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tely..**.** The 
171c0 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20  following table 
171d0 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76 61  describes the va
171e0 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c  rious storage cl
171f0 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a  asses for data:.
17200 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74  **.**   serial t
17210 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65 73  ype        bytes
17220 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74 79   of data      ty
17230 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  pe.**   --------
17240 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
17250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d  ----------    --
17260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
17270 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
17280 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
17290 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a           NULL.**
172a0 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
172b0 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
172c0 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
172d0 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
172e0 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
172f0 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
17300 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
17310 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20  r.**      3     
17320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17330 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  3            sig
17340 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
17350 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20      4           
17360 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20 20            4     
17370 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
17380 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20  teger.**      5 
17390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173a0 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
173b0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
173c0 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20 20  **      6       
173d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
173e0 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
173f0 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
17400 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20 20    7             
17410 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20          8       
17420 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a       IEEE float.
17430 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20 20  **      8       
17440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
17450 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
17460 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a  er constant 0.**
17470 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20 20        9         
17480 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
17490 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
174a0 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20   constant 1.**  
174b0 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20 20     10,11        
174c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174d0 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20         reserved 
174e0 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a  for expansion.**
174f0 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76      N>=12 and ev
17500 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f  en       (N-12)/
17510 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a  2        BLOB.**
17520 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64      N>=13 and od
17530 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f  d        (N-13)/
17540 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a  2        text.**
17550 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20  .** The 8 and 9 
17560 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65 64  types were added
17570 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20   in 3.3.0, file 
17580 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72  format 4.  Prior
17590 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20   versions.** of 
175a0 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20  SQLite will not 
175b0 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65  understand those
175c0 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a   serial types..*
175d0 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
175e0 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20  the serial-type 
175f0 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
17600 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f  ored in pMem..*/
17610 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
17620 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a  SerialType(Mem *
17630 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66  pMem, int file_f
17640 6f 72 6d 61 74 2c 20 75 33 32 20 2a 70 4c 65 6e  ormat, u32 *pLen
17650 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  ){.  int flags =
17660 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20   pMem->flags;.  
17670 75 33 32 20 6e 3b 0a 0a 20 20 61 73 73 65 72 74  u32 n;..  assert
17680 28 20 70 4c 65 6e 21 3d 30 20 29 3b 0a 20 20 69  ( pLen!=0 );.  i
17690 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c  f( flags&MEM_Nul
176a0 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d  l ){.    *pLen =
176b0 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   0;.    return 0
176c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
176d0 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20  s&MEM_Int ){.   
176e0 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77   /* Figure out w
176f0 68 65 74 68 65 72 20 74 6f 20 75 73 65 20 31 2c  hether to use 1,
17700 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62 79   2, 4, 6 or 8 by
17710 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69  tes. */.#   defi
17720 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28 28  ne MAX_6BYTE (((
17730 28 69 36 34 29 30 78 30 30 30 30 38 30 30 30 29  (i64)0x00008000)
17740 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36 34  <<32)-1).    i64
17750 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a   i = pMem->u.i;.
17760 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20 69      u64 u;.    i
17770 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( i<0 ){.      
17780 75 20 3d 20 7e 69 3b 0a 20 20 20 20 7d 65 6c 73  u = ~i;.    }els
17790 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69 3b 0a  e{.      u = i;.
177a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c      }.    if( u<
177b0 3d 31 32 37 20 29 7b 0a 20 20 20 20 20 20 69 66  =127 ){.      if
177c0 28 20 28 69 26 31 29 3d 3d 69 20 26 26 20 66 69  ( (i&1)==i && fi
177d0 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a  le_format>=4 ){.
177e0 20 20 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20          *pLen = 
177f0 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
17800 6e 20 38 2b 28 75 33 32 29 75 3b 0a 20 20 20 20  n 8+(u32)u;.    
17810 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17820 20 2a 70 4c 65 6e 20 3d 20 31 3b 0a 20 20 20 20   *pLen = 1;.    
17830 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
17840 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
17850 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29 7b 20  if( u<=32767 ){ 
17860 2a 70 4c 65 6e 20 3d 20 32 3b 20 72 65 74 75 72  *pLen = 2; retur
17870 6e 20 32 3b 20 7d 0a 20 20 20 20 69 66 28 20 75  n 2; }.    if( u
17880 3c 3d 38 33 38 38 36 30 37 20 29 7b 20 2a 70 4c  <=8388607 ){ *pL
17890 65 6e 20 3d 20 33 3b 20 72 65 74 75 72 6e 20 33  en = 3; return 3
178a0 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 32  ; }.    if( u<=2
178b0 31 34 37 34 38 33 36 34 37 20 29 7b 20 2a 70 4c  147483647 ){ *pL
178c0 65 6e 20 3d 20 34 3b 20 72 65 74 75 72 6e 20 34  en = 4; return 4
178d0 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d  ; }.    if( u<=M
178e0 41 58 5f 36 42 59 54 45 20 29 7b 20 2a 70 4c 65  AX_6BYTE ){ *pLe
178f0 6e 20 3d 20 36 3b 20 72 65 74 75 72 6e 20 35 3b  n = 6; return 5;
17900 20 7d 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38   }.    *pLen = 8
17910 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a  ;.    return 6;.
17920 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26    }.  if( flags&
17930 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
17940 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20 20 20 72  *pLen = 8;.    r
17950 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61  eturn 7;.  }.  a
17960 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d  ssert( pMem->db-
17970 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
17980 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c   flags&(MEM_Str|
17990 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 61  MEM_Blob) );.  a
179a0 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3e 3d  ssert( pMem->n>=
179b0 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75 33 32 29  0 );.  n = (u32)
179c0 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66  pMem->n;.  if( f
179d0 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
179e0 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d  ){.    n += pMem
179f0 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20  ->u.nZero;.  }. 
17a00 20 2a 70 4c 65 6e 20 3d 20 6e 3b 0a 20 20 72 65   *pLen = n;.  re
17a10 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32  turn ((n*2) + 12
17a20 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53   + ((flags&MEM_S
17a30 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a  tr)!=0));.}../*.
17a40 2a 2a 20 54 68 65 20 73 69 7a 65 73 20 66 6f 72  ** The sizes for
17a50 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 6c 65   serial types le
17a60 73 73 20 74 68 61 6e 20 31 32 38 0a 2a 2f 0a 73  ss than 128.*/.s
17a70 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 73  tatic const u8 s
17a80 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53  qlite3SmallTypeS
17a90 69 7a 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  izes[] = {.     
17aa0 20 20 20 2f 2a 20 20 30 20 20 20 31 20 20 20 32     /*  0   1   2
17ab0 20 20 20 33 20 20 20 34 20 20 20 35 20 20 20 36     3   4   5   6
17ac0 20 20 20 37 20 20 20 38 20 20 20 39 20 2a 2f 20     7   8   9 */ 
17ad0 20 20 0a 2f 2a 20 20 20 30 20 2a 2f 20 20 20 30    ./*   0 */   0
17ae0 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c 20 20 34  ,  1,  2,  3,  4
17af0 2c 20 20 36 2c 20 20 38 2c 20 20 38 2c 20 20 30  ,  6,  8,  8,  0
17b00 2c 20 20 30 2c 0a 2f 2a 20 20 31 30 20 2a 2f 20  ,  0,./*  10 */ 
17b10 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
17b20 20 20 31 2c 20 20 31 2c 20 20 32 2c 20 20 32 2c    1,  1,  2,  2,
17b30 20 20 33 2c 20 20 33 2c 0a 2f 2a 20 20 32 30 20    3,  3,./*  20 
17b40 2a 2f 20 20 20 34 2c 20 20 34 2c 20 20 35 2c 20  */   4,  4,  5, 
17b50 20 35 2c 20 20 36 2c 20 20 36 2c 20 20 37 2c 20   5,  6,  6,  7, 
17b60 20 37 2c 20 20 38 2c 20 20 38 2c 0a 2f 2a 20 20   7,  8,  8,./*  
17b70 33 30 20 2a 2f 20 20 20 39 2c 20 20 39 2c 20 31  30 */   9,  9, 1
17b80 30 2c 20 31 30 2c 20 31 31 2c 20 31 31 2c 20 31  0, 10, 11, 11, 1
17b90 32 2c 20 31 32 2c 20 31 33 2c 20 31 33 2c 0a 2f  2, 12, 13, 13,./
17ba0 2a 20 20 34 30 20 2a 2f 20 20 31 34 2c 20 31 34  *  40 */  14, 14
17bb0 2c 20 31 35 2c 20 31 35 2c 20 31 36 2c 20 31 36  , 15, 15, 16, 16
17bc0 2c 20 31 37 2c 20 31 37 2c 20 31 38 2c 20 31 38  , 17, 17, 18, 18
17bd0 2c 0a 2f 2a 20 20 35 30 20 2a 2f 20 20 31 39 2c  ,./*  50 */  19,
17be0 20 31 39 2c 20 32 30 2c 20 32 30 2c 20 32 31 2c   19, 20, 20, 21,
17bf0 20 32 31 2c 20 32 32 2c 20 32 32 2c 20 32 33 2c   21, 22, 22, 23,
17c00 20 32 33 2c 0a 2f 2a 20 20 36 30 20 2a 2f 20 20   23,./*  60 */  
17c10 32 34 2c 20 32 34 2c 20 32 35 2c 20 32 35 2c 20  24, 24, 25, 25, 
17c20 32 36 2c 20 32 36 2c 20 32 37 2c 20 32 37 2c 20  26, 26, 27, 27, 
17c30 32 38 2c 20 32 38 2c 0a 2f 2a 20 20 37 30 20 2a  28, 28,./*  70 *
17c40 2f 20 20 32 39 2c 20 32 39 2c 20 33 30 2c 20 33  /  29, 29, 30, 3
17c50 30 2c 20 33 31 2c 20 33 31 2c 20 33 32 2c 20 33  0, 31, 31, 32, 3
17c60 32 2c 20 33 33 2c 20 33 33 2c 0a 2f 2a 20 20 38  2, 33, 33,./*  8
17c70 30 20 2a 2f 20 20 33 34 2c 20 33 34 2c 20 33 35  0 */  34, 34, 35
17c80 2c 20 33 35 2c 20 33 36 2c 20 33 36 2c 20 33 37  , 35, 36, 36, 37
17c90 2c 20 33 37 2c 20 33 38 2c 20 33 38 2c 0a 2f 2a  , 37, 38, 38,./*
17ca0 20 20 39 30 20 2a 2f 20 20 33 39 2c 20 33 39 2c    90 */  39, 39,
17cb0 20 34 30 2c 20 34 30 2c 20 34 31 2c 20 34 31 2c   40, 40, 41, 41,
17cc0 20 34 32 2c 20 34 32 2c 20 34 33 2c 20 34 33 2c   42, 42, 43, 43,
17cd0 0a 2f 2a 20 31 30 30 20 2a 2f 20 20 34 34 2c 20  ./* 100 */  44, 
17ce0 34 34 2c 20 34 35 2c 20 34 35 2c 20 34 36 2c 20  44, 45, 45, 46, 
17cf0 34 36 2c 20 34 37 2c 20 34 37 2c 20 34 38 2c 20  46, 47, 47, 48, 
17d00 34 38 2c 0a 2f 2a 20 31 31 30 20 2a 2f 20 20 34  48,./* 110 */  4
17d10 39 2c 20 34 39 2c 20 35 30 2c 20 35 30 2c 20 35  9, 49, 50, 50, 5
17d20 31 2c 20 35 31 2c 20 35 32 2c 20 35 32 2c 20 35  1, 51, 52, 52, 5
17d30 33 2c 20 35 33 2c 0a 2f 2a 20 31 32 30 20 2a 2f  3, 53,./* 120 */
17d40 20 20 35 34 2c 20 35 34 2c 20 35 35 2c 20 35 35    54, 54, 55, 55
17d50 2c 20 35 36 2c 20 35 36 2c 20 35 37 2c 20 35 37  , 56, 56, 57, 57
17d60 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .};../*.** Retur
17d70 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  n the length of 
17d80 74 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70  the data corresp
17d90 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75  onding to the su
17da0 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79  pplied serial-ty
17db0 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  pe..*/.u32 sqlit
17dc0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
17dd0 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74  Len(u32 serial_t
17de0 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69  ype){.  if( seri
17df0 61 6c 5f 74 79 70 65 3e 3d 31 32 38 20 29 7b 0a  al_type>=128 ){.
17e00 20 20 20 20 72 65 74 75 72 6e 20 28 73 65 72 69      return (seri
17e10 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20  al_type-12)/2;. 
17e20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
17e30 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  rt( serial_type<
17e40 31 32 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  12 .            
17e50 7c 7c 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54  || sqlite3SmallT
17e60 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f  ypeSizes[serial_
17e70 74 79 70 65 5d 3d 3d 28 73 65 72 69 61 6c 5f 74  type]==(serial_t
17e80 79 70 65 20 2d 20 31 32 29 2f 32 20 29 3b 0a 20  ype - 12)/2 );. 
17e90 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
17ea0 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b  3SmallTypeSizes[
17eb0 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20  serial_type];.  
17ec0 7d 0a 7d 0a 75 38 20 73 71 6c 69 74 65 33 56 64  }.}.u8 sqlite3Vd
17ed0 62 65 4f 6e 65 42 79 74 65 53 65 72 69 61 6c 54  beOneByteSerialT
17ee0 79 70 65 4c 65 6e 28 75 38 20 73 65 72 69 61 6c  ypeLen(u8 serial
17ef0 5f 74 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74  _type){.  assert
17f00 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32  ( serial_type<12
17f10 38 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  8 );.  return sq
17f20 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69  lite3SmallTypeSi
17f30 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d  zes[serial_type]
17f40 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ;  .}../*.** If 
17f50 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72 63  we are on an arc
17f60 68 69 74 65 63 74 75 72 65 20 77 69 74 68 20 6d  hitecture with m
17f70 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61  ixed-endian floa
17f80 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20  ting .** points 
17f90 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e 20  (ex: ARM7) then 
17fa0 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20 34  swap the lower 4
17fb0 20 62 79 74 65 73 20 77 69 74 68 20 74 68 65 20   bytes with the 
17fc0 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74 65  .** upper 4 byte
17fd0 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  s.  Return the r
17fe0 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  esult..**.** For
17ff0 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74 75   most architectu
18000 72 65 73 2c 20 74 68 69 73 20 69 73 20 61 20 6e  res, this is a n
18010 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74  o-op..**.** (lat
18020 65 72 29 3a 20 20 49 74 20 69 73 20 72 65 70 6f  er):  It is repo
18030 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74 20  rted to me that 
18040 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e  the mixed-endian
18050 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41   problem.** on A
18060 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65 20  RM7 is an issue 
18070 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77 69  with GCC, not wi
18080 74 68 20 74 68 65 20 41 52 4d 37 20 63 68 69 70  th the ARM7 chip
18090 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74  .  It seems.** t
180a0 68 61 74 20 65 61 72 6c 79 20 76 65 72 73 69 6f  hat early versio
180b0 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65 64  ns of GCC stored
180c0 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20 6f   the two words o
180d0 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c  f a 64-bit.** fl
180e0 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67  oat in the wrong
180f0 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68 61   order.  And tha
18100 74 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e  t error has been
18110 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65   propagated.** e
18120 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65 20  ver since.  The 
18130 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63  blame is not nec
18140 65 73 73 61 72 69 6c 79 20 77 69 74 68 20 47 43  essarily with GC
18150 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43  C, though..** GC
18160 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75 73  C might have jus
18170 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70 72  t copying the pr
18180 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72 69  oblem from a pri
18190 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20  or compiler..** 
181a0 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74  I am also told t
181b0 68 61 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f  hat newer versio
181c0 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74 20 66  ns of GCC that f
181d0 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65 6e  ollow a differen
181e0 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68 65  t.** ABI get the
181f0 20 62 79 74 65 20 6f 72 64 65 72 20 72 69 67 68   byte order righ
18200 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70  t..**.** Develop
18210 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74 65  ers using SQLite
18220 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f 75   on an ARM7 shou
18230 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72  ld compile and r
18240 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c  un their.** appl
18250 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44  ication using -D
18260 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20 61  SQLITE_DEBUG=1 a
18270 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20 57  t least once.  W
18280 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61  ith DEBUG.** ena
18290 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65 72  bled, some asser
182a0 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e  ts below will en
182b0 73 75 72 65 20 74 68 61 74 20 74 68 65 20 62 79  sure that the by
182c0 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66  te order of.** f
182d0 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
182e0 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63 74 2e  lues is correct.
182f0 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d  .**.** (2007-08-
18300 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 20 56  30)  Frank van V
18310 75 67 74 20 68 61 73 20 73 74 75 64 69 65 64 20  ugt has studied 
18320 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f  this problem clo
18330 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20  sely.** and has 
18340 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69 6e 67  send his finding
18350 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20  s to the SQLite 
18360 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 72 61  developers.  Fra
18370 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 68 61  nk.** writes tha
18380 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72  t some Linux ker
18390 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61 74  nels offer float
183a0 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 77 61  ing point hardwa
183b0 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20  re.** emulation 
183c0 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 20 33  that uses only 3
183d0 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 73 20  2-bit mantissas 
183e0 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66 75 6c  instead of a ful
183f0 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61 73  l .** 48-bits as
18400 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
18410 20 49 45 45 45 20 73 74 61 6e 64 61 72 64 2e 20   IEEE standard. 
18420 20 28 54 68 69 73 20 69 73 20 74 68 65 0a 2a 2a   (This is the.**
18430 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53 54   CONFIG_FPE_FAST
18440 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e  FPE option.)  On
18450 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c 20 66   such systems, f
18460 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a  loating point.**
18470 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 62   byte swapping b
18480 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d 70  ecomes very comp
18490 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61 76 6f  licated.  To avo
184a0 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20  id problems,.** 
184b0 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 62 79  the necessary by
184c0 74 65 20 73 77 61 70 70 69 6e 67 20 69 73 20 63  te swapping is c
184d0 61 72 72 69 65 64 20 6f 75 74 20 75 73 69 6e 67  arried out using
184e0 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65   a 64-bit intege
184f0 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e  r.** rather than
18500 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e   a 64-bit float.
18510 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65 73 20    Frank assures 
18520 75 73 20 74 68 61 74 20 74 68 65 20 63 6f 64 65  us that the code
18530 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66   here.** works f
18540 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 68 65  or him.  We, the
18550 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 61 76   developers, hav
18560 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64 65  e no way to inde
18570 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72  pendently.** ver
18580 69 66 79 20 74 68 69 73 2c 20 62 75 74 20 46 72  ify this, but Fr
18590 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f  ank seems to kno
185a0 77 20 77 68 61 74 20 68 65 20 69 73 20 74 61 6c  w what he is tal
185b0 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f  king about.** so
185c0 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a   we trust him..*
185d0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
185e0 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42  MIXED_ENDIAN_64B
185f0 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63 20  IT_FLOAT.static 
18600 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28 75 36  u64 floatSwap(u6
18610 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b  4 in){.  union {
18620 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20  .    u64 r;.    
18630 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b  u32 i[2];.  } u;
18640 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72  .  u32 t;..  u.r
18650 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69   = in;.  t = u.i
18660 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20  [0];.  u.i[0] = 
18670 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d  u.i[1];.  u.i[1]
18680 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 20 75   = t;.  return u
18690 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73  .r;.}.# define s
186a0 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
186b0 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c 6f 61  oat(X)  X = floa
186c0 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65 0a 23  tSwap(X).#else.#
186d0 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65   define swapMixe
186e0 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a  dEndianFloat(X).
186f0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72  #endif../*.** Wr
18700 69 74 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a  ite the serializ
18710 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72  ed data blob for
18720 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   the value store
18730 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a  d in pMem into .
18740 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61 73  ** buf. It is as
18750 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63  sumed that the c
18760 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61  aller has alloca
18770 74 65 64 20 73 75 66 66 69 63 69 65 6e 74 20 73  ted sufficient s
18780 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  pace..** Return 
18790 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
187a0 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a  tes written..**.
187b0 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65 20 61  ** nBuf is the a
187c0 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 6c  mount of space l
187d0 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20 54  eft in buf[].  T
187e0 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73  he caller is res
187f0 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66 6f 72 20  ponsible.** for 
18800 61 6c 6c 6f 63 61 74 69 6e 67 20 65 6e 6f 75 67  allocating enoug
18810 68 20 73 70 61 63 65 20 74 6f 20 62 75 66 5b 5d  h space to buf[]
18820 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74   to hold the ent
18830 69 72 65 20 66 69 65 6c 64 2c 20 65 78 63 6c 75  ire field, exclu
18840 73 69 76 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70  sive.** of the p
18850 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 62 79 74  Mem->u.nZero byt
18860 65 73 20 66 6f 72 20 61 20 4d 45 4d 5f 5a 65 72  es for a MEM_Zer
18870 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 52  o value..**.** R
18880 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
18890 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
188a0 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
188b0 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62  buf[].  The numb
188c0 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69  er.** of bytes i
188d0 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  n the zero-fille
188e0 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64  d tail is includ
188f0 65 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  ed in the return
18900 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69   value only.** i
18910 66 20 74 68 6f 73 65 20 62 79 74 65 73 20 77 65  f those bytes we
18920 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66  re zeroed in buf
18930 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69  []..*/ .u32 sqli
18940 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74  te3VdbeSerialPut
18950 28 75 38 20 2a 62 75 66 2c 20 4d 65 6d 20 2a 70  (u8 *buf, Mem *p
18960 4d 65 6d 2c 20 75 33 32 20 73 65 72 69 61 6c 5f  Mem, u32 serial_
18970 74 79 70 65 29 7b 0a 20 20 75 33 32 20 6c 65 6e  type){.  u32 len
18980 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  ;..  /* Integer 
18990 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66  and Real */.  if
189a0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37  ( serial_type<=7
189b0 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e   && serial_type>
189c0 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a  0 ){.    u64 v;.
189d0 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 69      u32 i;.    i
189e0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
189f0 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  7 ){.      asser
18a00 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69  t( sizeof(v)==si
18a10 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 20  zeof(pMem->u.r) 
18a20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
18a30 26 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20  &v, &pMem->u.r, 
18a40 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20  sizeof(v));.    
18a50 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
18a60 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d  nFloat(v);.    }
18a70 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20  else{.      v = 
18a80 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d  pMem->u.i;.    }
18a90 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73  .    len = i = s
18aa0 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53  qlite3SmallTypeS
18ab0 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65  izes[serial_type
18ac0 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ];.    assert( i
18ad0 3e 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  >0 );.    do{.  
18ae0 20 20 20 20 62 75 66 5b 2d 2d 69 5d 20 3d 20 28      buf[--i] = (
18af0 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20  u8)(v&0xFF);.   
18b00 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20     v >>= 8;.    
18b10 7d 77 68 69 6c 65 28 20 69 20 29 3b 0a 20 20 20  }while( i );.   
18b20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d   return len;.  }
18b30 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72  ..  /* String or
18b40 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73   blob */.  if( s
18b50 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29  erial_type>=12 )
18b60 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  {.    assert( pM
18b70 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e  em->n + ((pMem->
18b80 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
18b90 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a  )?pMem->u.nZero:
18ba0 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
18bb0 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56  == (int)sqlite3V
18bc0 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
18bd0 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b  (serial_type) );
18be0 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d  .    len = pMem-
18bf0 3e 6e 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e  >n;.    if( len>
18c00 30 20 29 20 6d 65 6d 63 70 79 28 62 75 66 2c 20  0 ) memcpy(buf, 
18c10 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20  pMem->z, len);. 
18c20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
18c30 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72   }..  /* NULL or
18c40 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20   constants 0 or 
18c50 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b  1 */.  return 0;
18c60 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 22 78 22  .}../* Input "x"
18c70 20 69 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f   is a sequence o
18c80 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 61  f unsigned chara
18c90 63 74 65 72 73 20 74 68 61 74 20 72 65 70 72 65  cters that repre
18ca0 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67 2d 65 6e  sent a.** big-en
18cb0 64 69 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 52  dian integer.  R
18cc0 65 74 75 72 6e 20 74 68 65 20 65 71 75 69 76 61  eturn the equiva
18cd0 6c 65 6e 74 20 6e 61 74 69 76 65 20 69 6e 74 65  lent native inte
18ce0 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4f  ger.*/.#define O
18cf0 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20  NE_BYTE_INT(x)  
18d00 20 20 28 28 69 38 29 28 78 29 5b 30 5d 29 0a 23    ((i8)(x)[0]).#
18d10 64 65 66 69 6e 65 20 54 57 4f 5f 42 59 54 45 5f  define TWO_BYTE_
18d20 49 4e 54 28 78 29 20 20 20 20 28 32 35 36 2a 28  INT(x)    (256*(
18d30 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 78 29 5b  i8)((x)[0])|(x)[
18d40 31 5d 29 0a 23 64 65 66 69 6e 65 20 54 48 52 45  1]).#define THRE
18d50 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 28  E_BYTE_INT(x)  (
18d60 36 35 35 33 36 2a 28 69 38 29 28 28 78 29 5b 30  65536*(i8)((x)[0
18d70 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 29 7c 28  ])|((x)[1]<<8)|(
18d80 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e 65 20 46  x)[2]).#define F
18d90 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 78 29  OUR_BYTE_UINT(x)
18da0 20 20 28 28 28 75 33 32 29 28 78 29 5b 30 5d 3c    (((u32)(x)[0]<
18db0 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36  <24)|((x)[1]<<16
18dc0 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78  )|((x)[2]<<8)|(x
18dd0 29 5b 33 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f  )[3]).#define FO
18de0 55 52 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 28  UR_BYTE_INT(x) (
18df0 31 36 37 37 37 32 31 36 2a 28 69 38 29 28 28 78  16777216*(i8)((x
18e00 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 31  )[0])|((x)[1]<<1
18e10 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28  6)|((x)[2]<<8)|(
18e20 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65  x)[3])../*.** De
18e30 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61  serialize the da
18e40 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20  ta blob pointed 
18e50 74 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 72  to by buf as ser
18e60 69 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f  ial type serial_
18e70 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72  type.** and stor
18e80 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
18e90 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68  pMem.  Return th
18ea0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
18eb0 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  s read..**.** Th
18ec0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
18ed0 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 74 77  mplemented as tw
18ee0 6f 20 73 65 70 61 72 61 74 65 20 72 6f 75 74 69  o separate routi
18ef0 6e 65 73 20 66 6f 72 20 70 65 72 66 6f 72 6d 61  nes for performa
18f00 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 66 65 77 20  nce..** The few 
18f10 63 61 73 65 73 20 74 68 61 74 20 72 65 71 75 69  cases that requi
18f20 72 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  re local variabl
18f30 65 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 6f 75  es are broken ou
18f40 74 20 69 6e 74 6f 20 61 20 73 65 70 61 72 61 74  t into a separat
18f50 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 6f 20  e.** routine so 
18f60 74 68 61 74 20 69 6e 20 6d 6f 73 74 20 63 61 73  that in most cas
18f70 65 73 20 74 68 65 20 6f 76 65 72 68 65 61 64 20  es the overhead 
18f80 6f 66 20 6d 6f 76 69 6e 67 20 74 68 65 20 73 74  of moving the st
18f90 61 63 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 69  ack pointer.** i
18fa0 73 20 61 76 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73  s avoided..*/ .s
18fb0 74 61 74 69 63 20 75 33 32 20 53 51 4c 49 54 45  tatic u32 SQLITE
18fc0 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65 72 69 61 6c  _NOINLINE serial
18fd0 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73  Get(.  const uns
18fe0 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c  igned char *buf,
18ff0 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
19000 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72  o deserialize fr
19010 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69  om */.  u32 seri
19020 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20  al_type,        
19030 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20        /* Serial 
19040 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c  type to deserial
19050 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ize */.  Mem *pM
19060 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  em              
19070 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
19080 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76   cell to write v
19090 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a  alue into */.){.
190a0 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42    u64 x = FOUR_B
190b0 59 54 45 5f 55 49 4e 54 28 62 75 66 29 3b 0a 20  YTE_UINT(buf);. 
190c0 20 75 33 32 20 79 20 3d 20 46 4f 55 52 5f 42 59   u32 y = FOUR_BY
190d0 54 45 5f 55 49 4e 54 28 62 75 66 2b 34 29 3b 0a  TE_UINT(buf+4);.
190e0 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 2b 20    x = (x<<32) + 
190f0 79 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  y;.  if( serial_
19100 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 2f  type==6 ){.    /
19110 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
19120 2d 32 39 38 35 31 2d 35 32 32 37 32 20 56 61 6c  -29851-52272 Val
19130 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
19140 61 6e 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a  an 64-bit.    **
19150 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74   twos-complement
19160 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20   integer. */.   
19170 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69   pMem->u.i = *(i
19180 36 34 2a 29 26 78 3b 0a 20 20 20 20 70 4d 65 6d  64*)&x;.    pMem
19190 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
191a0 74 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  t;.    testcase(
191b0 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
191c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
191d0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
191e0 37 33 34 33 2d 34 39 31 31 34 20 56 61 6c 75 65  7343-49114 Value
191f0 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e   is a big-endian
19200 20 49 45 45 45 20 37 35 34 2d 32 30 30 38 20 36   IEEE 754-2008 6
19210 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 66 6c 6f  4-bit.    ** flo
19220 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75 6d 62  ating point numb
19230 65 72 2e 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  er. */.#if !defi
19240 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 21  ned(NDEBUG) && !
19250 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
19260 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
19270 4e 54 29 0a 20 20 20 20 2f 2a 20 56 65 72 69 66  NT).    /* Verif
19280 79 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20  y that integers 
19290 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  and floating poi
192a0 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68  nt values use th
192b0 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20 62 79  e same.    ** by
192c0 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74  te order.  Or, t
192d0 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49  hat if SQLITE_MI
192e0 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54  XED_ENDIAN_64BIT
192f0 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 2a 2a  _FLOAT is.    **
19300 20 64 65 66 69 6e 65 64 20 74 68 61 74 20 36 34   defined that 64
19310 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f  -bit floating po
19320 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c  int values reall
19330 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20  y are mixed.    
19340 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 2a  ** endian..    *
19350 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  /.    static con
19360 73 74 20 75 36 34 20 74 31 20 3d 20 28 28 75 36  st u64 t1 = ((u6
19370 34 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33  4)0x3ff00000)<<3
19380 32 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  2;.    static co
19390 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20  nst double r1 = 
193a0 31 2e 30 3b 0a 20 20 20 20 75 36 34 20 74 32 20  1.0;.    u64 t2 
193b0 3d 20 74 31 3b 0a 20 20 20 20 73 77 61 70 4d 69  = t1;.    swapMi
193c0 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74  xedEndianFloat(t
193d0 32 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  2);.    assert( 
193e0 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65  sizeof(r1)==size
193f0 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70  of(t2) && memcmp
19400 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f  (&r1, &t2, sizeo
19410 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e  f(r1))==0 );.#en
19420 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
19430 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20  sizeof(x)==8 && 
19440 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72  sizeof(pMem->u.r
19450 29 3d 3d 38 20 29 3b 0a 20 20 20 20 73 77 61 70  )==8 );.    swap
19460 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
19470 28 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  (x);.    memcpy(
19480 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20  &pMem->u.r, &x, 
19490 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20  sizeof(x));.    
194a0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71  pMem->flags = sq
194b0 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d  lite3IsNaN(pMem-
194c0 3e 75 2e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c  >u.r) ? MEM_Null
194d0 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d   : MEM_Real;.  }
194e0 0a 20 20 72 65 74 75 72 6e 20 38 3b 0a 7d 0a 75  .  return 8;.}.u
194f0 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
19500 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74  rialGet(.  const
19510 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
19520 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66  buf,     /* Buff
19530 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  er to deserializ
19540 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  e from */.  u32 
19550 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20  serial_type,    
19560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72            /* Ser
19570 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65  ial type to dese
19580 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d  rialize */.  Mem
19590 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20   *pMem          
195a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
195b0 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69  mory cell to wri
195c0 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f  te value into */
195d0 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65  .){.  switch( se
195e0 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
195f0 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52   case 10:   /* R
19600 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
19610 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61  re use */.    ca
19620 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65  se 11:   /* Rese
19630 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
19640 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  use */.    case 
19650 30 3a 20 7b 20 20 2f 2a 20 4e 75 6c 6c 20 2a 2f  0: {  /* Null */
19660 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
19670 43 45 2d 4f 46 3a 20 52 2d 32 34 30 37 38 2d 30  CE-OF: R-24078-0
19680 39 33 37 35 20 56 61 6c 75 65 20 69 73 20 61 20  9375 Value is a 
19690 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 70  NULL. */.      p
196a0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
196b0 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65  _Null;.      bre
196c0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
196d0 73 65 20 31 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  se 1: {.      /*
196e0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
196f0 34 34 38 38 35 2d 32 35 31 39 36 20 56 61 6c 75  44885-25196 Valu
19700 65 20 69 73 20 61 6e 20 38 2d 62 69 74 20 74 77  e is an 8-bit tw
19710 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 0a 20 20  os-complement.  
19720 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20      ** integer. 
19730 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
19740 2e 69 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e  .i = ONE_BYTE_IN
19750 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
19760 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
19770 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
19780 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
19790 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
197a0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   1;.    }.    ca
197b0 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74  se 2: { /* 2-byt
197c0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
197d0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
197e0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 37 39  DENCE-OF: R-4979
197f0 34 2d 33 35 30 32 36 20 56 61 6c 75 65 20 69 73  4-35026 Value is
19800 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 31 36   a big-endian 16
19810 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77  -bit.      ** tw
19820 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
19830 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
19840 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f  pMem->u.i = TWO_
19850 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
19860 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
19870 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
19880 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
19890 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
198a0 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d   return 2;.    }
198b0 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f  .    case 3: { /
198c0 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 3-byte signed 
198d0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
198e0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
198f0 20 52 2d 33 37 38 33 39 2d 35 34 33 30 31 20 56   R-37839-54301 V
19900 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
19910 64 69 61 6e 20 32 34 2d 62 69 74 0a 20 20 20 20  dian 24-bit.    
19920 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65    ** twos-comple
19930 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f  ment integer. */
19940 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
19950 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e   = THREE_BYTE_IN
19960 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
19970 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
19980 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
19990 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
199a0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
199b0 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   3;.    }.    ca
199c0 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74  se 4: { /* 4-byt
199d0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
199e0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
199f0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 38 34  DENCE-OF: R-0184
19a00 39 2d 32 36 30 37 39 20 56 61 6c 75 65 20 69 73  9-26079 Value is
19a10 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 33 32   a big-endian 32
19a20 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77  -bit.      ** tw
19a30 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
19a40 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
19a50 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52  pMem->u.i = FOUR
19a60 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
19a70 23 69 66 64 65 66 20 5f 5f 48 50 5f 63 63 20 0a  #ifdef __HP_cc .
19a80 20 20 20 20 20 20 2f 2a 20 57 6f 72 6b 20 61 72        /* Work ar
19a90 6f 75 6e 64 20 61 20 73 69 67 6e 2d 65 78 74 65  ound a sign-exte
19aa0 6e 73 69 6f 6e 20 62 75 67 20 69 6e 20 74 68 65  nsion bug in the
19ab0 20 48 50 20 63 6f 6d 70 69 6c 65 72 20 66 6f 72   HP compiler for
19ac0 20 48 50 2f 55 58 20 2a 2f 0a 20 20 20 20 20 20   HP/UX */.      
19ad0 69 66 28 20 62 75 66 5b 30 5d 26 30 78 38 30 20  if( buf[0]&0x80 
19ae0 29 20 70 4d 65 6d 2d 3e 75 2e 69 20 7c 3d 20 30  ) pMem->u.i |= 0
19af0 78 66 66 66 66 66 66 66 66 38 30 30 30 30 30 30  xffffffff8000000
19b00 30 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  0LL;.#endif.    
19b10 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
19b20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
19b30 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
19b40 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
19b50 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20  turn 4;.    }.  
19b60 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36    case 5: { /* 6
19b70 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
19b80 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  eger */.      /*
19b90 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
19ba0 35 30 33 38 35 2d 30 39 36 37 34 20 56 61 6c 75  50385-09674 Valu
19bb0 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61  e is a big-endia
19bc0 6e 20 34 38 2d 62 69 74 0a 20 20 20 20 20 20 2a  n 48-bit.      *
19bd0 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  * twos-complemen
19be0 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  t integer. */.  
19bf0 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
19c00 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62  FOUR_BYTE_UINT(b
19c10 75 66 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31  uf+2) + (((i64)1
19c20 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f  )<<32)*TWO_BYTE_
19c30 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20  INT(buf);.      
19c40 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
19c50 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73  M_Int;.      tes
19c60 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69  tcase( pMem->u.i
19c70 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  <0 );.      retu
19c80 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 6;.    }.    
19c90 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62  case 6:   /* 8-b
19ca0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
19cb0 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37  er */.    case 7
19cc0 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61  : { /* IEEE floa
19cd0 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20  ting point */.  
19ce0 20 20 20 20 2f 2a 20 54 68 65 73 65 20 75 73 65      /* These use
19cf0 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73   local variables
19d00 2c 20 73 6f 20 64 6f 20 74 68 65 6d 20 69 6e 20  , so do them in 
19d10 61 20 73 65 70 61 72 61 74 65 20 72 6f 75 74 69  a separate routi
19d20 6e 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  ne.      ** to a
19d30 76 6f 69 64 20 68 61 76 69 6e 67 20 74 6f 20 6d  void having to m
19d40 6f 76 65 20 74 68 65 20 66 72 61 6d 65 20 70 6f  ove the frame po
19d50 69 6e 74 65 72 20 69 6e 20 74 68 65 20 63 6f 6d  inter in the com
19d60 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  mon case */.    
19d70 20 20 72 65 74 75 72 6e 20 73 65 72 69 61 6c 47    return serialG
19d80 65 74 28 62 75 66 2c 73 65 72 69 61 6c 5f 74 79  et(buf,serial_ty
19d90 70 65 2c 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a  pe,pMem);.    }.
19da0 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f      case 8:    /
19db0 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20  * Integer 0 */. 
19dc0 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a     case 9: {  /*
19dd0 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20   Integer 1 */.  
19de0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
19df0 4f 46 3a 20 52 2d 31 32 39 37 36 2d 32 32 38 39  OF: R-12976-2289
19e00 33 20 56 61 6c 75 65 20 69 73 20 74 68 65 20 69  3 Value is the i
19e10 6e 74 65 67 65 72 20 30 2e 20 2a 2f 0a 20 20 20  nteger 0. */.   
19e20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
19e30 46 3a 20 52 2d 31 38 31 34 33 2d 31 32 31 32 31  F: R-18143-12121
19e40 20 56 61 6c 75 65 20 69 73 20 74 68 65 20 69 6e   Value is the in
19e50 74 65 67 65 72 20 31 2e 20 2a 2f 0a 20 20 20 20  teger 1. */.    
19e60 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65    pMem->u.i = se
19e70 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20  rial_type-8;.   
19e80 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
19e90 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
19ea0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
19eb0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
19ec0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
19ed0 2d 4f 46 3a 20 52 2d 31 34 36 30 36 2d 33 31 35  -OF: R-14606-315
19ee0 36 34 20 56 61 6c 75 65 20 69 73 20 61 20 42 4c  64 Value is a BL
19ef0 4f 42 20 74 68 61 74 20 69 73 20 28 4e 2d 31 32  OB that is (N-12
19f00 29 2f 32 20 62 79 74 65 73 20 69 6e 0a 20 20 20  )/2 bytes in.   
19f10 20 20 20 2a 2a 20 6c 65 6e 67 74 68 2e 0a 20 20     ** length..  
19f20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
19f30 4f 46 3a 20 52 2d 32 38 34 30 31 2d 30 30 31 34  OF: R-28401-0014
19f40 30 20 56 61 6c 75 65 20 69 73 20 61 20 73 74 72  0 Value is a str
19f50 69 6e 67 20 69 6e 20 74 68 65 20 74 65 78 74 20  ing in the text 
19f60 65 6e 63 6f 64 69 6e 67 20 61 6e 64 0a 20 20 20  encoding and.   
19f70 20 20 20 2a 2a 20 28 4e 2d 31 33 29 2f 32 20 62     ** (N-13)/2 b
19f80 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20  ytes in length. 
19f90 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  */.      static 
19fa0 63 6f 6e 73 74 20 75 31 36 20 61 46 6c 61 67 5b  const u16 aFlag[
19fb0 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d  ] = { MEM_Blob|M
19fc0 45 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f 53 74  EM_Ephem, MEM_St
19fd0 72 7c 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20  r|MEM_Ephem };. 
19fe0 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28       pMem->z = (
19ff0 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20 20  char *)buf;.    
1a000 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 28 73 65 72    pMem->n = (ser
1a010 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a  ial_type-12)/2;.
1a020 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
1a030 73 20 3d 20 61 46 6c 61 67 5b 73 65 72 69 61 6c  s = aFlag[serial
1a040 5f 74 79 70 65 26 31 5d 3b 0a 20 20 20 20 20 20  _type&1];.      
1a050 72 65 74 75 72 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a  return pMem->n;.
1a060 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1a070 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68  rn 0;.}./*.** Th
1a080 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
1a090 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73  ed to allocate s
1a0a0 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
1a0b0 66 6f 72 20 61 6e 20 55 6e 70 61 63 6b 65 64 52  for an UnpackedR
1a0c0 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75  ecord.** structu
1a0d0 72 65 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  re large enough 
1a0e0 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 20  to be used with 
1a0f0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1a100 64 55 6e 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20  dUnpack() if.** 
1a110 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
1a120 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
1a130 74 6f 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  to KeyInfo struc
1a140 74 75 72 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a  ture pKeyInfo..*
1a150 2a 0a 2a 2a 20 54 68 65 20 73 70 61 63 65 20 69  *.** The space i
1a160 73 20 65 69 74 68 65 72 20 61 6c 6c 6f 63 61 74  s either allocat
1a170 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
1a180 44 62 4d 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72  DbMallocRaw() or
1a190 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20   from within.** 
1a1a0 74 68 65 20 75 6e 61 6c 69 67 6e 65 64 20 62 75  the unaligned bu
1a1b0 66 66 65 72 20 70 61 73 73 65 64 20 76 69 61 20  ffer passed via 
1a1c0 74 68 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 74  the second and t
1a1d0 68 69 72 64 20 61 72 67 75 6d 65 6e 74 73 20 28  hird arguments (
1a1e0 70 72 65 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74  presumably.** st
1a1f0 61 63 6b 20 73 70 61 63 65 29 2e 20 49 66 20 74  ack space). If t
1a200 68 65 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20  he former, then 
1a210 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20 74  *ppFree is set t
1a220 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74  o a pointer that
1a230 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76   should.** be ev
1a240 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 62  entually freed b
1a250 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69  y the caller usi
1a260 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  ng sqlite3DbFree
1a270 28 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 0a  (). Or, if the .
1a280 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f  ** allocation co
1a290 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 70 53 70  mes from the pSp
1a2a0 61 63 65 2f 73 7a 53 70 61 63 65 20 62 75 66 66  ace/szSpace buff
1a2b0 65 72 2c 20 2a 70 70 46 72 65 65 20 69 73 20 73  er, *ppFree is s
1a2c0 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65  et to NULL.** be
1a2d0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
1a2e0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20  **.** If an OOM 
1a2f0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
1a300 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
1a310 2a 2f 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  */.UnpackedRecor
1a320 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65 41 6c  d *sqlite3VdbeAl
1a330 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  locUnpackedRecor
1a340 64 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  d(.  KeyInfo *pK
1a350 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
1a360 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
1a370 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 63 6f 72  ion of the recor
1a380 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70  d */.  char *pSp
1a390 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ace,            
1a3a0 20 20 20 20 20 20 20 2f 2a 20 55 6e 61 6c 69 67         /* Unalig
1a3b0 6e 65 64 20 73 70 61 63 65 20 61 76 61 69 6c 61  ned space availa
1a3c0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53  ble */.  int szS
1a3d0 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20  pace,           
1a3e0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1a3f0 20 6f 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20   of pSpace[] in 
1a400 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  bytes */.  char 
1a410 2a 2a 70 70 46 72 65 65 20 20 20 20 20 20 20 20  **ppFree        
1a420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
1a430 54 3a 20 43 61 6c 6c 65 72 20 73 68 6f 75 6c 64  T: Caller should
1a440 20 66 72 65 65 20 74 68 69 73 20 70 6f 69 6e 74   free this point
1a450 65 72 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63  er */.){.  Unpac
1a460 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 20 20 20  kedRecord *p;   
1a470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
1a480 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 74 6f  packed record to
1a490 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
1a4a0 20 6e 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20   nOff;          
1a4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a4c0 49 6e 63 72 65 6d 65 6e 74 20 70 53 70 61 63 65  Increment pSpace
1a4d0 20 62 79 20 6e 4f 66 66 20 74 6f 20 61 6c 69 67   by nOff to alig
1a4e0 6e 20 69 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  n it */.  int nB
1a4f0 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
1a500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1a510 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71  ber of bytes req
1a520 75 69 72 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a  uired for *p */.
1a530 0a 20 20 2f 2a 20 57 65 20 77 61 6e 74 20 74 6f  .  /* We want to
1a540 20 73 68 69 66 74 20 74 68 65 20 70 6f 69 6e 74   shift the point
1a550 65 72 20 70 53 70 61 63 65 20 75 70 20 73 75 63  er pSpace up suc
1a560 68 20 74 68 61 74 20 69 74 20 69 73 20 38 2d 62  h that it is 8-b
1a570 79 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a  yte aligned..  *
1a580 2a 20 54 68 75 73 2c 20 77 65 20 6e 65 65 64 20  * Thus, we need 
1a590 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 61 20 76  to calculate a v
1a5a0 61 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77  alue, nOff, betw
1a5b0 65 65 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f 20  een 0 and 7, to 
1a5c0 73 68 69 66 74 20 0a 20 20 2a 2a 20 69 74 20 62  shift .  ** it b
1a5d0 79 2e 20 20 49 66 20 70 53 70 61 63 65 20 69 73  y.  If pSpace is
1a5e0 20 61 6c 72 65 61 64 79 20 38 2d 62 79 74 65 20   already 8-byte 
1a5f0 61 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68  aligned, nOff sh
1a600 6f 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20  ould be zero..  
1a610 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d  */.  nOff = (8 -
1a620 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f   (SQLITE_PTR_TO_
1a630 49 4e 54 28 70 53 70 61 63 65 29 20 26 20 37 29  INT(pSpace) & 7)
1a640 29 20 26 20 37 3b 0a 20 20 6e 42 79 74 65 20 3d  ) & 7;.  nByte =
1a650 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55   ROUND8(sizeof(U
1a660 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 20  npackedRecord)) 
1a670 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70  + sizeof(Mem)*(p
1a680 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b  KeyInfo->nField+
1a690 31 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3e  1);.  if( nByte>
1a6a0 73 7a 53 70 61 63 65 2b 6e 4f 66 66 20 29 7b 0a  szSpace+nOff ){.
1a6b0 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65      p = (Unpacke
1a6c0 64 52 65 63 6f 72 64 20 2a 29 73 71 6c 69 74 65  dRecord *)sqlite
1a6d0 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65  3DbMallocRaw(pKe
1a6e0 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65  yInfo->db, nByte
1a6f0 29 3b 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d  );.    *ppFree =
1a700 20 28 63 68 61 72 20 2a 29 70 3b 0a 20 20 20 20   (char *)p;.    
1a710 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 20  if( !p ) return 
1a720 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1a730 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63  p = (UnpackedRec
1a740 6f 72 64 2a 29 26 70 53 70 61 63 65 5b 6e 4f 66  ord*)&pSpace[nOf
1a750 66 5d 3b 0a 20 20 20 20 2a 70 70 46 72 65 65 20  f];.    *ppFree 
1a760 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 61  = 0;.  }..  p->a
1a770 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63  Mem = (Mem*)&((c
1a780 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73  har*)p)[ROUND8(s
1a790 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65  izeof(UnpackedRe
1a7a0 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73 65 72  cord))];.  asser
1a7b0 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  t( pKeyInfo->aSo
1a7c0 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
1a7d0 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  p->pKeyInfo = pK
1a7e0 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69  eyInfo;.  p->nFi
1a7f0 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld = pKeyInfo->
1a800 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65  nField + 1;.  re
1a810 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
1a820 20 47 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d   Given the nKey-
1a830 62 79 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66  byte encoding of
1a840 20 61 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65   a record in pKe
1a850 79 5b 5d 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  y[], populate th
1a860 65 20 0a 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65  e .** UnpackedRe
1a870 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 20 69  cord structure i
1a880 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20  ndicated by the 
1a890 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20  fourth argument 
1a8a0 77 69 74 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  with the.** cont
1a8b0 65 6e 74 73 20 6f 66 20 74 68 65 20 64 65 63 6f  ents of the deco
1a8c0 64 65 64 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a  ded record..*/ .
1a8d0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
1a8e0 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20  RecordUnpack(.  
1a8f0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1a900 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  o,     /* Inform
1a910 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
1a920 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f  record format */
1a930 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20  .  int nKey,    
1a940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1a950 65 20 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20  e of the binary 
1a960 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73  record */.  cons
1a970 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
1a980 20 20 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79     /* The binary
1a990 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70   record */.  Unp
1a9a0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 20 20  ackedRecord *p  
1a9b0 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20      /* Populate 
1a9c0 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 62  this structure b
1a9d0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
1a9e0 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75   */.){.  const u
1a9f0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
1aa00 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  ey = (const unsi
1aa10 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
1aa20 3b 0a 20 20 69 6e 74 20 64 3b 20 0a 20 20 75 33  ;.  int d; .  u3
1aa30 32 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  2 idx;          
1aa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1aa50 20 4f 66 66 73 65 74 20 69 6e 20 61 4b 65 79 5b   Offset in aKey[
1aa60 5d 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  ] to read from *
1aa70 2f 0a 20 20 75 31 36 20 75 3b 20 20 20 20 20 20  /.  u16 u;      
1aa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa90 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20      /* Unsigned 
1aaa0 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  loop counter */.
1aab0 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d    u32 szHdr;.  M
1aac0 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d  em *pMem = p->aM
1aad0 65 6d 3b 0a 0a 20 20 70 2d 3e 64 65 66 61 75 6c  em;..  p->defaul
1aae0 74 5f 72 63 20 3d 20 30 3b 0a 20 20 61 73 73 65  t_rc = 0;.  asse
1aaf0 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
1ab00 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29  LIGNMENT(pMem) )
1ab10 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 72  ;.  idx = getVar
1ab20 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64  int32(aKey, szHd
1ab30 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b  r);.  d = szHdr;
1ab40 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c  .  u = 0;.  whil
1ab50 65 28 20 69 64 78 3c 73 7a 48 64 72 20 26 26 20  e( idx<szHdr && 
1ab60 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75  d<=nKey ){.    u
1ab70 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a  32 serial_type;.
1ab80 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56  .    idx += getV
1ab90 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 69 64  arint32(&aKey[id
1aba0 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29  x], serial_type)
1abb0 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20  ;.    pMem->enc 
1abc0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
1abd0 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20  .    pMem->db = 
1abe0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20  pKeyInfo->db;.  
1abf0 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73    /* pMem->flags
1ac00 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33   = 0; // sqlite3
1ac10 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20  VdbeSerialGet() 
1ac20 77 69 6c 6c 20 73 65 74 20 74 68 69 73 20 66 6f  will set this fo
1ac30 72 20 75 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  r us */.    pMem
1ac40 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a  ->szMalloc = 0;.
1ac50 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33      d += sqlite3
1ac60 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
1ac70 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74  Key[d], serial_t
1ac80 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20  ype, pMem);.    
1ac90 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20  pMem++;.    if( 
1aca0 28 2b 2b 75 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64  (++u)>=p->nField
1acb0 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
1acc0 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49  assert( u<=pKeyI
1acd0 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20  nfo->nField + 1 
1ace0 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  );.  p->nField =
1acf0 20 75 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54   u;.}..#if SQLIT
1ad00 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68  E_DEBUG./*.** Th
1ad10 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70  is function comp
1ad20 61 72 65 73 20 74 77 6f 20 69 6e 64 65 78 20 6f  ares two index o
1ad30 72 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6b  r table record k
1ad40 65 79 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  eys in the same 
1ad50 77 61 79 0a 2a 2a 20 61 73 20 74 68 65 20 73 71  way.** as the sq
1ad60 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1ad70 6f 6d 70 61 72 65 28 29 20 72 6f 75 74 69 6e 65  ompare() routine
1ad80 2e 20 55 6e 6c 69 6b 65 20 56 64 62 65 52 65 63  . Unlike VdbeRec
1ad90 6f 72 64 43 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a  ordCompare(),.**
1ada0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   this function d
1adb0 65 73 65 72 69 61 6c 69 7a 65 73 20 61 6e 64 20  eserializes and 
1adc0 63 6f 6d 70 61 72 65 73 20 76 61 6c 75 65 73 20  compares values 
1add0 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c  using the.** sql
1ade0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1adf0 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 4d  t() and sqlite3M
1ae00 65 6d 43 6f 6d 70 61 72 65 28 29 20 66 75 6e 63  emCompare() func
1ae10 74 69 6f 6e 73 2e 20 49 74 20 69 73 20 75 73 65  tions. It is use
1ae20 64 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29  d.** in assert()
1ae30 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65   statements to e
1ae40 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6f  nsure that the o
1ae50 70 74 69 6d 69 7a 65 64 20 63 6f 64 65 20 69 6e  ptimized code in
1ae60 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 52  .** sqlite3VdbeR
1ae70 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72  ecordCompare() r
1ae80 65 74 75 72 6e 73 20 72 65 73 75 6c 74 73 20 77  eturns results w
1ae90 69 74 68 20 74 68 65 73 65 20 74 77 6f 20 70 72  ith these two pr
1aea0 69 6d 69 74 69 76 65 73 2e 0a 2a 2a 0a 2a 2a 20  imitives..**.** 
1aeb0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
1aec0 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d  he result of com
1aed0 70 61 72 69 73 6f 6e 20 69 73 20 65 71 75 69 76  parison is equiv
1aee0 61 6c 65 6e 74 20 74 6f 20 64 65 73 69 72 65 64  alent to desired
1aef0 52 65 73 75 6c 74 2e 0a 2a 2a 20 52 65 74 75 72  Result..** Retur
1af00 6e 20 66 61 6c 73 65 20 69 66 20 74 68 65 72 65  n false if there
1af10 20 69 73 20 61 20 64 69 73 61 67 72 65 65 6d 65   is a disagreeme
1af20 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
1af30 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  t vdbeRecordComp
1af40 61 72 65 44 65 62 75 67 28 0a 20 20 69 6e 74 20  areDebug(.  int 
1af50 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
1af60 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66  d *pKey1, /* Lef
1af70 74 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  t key */.  const
1af80 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1af90 2a 70 50 4b 65 79 32 2c 20 2f 2a 20 52 69 67 68  *pPKey2, /* Righ
1afa0 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64  t key */.  int d
1afb0 65 73 69 72 65 64 52 65 73 75 6c 74 20 20 20 20  esiredResult    
1afc0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72           /* Corr
1afd0 65 63 74 20 61 6e 73 77 65 72 20 2a 2f 0a 29 7b  ect answer */.){
1afe0 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 20  .  u32 d1;      
1aff0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1b000 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
1b010 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74  ext data element
1b020 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20   */.  u32 idx1; 
1b030 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1b040 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
1b050 66 20 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c  f next header el
1b060 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73  ement */.  u32 s
1b070 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a  zHdr1;        /*
1b080 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1b090 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20   in header */.  
1b0a0 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74  int i = 0;.  int
1b0b0 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74   rc = 0;.  const
1b0c0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1b0d0 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75  aKey1 = (const u
1b0e0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
1b0f0 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  Key1;.  KeyInfo 
1b100 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d  *pKeyInfo;.  Mem
1b110 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e   mem1;..  pKeyIn
1b120 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65  fo = pPKey2->pKe
1b130 79 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 4b 65  yInfo;.  if( pKe
1b140 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30 20 29 20 72  yInfo->db==0 ) r
1b150 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 31 2e  eturn 1;.  mem1.
1b160 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
1b170 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d  enc;.  mem1.db =
1b180 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20   pKeyInfo->db;. 
1b190 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d   /* mem1.flags =
1b1a0 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20   0;  // Will be 
1b1b0 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 73  initialized by s
1b1c0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1b1d0 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f  Get() */.  VVA_O
1b1e0 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  NLY( mem1.szMall
1b1f0 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c  oc = 0; ) /* Onl
1b200 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65  y needed by asse
1b210 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
1b220 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65  */..  /* Compile
1b230 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20  rs may complain 
1b240 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73  that mem1.u.i is
1b250 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69   potentially uni
1b260 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a  nitialized..  **
1b270 20 57 65 20 63 6f 75 6c 64 20 69 6e 69 74 69 61   We could initia
1b280 6c 69 7a 65 20 69 74 2c 20 61 73 20 73 68 6f 77  lize it, as show
1b290 6e 20 68 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e  n here, to silen
1b2a0 63 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69  ce those complai
1b2b0 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e  nts..  ** But in
1b2c0 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20   fact, mem1.u.i 
1b2d0 77 69 6c 6c 20 6e 65 76 65 72 20 61 63 74 75 61  will never actua
1b2e0 6c 6c 79 20 62 65 20 75 73 65 64 20 75 6e 69 6e  lly be used unin
1b2f0 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64  itialized, and d
1b300 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 75  oing .  ** the u
1b310 6e 6e 65 63 65 73 73 61 72 79 20 69 6e 69 74 69  nnecessary initi
1b320 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20 61 20  alization has a 
1b330 6d 65 61 73 75 72 61 62 6c 65 20 6e 65 67 61 74  measurable negat
1b340 69 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  ive performance.
1b350 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e    ** impact, sin
1b360 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ce this routine 
1b370 69 73 20 61 20 76 65 72 79 20 68 69 67 68 20 72  is a very high r
1b380 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20  unner.  And so, 
1b390 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74  we choose.  ** t
1b3a0 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d  o ignore the com
1b3b0 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61  piler warnings a
1b3c0 6e 64 20 6c 65 61 76 65 20 74 68 69 73 20 76 61  nd leave this va
1b3d0 72 69 61 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c  riable uninitial
1b3e0 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20  ized..  */.  /* 
1b3f0 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20   mem1.u.i = 0;  
1b400 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68  // not needed, h
1b410 65 72 65 20 74 6f 20 73 69 6c 65 6e 63 65 20 63  ere to silence c
1b420 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20  ompiler warning 
1b430 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 67  */.  .  idx1 = g
1b440 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31  etVarint32(aKey1
1b450 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 69 66 28  , szHdr1);.  if(
1b460 20 73 7a 48 64 72 31 3e 39 38 33 30 37 20 29 20   szHdr1>98307 ) 
1b470 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1b480 52 52 55 50 54 3b 0a 20 20 64 31 20 3d 20 73 7a  RRUPT;.  d1 = sz
1b490 48 64 72 31 3b 0a 20 20 61 73 73 65 72 74 28 20  Hdr1;.  assert( 
1b4a0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
1b4b0 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65  +pKeyInfo->nXFie
1b4c0 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65  ld>=pPKey2->nFie
1b4d0 6c 64 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ld || CORRUPT_DB
1b4e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b   );.  assert( pK
1b4f0 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
1b500 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
1b510 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  t( pKeyInfo->nFi
1b520 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  eld>0 );.  asser
1b530 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20  t( idx1<=szHdr1 
1b540 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
1b550 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73  .  do{.    u32 s
1b560 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20  erial_type1;..  
1b570 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65    /* Read the se
1b580 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74  rial types for t
1b590 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20  he next element 
1b5a0 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a  in each key. */.
1b5b0 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74 56      idx1 += getV
1b5c0 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b 69  arint32( aKey1+i
1b5d0 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  dx1, serial_type
1b5e0 31 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72  1 );..    /* Ver
1b5f0 69 66 79 20 74 68 61 74 20 74 68 65 72 65 20 69  ify that there i
1b600 73 20 65 6e 6f 75 67 68 20 6b 65 79 20 73 70 61  s enough key spa
1b610 63 65 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f 20  ce remaining to 
1b620 61 76 6f 69 64 0a 20 20 20 20 2a 2a 20 61 20 62  avoid.    ** a b
1b630 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 2e 20  uffer overread. 
1b640 20 54 68 65 20 22 64 31 2b 73 65 72 69 61 6c 5f   The "d1+serial_
1b650 74 79 70 65 31 2b 32 22 20 73 75 62 65 78 70 72  type1+2" subexpr
1b660 65 73 73 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20  ession will.    
1b670 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 67 72 65  ** always be gre
1b680 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
1b690 61 6c 20 74 6f 20 74 68 65 20 61 6d 6f 75 6e 74  al to the amount
1b6a0 20 6f 66 20 72 65 71 75 69 72 65 64 20 6b 65 79   of required key
1b6b0 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 55   space..    ** U
1b6c0 73 65 20 74 68 61 74 20 61 70 70 72 6f 78 69 6d  se that approxim
1b6d0 61 74 69 6f 6e 20 74 6f 20 61 76 6f 69 64 20 74  ation to avoid t
1b6e0 68 65 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76  he more expensiv
1b6f0 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  e call to.    **
1b700 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1b710 61 6c 54 79 70 65 4c 65 6e 28 29 20 69 6e 20 74  alTypeLen() in t
1b720 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a  he common case..
1b730 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64      */.    if( d
1b740 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32  1+serial_type1+2
1b750 3e 28 75 33 32 29 6e 4b 65 79 31 0a 20 20 20 20  >(u32)nKey1.    
1b760 20 26 26 20 64 31 2b 73 71 6c 69 74 65 33 56 64   && d1+sqlite3Vd
1b770 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
1b780 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 28 75  serial_type1)>(u
1b790 33 32 29 6e 4b 65 79 31 20 0a 20 20 20 20 29 7b  32)nKey1 .    ){
1b7a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1b7b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72    }..    /* Extr
1b7c0 61 63 74 20 74 68 65 20 76 61 6c 75 65 73 20 74  act the values t
1b7d0 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20  o be compared.. 
1b7e0 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20     */.    d1 += 
1b7f0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1b800 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c  lGet(&aKey1[d1],
1b810 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26   serial_type1, &
1b820 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44  mem1);..    /* D
1b830 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  o the comparison
1b840 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
1b850 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
1b860 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79  re(&mem1, &pPKey
1b870 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65 79  2->aMem[i], pKey
1b880 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b  Info->aColl[i]);
1b890 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29  .    if( rc!=0 )
1b8a0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1b8b0 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30  mem1.szMalloc==0
1b8c0 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d   );  /* See comm
1b8d0 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20  ent below */.   
1b8e0 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d     if( pKeyInfo-
1b8f0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29  >aSortOrder[i] )
1b900 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
1b910 72 63 3b 20 20 2f 2a 20 49 6e 76 65 72 74 20 74  rc;  /* Invert t
1b920 68 65 20 72 65 73 75 6c 74 20 66 6f 72 20 44 45  he result for DE
1b930 53 43 20 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a  SC sort order. *
1b940 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
1b950 67 6f 74 6f 20 64 65 62 75 67 43 6f 6d 70 61 72  goto debugCompar
1b960 65 45 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  eEnd;.    }.    
1b970 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69  i++;.  }while( i
1b980 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69 3c  dx1<szHdr1 && i<
1b990 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29  pPKey2->nField )
1b9a0 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72  ;..  /* No memor
1b9b0 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  y allocation is 
1b9c0 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d  ever used on mem
1b9d0 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20 75  1.  Prove this u
1b9e0 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f  sing.  ** the fo
1b9f0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29  llowing assert()
1ba00 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72 74  .  If the assert
1ba10 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64  () fails, it ind
1ba20 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65  icates a.  ** me
1ba30 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20  mory leak and a 
1ba40 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c  need to call sql
1ba50 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
1ba60 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a  se(&mem1)..  */.
1ba70 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73    assert( mem1.s
1ba80 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20  zMalloc==0 );.. 
1ba90 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d   /* rc==0 here m
1baa0 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66  eans that one of
1bab0 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75   the keys ran ou
1bac0 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a  t of fields and.
1bad0 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65    ** all the fie
1bae0 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70  lds up to that p
1baf0 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e  oint were equal.
1bb00 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66 61   Return the defa
1bb10 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75  ult_rc.  ** valu
1bb20 65 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 50  e.  */.  rc = pP
1bb30 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
1bb40 3b 0a 0a 64 65 62 75 67 43 6f 6d 70 61 72 65 45  ;..debugCompareE
1bb50 6e 64 3a 0a 20 20 69 66 28 20 64 65 73 69 72 65  nd:.  if( desire
1bb60 64 52 65 73 75 6c 74 3d 3d 30 20 26 26 20 72 63  dResult==0 && rc
1bb70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
1bb80 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65 73    if( desiredRes
1bb90 75 6c 74 3c 30 20 26 26 20 72 63 3c 30 20 29 20  ult<0 && rc<0 ) 
1bba0 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
1bbb0 64 65 73 69 72 65 64 52 65 73 75 6c 74 3e 30 20  desiredResult>0 
1bbc0 26 26 20 72 63 3e 30 20 29 20 72 65 74 75 72 6e  && rc>0 ) return
1bbd0 20 31 3b 0a 20 20 69 66 28 20 43 4f 52 52 55 50   1;.  if( CORRUP
1bbe0 54 5f 44 42 20 29 20 72 65 74 75 72 6e 20 31 3b  T_DB ) return 1;
1bbf0 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d  .  if( pKeyInfo-
1bc00 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1bc10 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  d ) return 1;.  
1bc20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
1bc30 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44  if..#if SQLITE_D
1bc40 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  EBUG./*.** Count
1bc50 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
1bc60 69 65 6c 64 73 20 28 61 2e 6b 2e 61 2e 20 63 6f  ields (a.k.a. co
1bc70 6c 75 6d 6e 73 29 20 69 6e 20 74 68 65 20 72 65  lumns) in the re
1bc80 63 6f 72 64 20 67 69 76 65 6e 20 62 79 0a 2a 2a  cord given by.**
1bc90 20 70 4b 65 79 2c 6e 4b 65 79 2e 20 20 54 68 65   pKey,nKey.  The
1bca0 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 69   verify that thi
1bcb0 73 20 63 6f 75 6e 74 20 69 73 20 6c 65 73 73 20  s count is less 
1bcc0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
1bcd0 20 74 68 65 0a 2a 2a 20 6c 69 6d 69 74 20 67 69   the.** limit gi
1bce0 76 65 6e 20 62 79 20 70 4b 65 79 49 6e 66 6f 2d  ven by pKeyInfo-
1bcf0 3e 6e 46 69 65 6c 64 20 2b 20 70 4b 65 79 49 6e  >nField + pKeyIn
1bd00 66 6f 2d 3e 6e 58 46 69 65 6c 64 2e 0a 2a 2a 0a  fo->nXField..**.
1bd10 2a 2a 20 49 66 20 74 68 69 73 20 63 6f 6e 73 74  ** If this const
1bd20 72 61 69 6e 74 20 69 73 20 6e 6f 74 20 73 61 74  raint is not sat
1bd30 69 73 66 69 65 64 2c 20 69 74 20 6d 65 61 6e 73  isfied, it means
1bd40 20 74 68 61 74 20 74 68 65 20 68 69 67 68 2d 73   that the high-s
1bd50 70 65 65 64 0a 2a 2a 20 76 64 62 65 52 65 63 6f  peed.** vdbeReco
1bd60 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61  rdCompareInt() a
1bd70 6e 64 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  nd vdbeRecordCom
1bd80 70 61 72 65 53 74 72 69 6e 67 28 29 20 72 6f 75  pareString() rou
1bd90 74 69 6e 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f  tines will.** no
1bda0 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  t work correctly
1bdb0 2e 20 20 49 66 20 74 68 69 73 20 61 73 73 65 72  .  If this asser
1bdc0 74 28 29 20 65 76 65 72 20 66 69 72 65 73 2c 20  t() ever fires, 
1bdd0 69 74 20 70 72 6f 62 61 62 6c 79 20 6d 65 61 6e  it probably mean
1bde0 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 4b 65  s.** that the Ke
1bdf0 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 6f 72 20  yInfo.nField or 
1be00 4b 65 79 49 6e 66 6f 2e 6e 58 46 69 65 6c 64 20  KeyInfo.nXField 
1be10 76 61 6c 75 65 73 20 77 65 72 65 20 63 6f 6d 70  values were comp
1be20 75 74 65 64 0a 2a 2a 20 69 6e 63 6f 72 72 65 63  uted.** incorrec
1be30 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tly..*/.static v
1be40 6f 69 64 20 76 64 62 65 41 73 73 65 72 74 46 69  oid vdbeAssertFi
1be50 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69  eldCountWithinLi
1be60 6d 69 74 73 28 0a 20 20 69 6e 74 20 6e 4b 65 79  mits(.  int nKey
1be70 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
1be80 65 79 2c 20 20 20 2f 2a 20 54 68 65 20 72 65 63  ey,   /* The rec
1be90 6f 72 64 20 74 6f 20 76 65 72 69 66 79 20 2a 2f  ord to verify */
1bea0 20 0a 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e 66   .  const KeyInf
1beb0 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20 20 20  o *pKeyInfo     
1bec0 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20 73 69 7a    /* Compare siz
1bed0 65 20 77 69 74 68 20 74 68 69 73 20 4b 65 79 49  e with this KeyI
1bee0 6e 66 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nfo */.){.  int 
1bef0 6e 46 69 65 6c 64 20 3d 20 30 3b 0a 20 20 75 33  nField = 0;.  u3
1bf00 32 20 73 7a 48 64 72 3b 0a 20 20 75 33 32 20 69  2 szHdr;.  u32 i
1bf10 64 78 3b 0a 20 20 75 33 32 20 6e 6f 74 55 73 65  dx;.  u32 notUse
1bf20 64 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  d;.  const unsig
1bf30 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d  ned char *aKey =
1bf40 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
1bf50 20 63 68 61 72 2a 29 70 4b 65 79 3b 0a 0a 20 20   char*)pKey;..  
1bf60 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29  if( CORRUPT_DB )
1bf70 20 72 65 74 75 72 6e 3b 0a 20 20 69 64 78 20 3d   return;.  idx =
1bf80 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
1bf90 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 61 73 73  y, szHdr);.  ass
1bfa0 65 72 74 28 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a  ert( nKey>=0 );.
1bfb0 20 20 61 73 73 65 72 74 28 20 73 7a 48 64 72 3c    assert( szHdr<
1bfc0 3d 28 75 33 32 29 6e 4b 65 79 20 29 3b 0a 20 20  =(u32)nKey );.  
1bfd0 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72  while( idx<szHdr
1bfe0 20 29 7b 0a 20 20 20 20 69 64 78 20 2b 3d 20 67   ){.    idx += g
1bff0 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2b  etVarint32(aKey+
1c000 69 64 78 2c 20 6e 6f 74 55 73 65 64 29 3b 0a 20  idx, notUsed);. 
1c010 20 20 20 6e 46 69 65 6c 64 2b 2b 3b 0a 20 20 7d     nField++;.  }
1c020 0a 20 20 61 73 73 65 72 74 28 20 6e 46 69 65 6c  .  assert( nFiel
1c030 64 20 3c 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  d <= pKeyInfo->n
1c040 46 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e  Field+pKeyInfo->
1c050 6e 58 46 69 65 6c 64 20 29 3b 0a 7d 0a 23 65 6c  nXField );.}.#el
1c060 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65  se.# define vdbe
1c070 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74  AssertFieldCount
1c080 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 41 2c 42  WithinLimits(A,B
1c090 2c 43 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,C).#endif../*.*
1c0a0 2a 20 42 6f 74 68 20 2a 70 4d 65 6d 31 20 61 6e  * Both *pMem1 an
1c0b0 64 20 2a 70 4d 65 6d 32 20 63 6f 6e 74 61 69 6e  d *pMem2 contain
1c0c0 20 73 74 72 69 6e 67 20 76 61 6c 75 65 73 2e 20   string values. 
1c0d0 43 6f 6d 70 61 72 65 20 74 68 65 20 74 77 6f 20  Compare the two 
1c0e0 76 61 6c 75 65 73 0a 2a 2a 20 75 73 69 6e 67 20  values.** using 
1c0f0 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
1c100 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 41 73  quence pColl. As
1c110 20 75 73 75 61 6c 2c 20 72 65 74 75 72 6e 20 61   usual, return a
1c120 20 6e 65 67 61 74 69 76 65 20 2c 20 7a 65 72 6f   negative , zero
1c130 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20  .** or positive 
1c140 76 61 6c 75 65 20 69 66 20 2a 70 4d 65 6d 31 20  value if *pMem1 
1c150 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
1c160 75 61 6c 20 74 6f 20 6f 72 20 67 72 65 61 74 65  ual to or greate
1c170 72 20 74 68 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d  r than .** *pMem
1c180 32 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  2, respectively.
1c190 20 53 69 6d 69 6c 61 72 20 69 6e 20 73 70 69 72   Similar in spir
1c1a0 69 74 20 74 6f 20 22 72 63 20 3d 20 28 2a 70 4d  it to "rc = (*pM
1c1b0 65 6d 31 29 20 2d 20 28 2a 70 4d 65 6d 32 29 3b  em1) - (*pMem2);
1c1c0 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  "..*/.static int
1c1d0 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53   vdbeCompareMemS
1c1e0 74 72 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20 4d  tring(.  const M
1c1f0 65 6d 20 2a 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e  em *pMem1,.  con
1c200 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20  st Mem *pMem2,. 
1c210 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a   const CollSeq *
1c220 70 43 6f 6c 6c 2c 0a 20 20 75 38 20 2a 70 72 63  pColl,.  u8 *prc
1c230 45 72 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Err             
1c240 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61           /* If a
1c250 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 73 65  n OOM occurs, se
1c260 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  t to SQLITE_NOME
1c270 4d 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 4d  M */.){.  if( pM
1c280 65 6d 31 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d  em1->enc==pColl-
1c290 3e 65 6e 63 20 29 7b 0a 20 20 20 20 2f 2a 20 54  >enc ){.    /* T
1c2a0 68 65 20 73 74 72 69 6e 67 73 20 61 72 65 20 61  he strings are a
1c2b0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 6f  lready in the co
1c2c0 72 72 65 63 74 20 65 6e 63 6f 64 69 6e 67 2e 20  rrect encoding. 
1c2d0 20 43 61 6c 6c 20 74 68 65 0a 20 20 20 20 20 2a   Call the.     *
1c2e0 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  * comparison fun
1c2f0 63 74 69 6f 6e 20 64 69 72 65 63 74 6c 79 20 2a  ction directly *
1c300 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 6f  /.    return pCo
1c310 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e  ll->xCmp(pColl->
1c320 70 55 73 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70  pUser,pMem1->n,p
1c330 4d 65 6d 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e  Mem1->z,pMem2->n
1c340 2c 70 4d 65 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65  ,pMem2->z);.  }e
1c350 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  lse{.    int rc;
1c360 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  .    const void 
1c370 2a 76 31 2c 20 2a 76 32 3b 0a 20 20 20 20 69 6e  *v1, *v2;.    in
1c380 74 20 6e 31 2c 20 6e 32 3b 0a 20 20 20 20 4d 65  t n1, n2;.    Me
1c390 6d 20 63 31 3b 0a 20 20 20 20 4d 65 6d 20 63 32  m c1;.    Mem c2
1c3a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1c3b0 65 4d 65 6d 49 6e 69 74 28 26 63 31 2c 20 70 4d  eMemInit(&c1, pM
1c3c0 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c  em1->db, MEM_Nul
1c3d0 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  l);.    sqlite3V
1c3e0 64 62 65 4d 65 6d 49 6e 69 74 28 26 63 32 2c 20  dbeMemInit(&c2, 
1c3f0 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e  pMem1->db, MEM_N
1c400 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ull);.    sqlite
1c410 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43  3VdbeMemShallowC
1c420 6f 70 79 28 26 63 31 2c 20 70 4d 65 6d 31 2c 20  opy(&c1, pMem1, 
1c430 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20  MEM_Ephem);.    
1c440 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68  sqlite3VdbeMemSh
1c450 61 6c 6c 6f 77 43 6f 70 79 28 26 63 32 2c 20 70  allowCopy(&c2, p
1c460 4d 65 6d 32 2c 20 4d 45 4d 5f 45 70 68 65 6d 29  Mem2, MEM_Ephem)
1c470 3b 0a 20 20 20 20 76 31 20 3d 20 73 71 6c 69 74  ;.    v1 = sqlit
1c480 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c  e3ValueText((sql
1c490 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 31 2c  ite3_value*)&c1,
1c4a0 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20   pColl->enc);.  
1c4b0 20 20 6e 31 20 3d 20 76 31 3d 3d 30 20 3f 20 30    n1 = v1==0 ? 0
1c4c0 20 3a 20 63 31 2e 6e 3b 0a 20 20 20 20 76 32 20   : c1.n;.    v2 
1c4d0 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65  = sqlite3ValueTe
1c4e0 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  xt((sqlite3_valu
1c4f0 65 2a 29 26 63 32 2c 20 70 43 6f 6c 6c 2d 3e 65  e*)&c2, pColl->e
1c500 6e 63 29 3b 0a 20 20 20 20 6e 32 20 3d 20 76 32  nc);.    n2 = v2
1c510 3d 3d 30 20 3f 20 30 20 3a 20 63 32 2e 6e 3b 0a  ==0 ? 0 : c2.n;.
1c520 20 20 20 20 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e      rc = pColl->
1c530 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65  xCmp(pColl->pUse
1c540 72 2c 20 6e 31 2c 20 76 31 2c 20 6e 32 2c 20 76  r, n1, v1, n2, v
1c550 32 29 3b 0a 20 20 20 20 69 66 28 20 28 76 31 3d  2);.    if( (v1=
1c560 3d 30 20 7c 7c 20 76 32 3d 3d 30 29 20 26 26 20  =0 || v2==0) && 
1c570 70 72 63 45 72 72 20 29 20 2a 70 72 63 45 72 72  prcErr ) *prcErr
1c580 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1c590 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1c5a0 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 31 29 3b  MemRelease(&c1);
1c5b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1c5c0 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 32 29 3b  MemRelease(&c2);
1c5d0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1c5e0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d    }.}../*.** Com
1c5f0 70 61 72 65 20 74 77 6f 20 62 6c 6f 62 73 2e 20  pare two blobs. 
1c600 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65   Return negative
1c610 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74  , zero, or posit
1c620 69 76 65 20 69 66 20 74 68 65 20 66 69 72 73 74  ive if the first
1c630 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e  .** is less than
1c640 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67  , equal to, or g
1c650 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
1c660 73 65 63 6f 6e 64 2c 20 72 65 73 70 65 63 74 69  second, respecti
1c670 76 65 6c 79 2e 0a 2a 2a 20 49 66 20 6f 6e 65 20  vely..** If one 
1c680 62 6c 6f 62 20 69 73 20 61 20 70 72 65 66 69 78  blob is a prefix
1c690 20 6f 66 20 74 68 65 20 6f 74 68 65 72 2c 20 74   of the other, t
1c6a0 68 65 6e 20 74 68 65 20 73 68 6f 72 74 65 72 20  hen the shorter 
1c6b0 69 73 20 74 68 65 20 6c 65 73 73 6f 72 2e 0a 2a  is the lessor..*
1c6c0 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
1c6d0 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 73 71 6c  NOINLINE int sql
1c6e0 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28  ite3BlobCompare(
1c6f0 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 31 2c 20  const Mem *pB1, 
1c700 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 32 29 7b  const Mem *pB2){
1c710 0a 20 20 69 6e 74 20 63 20 3d 20 6d 65 6d 63 6d  .  int c = memcm
1c720 70 28 70 42 31 2d 3e 7a 2c 20 70 42 32 2d 3e 7a  p(pB1->z, pB2->z
1c730 2c 20 70 42 31 2d 3e 6e 3e 70 42 32 2d 3e 6e 20  , pB1->n>pB2->n 
1c740 3f 20 70 42 32 2d 3e 6e 20 3a 20 70 42 31 2d 3e  ? pB2->n : pB1->
1c750 6e 29 3b 0a 20 20 69 66 28 20 63 20 29 20 72 65  n);.  if( c ) re
1c760 74 75 72 6e 20 63 3b 0a 20 20 72 65 74 75 72 6e  turn c;.  return
1c770 20 70 42 31 2d 3e 6e 20 2d 20 70 42 32 2d 3e 6e   pB1->n - pB2->n
1c780 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20  ;.}../*.** Do a 
1c790 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74 77 65  comparison betwe
1c7a0 65 6e 20 61 20 36 34 2d 62 69 74 20 73 69 67 6e  en a 64-bit sign
1c7b0 65 64 20 69 6e 74 65 67 65 72 20 61 6e 64 20 61  ed integer and a
1c7c0 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67   64-bit floating
1c7d0 2d 70 6f 69 6e 74 0a 2a 2a 20 6e 75 6d 62 65 72  -point.** number
1c7e0 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69  .  Return negati
1c7f0 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73  ve, zero, or pos
1c800 69 74 69 76 65 20 69 66 20 74 68 65 20 66 69 72  itive if the fir
1c810 73 74 20 28 69 36 34 29 20 69 73 20 6c 65 73 73  st (i64) is less
1c820 20 74 68 61 6e 2c 0a 2a 2a 20 65 71 75 61 6c 20   than,.** equal 
1c830 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74  to, or greater t
1c840 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 28  han the second (
1c850 64 6f 75 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74  double)..*/.stat
1c860 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  ic int sqlite3In
1c870 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 69 36  tFloatCompare(i6
1c880 34 20 69 2c 20 64 6f 75 62 6c 65 20 72 29 7b 0a  4 i, double r){.
1c890 20 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 4f 4e    if( sizeof(LON
1c8a0 47 44 4f 55 42 4c 45 5f 54 59 50 45 29 3e 38 20  GDOUBLE_TYPE)>8 
1c8b0 29 7b 0a 20 20 20 20 4c 4f 4e 47 44 4f 55 42 4c  ){.    LONGDOUBL
1c8c0 45 5f 54 59 50 45 20 78 20 3d 20 28 4c 4f 4e 47  E_TYPE x = (LONG
1c8d0 44 4f 55 42 4c 45 5f 54 59 50 45 29 69 3b 0a 20  DOUBLE_TYPE)i;. 
1c8e0 20 20 20 69 66 28 20 78 3c 72 20 29 20 72 65 74     if( x<r ) ret
1c8f0 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  urn -1;.    if( 
1c900 78 3e 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b  x>r ) return +1;
1c910 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1c920 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36 34 20   }else{.    i64 
1c930 79 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 73 3b  y;.    double s;
1c940 0a 20 20 20 20 69 66 28 20 72 3c 2d 39 32 32 33  .    if( r<-9223
1c950 33 37 32 30 33 36 38 35 34 37 37 35 38 30 38 2e  372036854775808.
1c960 30 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20  0 ) return +1;. 
1c970 20 20 20 69 66 28 20 72 3e 39 32 32 33 33 37 32     if( r>9223372
1c980 30 33 36 38 35 34 37 37 35 38 30 37 2e 30 20 29  036854775807.0 )
1c990 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1c9a0 79 20 3d 20 28 69 36 34 29 72 3b 0a 20 20 20 20  y = (i64)r;.    
1c9b0 69 66 28 20 69 3c 79 20 29 20 72 65 74 75 72 6e  if( i<y ) return
1c9c0 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 3e 79   -1;.    if( i>y
1c9d0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 79 3d   ){.      if( y=
1c9e0 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20  =SMALLEST_INT64 
1c9f0 26 26 20 72 3e 30 2e 30 20 29 20 72 65 74 75 72  && r>0.0 ) retur
1ca00 6e 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75  n -1;.      retu
1ca10 72 6e 20 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20  rn +1;.    }.   
1ca20 20 73 20 3d 20 28 64 6f 75 62 6c 65 29 69 3b 0a   s = (double)i;.
1ca30 20 20 20 20 69 66 28 20 73 3c 72 20 29 20 72 65      if( s<r ) re
1ca40 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28  turn -1;.    if(
1ca50 20 73 3e 72 20 29 20 72 65 74 75 72 6e 20 2b 31   s>r ) return +1
1ca60 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1ca70 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d    }.}../*.** Com
1ca80 70 61 72 65 20 74 68 65 20 76 61 6c 75 65 73 20  pare the values 
1ca90 63 6f 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65  contained by the
1caa0 20 74 77 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   two memory cell
1cab0 73 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20  s, returning.** 
1cac0 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 20 6f  negative, zero o
1cad0 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 4d  r positive if pM
1cae0 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e  em1 is less than
1caf0 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67  , equal to, or g
1cb00 72 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20 70  reater.** than p
1cb10 4d 65 6d 32 2e 20 53 6f 72 74 69 6e 67 20 6f 72  Mem2. Sorting or
1cb20 64 65 72 20 69 73 20 4e 55 4c 4c 27 73 20 66 69  der is NULL's fi
1cb30 72 73 74 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79  rst, followed by
1cb40 20 6e 75 6d 62 65 72 73 20 28 69 6e 74 65 67 65   numbers (intege
1cb50 72 73 0a 2a 2a 20 61 6e 64 20 72 65 61 6c 73 29  rs.** and reals)
1cb60 20 73 6f 72 74 65 64 20 6e 75 6d 65 72 69 63 61   sorted numerica
1cb70 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79  lly, followed by
1cb80 20 74 65 78 74 20 6f 72 64 65 72 65 64 20 62 79   text ordered by
1cb90 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a   the collating.*
1cba0 2a 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  * sequence pColl
1cbb0 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 62 6c 6f   and finally blo
1cbc0 62 27 73 20 6f 72 64 65 72 65 64 20 62 79 20 6d  b's ordered by m
1cbd0 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  emcmp()..**.** T
1cbe0 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61  wo NULL values a
1cbf0 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71  re considered eq
1cc00 75 61 6c 20 62 79 20 74 68 69 73 20 66 75 6e 63  ual by this func
1cc10 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
1cc20 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 63  ite3MemCompare(c
1cc30 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c  onst Mem *pMem1,
1cc40 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d   const Mem *pMem
1cc50 32 2c 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71  2, const CollSeq
1cc60 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 6e 74 20   *pColl){.  int 
1cc70 66 31 2c 20 66 32 3b 0a 20 20 69 6e 74 20 63 6f  f1, f2;.  int co
1cc80 6d 62 69 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a 20  mbined_flags;.. 
1cc90 20 66 31 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61   f1 = pMem1->fla
1cca0 67 73 3b 0a 20 20 66 32 20 3d 20 70 4d 65 6d 32  gs;.  f2 = pMem2
1ccb0 2d 3e 66 6c 61 67 73 3b 0a 20 20 63 6f 6d 62 69  ->flags;.  combi
1ccc0 6e 65 64 5f 66 6c 61 67 73 20 3d 20 66 31 7c 66  ned_flags = f1|f
1ccd0 32 3b 0a 20 20 61 73 73 65 72 74 28 20 28 63 6f  2;.  assert( (co
1cce0 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 26 20 4d  mbined_flags & M
1ccf0 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b  EM_RowSet)==0 );
1cd00 0a 20 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76  . .  /* If one v
1cd10 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20 69 74  alue is NULL, it
1cd20 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68   is less than th
1cd30 65 20 6f 74 68 65 72 2e 20 49 66 20 62 6f 74 68  e other. If both
1cd40 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20 61 72 65   values.  ** are
1cd50 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 30 2e   NULL, return 0.
1cd60 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62  .  */.  if( comb
1cd70 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e  ined_flags&MEM_N
1cd80 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ull ){.    retur
1cd90 6e 20 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20  n (f2&MEM_Null) 
1cda0 2d 20 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b  - (f1&MEM_Null);
1cdb0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 6c 65  .  }..  /* At le
1cdc0 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 74  ast one of the t
1cdd0 77 6f 20 76 61 6c 75 65 73 20 69 73 20 61 20 6e  wo values is a n
1cde0 75 6d 62 65 72 0a 20 20 2a 2f 0a 20 20 69 66 28  umber.  */.  if(
1cdf0 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26   combined_flags&
1ce00 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61  (MEM_Int|MEM_Rea
1ce10 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66  l) ){.    if( (f
1ce20 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74  1 & f2 & MEM_Int
1ce30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
1ce40 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20 70  ( pMem1->u.i < p
1ce50 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75  Mem2->u.i ) retu
1ce60 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28  rn -1;.      if(
1ce70 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d   pMem1->u.i > pM
1ce80 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72  em2->u.i ) retur
1ce90 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74 75  n +1;.      retu
1cea0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
1ceb0 69 66 28 20 28 66 31 20 26 20 66 32 20 26 20 4d  if( (f1 & f2 & M
1cec0 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20  EM_Real)!=0 ){. 
1ced0 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e       if( pMem1->
1cee0 75 2e 72 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 72  u.r < pMem2->u.r
1cef0 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
1cf00 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75      if( pMem1->u
1cf10 2e 72 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 72 20  .r > pMem2->u.r 
1cf20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20  ) return +1;.   
1cf30 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1cf40 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31 26 4d   }.    if( (f1&M
1cf50 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20  EM_Int)!=0 ){.  
1cf60 20 20 20 20 69 66 28 20 28 66 32 26 4d 45 4d 5f      if( (f2&MEM_
1cf70 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  Real)!=0 ){.    
1cf80 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
1cf90 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72  e3IntFloatCompar
1cfa0 65 28 70 4d 65 6d 31 2d 3e 75 2e 69 2c 20 70 4d  e(pMem1->u.i, pM
1cfb0 65 6d 32 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20  em2->u.r);.     
1cfc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1cfd0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
1cfe0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1cff0 20 28 66 31 26 4d 45 4d 5f 52 65 61 6c 29 21 3d   (f1&MEM_Real)!=
1d000 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  0 ){.      if( (
1d010 66 32 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29  f2&MEM_Int)!=0 )
1d020 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1d030 20 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61   -sqlite3IntFloa
1d040 74 43 6f 6d 70 61 72 65 28 70 4d 65 6d 32 2d 3e  tCompare(pMem2->
1d050 75 2e 69 2c 20 70 4d 65 6d 31 2d 3e 75 2e 72 29  u.i, pMem1->u.r)
1d060 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1d070 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31         return -1
1d080 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d090 20 20 20 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20      return +1;. 
1d0a0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20   }..  /* If one 
1d0b0 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e  value is a strin
1d0c0 67 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20  g and the other 
1d0d0 69 73 20 61 20 62 6c 6f 62 2c 20 74 68 65 20 73  is a blob, the s
1d0e0 74 72 69 6e 67 20 69 73 20 6c 65 73 73 2e 0a 20  tring is less.. 
1d0f0 20 2a 2a 20 49 66 20 62 6f 74 68 20 61 72 65 20   ** If both are 
1d100 73 74 72 69 6e 67 73 2c 20 63 6f 6d 70 61 72 65  strings, compare
1d110 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61   using the colla
1d120 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  ting functions..
1d130 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69    */.  if( combi
1d140 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 53 74  ned_flags&MEM_St
1d150 72 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66 31  r ){.    if( (f1
1d160 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29   & MEM_Str)==0 )
1d170 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
1d180 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1d190 28 66 32 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d  (f2 & MEM_Str)==
1d1a0 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
1d1b0 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n -1;.    }..   
1d1c0 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e   assert( pMem1->
1d1d0 65 6e 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20  enc==pMem2->enc 
1d1e0 7c 7c 20 70 4d 65 6d 31 2d 3e 64 62 2d 3e 6d 61  || pMem1->db->ma
1d1f0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1d200 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d    assert( pMem1-
1d210 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  >enc==SQLITE_UTF
1d220 38 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  8 || .          
1d230 20 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51    pMem1->enc==SQ
1d240 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c 20  LITE_UTF16LE || 
1d250 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49  pMem1->enc==SQLI
1d260 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a 20  TE_UTF16BE );.. 
1d270 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74     /* The collat
1d280 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6d 75 73  ion sequence mus
1d290 74 20 62 65 20 64 65 66 69 6e 65 64 20 61 74 20  t be defined at 
1d2a0 74 68 69 73 20 70 6f 69 6e 74 2c 20 65 76 65 6e  this point, even
1d2b0 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 75   if.    ** the u
1d2c0 73 65 72 20 64 65 6c 65 74 65 73 20 74 68 65 20  ser deletes the 
1d2d0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1d2e0 63 65 20 61 66 74 65 72 20 74 68 65 20 76 64 62  ce after the vdb
1d2f0 65 20 70 72 6f 67 72 61 6d 20 69 73 0a 20 20 20  e program is.   
1d300 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74 68   ** compiled (th
1d310 69 73 20 77 61 73 20 6e 6f 74 20 61 6c 77 61 79  is was not alway
1d320 73 20 74 68 65 20 63 61 73 65 29 2e 0a 20 20 20  s the case)..   
1d330 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1d340 21 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d  !pColl || pColl-
1d350 3e 78 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69 66  >xCmp );..    if
1d360 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
1d370 20 72 65 74 75 72 6e 20 76 64 62 65 43 6f 6d 70   return vdbeComp
1d380 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 70 4d 65  areMemString(pMe
1d390 6d 31 2c 20 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c  m1, pMem2, pColl
1d3a0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
1d3b0 2f 2a 20 49 66 20 61 20 4e 55 4c 4c 20 70 6f 69  /* If a NULL poi
1d3c0 6e 74 65 72 20 77 61 73 20 70 61 73 73 65 64 20  nter was passed 
1d3d0 61 73 20 74 68 65 20 63 6f 6c 6c 61 74 65 20 66  as the collate f
1d3e0 75 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c 20 74 68  unction, fall th
1d3f0 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74 6f 20  rough.    ** to 
1d400 74 68 65 20 62 6c 6f 62 20 63 61 73 65 20 61 6e  the blob case an
1d410 64 20 75 73 65 20 6d 65 6d 63 6d 70 28 29 2e 20  d use memcmp(). 
1d420 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 42   */.  }. .  /* B
1d430 6f 74 68 20 76 61 6c 75 65 73 20 6d 75 73 74 20  oth values must 
1d440 62 65 20 62 6c 6f 62 73 2e 20 20 43 6f 6d 70 61  be blobs.  Compa
1d450 72 65 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28  re using memcmp(
1d460 29 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ).  */.  return 
1d470 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61  sqlite3BlobCompa
1d480 72 65 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 29  re(pMem1, pMem2)
1d490 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ;.}.../*.** The 
1d4a0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70  first argument p
1d4b0 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
1d4c0 6e 63 74 69 6f 6e 20 69 73 20 61 20 73 65 72 69  nction is a seri
1d4d0 61 6c 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a 20  al-type that.** 
1d4e0 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61  corresponds to a
1d4f0 6e 20 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c 20  n integer - all 
1d500 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20 31  values between 1
1d510 20 61 6e 64 20 39 20 69 6e 63 6c 75 73 69 76 65   and 9 inclusive
1d520 20 0a 2a 2a 20 65 78 63 65 70 74 20 37 2e 20 54   .** except 7. T
1d530 68 65 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74 73  he second points
1d540 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
1d550 74 61 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67  taining an integ
1d560 65 72 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72 69  er value.** seri
1d570 61 6c 69 7a 65 64 20 61 63 63 6f 72 64 69 6e 67  alized according
1d580 20 74 6f 20 73 65 72 69 61 6c 5f 74 79 70 65 2e   to serial_type.
1d590 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
1d5a0 65 73 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20 61  eserializes.** a
1d5b0 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 76  nd returns the v
1d5c0 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
1d5d0 69 36 34 20 76 64 62 65 52 65 63 6f 72 64 44 65  i64 vdbeRecordDe
1d5e0 63 6f 64 65 49 6e 74 28 75 33 32 20 73 65 72 69  codeInt(u32 seri
1d5f0 61 6c 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 75  al_type, const u
1d600 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20  8 *aKey){.  u32 
1d610 79 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  y;.  assert( COR
1d620 52 55 50 54 5f 44 42 20 7c 7c 20 28 73 65 72 69  RUPT_DB || (seri
1d630 61 6c 5f 74 79 70 65 3e 3d 31 20 26 26 20 73 65  al_type>=1 && se
1d640 72 69 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26 20  rial_type<=9 && 
1d650 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 37 29 20  serial_type!=7) 
1d660 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72  );.  switch( ser
1d670 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20  ial_type ){.    
1d680 63 61 73 65 20 30 3a 0a 20 20 20 20 63 61 73 65  case 0:.    case
1d690 20 31 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61   1:.      testca
1d6a0 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
1d6b0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1d6c0 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b   ONE_BYTE_INT(aK
1d6d0 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 32 3a  ey);.    case 2:
1d6e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d6f0 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
1d700 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 57  .      return TW
1d710 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  O_BYTE_INT(aKey)
1d720 3b 0a 20 20 20 20 63 61 73 65 20 33 3a 0a 20 20  ;.    case 3:.  
1d730 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
1d740 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
1d750 20 20 20 20 72 65 74 75 72 6e 20 54 48 52 45 45      return THREE
1d760 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
1d770 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 0a 20  .    case 4: {. 
1d780 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1d790 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1d7a0 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59       y = FOUR_BY
1d7b0 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
1d7c0 20 20 20 20 20 72 65 74 75 72 6e 20 28 69 36 34       return (i64
1d7d0 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20  )*(int*)&y;.    
1d7e0 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 0a  }.    case 5: {.
1d7f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1d800 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1d810 20 20 20 20 20 20 72 65 74 75 72 6e 20 46 4f 55        return FOU
1d820 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
1d830 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c  +2) + (((i64)1)<
1d840 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e  <32)*TWO_BYTE_IN
1d850 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20  T(aKey);.    }. 
1d860 20 20 20 63 61 73 65 20 36 3a 20 7b 0a 20 20 20     case 6: {.   
1d870 20 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f     u64 x = FOUR_
1d880 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b  BYTE_UINT(aKey);
1d890 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d8a0 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
1d8b0 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33  .      x = (x<<3
1d8c0 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55  2) | FOUR_BYTE_U
1d8d0 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20  INT(aKey+4);.   
1d8e0 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a     return (i64)*
1d8f0 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d 0a  (i64*)&x;.    }.
1d900 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 73    }..  return (s
1d910 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 38 29 3b  erial_type - 8);
1d920 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1d930 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73  unction compares
1d940 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72   the two table r
1d950 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63  ows or index rec
1d960 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65  ords.** specifie
1d970 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65  d by {nKey1, pKe
1d980 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20  y1} and pPKey2. 
1d990 20 49 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65   It returns a ne
1d9a0 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20  gative, zero.** 
1d9b0 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65  or positive inte
1d9c0 67 65 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c  ger if key1 is l
1d9d0 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
1d9e0 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65  to or .** greate
1d9f0 72 20 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68  r than key2.  Th
1da00 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d  e {nKey1, pKey1}
1da10 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 62   key must be a b
1da20 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62  lob.** created b
1da30 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  y the OP_MakeRec
1da40 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68  ord opcode of th
1da50 65 20 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b  e VDBE.  The pPK
1da60 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20  ey2.** key must 
1da70 62 65 20 61 20 70 61 72 73 65 64 20 6b 65 79 20  be a parsed key 
1da80 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64  such as obtained
1da90 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
1daa0 56 64 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e  VdbeParseRecord.
1dab0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  .**.** If argume
1dac0 6e 74 20 62 53 6b 69 70 20 69 73 20 6e 6f 6e 2d  nt bSkip is non-
1dad0 7a 65 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75  zero, it is assu
1dae0 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c  med that the cal
1daf0 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 0a  ler has already.
1db00 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  ** determined th
1db10 61 74 20 74 68 65 20 66 69 72 73 74 20 66 69 65  at the first fie
1db20 6c 64 73 20 6f 66 20 74 68 65 20 6b 65 79 73 20  lds of the keys 
1db30 61 72 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a  are equal..**.**
1db40 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64   Key1 and Key2 d
1db50 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f  o not have to co
1db60 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e  ntain the same n
1db70 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e  umber of fields.
1db80 20 49 66 20 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c   If all .** fiel
1db90 64 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69  ds that appear i
1dba0 6e 20 62 6f 74 68 20 6b 65 79 73 20 61 72 65 20  n both keys are 
1dbb0 65 71 75 61 6c 2c 20 74 68 65 6e 20 70 50 4b 65  equal, then pPKe
1dbc0 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69  y2->default_rc i
1dbd0 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a  s .** returned..
1dbe0 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 62 61 73  **.** If databas
1dbf0 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  e corruption is 
1dc00 64 69 73 63 6f 76 65 72 65 64 2c 20 73 65 74 20  discovered, set 
1dc10 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20  pPKey2->errCode 
1dc20 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f  to .** SQLITE_CO
1dc30 52 52 55 50 54 20 61 6e 64 20 72 65 74 75 72 6e  RRUPT and return
1dc40 20 30 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72   0. If an OOM er
1dc50 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
1dc60 65 64 2c 20 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e  ed, .** pPKey2->
1dc70 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 20 74  errCode is set t
1dc80 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61  o SQLITE_NOMEM a
1dc90 6e 64 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  nd, if it is not
1dca0 20 4e 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61   NULL, the.** ma
1dcb0 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61 67  lloc-failed flag
1dcc0 20 73 65 74 20 6f 6e 20 64 61 74 61 62 61 73 65   set on database
1dcd0 20 68 61 6e 64 6c 65 20 28 70 50 4b 65 79 32 2d   handle (pPKey2-
1dce0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a  >pKeyInfo->db)..
1dcf0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1dd00 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57  beRecordCompareW
1dd10 69 74 68 53 6b 69 70 28 0a 20 20 69 6e 74 20 6e  ithSkip(.  int n
1dd20 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
1dd30 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65   *pKey1,   /* Le
1dd40 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61  ft key */.  Unpa
1dd50 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  ckedRecord *pPKe
1dd60 79 32 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  y2,         /* R
1dd70 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  ight key */.  in
1dd80 74 20 62 53 6b 69 70 20 20 20 20 20 20 20 20 20  t bSkip         
1dd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dda0 20 49 66 20 74 72 75 65 2c 20 73 6b 69 70 20 74   If true, skip t
1ddb0 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 2a  he first field *
1ddc0 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20  /.){.  u32 d1;  
1ddd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dde0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1ddf0 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
1de00 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e  next data elemen
1de10 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  t */.  int i;   
1de20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de30 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1de40 6f 66 20 6e 65 78 74 20 66 69 65 6c 64 20 74 6f  of next field to
1de50 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75 33   compare */.  u3
1de60 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20  2 szHdr1;       
1de70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1de80 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20   Size of record 
1de90 68 65 61 64 65 72 20 69 6e 20 62 79 74 65 73 20  header in bytes 
1dea0 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20  */.  u32 idx1;  
1deb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dec0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
1ded0 66 20 66 69 72 73 74 20 74 79 70 65 20 69 6e 20  f first type in 
1dee0 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
1def0 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rc = 0;         
1df00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1df10 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20  eturn value */. 
1df20 20 4d 65 6d 20 2a 70 52 68 73 20 3d 20 70 50 4b   Mem *pRhs = pPK
1df30 65 79 32 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20  ey2->aMem;      
1df40 20 2f 2a 20 4e 65 78 74 20 66 69 65 6c 64 20 6f   /* Next field o
1df50 66 20 70 50 4b 65 79 32 20 74 6f 20 63 6f 6d 70  f pPKey2 to comp
1df60 61 72 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  are */.  KeyInfo
1df70 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b   *pKeyInfo = pPK
1df80 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ey2->pKeyInfo;. 
1df90 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1dfa0 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63  char *aKey1 = (c
1dfb0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1dfc0 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4d 65  ar *)pKey1;.  Me
1dfd0 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66  m mem1;..  /* If
1dfe0 20 62 53 6b 69 70 20 69 73 20 74 72 75 65 2c 20   bSkip is true, 
1dff0 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20  then the caller 
1e000 68 61 73 20 61 6c 72 65 61 64 79 20 64 65 74 65  has already dete
1e010 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65 20  rmined that the 
1e020 66 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20 65  first.  ** two e
1e030 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6b  lements in the k
1e040 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20 46  eys are equal. F
1e050 69 78 20 74 68 65 20 76 61 72 69 6f 75 73 20 73  ix the various s
1e060 74 61 63 6b 20 76 61 72 69 61 62 6c 65 73 20 73  tack variables s
1e070 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73  o.  ** that this
1e080 20 72 6f 75 74 69 6e 65 20 62 65 67 69 6e 73 20   routine begins 
1e090 63 6f 6d 70 61 72 69 6e 67 20 61 74 20 74 68 65  comparing at the
1e0a0 20 73 65 63 6f 6e 64 20 66 69 65 6c 64 2e 20 2a   second field. *
1e0b0 2f 0a 20 20 69 66 28 20 62 53 6b 69 70 20 29 7b  /.  if( bSkip ){
1e0c0 0a 20 20 20 20 75 33 32 20 73 31 3b 0a 20 20 20  .    u32 s1;.   
1e0d0 20 69 64 78 31 20 3d 20 31 20 2b 20 67 65 74 56   idx1 = 1 + getV
1e0e0 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31  arint32(&aKey1[1
1e0f0 5d 2c 20 73 31 29 3b 0a 20 20 20 20 73 7a 48 64  ], s1);.    szHd
1e100 72 31 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 20  r1 = aKey1[0];. 
1e110 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31 20 2b     d1 = szHdr1 +
1e120 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1e130 61 6c 54 79 70 65 4c 65 6e 28 73 31 29 3b 0a 20  alTypeLen(s1);. 
1e140 20 20 20 69 20 3d 20 31 3b 0a 20 20 20 20 70 52     i = 1;.    pR
1e150 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  hs++;.  }else{. 
1e160 20 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72     idx1 = getVar
1e170 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48  int32(aKey1, szH
1e180 64 72 31 29 3b 0a 20 20 20 20 64 31 20 3d 20 73  dr1);.    d1 = s
1e190 7a 48 64 72 31 3b 0a 20 20 20 20 69 66 28 20 64  zHdr1;.    if( d
1e1a0 31 3e 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  1>(unsigned)nKey
1e1b0 31 20 29 7b 20 0a 20 20 20 20 20 20 70 50 4b 65  1 ){ .      pPKe
1e1c0 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75  y2->errCode = (u
1e1d0 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  8)SQLITE_CORRUPT
1e1e0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74  _BKPT;.      ret
1e1f0 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 75  urn 0;  /* Corru
1e200 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20  ption */.    }. 
1e210 20 20 20 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20     i = 0;.  }.. 
1e220 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e   VVA_ONLY( mem1.
1e230 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20  szMalloc = 0; ) 
1e240 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62  /* Only needed b
1e250 79 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  y assert() state
1e260 6d 65 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65 72  ments */.  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 2b 70 50 4b 65  nfo->nField+pPKe
1e290 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58  y2->pKeyInfo->nX
1e2a0 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e  Field>=pPKey2->n
1e2b0 46 69 65 6c 64 20 0a 20 20 20 20 20 20 20 7c 7c  Field .       ||
1e2c0 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
1e2d0 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d   assert( pPKey2-
1e2e0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74  >pKeyInfo->aSort
1e2f0 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Order!=0 );.  as
1e300 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b  sert( pPKey2->pK
1e310 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30  eyInfo->nField>0
1e320 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   );.  assert( id
1e330 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f  x1<=szHdr1 || CO
1e340 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f  RRUPT_DB );.  do
1e350 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
1e360 5f 74 79 70 65 3b 0a 0a 20 20 20 20 2f 2a 20 52  _type;..    /* R
1e370 48 53 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  HS is an integer
1e380 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 68 73   */.    if( pRhs
1e390 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
1e3a0 74 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61  t ){.      seria
1e3b0 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69  l_type = aKey1[i
1e3c0 64 78 31 5d 3b 0a 20 20 20 20 20 20 74 65 73 74  dx1];.      test
1e3d0 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70  case( serial_typ
1e3e0 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69  e==12 );.      i
1e3f0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
1e400 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  10 ){.        rc
1e410 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = +1;.      }el
1e420 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  se if( serial_ty
1e430 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  pe==0 ){.       
1e440 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1e450 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c  }else if( serial
1e460 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20  _type==7 ){.    
1e470 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
1e480 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b  erialGet(&aKey1[
1e490 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  d1], serial_type
1e4a0 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20  , &mem1);.      
1e4b0 20 20 72 63 20 3d 20 2d 73 71 6c 69 74 65 33 49    rc = -sqlite3I
1e4c0 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70  ntFloatCompare(p
1e4d0 52 68 73 2d 3e 75 2e 69 2c 20 6d 65 6d 31 2e 75  Rhs->u.i, mem1.u
1e4e0 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .r);.      }else
1e4f0 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6c 68  {.        i64 lh
1e500 73 20 3d 20 76 64 62 65 52 65 63 6f 72 64 44 65  s = vdbeRecordDe
1e510 63 6f 64 65 49 6e 74 28 73 65 72 69 61 6c 5f 74  codeInt(serial_t
1e520 79 70 65 2c 20 26 61 4b 65 79 31 5b 64 31 5d 29  ype, &aKey1[d1])
1e530 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 72 68  ;.        i64 rh
1e540 73 20 3d 20 70 52 68 73 2d 3e 75 2e 69 3b 0a 20  s = pRhs->u.i;. 
1e550 20 20 20 20 20 20 20 69 66 28 20 6c 68 73 3c 72         if( lhs<r
1e560 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  hs ){.          
1e570 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  rc = -1;.       
1e580 20 7d 65 6c 73 65 20 69 66 28 20 6c 68 73 3e 72   }else if( lhs>r
1e590 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  hs ){.          
1e5a0 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20  rc = +1;.       
1e5b0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1e5c0 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20  ..    /* RHS is 
1e5d0 72 65 61 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65  real */.    else
1e5e0 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73   if( pRhs->flags
1e5f0 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20   & MEM_Real ){. 
1e600 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65       serial_type
1e610 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a   = aKey1[idx1];.
1e620 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
1e630 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20  _type>=10 ){.   
1e640 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74       /* Serial t
1e650 79 70 65 73 20 31 32 20 6f 72 20 67 72 65 61 74  ypes 12 or great
1e660 65 72 20 61 72 65 20 73 74 72 69 6e 67 73 20 61  er are strings a
1e670 6e 64 20 62 6c 6f 62 73 20 28 67 72 65 61 74 65  nd blobs (greate
1e680 72 20 74 68 61 6e 0a 20 20 20 20 20 20 20 20 2a  r than.        *
1e690 2a 20 6e 75 6d 62 65 72 73 29 2e 20 54 79 70 65  * numbers). Type
1e6a0 73 20 31 30 20 61 6e 64 20 31 31 20 61 72 65 20  s 10 and 11 are 
1e6b0 63 75 72 72 65 6e 74 6c 79 20 22 72 65 73 65 72  currently "reser
1e6c0 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 0a  ved for future .
1e6d0 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 22 2c          ** use",
1e6e0 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 72   so it doesn't r
1e6f0 65 61 6c 6c 79 20 6d 61 74 74 65 72 20 77 68 61  eally matter wha
1e700 74 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  t the results of
1e710 20 63 6f 6d 70 61 72 69 6e 67 0a 20 20 20 20 20   comparing.     
1e720 20 20 20 2a 2a 20 74 68 65 6d 20 74 6f 20 6e 75     ** them to nu
1e730 6d 62 65 72 69 63 20 76 61 6c 75 65 73 20 61 72  mberic values ar
1e740 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  e.  */.        r
1e750 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65  c = +1;.      }e
1e760 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74  lse if( serial_t
1e770 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ype==0 ){.      
1e780 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1e790 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e7a0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1e7b0 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c  lGet(&aKey1[d1],
1e7c0 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d   serial_type, &m
1e7d0 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  em1);.        if
1e7e0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37  ( serial_type==7
1e7f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
1e800 28 20 6d 65 6d 31 2e 75 2e 72 3c 70 52 68 73 2d  ( mem1.u.r<pRhs-
1e810 3e 75 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20  >u.r ){.        
1e820 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1e830 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1e840 20 6d 65 6d 31 2e 75 2e 72 3e 70 52 68 73 2d 3e   mem1.u.r>pRhs->
1e850 75 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  u.r ){.         
1e860 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20     rc = +1;.    
1e870 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e880 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1e890 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 74   rc = sqlite3Int
1e8a0 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 6d 65 6d  FloatCompare(mem
1e8b0 31 2e 75 2e 69 2c 20 70 52 68 73 2d 3e 75 2e 72  1.u.i, pRhs->u.r
1e8c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1e8d0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1e8e0 2f 2a 20 52 48 53 20 69 73 20 61 20 73 74 72 69  /* RHS is a stri
1e8f0 6e 67 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69  ng */.    else i
1e900 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
1e910 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20   MEM_Str ){.    
1e920 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61    getVarint32(&a
1e930 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69  Key1[idx1], seri
1e940 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20  al_type);.      
1e950 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c  testcase( serial
1e960 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20  _type==12 );.   
1e970 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
1e980 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 20 20 20  pe<12 ){.       
1e990 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1e9a0 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65 72 69  }else if( !(seri
1e9b0 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20  al_type & 0x01) 
1e9c0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1e9d0 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  +1;.      }else{
1e9e0 0a 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 6e 20  .        mem1.n 
1e9f0 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d  = (serial_type -
1ea00 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20   12) / 2;.      
1ea10 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b    testcase( (d1+
1ea20 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e  mem1.n)==(unsign
1ea30 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20  ed)nKey1 );.    
1ea40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64      testcase( (d
1ea50 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e  1+mem1.n+1)==(un
1ea60 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
1ea70 20 20 20 20 20 20 20 20 69 66 28 20 28 64 31 2b          if( (d1+
1ea80 6d 65 6d 31 2e 6e 29 20 3e 20 28 75 6e 73 69 67  mem1.n) > (unsig
1ea90 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20  ned)nKey1 ){.   
1eaa0 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65         pPKey2->e
1eab0 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c  rrCode = (u8)SQL
1eac0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1ead0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
1eae0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1eaf0 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69       /* Corrupti
1eb00 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65  on */.        }e
1eb10 6c 73 65 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  lse if( pKeyInfo
1eb20 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20  ->aColl[i] ){.  
1eb30 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 65 6e 63          mem1.enc
1eb40 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
1eb50 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  ;.          mem1
1eb60 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  .db = pKeyInfo->
1eb70 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  db;.          me
1eb80 6d 31 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m1.flags = MEM_S
1eb90 74 72 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  tr;.          me
1eba0 6d 31 2e 7a 20 3d 20 28 63 68 61 72 2a 29 26 61  m1.z = (char*)&a
1ebb0 4b 65 79 31 5b 64 31 5d 3b 0a 20 20 20 20 20 20  Key1[d1];.      
1ebc0 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d      rc = vdbeCom
1ebd0 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20  pareMemString(. 
1ebe0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 6d 65               &me
1ebf0 6d 31 2c 20 70 52 68 73 2c 20 70 4b 65 79 49 6e  m1, pRhs, pKeyIn
1ec00 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70  fo->aColl[i], &p
1ec10 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 0a 20  PKey2->errCode. 
1ec20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
1ec30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ec40 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20       int nCmp = 
1ec50 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20 70 52 68 73  MIN(mem1.n, pRhs
1ec60 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ->n);.          
1ec70 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65  rc = memcmp(&aKe
1ec80 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c  y1[d1], pRhs->z,
1ec90 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20   nCmp);.        
1eca0 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63    if( rc==0 ) rc
1ecb0 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20 70 52 68 73   = mem1.n - pRhs
1ecc0 2d 3e 6e 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a  ->n; .        }.
1ecd0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1ece0 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20 62     /* RHS is a b
1ecf0 6c 6f 62 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  lob */.    else 
1ed00 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20  if( pRhs->flags 
1ed10 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20  & MEM_Blob ){.  
1ed20 20 20 20 20 67 65 74 56 61 72 69 6e 74 33 32 28      getVarint32(
1ed30 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65  &aKey1[idx1], se
1ed40 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
1ed50 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69    testcase( seri
1ed60 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20  al_type==12 );. 
1ed70 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
1ed80 74 79 70 65 3c 31 32 20 7c 7c 20 28 73 65 72 69  type<12 || (seri
1ed90 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20  al_type & 0x01) 
1eda0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1edb0 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  -1;.      }else{
1edc0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 74  .        int nSt
1edd0 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  r = (serial_type
1ede0 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20   - 12) / 2;.    
1edf0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64      testcase( (d
1ee00 31 2b 6e 53 74 72 29 3d 3d 28 75 6e 73 69 67 6e  1+nStr)==(unsign
1ee10 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20  ed)nKey1 );.    
1ee20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64      testcase( (d
1ee30 31 2b 6e 53 74 72 2b 31 29 3d 3d 28 75 6e 73 69  1+nStr+1)==(unsi
1ee40 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20  gned)nKey1 );.  
1ee50 20 20 20 20 20 20 69 66 28 20 28 64 31 2b 6e 53        if( (d1+nS
1ee60 74 72 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29  tr) > (unsigned)
1ee70 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20  nKey1 ){.       
1ee80 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f     pPKey2->errCo
1ee90 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f  de = (u8)SQLITE_
1eea0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1eeb0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
1eec0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1eed0 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a   /* Corruption *
1eee0 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  /.        }else{
1eef0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
1ef00 43 6d 70 20 3d 20 4d 49 4e 28 6e 53 74 72 2c 20  Cmp = MIN(nStr, 
1ef10 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20  pRhs->n);.      
1ef20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28      rc = memcmp(
1ef30 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73  &aKey1[d1], pRhs
1ef40 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20  ->z, nCmp);.    
1ef50 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20        if( rc==0 
1ef60 29 20 72 63 20 3d 20 6e 53 74 72 20 2d 20 70 52  ) rc = nStr - pR
1ef70 68 73 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 7d  hs->n;.        }
1ef80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1ef90 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 6e 75      /* RHS is nu
1efa0 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 7b 0a  ll */.    else{.
1efb0 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70        serial_typ
1efc0 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b  e = aKey1[idx1];
1efd0 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73 65 72  .      rc = (ser
1efe0 69 61 6c 5f 74 79 70 65 21 3d 30 29 3b 0a 20 20  ial_type!=0);.  
1eff0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 21    }..    if( rc!
1f000 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1f010 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
1f020 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20  rder[i] ){.     
1f030 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20     rc = -rc;.   
1f040 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
1f050 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  t( vdbeRecordCom
1f060 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
1f070 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
1f080 72 63 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  rc) );.      ass
1f090 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  ert( mem1.szMall
1f0a0 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65  oc==0 );  /* See
1f0b0 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a   comment below *
1f0c0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  /.      return r
1f0d0 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 2b  c;.    }..    i+
1f0e0 2b 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20  +;.    pRhs++;. 
1f0f0 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33     d1 += sqlite3
1f100 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
1f110 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  n(serial_type);.
1f120 20 20 20 20 69 64 78 31 20 2b 3d 20 73 71 6c 69      idx1 += sqli
1f130 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 73 65 72  te3VarintLen(ser
1f140 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 7d 77 68  ial_type);.  }wh
1f150 69 6c 65 28 20 69 64 78 31 3c 28 75 6e 73 69 67  ile( idx1<(unsig
1f160 6e 65 64 29 73 7a 48 64 72 31 20 26 26 20 69 3c  ned)szHdr1 && i<
1f170 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 26  pPKey2->nField &
1f180 26 20 64 31 3c 3d 28 75 6e 73 69 67 6e 65 64 29  & d1<=(unsigned)
1f190 6e 4b 65 79 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e  nKey1 );..  /* N
1f1a0 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  o memory allocat
1f1b0 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64  ion is ever used
1f1c0 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65   on mem1.  Prove
1f1d0 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a   this using.  **
1f1e0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
1f1f0 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65  ssert().  If the
1f200 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c   assert() fails,
1f210 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a   it indicates a.
1f220 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b    ** memory leak
1f230 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63   and a need to c
1f240 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d  all sqlite3VdbeM
1f250 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29  emRelease(&mem1)
1f260 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1f270 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30  mem1.szMalloc==0
1f280 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20   );..  /* rc==0 
1f290 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20  here means that 
1f2a0 6f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74  one or both of t
1f2b0 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20  he keys ran out 
1f2c0 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20  of fields and.  
1f2d0 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64  ** all the field
1f2e0 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69  s up to that poi
1f2f0 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52  nt were equal. R
1f300 65 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c  eturn the defaul
1f310 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  t_rc.  ** value.
1f320 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 43    */.  assert( C
1f330 4f 52 52 55 50 54 5f 44 42 20 0a 20 20 20 20 20  ORRUPT_DB .     
1f340 20 20 7c 7c 20 76 64 62 65 52 65 63 6f 72 64 43    || vdbeRecordC
1f350 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79  ompareDebug(nKey
1f360 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1f370 2c 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  , pPKey2->defaul
1f380 74 5f 72 63 29 20 0a 20 20 20 20 20 20 20 7c 7c  t_rc) .       ||
1f390 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d   pKeyInfo->db->m
1f3a0 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b  allocFailed.  );
1f3b0 0a 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65  .  pPKey2->eqSee
1f3c0 6e 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  n = 1;.  return 
1f3d0 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
1f3e0 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  rc;.}.int sqlite
1f3f0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1f400 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  re(.  int nKey1,
1f410 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
1f420 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65  y1,   /* Left ke
1f430 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
1f440 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20  ecord *pPKey2   
1f450 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
1f460 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75  key */.){.  retu
1f470 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  rn sqlite3VdbeRe
1f480 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53  cordCompareWithS
1f490 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  kip(nKey1, pKey1
1f4a0 2c 20 70 50 4b 65 79 32 2c 20 30 29 3b 0a 7d 0a  , pPKey2, 0);.}.
1f4b0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1f4c0 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69  ction is an opti
1f4d0 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  mized version of
1f4e0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1f4f0 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20  rdCompare() .** 
1f500 74 68 61 74 20 28 61 29 20 74 68 65 20 66 69 72  that (a) the fir
1f510 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65  st field of pPKe
1f520 79 32 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  y2 is an integer
1f530 2c 20 61 6e 64 20 28 62 29 20 74 68 65 20 0a 2a  , and (b) the .*
1f540 2a 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72  * size-of-header
1f550 20 76 61 72 69 6e 74 20 61 74 20 74 68 65 20 73   varint at the s
1f560 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e  tart of (pKey1/n
1f570 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20 61 20  Key1) fits in a 
1f580 73 69 6e 67 6c 65 0a 2a 2a 20 62 79 74 65 20 28  single.** byte (
1f590 69 2e 65 2e 20 69 73 20 6c 65 73 73 20 74 68 61  i.e. is less tha
1f5a0 6e 20 31 32 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f  n 128)..**.** To
1f5b0 20 61 76 6f 69 64 20 63 6f 6e 63 65 72 6e 73 20   avoid concerns 
1f5c0 61 62 6f 75 74 20 62 75 66 66 65 72 20 6f 76 65  about buffer ove
1f5d0 72 72 65 61 64 73 2c 20 74 68 69 73 20 72 6f 75  rreads, this rou
1f5e0 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  tine is only use
1f5f0 64 0a 2a 2a 20 6f 6e 20 73 63 68 65 6d 61 73 20  d.** on schemas 
1f600 77 68 65 72 65 20 74 68 65 20 6d 61 78 69 6d 75  where the maximu
1f610 6d 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 73  m valid header s
1f620 69 7a 65 20 69 73 20 36 33 20 62 79 74 65 73 20  ize is 63 bytes 
1f630 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74  or less..*/.stat
1f640 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72  ic int vdbeRecor
1f650 64 43 6f 6d 70 61 72 65 49 6e 74 28 0a 20 20 69  dCompareInt(.  i
1f660 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
1f670 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20  void *pKey1, /* 
1f680 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e  Left key */.  Un
1f690 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
1f6a0 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52  Key2        /* R
1f6b0 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20  ight key */.){. 
1f6c0 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 20   const u8 *aKey 
1f6d0 3d 20 26 28 28 63 6f 6e 73 74 20 75 38 2a 29 70  = &((const u8*)p
1f6e0 4b 65 79 31 29 5b 2a 28 63 6f 6e 73 74 20 75 38  Key1)[*(const u8
1f6f0 2a 29 70 4b 65 79 31 20 26 20 30 78 33 46 5d 3b  *)pKey1 & 0x3F];
1f700 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79  .  int serial_ty
1f710 70 65 20 3d 20 28 28 63 6f 6e 73 74 20 75 38 2a  pe = ((const u8*
1f720 29 70 4b 65 79 31 29 5b 31 5d 3b 0a 20 20 69 6e  )pKey1)[1];.  in
1f730 74 20 72 65 73 3b 0a 20 20 75 33 32 20 79 3b 0a  t res;.  u32 y;.
1f740 20 20 75 36 34 20 78 3b 0a 20 20 69 36 34 20 76    u64 x;.  i64 v
1f750 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b   = pPKey2->aMem[
1f760 30 5d 2e 75 2e 69 3b 0a 20 20 69 36 34 20 6c 68  0].u.i;.  i64 lh
1f770 73 3b 0a 0a 20 20 76 64 62 65 41 73 73 65 72 74  s;..  vdbeAssert
1f780 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e  FieldCountWithin
1f790 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b  Limits(nKey1, pK
1f7a0 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ey1, pPKey2->pKe
1f7b0 79 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  yInfo);.  assert
1f7c0 28 20 28 2a 28 75 38 2a 29 70 4b 65 79 31 29 3c  ( (*(u8*)pKey1)<
1f7d0 3d 30 78 33 46 20 7c 7c 20 43 4f 52 52 55 50 54  =0x3F || CORRUPT
1f7e0 5f 44 42 20 29 3b 0a 20 20 73 77 69 74 63 68 28  _DB );.  switch(
1f7f0 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a   serial_type ){.
1f800 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a      case 1: { /*
1f810 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   1-byte signed i
1f820 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1f830 6c 68 73 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49  lhs = ONE_BYTE_I
1f840 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1f850 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
1f860 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1f870 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32      }.    case 2
1f880 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69  : { /* 2-byte si
1f890 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1f8a0 20 20 20 20 20 20 6c 68 73 20 3d 20 54 57 4f 5f        lhs = TWO_
1f8b0 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1f8c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f8d0 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
1f8e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1f8f0 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62  case 3: { /* 3-b
1f900 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1f910 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20  er */.      lhs 
1f920 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54  = THREE_BYTE_INT
1f930 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65  (aKey);.      te
1f940 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
1f950 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1f960 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20    }.    case 4: 
1f970 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e  { /* 4-byte sign
1f980 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1f990 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54      y = FOUR_BYT
1f9a0 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  E_UINT(aKey);.  
1f9b0 20 20 20 20 6c 68 73 20 3d 20 28 69 36 34 29 2a      lhs = (i64)*
1f9c0 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20 20  (int*)&y;.      
1f9d0 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
1f9e0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1f9f0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35      }.    case 5
1fa00 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69  : { /* 6-byte si
1fa10 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1fa20 20 20 20 20 20 20 6c 68 73 20 3d 20 46 4f 55 52        lhs = FOUR
1fa30 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b  _BYTE_UINT(aKey+
1fa40 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c  2) + (((i64)1)<<
1fa50 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54  32)*TWO_BYTE_INT
1fa60 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65  (aKey);.      te
1fa70 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
1fa80 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1fa90 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20    }.    case 6: 
1faa0 7b 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e  { /* 8-byte sign
1fab0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1fac0 20 20 20 20 78 20 3d 20 46 4f 55 52 5f 42 59 54      x = FOUR_BYT
1fad0 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  E_UINT(aKey);.  
1fae0 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20      x = (x<<32) 
1faf0 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  | FOUR_BYTE_UINT
1fb00 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20  (aKey+4);.      
1fb10 6c 68 73 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b  lhs = *(i64*)&x;
1fb20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1fb30 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20   lhs<0 );.      
1fb40 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1fb50 20 63 61 73 65 20 38 3a 20 0a 20 20 20 20 20 20   case 8: .      
1fb60 6c 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  lhs = 0;.      b
1fb70 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 39  reak;.    case 9
1fb80 3a 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 31 3b  :.      lhs = 1;
1fb90 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
1fba0 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20     /* This case 
1fbb0 63 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76 65 64  could be removed
1fbc0 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e   without changin
1fbd0 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  g the results of
1fbe0 20 72 75 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20   running.    ** 
1fbf0 74 68 69 73 20 63 6f 64 65 2e 20 49 6e 63 6c 75  this code. Inclu
1fc00 64 69 6e 67 20 69 74 20 63 61 75 73 65 73 20 67  ding it causes g
1fc10 63 63 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  cc to generate a
1fc20 20 66 61 73 74 65 72 20 73 77 69 74 63 68 20 0a   faster switch .
1fc30 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
1fc40 20 28 73 69 6e 63 65 20 74 68 65 20 72 61 6e 67   (since the rang
1fc50 65 20 6f 66 20 73 77 69 74 63 68 20 74 61 72 67  e of switch targ
1fc60 65 74 73 20 6e 6f 77 20 73 74 61 72 74 73 20 61  ets now starts a
1fc70 74 20 7a 65 72 6f 20 61 6e 64 0a 20 20 20 20 2a  t zero and.    *
1fc80 2a 20 69 73 20 63 6f 6e 74 69 67 75 6f 75 73 29  * is contiguous)
1fc90 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63 61   but does not ca
1fca0 75 73 65 20 61 6e 79 20 64 75 70 6c 69 63 61 74  use any duplicat
1fcb0 65 20 63 6f 64 65 20 74 6f 20 62 65 20 67 65 6e  e code to be gen
1fcc0 65 72 61 74 65 64 0a 20 20 20 20 2a 2a 20 28 61  erated.    ** (a
1fcd0 73 20 67 63 63 20 69 73 20 63 6c 65 76 65 72 20  s gcc is clever 
1fce0 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6d 62 69 6e  enough to combin
1fcf0 65 20 74 68 65 20 74 77 6f 20 6c 69 6b 65 20 63  e the two like c
1fd00 61 73 65 73 29 2e 20 4f 74 68 65 72 20 0a 20 20  ases). Other .  
1fd10 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 73 20 6d    ** compilers m
1fd20 69 67 68 74 20 62 65 20 73 69 6d 69 6c 61 72 2e  ight be similar.
1fd30 20 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 30    */ .    case 0
1fd40 3a 20 63 61 73 65 20 37 3a 0a 20 20 20 20 20 20  : case 7:.      
1fd50 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
1fd60 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1fd70 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1fd80 4b 65 79 32 29 3b 0a 0a 20 20 20 20 64 65 66 61  Key2);..    defa
1fd90 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ult:.      retur
1fda0 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  n sqlite3VdbeRec
1fdb0 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31  ordCompare(nKey1
1fdc0 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29  , pKey1, pPKey2)
1fdd0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 76 3e 6c  ;.  }..  if( v>l
1fde0 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  hs ){.    res = 
1fdf0 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 7d 65  pPKey2->r1;.  }e
1fe00 6c 73 65 20 69 66 28 20 76 3c 6c 68 73 20 29 7b  lse if( v<lhs ){
1fe10 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79  .    res = pPKey
1fe20 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 65 20 69  2->r2;.  }else i
1fe30 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c  f( pPKey2->nFiel
1fe40 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  d>1 ){.    /* Th
1fe50 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f  e first fields o
1fe60 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61  f the two keys a
1fe70 72 65 20 65 71 75 61 6c 2e 20 43 6f 6d 70 61 72  re equal. Compar
1fe80 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 0a  e the trailing .
1fe90 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 20      ** fields.  
1fea0 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c  */.    res = sql
1feb0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1fec0 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b  mpareWithSkip(nK
1fed0 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1fee0 79 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  y2, 1);.  }else{
1fef0 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  .    /* The firs
1ff00 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
1ff10 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75  two keys are equ
1ff20 61 6c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  al and there are
1ff30 20 6e 6f 20 74 72 61 69 6c 69 6e 67 0a 20 20 20   no trailing.   
1ff40 20 2a 2a 20 66 69 65 6c 64 73 2e 20 52 65 74 75   ** fields. Retu
1ff50 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75  rn pPKey2->defau
1ff60 6c 74 5f 72 63 20 69 6e 20 74 68 69 73 20 63 61  lt_rc in this ca
1ff70 73 65 2e 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d  se. */.    res =
1ff80 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
1ff90 5f 72 63 3b 0a 20 20 20 20 70 50 4b 65 79 32 2d  _rc;.    pPKey2-
1ffa0 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 7d  >eqSeen = 1;.  }
1ffb0 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64 62 65  ..  assert( vdbe
1ffc0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62  RecordCompareDeb
1ffd0 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ug(nKey1, pKey1,
1ffe0 20 70 50 4b 65 79 32 2c 20 72 65 73 29 20 29 3b   pPKey2, res) );
1fff0 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
20000 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
20010 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69  ction is an opti
20020 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  mized version of
20030 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
20040 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20  rdCompare() .** 
20050 74 68 61 74 20 28 61 29 20 74 68 65 20 66 69 72  that (a) the fir
20060 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65  st field of pPKe
20070 79 32 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20  y2 is a string, 
20080 74 68 61 74 20 28 62 29 20 74 68 65 20 66 69 72  that (b) the fir
20090 73 74 20 66 69 65 6c 64 0a 2a 2a 20 75 73 65 73  st field.** uses
200a0 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
200b0 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59 20 61  equence BINARY a
200c0 6e 64 20 28 63 29 20 74 68 61 74 20 74 68 65 20  nd (c) that the 
200d0 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76  size-of-header v
200e0 61 72 69 6e 74 20 0a 2a 2a 20 61 74 20 74 68 65  arint .** at the
200f0 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31   start of (pKey1
20100 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20  /nKey1) fits in 
20110 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a  a single byte..*
20120 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
20130 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74  eRecordCompareSt
20140 72 69 6e 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79  ring(.  int nKey
20150 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
20160 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65  Key1, /* Left ke
20170 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
20180 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20  ecord *pPKey2   
20190 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
201a0 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  y */.){.  const 
201b0 75 38 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  u8 *aKey1 = (con
201c0 73 74 20 75 38 2a 29 70 4b 65 79 31 3b 0a 20 20  st u8*)pKey1;.  
201d0 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65 3b  int serial_type;
201e0 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61  .  int res;..  a
201f0 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 61  ssert( pPKey2->a
20200 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 20 26 20 4d  Mem[0].flags & M
20210 45 4d 5f 53 74 72 20 29 3b 0a 20 20 76 64 62 65  EM_Str );.  vdbe
20220 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74  AssertFieldCount
20230 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65  WithinLimits(nKe
20240 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
20250 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  2->pKeyInfo);.  
20260 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
20270 79 31 5b 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  y1[1], serial_ty
20280 70 65 29 3b 0a 20 20 69 66 28 20 73 65 72 69 61  pe);.  if( seria
20290 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20  l_type<12 ){.   
202a0 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
202b0 31 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79  1;      /* (pKey
202c0 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 6e 75  1/nKey1) is a nu
202d0 6d 62 65 72 20 6f 72 20 61 20 6e 75 6c 6c 20 2a  mber or a null *
202e0 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28  /.  }else if( !(
202f0 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78  serial_type & 0x
20300 30 31 29 20 29 7b 20 0a 20 20 20 20 72 65 73 20  01) ){ .    res 
20310 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 20 20 20  = pPKey2->r2;   
20320 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65     /* (pKey1/nKe
20330 79 31 29 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f  y1) is a blob */
20340 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
20350 74 20 6e 43 6d 70 3b 0a 20 20 20 20 69 6e 74 20  t nCmp;.    int 
20360 6e 53 74 72 3b 0a 20 20 20 20 69 6e 74 20 73 7a  nStr;.    int sz
20370 48 64 72 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a  Hdr = aKey1[0];.
20380 0a 20 20 20 20 6e 53 74 72 20 3d 20 28 73 65 72  .    nStr = (ser
20390 69 61 6c 5f 74 79 70 65 2d 31 32 29 20 2f 20 32  ial_type-12) / 2
203a0 3b 0a 20 20 20 20 69 66 28 20 28 73 7a 48 64 72  ;.    if( (szHdr
203b0 20 2b 20 6e 53 74 72 29 20 3e 20 6e 4b 65 79 31   + nStr) > nKey1
203c0 20 29 7b 0a 20 20 20 20 20 20 70 50 4b 65 79 32   ){.      pPKey2
203d0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29  ->errCode = (u8)
203e0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
203f0 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72  KPT;.      retur
20400 6e 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72 72 75  n 0;    /* Corru
20410 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20  ption */.    }. 
20420 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 20 70     nCmp = MIN( p
20430 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e  PKey2->aMem[0].n
20440 2c 20 6e 53 74 72 20 29 3b 0a 20 20 20 20 72 65  , nStr );.    re
20450 73 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79  s = memcmp(&aKey
20460 31 5b 73 7a 48 64 72 5d 2c 20 70 50 4b 65 79 32  1[szHdr], pPKey2
20470 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d  ->aMem[0].z, nCm
20480 70 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 65 73  p);..    if( res
20490 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73  ==0 ){.      res
204a0 20 3d 20 6e 53 74 72 20 2d 20 70 50 4b 65 79 32   = nStr - pPKey2
204b0 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20  ->aMem[0].n;.   
204c0 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b     if( res==0 ){
204d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 4b  .        if( pPK
204e0 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b  ey2->nField>1 ){
204f0 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 20 3d  .          res =
20500 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
20510 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69  rdCompareWithSki
20520 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  p(nKey1, pKey1, 
20530 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20 20  pPKey2, 1);.    
20540 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20550 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
20560 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20  2->default_rc;. 
20570 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d           pPKey2-
20580 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20  >eqSeen = 1;.   
20590 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
205a0 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a  se if( res>0 ){.
205b0 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50          res = pP
205c0 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 20 20  Key2->r2;.      
205d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
205e0 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b  es = pPKey2->r1;
205f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
20600 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a  se if( res>0 ){.
20610 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
20620 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73  y2->r2;.    }els
20630 65 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70  e{.      res = p
20640 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 7d  PKey2->r1;.    }
20650 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
20660 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
20670 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
20680 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73  ey1, pPKey2, res
20690 29 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52  ).       || CORR
206a0 55 50 54 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c  UPT_DB.       ||
206b0 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
206c0 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  o->db->mallocFai
206d0 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65 74 75 72  led.  );.  retur
206e0 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
206f0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
20700 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 56 64   to an sqlite3Vd
20710 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
20720 29 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 75 6e  ) compatible fun
20730 63 74 69 6f 6e 0a 2a 2a 20 73 75 69 74 61 62 6c  ction.** suitabl
20740 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20  e for comparing 
20750 73 65 72 69 61 6c 69 7a 65 64 20 72 65 63 6f 72  serialized recor
20760 64 73 20 74 6f 20 74 68 65 20 75 6e 70 61 63 6b  ds to the unpack
20770 65 64 20 72 65 63 6f 72 64 20 70 61 73 73 65 64  ed record passed
20780 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  .** as the only 
20790 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63  argument..*/.Rec
207a0 6f 72 64 43 6f 6d 70 61 72 65 20 73 71 6c 69 74  ordCompare sqlit
207b0 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72  e3VdbeFindCompar
207c0 65 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  e(UnpackedRecord
207d0 20 2a 70 29 7b 0a 20 20 2f 2a 20 76 61 72 69 6e   *p){.  /* varin
207e0 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  tRecordCompareIn
207f0 74 28 29 20 61 6e 64 20 76 61 72 69 6e 74 52 65  t() and varintRe
20800 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e  cordCompareStrin
20810 67 28 29 20 62 6f 74 68 20 61 73 73 75 6d 65 0a  g() both assume.
20820 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73 69    ** that the si
20830 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72  ze-of-header var
20840 69 6e 74 20 74 68 61 74 20 6f 63 63 75 72 73 20  int that occurs 
20850 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
20860 65 61 63 68 20 72 65 63 6f 72 64 0a 20 20 2a 2a  each record.  **
20870 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c   fits in a singl
20880 65 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20  e byte (i.e. is 
20890 31 32 37 20 6f 72 20 6c 65 73 73 29 2e 20 76 61  127 or less). va
208a0 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72  rintRecordCompar
208b0 65 49 6e 74 28 29 0a 20 20 2a 2a 20 61 6c 73 6f  eInt().  ** also
208c0 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 69 74   assumes that it
208d0 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72   is safe to over
208e0 72 65 61 64 20 61 20 62 75 66 66 65 72 20 62 79  read a buffer by
208f0 20 61 74 20 6c 65 61 73 74 20 74 68 65 20 0a 20   at least the . 
20900 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73   ** maximum poss
20910 69 62 6c 65 20 6c 65 67 61 6c 20 68 65 61 64 65  ible legal heade
20920 72 20 73 69 7a 65 20 70 6c 75 73 20 38 20 62 79  r size plus 8 by
20930 74 65 73 2e 20 42 65 63 61 75 73 65 20 74 68 65  tes. Because the
20940 72 65 20 69 73 0a 20 20 2a 2a 20 67 75 61 72 61  re is.  ** guara
20950 6e 74 65 65 64 20 74 6f 20 62 65 20 61 74 20 6c  nteed to be at l
20960 65 61 73 74 20 37 34 20 28 62 75 74 20 6e 6f 74  east 74 (but not
20970 20 31 33 36 29 20 62 79 74 65 73 20 6f 66 20 70   136) bytes of p
20980 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67  adding following
20990 20 65 61 63 68 0a 20 20 2a 2a 20 62 75 66 66 65   each.  ** buffe
209a0 72 20 70 61 73 73 65 64 20 74 6f 20 76 61 72 69  r passed to vari
209b0 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  ntRecordCompareI
209c0 6e 74 28 29 20 74 68 69 73 20 6d 61 6b 65 73 20  nt() this makes 
209d0 69 74 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f  it convenient to
209e0 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 74 68 65 20  .  ** limit the 
209f0 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  size of the head
20a00 65 72 20 74 6f 20 36 34 20 62 79 74 65 73 20 69  er to 64 bytes i
20a10 6e 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68  n cases where th
20a20 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a 20 20  e first field.  
20a30 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ** is an integer
20a40 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
20a50 65 61 73 69 65 73 74 20 77 61 79 20 74 6f 20 65  easiest way to e
20a60 6e 66 6f 72 63 65 20 74 68 69 73 20 6c 69 6d 69  nforce this limi
20a70 74 20 69 73 20 74 6f 20 63 6f 6e 73 69 64 65 72  t is to consider
20a80 20 6f 6e 6c 79 20 72 65 63 6f 72 64 73 20 77 69   only records wi
20a90 74 68 0a 20 20 2a 2a 20 31 33 20 66 69 65 6c 64  th.  ** 13 field
20aa0 73 20 6f 72 20 6c 65 73 73 2e 20 49 66 20 74 68  s or less. If th
20ab0 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 69 73  e first field is
20ac0 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74 68 65   an integer, the
20ad0 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 0a 20   maximum legal. 
20ae0 20 2a 2a 20 68 65 61 64 65 72 20 73 69 7a 65 20   ** header size 
20af0 69 73 20 28 31 32 2a 35 20 2b 20 31 20 2b 20 31  is (12*5 + 1 + 1
20b00 29 20 62 79 74 65 73 2e 20 20 2a 2f 0a 20 20 69  ) bytes.  */.  i
20b10 66 28 20 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d  f( (p->pKeyInfo-
20b20 3e 6e 46 69 65 6c 64 20 2b 20 70 2d 3e 70 4b 65  >nField + p->pKe
20b30 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 29 3c  yInfo->nXField)<
20b40 3d 31 33 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  =13 ){.    int f
20b50 6c 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30  lags = p->aMem[0
20b60 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69 66 28  ].flags;.    if(
20b70 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53   p->pKeyInfo->aS
20b80 6f 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b 0a 20  ortOrder[0] ){. 
20b90 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 31 3b 0a       p->r1 = 1;.
20ba0 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 2d 31        p->r2 = -1
20bb0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20bc0 20 20 20 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20     p->r1 = -1;. 
20bd0 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 31 3b 0a       p->r2 = 1;.
20be0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66      }.    if( (f
20bf0 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20  lags & MEM_Int) 
20c00 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
20c10 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
20c20 65 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  eInt;.    }.    
20c30 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20  testcase( flags 
20c40 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20  & MEM_Real );.  
20c50 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67    testcase( flag
20c60 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a  s & MEM_Null );.
20c70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c      testcase( fl
20c80 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
20c90 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  ;.    if( (flags
20ca0 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d   & (MEM_Real|MEM
20cb0 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29  _Null|MEM_Blob))
20cc0 3d 3d 30 20 26 26 20 70 2d 3e 70 4b 65 79 49 6e  ==0 && p->pKeyIn
20cd0 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20  fo->aColl[0]==0 
20ce0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
20cf0 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72   flags & MEM_Str
20d00 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
20d10 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
20d20 72 65 53 74 72 69 6e 67 3b 0a 20 20 20 20 7d 0a  reString;.    }.
20d30 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71    }..  return sq
20d40 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
20d50 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ompare;.}../*.**
20d60 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20   pCur points at 
20d70 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63  an index entry c
20d80 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65  reated using the
20d90 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
20da0 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74  pcode..** Read t
20db0 68 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61  he rowid (the la
20dc0 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20  st field in the 
20dd0 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72  record) and stor
20de0 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a  e it in *rowid..
20df0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
20e00 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
20e10 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65  g works, or an e
20e20 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77  rror code otherw
20e30 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20  ise..**.** pCur 
20e40 6d 69 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e  might be pointin
20e50 67 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e  g to text obtain
20e60 65 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70  ed from a corrup
20e70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  t database file.
20e80 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65  .** So the conte
20e90 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75  nt cannot be tru
20ea0 73 74 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70  sted.  Do approp
20eb0 72 69 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20  riate checks on 
20ec0 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a  the content..*/.
20ed0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49  int sqlite3VdbeI
20ee0 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20  dxRowid(sqlite3 
20ef0 2a 64 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70  *db, BtCursor *p
20f00 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29  Cur, i64 *rowid)
20f10 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79  {.  i64 nCellKey
20f20 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
20f30 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20    u32 szHdr;    
20f40 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
20f50 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  he header */.  u
20f60 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20  32 typeRowid;   
20f70 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
20f80 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a  of the rowid */.
20f90 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20    u32 lenRowid; 
20fa0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
20fb0 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65  he rowid */.  Me
20fc0 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47 65  m m, v;..  /* Ge
20fd0 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
20fe0 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20  e index entry.  
20ff0 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74  Only indices ent
21000 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a  ries of less.  *
21010 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72 65 20  * than 2GiB are 
21020 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69  support - anythi
21030 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65  ng large must be
21040 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
21050 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63  tion..  ** Any c
21060 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74  orruption is det
21070 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33  ected in sqlite3
21080 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
21090 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a  r(), though, so.
210a0 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63    ** this code c
210b0 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65  an safely assume
210c0 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69   that nCellKey i
210d0 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f  s 32-bits  .  */
210e0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
210f0 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
21100 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20  alid(pCur) );.  
21110 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73  VVA_ONLY(rc =) s
21120 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
21130 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b  ze(pCur, &nCellK
21140 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  ey);.  assert( r
21150 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20  c==SQLITE_OK ); 
21160 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61      /* pCur is a
21170 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b  lways valid so K
21180 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61  eySize cannot fa
21190 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  il */.  assert( 
211a0 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49  (nCellKey & SQLI
211b0 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36  TE_MAX_U32)==(u6
211c0 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20  4)nCellKey );.. 
211d0 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20   /* Read in the 
211e0 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74  complete content
211f0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
21200 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  try */.  sqlite3
21210 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20  VdbeMemInit(&m, 
21220 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73  db, 0);.  rc = s
21230 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
21240 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20  mBtree(pCur, 0, 
21250 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31  (u32)nCellKey, 1
21260 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20  , &m);.  if( rc 
21270 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
21280 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
21290 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74  index entry must
212a0 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 68 65   begin with a he
212b0 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28  ader size */.  (
212c0 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32  void)getVarint32
212d0 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72  ((u8*)m.z, szHdr
212e0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
212f0 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73  zHdr==3 );.  tes
21300 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e  tcase( szHdr==m.
21310 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b  n );.  if( unlik
21320 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28  ely(szHdr<3 || (
21330 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29  int)szHdr>m.n) )
21340 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72  {.    goto idx_r
21350 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b  owid_corruption;
21360 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c  .  }..  /* The l
21370 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ast field of the
21380 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65   index should be
21390 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 74 68   an integer - th
213a0 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65  e ROWID..  ** Ve
213b0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6c 61  rify that the la
213c0 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c 79 20  st entry really 
213d0 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a  is an integer. *
213e0 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72  /.  (void)getVar
213f0 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b  int32((u8*)&m.z[
21400 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f  szHdr-1], typeRo
21410 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65  wid);.  testcase
21420 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31 20 29  ( typeRowid==1 )
21430 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
21440 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20  peRowid==2 );.  
21450 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
21460 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74  wid==3 );.  test
21470 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
21480 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =4 );.  testcase
21490 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35 20 29  ( typeRowid==5 )
214a0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
214b0 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20  peRowid==6 );.  
214c0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
214d0 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74  wid==8 );.  test
214e0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
214f0 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  =9 );.  if( unli
21500 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64 3c 31  kely(typeRowid<1
21510 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e 39 20   || typeRowid>9 
21520 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d 37 29  || typeRowid==7)
21530 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
21540 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
21550 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69  n;.  }.  lenRowi
21560 64 20 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c  d = sqlite3Small
21570 54 79 70 65 53 69 7a 65 73 5b 74 79 70 65 52 6f  TypeSizes[typeRo
21580 77 69 64 5d 3b 0a 20 20 74 65 73 74 63 61 73 65  wid];.  testcase
21590 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64  ( (u32)m.n==szHd
215a0 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20  r+lenRowid );.  
215b0 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33  if( unlikely((u3
215c0 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52  2)m.n<szHdr+lenR
215d0 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67 6f 74  owid) ){.    got
215e0 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  o idx_rowid_corr
215f0 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  uption;.  }..  /
21600 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e 74 65  * Fetch the inte
21610 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e 64 20  ger off the end 
21620 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72 65 63  of the index rec
21630 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ord */.  sqlite3
21640 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 75  VdbeSerialGet((u
21650 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52  8*)&m.z[m.n-lenR
21660 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64  owid], typeRowid
21670 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20  , &v);.  *rowid 
21680 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74  = v.u.i;.  sqlit
21690 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
216a0 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
216b0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
216c0 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64 61 74  Jump here if dat
216d0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
216e0 20 69 73 20 64 65 74 65 63 74 65 64 20 61 66 74   is detected aft
216f0 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a 20 20  er m has been.  
21700 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46  ** allocated.  F
21710 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65 63 74  ree the m object
21720 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
21730 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69  TE_CORRUPT. */.i
21740 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
21750 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73 65 28  ion:.  testcase(
21760 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29   m.szMalloc!=0 )
21770 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
21780 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
21790 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
217a0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a  ORRUPT_BKPT;.}..
217b0 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
217c0 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64  e key of the ind
217d0 65 78 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  ex entry that cu
217e0 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74  rsor pC is point
217f0 69 6e 67 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a  ing to against.*
21800 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67  * the key string
21810 20 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20   in pUnpacked.  
21820 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73  Write into *pRes
21830 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61   a number.** tha
21840 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a  t is negative, z
21850 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
21860 20 69 66 20 70 43 20 69 73 20 6c 65 73 73 20 74   if pC is less t
21870 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a  han, equal to,.*
21880 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  * or greater tha
21890 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 52 65  n pUnpacked.  Re
218a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
218b0 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  n success..**.**
218c0 20 70 55 6e 70 61 63 6b 65 64 20 69 73 20 65 69   pUnpacked is ei
218d0 74 68 65 72 20 63 72 65 61 74 65 64 20 77 69 74  ther created wit
218e0 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20  hout a rowid or 
218f0 69 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20  is truncated so 
21900 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73  that it.** omits
21910 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   the rowid at th
21920 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69  e end.  The rowi
21930 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
21940 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a  the index entry.
21950 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73  ** is ignored as
21960 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74   well.  Hence, t
21970 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79  his routine only
21980 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72   compares the pr
21990 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68  efixes .** of th
219a0 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20  e keys prior to 
219b0 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c  the final rowid,
219c0 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20   not the entire 
219d0 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  key..*/.int sqli
219e0 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d  te3VdbeIdxKeyCom
219f0 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20  pare(.  sqlite3 
21a00 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
21a10 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
21a20 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
21a30 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
21a40 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pC,            
21a50 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
21a60 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61  sor to compare a
21a70 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61  gainst */.  Unpa
21a80 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70  ckedRecord *pUnp
21a90 61 63 6b 65 64 2c 20 20 20 20 20 20 20 2f 2a 20  acked,       /* 
21aa0 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e  Unpacked version
21ab0 20 6f 66 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74   of key */.  int
21ac0 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20 20   *res           
21ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21ae0 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61   Write the compa
21af0 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72  rison result her
21b00 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43  e */.){.  i64 nC
21b10 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  ellKey = 0;.  in
21b20 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72  t rc;.  BtCursor
21b30 20 2a 70 43 75 72 3b 0a 20 20 4d 65 6d 20 6d 3b   *pCur;.  Mem m;
21b40 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ..  assert( pC->
21b50 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
21b60 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 70 43 75  E_BTREE );.  pCu
21b70 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73  r = pC->uc.pCurs
21b80 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  or;.  assert( sq
21b90 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
21ba0 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b  IsValid(pCur) );
21bb0 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d  .  VVA_ONLY(rc =
21bc0 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  ) sqlite3BtreeKe
21bd0 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65  ySize(pCur, &nCe
21be0 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74  llKey);.  assert
21bf0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21c00 29 3b 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73  );    /* pCur is
21c10 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f   always valid so
21c20 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20   KeySize cannot 
21c30 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65  fail */.  /* nCe
21c40 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79  llKey will alway
21c50 73 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61  s be between 0 a
21c60 6e 64 20 30 78 66 66 66 66 66 66 66 66 20 62 65  nd 0xffffffff be
21c70 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79  cause of the way
21c80 0a 20 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65  .  ** that btree
21c90 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61  ParseCellPtr() a
21ca0 6e 64 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  nd sqlite3GetVar
21cb0 69 6e 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c  int32() are impl
21cc0 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28  emented */.  if(
21cd0 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20   nCellKey<=0 || 
21ce0 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66  nCellKey>0x7ffff
21cf0 66 66 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20  fff ){.    *res 
21d00 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
21d10 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
21d20 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  KPT;.  }.  sqlit
21d30 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d  e3VdbeMemInit(&m
21d40 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d  , db, 0);.  rc =
21d50 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
21d60 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30  romBtree(pCur, 0
21d70 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c  , (u32)nCellKey,
21d80 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
21d90 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
21da0 72 63 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d  rc;.  }.  *res =
21db0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
21dc0 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d  rdCompare(m.n, m
21dd0 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a  .z, pUnpacked);.
21de0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
21df0 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
21e00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21e10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
21e20 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
21e30 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75  value to be retu
21e40 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65  rned by subseque
21e50 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73  nt calls to.** s
21e60 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29  qlite3_changes()
21e70 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
21e80 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a   handle 'db'. .*
21e90 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
21ea0 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c  beSetChanges(sql
21eb0 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43  ite3 *db, int nC
21ec0 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74  hange){.  assert
21ed0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
21ee0 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
21ef0 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65  );.  db->nChange
21f00 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62   = nChange;.  db
21f10 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b  ->nTotalChange +
21f20 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  = nChange;.}../*
21f30 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69  .** Set a flag i
21f40 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70  n the vdbe to up
21f50 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20  date the change 
21f60 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20  counter when it 
21f70 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20  is finalised.** 
21f80 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69  or reset..*/.voi
21f90 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75  d sqlite3VdbeCou
21fa0 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a  ntChanges(Vdbe *
21fb0 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43  v){.  v->changeC
21fc0 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ntOn = 1;.}../*.
21fd0 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72  ** Mark every pr
21fe0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
21ff0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
22000 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
22010 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70  ection.** as exp
22020 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  ired..**.** An e
22030 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74  xpired statement
22040 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f   means that reco
22050 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65  mpilation of the
22060 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a   statement is.**
22070 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61   recommend.  Sta
22080 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77  tements expire w
22090 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65  hen things happe
220a0 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69  n that make thei
220b0 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62  r.** programs ob
220c0 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e  solete.  Removin
220d0 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  g user-defined f
220e0 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c  unctions or coll
220f0 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
22100 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20  es, or changing 
22110 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  an authorization
22120 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68   function are th
22130 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68  e types of.** th
22140 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70  ings that make p
22150 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
22160 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a  ts obsolete..*/.
22170 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69  void sqlite3Expi
22180 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
22190 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ents(sqlite3 *db
221a0 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
221b0 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62  for(p = db->pVdb
221c0 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  e; p; p=p->pNext
221d0 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65  ){.    p->expire
221e0 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 1;.  }.}../*
221f0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
22200 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74  atabase associat
22210 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
22220 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71  ..*/.sqlite3 *sq
22230 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65  lite3VdbeDb(Vdbe
22240 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76   *v){.  return v
22250 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ->db;.}../*.** R
22260 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
22270 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61  to an sqlite3_va
22280 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  lue structure co
22290 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c  ntaining the val
222a0 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61  ue bound.** para
222b0 6d 65 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d  meter iVar of VM
222c0 20 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74   v. Except, if t
222d0 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53  he value is an S
222e0 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20  QL NULL, return 
222f0 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55  .** 0 instead. U
22300 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c  nless it is NULL
22310 2c 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79  , apply affinity
22320 20 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65   aff (one of the
22330 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a   SQLITE_AFF_*.**
22340 20 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74   constants) to t
22350 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  he value before 
22360 72 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a  returning it..**
22370 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
22380 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66   value must be f
22390 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
223a0 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
223b0 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a  ValueFree()..*/.
223c0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73  sqlite3_value *s
223d0 71 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75  qlite3VdbeGetBou
223e0 6e 64 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c  ndValue(Vdbe *v,
223f0 20 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66   int iVar, u8 af
22400 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56  f){.  assert( iV
22410 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20  ar>0 );.  if( v 
22420 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  ){.    Mem *pMem
22430 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72   = &v->aVar[iVar
22440 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  -1];.    if( 0==
22450 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
22460 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20  EM_Null) ){.    
22470 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
22480 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56  *pRet = sqlite3V
22490 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a  alueNew(v->db);.
224a0 20 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29        if( pRet )
224b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
224c0 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65  3VdbeMemCopy((Me
224d0 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b  m *)pRet, pMem);
224e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
224f0 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69  ValueApplyAffini
22500 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51  ty(pRet, aff, SQ
22510 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
22520 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
22530 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d   pRet;.    }.  }
22540 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
22550 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
22560 53 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61  SQL variable iVa
22570 72 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e  r so that bindin
22580 67 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f  g a new value to
22590 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74   it signals.** t
225a0 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69  o sqlite3_reopti
225b0 6d 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70  mize() that re-p
225c0 72 65 70 61 72 69 6e 67 20 74 68 65 20 73 74 61  reparing the sta
225d0 74 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c  tement may resul
225e0 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72  t.** in a better
225f0 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a   query plan..*/.
22600 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
22610 53 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20  SetVarmask(Vdbe 
22620 2a 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20  *v, int iVar){. 
22630 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20   assert( iVar>0 
22640 29 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32  );.  if( iVar>32
22650 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61   ){.    v->expma
22660 73 6b 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b  sk = 0xffffffff;
22670 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d  .  }else{.    v-
22680 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33  >expmask |= ((u3
22690 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29  2)1 << (iVar-1))
226a0 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
226b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
226c0 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
226d0 54 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d  Transfer error m
226e0 65 73 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d  essage text from
226f0 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62   an sqlite3_vtab
22700 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73  .zErrMsg (text s
22710 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  tored.** in memo
22720 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
22730 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29   sqlite3_malloc)
22740 20 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72   into a Vdbe.zEr
22750 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65  rMsg (text store
22760 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  d.** in memory o
22770 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
22780 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a  ite3DbMalloc)..*
22790 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74  /.void sqlite3Vt
227a0 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56  abImportErrmsg(V
227b0 64 62 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  dbe *p, sqlite3_
227c0 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20  vtab *pVtab){.  
227d0 69 66 28 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  if( pVtab->zErrM
227e0 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  sg ){.    sqlite
227f0 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
22800 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
22810 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
22820 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67  ;.    p->zErrMsg
22830 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
22840 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45  up(db, pVtab->zE
22850 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69  rrMsg);.    sqli
22860 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e  te3_free(pVtab->
22870 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 56  zErrMsg);.    pV
22880 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30  tab->zErrMsg = 0
22890 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
228a0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
228b0 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a        RTUALTABLE */.