/ Hex Artifact Content
Login

Artifact 3308a07a6b0b64e22e83cbcc76773eaf330b056a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e  #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72  e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
02d0: 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20 29  , sizeof(Vdbe) )
02e0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
02f0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62  eturn 0;.  p->db
0300: 20 3d 20 64 62 3b 0a 20 20 69 66 28 20 64 62 2d   = db;.  if( db-
0310: 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 64 62  >pVdbe ){.    db
0320: 2d 3e 70 56 64 62 65 2d 3e 70 50 72 65 76 20 3d  ->pVdbe->pPrev =
0330: 20 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65   p;.  }.  p->pNe
0340: 78 74 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a  xt = db->pVdbe;.
0350: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
0360: 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b    db->pVdbe = p;
0370: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
0380: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20  BE_MAGIC_INIT;. 
0390: 20 70 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61   p->pParse = pPa
03a0: 72 73 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rse;.  assert( p
03b0: 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30  Parse->aLabel==0
03c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
03d0: 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20  arse->nLabel==0 
03e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
03f0: 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30  rse->nOpAlloc==0
0400: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
0410: 61 72 73 65 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 3d  arse->szOpAlloc=
0420: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  =0 );.  return p
0430: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
0440: 65 20 74 68 65 20 65 72 72 6f 72 20 73 74 72 69  e the error stri
0450: 6e 67 20 73 74 6f 72 65 64 20 69 6e 20 56 64 62  ng stored in Vdb
0460: 65 2e 7a 45 72 72 4d 73 67 0a 2a 2f 0a 76 6f 69  e.zErrMsg.*/.voi
0470: 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72  d sqlite3VdbeErr
0480: 6f 72 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  or(Vdbe *p, cons
0490: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
04a0: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
04b0: 20 61 70 3b 0a 20 20 73 71 6c 69 74 65 33 44 62   ap;.  sqlite3Db
04c0: 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 7a  Free(p->db, p->z
04d0: 45 72 72 4d 73 67 29 3b 0a 20 20 76 61 5f 73 74  ErrMsg);.  va_st
04e0: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
04f0: 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d  ;.  p->zErrMsg =
0500: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
0510: 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c  (p->db, zFormat,
0520: 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
0530: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  p);.}../*.** Rem
0540: 65 6d 62 65 72 20 74 68 65 20 53 51 4c 20 73 74  ember the SQL st
0550: 72 69 6e 67 20 66 6f 72 20 61 20 70 72 65 70 61  ring for a prepa
0560: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  red statement..*
0570: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
0580: 62 65 53 65 74 53 71 6c 28 56 64 62 65 20 2a 70  beSetSql(Vdbe *p
0590: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  , const char *z,
05a0: 20 69 6e 74 20 6e 2c 20 69 6e 74 20 69 73 50 72   int n, int isPr
05b0: 65 70 61 72 65 56 32 29 7b 0a 20 20 61 73 73 65  epareV2){.  asse
05c0: 72 74 28 20 69 73 50 72 65 70 61 72 65 56 32 3d  rt( isPrepareV2=
05d0: 3d 31 20 7c 7c 20 69 73 50 72 65 70 61 72 65 56  =1 || isPrepareV
05e0: 32 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  2==0 );.  if( p=
05f0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66  =0 ) return;.#if
0600: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
0610: 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 21  OMIT_TRACE) && !
0620: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
0630: 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 29 0a 20 20  NABLE_SQLLOG).  
0640: 69 66 28 20 21 69 73 50 72 65 70 61 72 65 56 32  if( !isPrepareV2
0650: 20 29 20 72 65 74 75 72 6e 3b 0a 23 65 6e 64 69   ) return;.#endi
0660: 66 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a  f.  assert( p->z
0670: 53 71 6c 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a  Sql==0 );.  p->z
0680: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53  Sql = sqlite3DbS
0690: 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 2c  trNDup(p->db, z,
06a0: 20 6e 29 3b 0a 20 20 70 2d 3e 69 73 50 72 65 70   n);.  p->isPrep
06b0: 61 72 65 56 32 20 3d 20 28 75 38 29 69 73 50 72  areV2 = (u8)isPr
06c0: 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a  epareV2;.}../*.*
06d0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 53 51 4c  * Return the SQL
06e0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
06f0: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
0700: 65 6d 65 6e 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63  ement.*/.const c
0710: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 71 6c  har *sqlite3_sql
0720: 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70  (sqlite3_stmt *p
0730: 53 74 6d 74 29 7b 0a 20 20 56 64 62 65 20 2a 70  Stmt){.  Vdbe *p
0740: 20 3d 20 28 56 64 62 65 20 2a 29 70 53 74 6d 74   = (Vdbe *)pStmt
0750: 3b 0a 20 20 72 65 74 75 72 6e 20 70 20 3f 20 70  ;.  return p ? p
0760: 2d 3e 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->zSql : 0;.}../
0770: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
0780: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
0790: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
07a0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
07b0: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
07c0: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
07d0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
07e0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
07f0: 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b 0a 20 20  .  tmp = *pA;.  
0800: 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70 42  *pA = *pB;.  *pB
0810: 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20 3d   = tmp;.  pTmp =
0820: 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 41   pA->pNext;.  pA
0830: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70 4e  ->pNext = pB->pN
0840: 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78 74  ext;.  pB->pNext
0850: 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70 20   = pTmp;.  pTmp 
0860: 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20 70  = pA->pPrev;.  p
0870: 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e 70  A->pPrev = pB->p
0880: 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72 65  Prev;.  pB->pPre
0890: 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d 70  v = pTmp;.  zTmp
08a0: 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70   = pA->zSql;.  p
08b0: 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a 53  A->zSql = pB->zS
08c0: 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20 3d  ql;.  pB->zSql =
08d0: 20 7a 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73 50   zTmp;.  pB->isP
08e0: 72 65 70 61 72 65 56 32 20 3d 20 70 41 2d 3e 69  repareV2 = pA->i
08f0: 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f  sPrepareV2;.}../
0900: 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20  *.** Resize the 
0910: 56 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73  Vdbe.aOp array s
0920: 6f 20 74 68 61 74 20 69 74 20 69 73 20 61 74 20  o that it is at 
0930: 6c 65 61 73 74 20 6e 4f 70 20 65 6c 65 6d 65 6e  least nOp elemen
0940: 74 73 20 6c 61 72 67 65 72 20 0a 2a 2a 20 74 68  ts larger .** th
0950: 61 6e 20 69 74 73 20 63 75 72 72 65 6e 74 20 73  an its current s
0960: 69 7a 65 2e 20 6e 4f 70 20 69 73 20 67 75 61 72  ize. nOp is guar
0970: 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 65 73  anteed to be les
0980: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a  s than or equal.
0990: 2a 2a 20 74 6f 20 31 30 32 34 2f 73 69 7a 65 6f  ** to 1024/sizeo
09a0: 66 28 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f(Op)..**.** If 
09b0: 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79  an out-of-memory
09c0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
09d0: 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74 68 65  ile resizing the
09e0: 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a   array, return.*
09f0: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20  * SQLITE_NOMEM. 
0a00: 49 6e 20 74 68 69 73 20 63 61 73 65 20 56 64 62  In this case Vdb
0a10: 65 2e 61 4f 70 20 61 6e 64 20 50 61 72 73 65 2e  e.aOp and Parse.
0a20: 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20  nOpAlloc remain 
0a30: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 28 74  .** unchanged (t
0a40: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 61  his is so that a
0a50: 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61  ny opcodes alrea
0a60: 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e  dy allocated can
0a70: 20 62 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74 6c   be .** correctl
0a80: 79 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 61 6c  y deallocated al
0a90: 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72 65 73  ong with the res
0aa0: 74 20 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a  t of the Vdbe)..
0ab0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 72  */.static int gr
0ac0: 6f 77 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a  owOpArray(Vdbe *
0ad0: 76 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 56  v, int nOp){.  V
0ae0: 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 50  dbeOp *pNew;.  P
0af0: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
0b00: 72 73 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53  rse;..  /* The S
0b10: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
0b20: 4f 43 5f 53 54 52 45 53 53 20 63 6f 6d 70 69 6c  OC_STRESS compil
0b30: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
0b40: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 66 6f 72   designed to for
0b50: 63 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 66 72 65  ce.  ** more fre
0b60: 71 75 65 6e 74 20 72 65 61 6c 6c 6f 63 73 20 61  quent reallocs a
0b70: 6e 64 20 68 65 6e 63 65 20 70 72 6f 76 69 64 65  nd hence provide
0b80: 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74   more opportunit
0b90: 69 65 73 20 66 6f 72 20 0a 20 20 2a 2a 20 73 69  ies for .  ** si
0ba0: 6d 75 6c 61 74 65 64 20 4f 4f 4d 20 66 61 75 6c  mulated OOM faul
0bb0: 74 73 2e 20 20 53 51 4c 49 54 45 5f 54 45 53 54  ts.  SQLITE_TEST
0bc0: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20  _REALLOC_STRESS 
0bd0: 69 73 20 67 65 6e 65 72 61 6c 6c 79 20 75 73 65  is generally use
0be0: 64 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 65  d.  ** during te
0bf0: 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 57 69 74  sting only.  Wit
0c00: 68 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  h SQLITE_TEST_RE
0c10: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 67 72 6f  ALLOC_STRESS gro
0c20: 77 20 74 68 65 20 6f 70 20 61 72 72 61 79 0a 20  w the op array. 
0c30: 20 2a 2a 20 62 79 20 74 68 65 20 6d 69 6e 69 6d   ** by the minim
0c40: 75 6d 2a 20 61 6d 6f 75 6e 74 20 72 65 71 75 69  um* amount requi
0c50: 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 73 69  red until the si
0c60: 7a 65 20 72 65 61 63 68 65 73 20 35 31 32 2e 20  ze reaches 512. 
0c70: 20 4e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65   Normal.  ** ope
0c80: 72 61 74 69 6f 6e 20 28 77 69 74 68 6f 75 74 20  ration (without 
0c90: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
0ca0: 4c 4f 43 5f 53 54 52 45 53 53 29 20 69 73 20 74  LOC_STRESS) is t
0cb0: 6f 20 64 6f 75 62 6c 65 20 74 68 65 20 63 75 72  o double the cur
0cc0: 72 65 6e 74 0a 20 20 2a 2a 20 73 69 7a 65 20 6f  rent.  ** size o
0cd0: 66 20 74 68 65 20 6f 70 20 61 72 72 61 79 20 6f  f the op array o
0ce0: 72 20 61 64 64 20 31 4b 42 20 6f 66 20 73 70 61  r add 1KB of spa
0cf0: 63 65 2c 20 77 68 69 63 68 65 76 65 72 20 69 73  ce, whichever is
0d00: 20 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66   smaller. */.#if
0d10: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 5f  def SQLITE_TEST_
0d20: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 0a 20  REALLOC_STRESS. 
0d30: 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d 3e   int nNew = (p->
0d40: 6e 4f 70 41 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20  nOpAlloc>=512 ? 
0d50: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20  p->nOpAlloc*2 : 
0d60: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29  p->nOpAlloc+nOp)
0d70: 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 6e 4e  ;.#else.  int nN
0d80: 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f  ew = (p->nOpAllo
0d90: 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a  c ? p->nOpAlloc*
0da0: 32 20 3a 20 28 69 6e 74 29 28 31 30 32 34 2f 73  2 : (int)(1024/s
0db0: 69 7a 65 6f 66 28 4f 70 29 29 29 3b 0a 20 20 55  izeof(Op)));.  U
0dc0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
0dd0: 6e 4f 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nOp);.#endif..  
0de0: 61 73 73 65 72 74 28 20 6e 4f 70 3c 3d 28 31 30  assert( nOp<=(10
0df0: 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29 20 29  24/sizeof(Op)) )
0e00: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77  ;.  assert( nNew
0e10: 3e 3d 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e  >=(p->nOpAlloc+n
0e20: 4f 70 29 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20  Op) );.  pNew = 
0e30: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
0e40: 28 70 2d 3e 64 62 2c 20 76 2d 3e 61 4f 70 2c 20  (p->db, v->aOp, 
0e50: 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29  nNew*sizeof(Op))
0e60: 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ;.  if( pNew ){.
0e70: 20 20 20 20 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63      p->szOpAlloc
0e80: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
0e90: 6f 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e  ocSize(p->db, pN
0ea0: 65 77 29 3b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41  ew);.    p->nOpA
0eb0: 6c 6c 6f 63 20 3d 20 70 2d 3e 73 7a 4f 70 41 6c  lloc = p->szOpAl
0ec0: 6c 6f 63 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a  loc/sizeof(Op);.
0ed0: 20 20 20 20 76 2d 3e 61 4f 70 20 3d 20 70 4e 65      v->aOp = pNe
0ee0: 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  w;.  }.  return 
0ef0: 28 70 4e 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f  (pNew ? SQLITE_O
0f00: 4b 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  K : SQLITE_NOMEM
0f10: 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  );.}..#ifdef SQL
0f20: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69  ITE_DEBUG./* Thi
0f30: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73  s routine is jus
0f40: 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70  t a convenient p
0f50: 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 62 72  lace to set a br
0f60: 65 61 6b 70 6f 69 6e 74 20 74 68 61 74 20 77 69  eakpoint that wi
0f70: 6c 6c 0a 2a 2a 20 66 69 72 65 20 61 66 74 65 72  ll.** fire after
0f80: 20 65 61 63 68 20 6f 70 63 6f 64 65 20 69 73 20   each opcode is 
0f90: 69 6e 73 65 72 74 65 64 20 61 6e 64 20 64 69 73  inserted and dis
0fa0: 70 6c 61 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20  played using.** 
0fb0: 22 50 52 41 47 4d 41 20 76 64 62 65 5f 61 64 64  "PRAGMA vdbe_add
0fc0: 6f 70 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a  optrace=on"..*/.
0fd0: 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74  static void test
0fe0: 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e  _addop_breakpoin
0ff0: 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  t(void){.  stati
1000: 63 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e  c int n = 0;.  n
1010: 2b 2b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ++;.}.#endif../*
1020: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 69 6e  .** Add a new in
1030: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65  struction to the
1040: 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72 75 63   list of instruc
1050: 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20 69 6e  tions current in
1060: 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52   the.** VDBE.  R
1070: 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73  eturn the addres
1080: 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73  s of the new ins
1090: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  truction..**.** 
10a0: 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a  Parameters:.**.*
10b0: 2a 20 20 20 20 70 20 20 20 20 20 20 20 20 20 20  *    p          
10c0: 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20       Pointer to 
10d0: 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20  the VDBE.**.**  
10e0: 20 20 6f 70 20 20 20 20 20 20 20 20 20 20 20 20    op            
10f0: 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66 6f 72    The opcode for
1100: 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   this instructio
1110: 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70  n.**.**    p1, p
1120: 32 2c 20 70 33 20 20 20 20 20 20 4f 70 65 72 61  2, p3      Opera
1130: 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  nds.**.** Use th
1140: 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  e sqlite3VdbeRes
1150: 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 6e 63  olveLabel() func
1160: 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20 61  tion to fix an a
1170: 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68  ddress and.** th
1180: 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  e sqlite3VdbeCha
1190: 6e 67 65 50 34 28 29 20 66 75 6e 63 74 69 6f 6e  ngeP4() function
11a0: 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76   to change the v
11b0: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 0a 2a  alue of the P4.*
11c0: 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 73 74  * operand..*/.st
11d0: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
11e0: 4c 49 4e 45 20 69 6e 74 20 67 72 6f 77 4f 70 33  LINE int growOp3
11f0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
1200: 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32  , int p1, int p2
1210: 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20 61 73 73  , int p3){.  ass
1220: 65 72 74 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e  ert( p->pParse->
1230: 6e 4f 70 41 6c 6c 6f 63 3c 3d 70 2d 3e 6e 4f 70  nOpAlloc<=p->nOp
1240: 20 29 3b 0a 20 20 69 66 28 20 67 72 6f 77 4f 70   );.  if( growOp
1250: 41 72 72 61 79 28 70 2c 20 31 29 20 29 20 72 65  Array(p, 1) ) re
1260: 74 75 72 6e 20 31 3b 0a 20 20 61 73 73 65 72 74  turn 1;.  assert
1270: 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70  ( p->pParse->nOp
1280: 41 6c 6c 6f 63 3e 70 2d 3e 6e 4f 70 20 29 3b 0a  Alloc>p->nOp );.
1290: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
12a0: 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70  VdbeAddOp3(p, op
12b0: 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 7d  , p1, p2, p3);.}
12c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
12d0: 41 64 64 4f 70 33 28 56 64 62 65 20 2a 70 2c 20  AddOp3(Vdbe *p, 
12e0: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20  int op, int p1, 
12f0: 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b  int p2, int p3){
1300: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65  .  int i;.  Vdbe
1310: 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20  Op *pOp;..  i = 
1320: 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74  p->nOp;.  assert
1330: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
1340: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
1350: 20 61 73 73 65 72 74 28 20 6f 70 3e 30 20 26 26   assert( op>0 &&
1360: 20 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66   op<0xff );.  if
1370: 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70  ( p->pParse->nOp
1380: 41 6c 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20  Alloc<=i ){.    
1390: 72 65 74 75 72 6e 20 67 72 6f 77 4f 70 33 28 70  return growOp3(p
13a0: 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33  , op, p1, p2, p3
13b0: 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b  );.  }.  p->nOp+
13c0: 2b 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61  +;.  pOp = &p->a
13d0: 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70  Op[i];.  pOp->op
13e0: 63 6f 64 65 20 3d 20 28 75 38 29 6f 70 3b 0a 20  code = (u8)op;. 
13f0: 20 70 4f 70 2d 3e 70 35 20 3d 20 30 3b 0a 20 20   pOp->p5 = 0;.  
1400: 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20  pOp->p1 = p1;.  
1410: 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20  pOp->p2 = p2;.  
1420: 70 4f 70 2d 3e 70 33 20 3d 20 70 33 3b 0a 20 20  pOp->p3 = p3;.  
1430: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  pOp->p4.p = 0;. 
1440: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
1450: 34 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66 64 65  4_NOTUSED;.#ifde
1460: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1470: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
1480: 0a 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  .  pOp->zComment
1490: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 0;.#endif.#if
14a0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
14b0: 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c  .  if( p->db->fl
14c0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
14d0: 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20  eAddopTrace ){. 
14e0: 20 20 20 69 6e 74 20 6a 6a 2c 20 6b 6b 3b 0a 20     int jj, kk;. 
14f0: 20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65     Parse *pParse
1500: 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20   = p->pParse;.  
1510: 20 20 66 6f 72 28 6a 6a 3d 6b 6b 3d 30 3b 20 6a    for(jj=kk=0; j
1520: 6a 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  j<SQLITE_N_COLCA
1530: 43 48 45 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20  CHE; jj++){.    
1540: 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
1550: 68 65 20 2a 78 20 3d 20 70 50 61 72 73 65 2d 3e  he *x = pParse->
1560: 61 43 6f 6c 43 61 63 68 65 20 2b 20 6a 6a 3b 0a  aColCache + jj;.
1570: 20 20 20 20 20 20 69 66 28 20 78 2d 3e 69 4c 65        if( x->iLe
1580: 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43 61 63  vel>pParse->iCac
1590: 68 65 4c 65 76 65 6c 20 7c 7c 20 78 2d 3e 69 52  heLevel || x->iR
15a0: 65 67 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  eg==0 ) continue
15b0: 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22  ;.      printf("
15c0: 20 72 5b 25 64 5d 3d 7b 25 64 3a 25 64 7d 22 2c   r[%d]={%d:%d}",
15d0: 20 78 2d 3e 69 52 65 67 2c 20 78 2d 3e 69 54 61   x->iReg, x->iTa
15e0: 62 6c 65 2c 20 78 2d 3e 69 43 6f 6c 75 6d 6e 29  ble, x->iColumn)
15f0: 3b 0a 20 20 20 20 20 20 6b 6b 2b 2b 3b 0a 20 20  ;.      kk++;.  
1600: 20 20 7d 0a 20 20 20 20 69 66 28 20 6b 6b 20 29    }.    if( kk )
1610: 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20   printf("\n");. 
1620: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
1630: 69 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e  intOp(0, i, &p->
1640: 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 74 65 73  aOp[i]);.    tes
1650: 74 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69  t_addop_breakpoi
1660: 6e 74 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  nt();.  }.#endif
1670: 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
1680: 46 49 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c  FILE.  pOp->cycl
1690: 65 73 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63  es = 0;.  pOp->c
16a0: 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23  nt = 0;.#endif.#
16b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42  ifdef SQLITE_VDB
16c0: 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 70 4f 70  E_COVERAGE.  pOp
16d0: 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 30 3b 0a  ->iSrcLine = 0;.
16e0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
16f0: 69 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  i;.}.int sqlite3
1700: 56 64 62 65 41 64 64 4f 70 30 28 56 64 62 65 20  VdbeAddOp0(Vdbe 
1710: 2a 70 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72  *p, int op){.  r
1720: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1730: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30  eAddOp3(p, op, 0
1740: 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73  , 0, 0);.}.int s
1750: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
1760: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
1770: 2c 20 69 6e 74 20 70 31 29 7b 0a 20 20 72 65 74  , int p1){.  ret
1780: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41  urn sqlite3VdbeA
1790: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
17a0: 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71   0, 0);.}.int sq
17b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17c0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  Vdbe *p, int op,
17d0: 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29   int p1, int p2)
17e0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
17f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
1800: 6f 70 2c 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a  op, p1, p2, 0);.
1810: 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  }../* Generate c
1820: 6f 64 65 20 66 6f 72 20 61 6e 20 75 6e 63 6f 6e  ode for an uncon
1830: 64 69 74 69 6f 6e 61 6c 20 6a 75 6d 70 20 74 6f  ditional jump to
1840: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 44 65   instruction iDe
1850: 73 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  st.*/.int sqlite
1860: 33 56 64 62 65 47 6f 74 6f 28 56 64 62 65 20 2a  3VdbeGoto(Vdbe *
1870: 70 2c 20 69 6e 74 20 69 44 65 73 74 29 7b 0a 20  p, int iDest){. 
1880: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1890: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f  dbeAddOp3(p, OP_
18a0: 47 6f 74 6f 2c 20 30 2c 20 69 44 65 73 74 2c 20  Goto, 0, iDest, 
18b0: 30 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61  0);.}../* Genera
18c0: 74 65 20 63 6f 64 65 20 74 6f 20 63 61 75 73 65  te code to cause
18d0: 20 74 68 65 20 73 74 72 69 6e 67 20 7a 53 74 72   the string zStr
18e0: 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 69 6e   to be loaded in
18f0: 74 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69  to.** register i
1900: 44 65 73 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Dest.*/.int sqli
1910: 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
1920: 67 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  g(Vdbe *p, int i
1930: 44 65 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  Dest, const char
1940: 20 2a 7a 53 74 72 29 7b 0a 20 20 72 65 74 75 72   *zStr){.  retur
1950: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  n sqlite3VdbeAdd
1960: 4f 70 34 28 70 2c 20 4f 50 5f 53 74 72 69 6e 67  Op4(p, OP_String
1970: 38 2c 20 30 2c 20 69 44 65 73 74 2c 20 30 2c 20  8, 0, iDest, 0, 
1980: 7a 53 74 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  zStr, 0);.}../*.
1990: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
19a0: 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a 65   that initialize
19b0: 73 20 6d 75 6c 74 69 70 6c 65 20 72 65 67 69 73  s multiple regis
19c0: 74 65 72 73 20 74 6f 20 73 74 72 69 6e 67 20 6f  ters to string o
19d0: 72 20 69 6e 74 65 67 65 72 0a 2a 2a 20 63 6f 6e  r integer.** con
19e0: 73 74 61 6e 74 73 2e 20 20 54 68 65 20 72 65 67  stants.  The reg
19f0: 69 73 74 65 72 73 20 62 65 67 69 6e 20 77 69 74  isters begin wit
1a00: 68 20 69 44 65 73 74 20 61 6e 64 20 69 6e 63 72  h iDest and incr
1a10: 65 61 73 65 20 63 6f 6e 73 65 63 75 74 69 76 65  ease consecutive
1a20: 6c 79 2e 0a 2a 2a 20 4f 6e 65 20 72 65 67 69 73  ly..** One regis
1a30: 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ter is initializ
1a40: 65 64 20 66 6f 72 20 65 61 63 68 20 63 68 61 72  ed for each char
1a50: 61 63 67 74 65 72 20 69 6e 20 7a 54 79 70 65 73  acgter in zTypes
1a60: 5b 5d 2e 20 20 46 6f 72 20 65 61 63 68 0a 2a 2a  [].  For each.**
1a70: 20 22 73 22 20 63 68 61 72 61 63 74 65 72 20 69   "s" character i
1a80: 6e 20 7a 54 79 70 65 73 5b 5d 2c 20 74 68 65 20  n zTypes[], the 
1a90: 72 65 67 69 73 74 65 72 20 69 73 20 61 20 73 74  register is a st
1aa0: 72 69 6e 67 20 69 66 20 74 68 65 20 61 72 67 75  ring if the argu
1ab0: 6d 65 6e 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 4e  ment is.** not N
1ac0: 55 4c 4c 2c 20 6f 72 20 4f 50 5f 4e 75 6c 6c 20  ULL, or OP_Null 
1ad0: 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  if the value is 
1ae0: 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20  a null pointer. 
1af0: 20 46 6f 72 20 65 61 63 68 20 22 69 22 20 63 68   For each "i" ch
1b00: 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 7a 54  aracter.** in zT
1b10: 79 70 65 73 5b 5d 2c 20 74 68 65 20 72 65 67 69  ypes[], the regi
1b20: 73 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69  ster is initiali
1b30: 7a 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  zed to an intege
1b40: 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
1b50: 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28  e3VdbeMultiLoad(
1b60: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65  Vdbe *p, int iDe
1b70: 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  st, const char *
1b80: 7a 54 79 70 65 73 2c 20 2e 2e 2e 29 7b 0a 20 20  zTypes, ...){.  
1b90: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e  va_list ap;.  in
1ba0: 74 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20  t i;.  char c;. 
1bb0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 54   va_start(ap, zT
1bc0: 79 70 65 73 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ypes);.  for(i=0
1bd0: 3b 20 28 63 20 3d 20 7a 54 79 70 65 73 5b 69 5d  ; (c = zTypes[i]
1be0: 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  )!=0; i++){.    
1bf0: 69 66 28 20 63 3d 3d 27 73 27 20 29 7b 0a 20 20  if( c=='s' ){.  
1c00: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1c10: 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63  z = va_arg(ap, c
1c20: 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20  onst char*);.   
1c30: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71     int addr = sq
1c40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1c50: 70 2c 20 7a 3d 3d 30 20 3f 20 4f 50 5f 4e 75 6c  p, z==0 ? OP_Nul
1c60: 6c 20 3a 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  l : OP_String8, 
1c70: 30 2c 20 69 44 65 73 74 2b 2b 29 3b 0a 20 20 20  0, iDest++);.   
1c80: 20 20 20 69 66 28 20 7a 20 29 20 73 71 6c 69 74     if( z ) sqlit
1c90: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 70  e3VdbeChangeP4(p
1ca0: 2c 20 61 64 64 72 2c 20 7a 2c 20 30 29 3b 0a 20  , addr, z, 0);. 
1cb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cc0: 61 73 73 65 72 74 28 20 63 3d 3d 27 69 27 20 29  assert( c=='i' )
1cd0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1ce0: 64 62 65 41 64 64 4f 70 32 28 70 2c 20 4f 50 5f  dbeAddOp2(p, OP_
1cf0: 49 6e 74 65 67 65 72 2c 20 76 61 5f 61 72 67 28  Integer, va_arg(
1d00: 61 70 2c 20 69 6e 74 29 2c 20 69 44 65 73 74 2b  ap, int), iDest+
1d10: 2b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  +);.    }.  }.  
1d20: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f  va_end(ap);.}../
1d30: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f  *.** Add an opco
1d40: 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73  de that includes
1d50: 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73   the p4 value as
1d60: 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69   a pointer..*/.i
1d70: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
1d80: 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a 70 2c  dOp4(.  Vdbe *p,
1d90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1da0: 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f  dd the opcode to
1db0: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
1dc0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
1dd0: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63    /* The new opc
1de0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c  ode */.  int p1,
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e00: 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a  The P1 operand *
1e10: 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20  /.  int p2,     
1e20: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1e30: 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  2 operand */.  i
1e40: 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20  nt p3,          
1e50: 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65     /* The P3 ope
1e60: 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rand */.  const 
1e70: 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a  char *zP4,    /*
1e80: 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   The P4 operand 
1e90: 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20  */.  int p4type 
1ea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f           /* P4 o
1eb0: 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29  perand type */.)
1ec0: 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73  {.  int addr = s
1ed0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1ee0: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
1ef0: 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  p3);.  sqlite3Vd
1f00: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64  beChangeP4(p, ad
1f10: 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70 65 29  dr, zP4, p4type)
1f20: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ;.  return addr;
1f30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
1f40: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63   opcode that inc
1f50: 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c  ludes the p4 val
1f60: 75 65 20 77 69 74 68 20 61 20 50 34 5f 49 4e 54  ue with a P4_INT
1f70: 36 34 20 6f 72 0a 2a 2a 20 50 34 5f 52 45 41 4c  64 or.** P4_REAL
1f80: 20 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   type..*/.int sq
1f90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44  lite3VdbeAddOp4D
1fa0: 75 70 38 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  up8(.  Vdbe *p, 
1fb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
1fc0: 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20  d the opcode to 
1fd0: 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74  this VM */.  int
1fe0: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
1ff0: 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f   /* The new opco
2000: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20  de */.  int p1, 
2010: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2020: 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f  he P1 operand */
2030: 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20  .  int p2,      
2040: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32         /* The P2
2050: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
2060: 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20  t p3,           
2070: 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72    /* The P3 oper
2080: 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  and */.  const u
2090: 38 20 2a 7a 50 34 2c 20 20 20 20 20 20 2f 2a 20  8 *zP4,      /* 
20a0: 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a  The P4 operand *
20b0: 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20 20  /.  int p4type  
20c0: 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70          /* P4 op
20d0: 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b  erand type */.){
20e0: 0a 20 20 63 68 61 72 20 2a 70 34 63 6f 70 79 20  .  char *p4copy 
20f0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
2100: 63 52 61 77 28 73 71 6c 69 74 65 33 56 64 62 65  cRaw(sqlite3Vdbe
2110: 44 62 28 70 29 2c 20 38 29 3b 0a 20 20 69 66 28  Db(p), 8);.  if(
2120: 20 70 34 63 6f 70 79 20 29 20 6d 65 6d 63 70 79   p4copy ) memcpy
2130: 28 70 34 63 6f 70 79 2c 20 7a 50 34 2c 20 38 29  (p4copy, zP4, 8)
2140: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
2150: 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c 20  e3VdbeAddOp4(p, 
2160: 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 2c 20  op, p1, p2, p3, 
2170: 70 34 63 6f 70 79 2c 20 70 34 74 79 70 65 29 3b  p4copy, p4type);
2180: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
2190: 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 20   OP_ParseSchema 
21a0: 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f  opcode.  This ro
21b0: 75 74 69 6e 65 20 69 73 20 62 72 6f 6b 65 6e 20  utine is broken 
21c0: 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69  out from.** sqli
21d0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 29 20  te3VdbeAddOp4() 
21e0: 73 69 6e 63 65 20 69 74 20 6e 65 65 64 73 20 74  since it needs t
21f0: 6f 20 61 6c 73 6f 20 6e 65 65 64 73 20 74 6f 20  o also needs to 
2200: 6d 61 72 6b 20 61 6c 6c 20 62 74 72 65 65 73 0a  mark all btrees.
2210: 2a 2a 20 61 73 20 68 61 76 69 6e 67 20 62 65 65  ** as having bee
2220: 6e 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  n used..**.** Th
2230: 65 20 7a 57 68 65 72 65 20 73 74 72 69 6e 67 20  e zWhere string 
2240: 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f  must have been o
2250: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
2260: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
2270: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
2280: 69 6c 6c 20 74 61 6b 65 20 6f 77 6e 65 72 73 68  ill take ownersh
2290: 69 70 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61  ip of the alloca
22a0: 74 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76  ted memory..*/.v
22b0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 41  oid sqlite3VdbeA
22c0: 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28  ddParseSchemaOp(
22d0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 62  Vdbe *p, int iDb
22e0: 2c 20 63 68 61 72 20 2a 7a 57 68 65 72 65 29 7b  , char *zWhere){
22f0: 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20  .  int j;.  int 
2300: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
2310: 62 65 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f 50  beAddOp3(p, OP_P
2320: 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c  arseSchema, iDb,
2330: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
2340: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c  3VdbeChangeP4(p,
2350: 20 61 64 64 72 2c 20 7a 57 68 65 72 65 2c 20 50   addr, zWhere, P
2360: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f  4_DYNAMIC);.  fo
2370: 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e  r(j=0; j<p->db->
2380: 6e 44 62 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65  nDb; j++) sqlite
2390: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 70  3VdbeUsesBtree(p
23a0: 2c 20 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  , j);.}../*.** A
23b0: 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61  dd an opcode tha
23c0: 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70  t includes the p
23d0: 34 20 76 61 6c 75 65 20 61 73 20 61 6e 20 69 6e  4 value as an in
23e0: 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  teger..*/.int sq
23f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
2400: 6e 74 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  nt(.  Vdbe *p,  
2410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
2420: 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74   the opcode to t
2430: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
2440: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
2450: 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64  /* The new opcod
2460: 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20  e */.  int p1,  
2470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2480: 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P1 operand */.
2490: 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20    int p2,       
24a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20        /* The P2 
24b0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
24c0: 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20   p3,            
24d0: 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61   /* The P3 opera
24e0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20  nd */.  int p4  
24f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2500: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 61 73  he P4 operand as
2510: 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29   an integer */.)
2520: 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73  {.  int addr = s
2530: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2540: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
2550: 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  p3);.  sqlite3Vd
2560: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64  beChangeP4(p, ad
2570: 64 72 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54  dr, SQLITE_INT_T
2580: 4f 5f 50 54 52 28 70 34 29 2c 20 50 34 5f 49 4e  O_PTR(p4), P4_IN
2590: 54 33 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  T32);.  return a
25a0: 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  ddr;.}../*.** Cr
25b0: 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f  eate a new symbo
25c0: 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e  lic label for an
25d0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
25e0: 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 0a  t has yet to be.
25f0: 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20 73  ** coded.  The s
2600: 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73  ymbolic label is
2610: 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e   really just a n
2620: 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 20  egative number. 
2630: 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61   The.** label ca
2640: 6e 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65  n be used as the
2650: 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e 20   P2 value of an 
2660: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65  operation.  Late
2670: 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c  r, when.** the l
2680: 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65 64  abel is resolved
2690: 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 61   to a specific a
26a0: 64 64 72 65 73 73 2c 20 74 68 65 20 56 44 42 45  ddress, the VDBE
26b0: 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68   will scan.** th
26c0: 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61 74  rough its operat
26d0: 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68 61  ion list and cha
26e0: 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f  nge all values o
26f0: 66 20 50 32 20 77 68 69 63 68 20 6d 61 74 63 68  f P2 which match
2700: 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 6e  .** the label in
2710: 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20  to the resolved 
2720: 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  address..**.** T
2730: 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74 68  he VDBE knows th
2740: 61 74 20 61 20 50 32 20 76 61 6c 75 65 20 69 73  at a P2 value is
2750: 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73 65   a label because
2760: 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61   labels are.** a
2770: 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65 20 61  lways negative a
2780: 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61 72 65  nd P2 values are
2790: 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20 6e   suppose to be n
27a0: 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20  on-negative..** 
27b0: 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69 76  Hence, a negativ
27c0: 65 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20  e P2 value is a 
27d0: 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73 20 79  label that has y
27e0: 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76 65  et to be resolve
27f0: 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73  d..**.** Zero is
2800: 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d   returned if a m
2810: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
2820: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
2830: 65 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 65 20  eMakeLabel(Vdbe 
2840: 2a 76 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20  *v){.  Parse *p 
2850: 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  = v->pParse;.  i
2860: 6e 74 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c  nt i = p->nLabel
2870: 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 76 2d  ++;.  assert( v-
2880: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
2890: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
28a0: 20 28 69 20 26 20 28 69 2d 31 29 29 3d 3d 30 20   (i & (i-1))==0 
28b0: 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c  ){.    p->aLabel
28c0: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
28d0: 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c  locOrFree(p->db,
28e0: 20 70 2d 3e 61 4c 61 62 65 6c 2c 20 0a 20 20 20   p->aLabel, .   
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2910: 20 20 20 20 28 69 2a 32 2b 31 29 2a 73 69 7a 65      (i*2+1)*size
2920: 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29  of(p->aLabel[0])
2930: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
2940: 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d  aLabel ){.    p-
2950: 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b  >aLabel[i] = -1;
2960: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 41 44  .  }.  return AD
2970: 44 52 28 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  DR(i);.}../*.** 
2980: 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78  Resolve label "x
2990: 22 20 74 6f 20 62 65 20 74 68 65 20 61 64 64 72  " to be the addr
29a0: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
29b0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a  instruction to.*
29c0: 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20  * be inserted.  
29d0: 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 78  The parameter "x
29e0: 22 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  " must have been
29f0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
2a00: 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74  * a prior call t
2a10: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  o sqlite3VdbeMak
2a20: 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69  eLabel()..*/.voi
2a30: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  d sqlite3VdbeRes
2a40: 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a  olveLabel(Vdbe *
2a50: 76 2c 20 69 6e 74 20 78 29 7b 0a 20 20 50 61 72  v, int x){.  Par
2a60: 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73  se *p = v->pPars
2a70: 65 3b 0a 20 20 69 6e 74 20 6a 20 3d 20 41 44 44  e;.  int j = ADD
2a80: 52 28 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  R(x);.  assert( 
2a90: 76 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  v->magic==VDBE_M
2aa0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
2ab0: 73 73 65 72 74 28 20 6a 3c 70 2d 3e 6e 4c 61 62  ssert( j<p->nLab
2ac0: 65 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  el );.  assert( 
2ad0: 6a 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  j>=0 );.  if( p-
2ae0: 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70  >aLabel ){.    p
2af0: 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76 2d  ->aLabel[j] = v-
2b00: 3e 6e 4f 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  >nOp;.  }.  p->i
2b10: 46 69 78 65 64 4f 70 20 3d 20 76 2d 3e 6e 4f 70  FixedOp = v->nOp
2b20: 20 2d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d   - 1;.}../*.** M
2b30: 61 72 6b 20 74 68 65 20 56 44 42 45 20 61 73 20  ark the VDBE as 
2b40: 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c  one that can onl
2b50: 79 20 62 65 20 72 75 6e 20 6f 6e 65 20 74 69 6d  y be run one tim
2b60: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
2b70: 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63  e3VdbeRunOnlyOnc
2b80: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d  e(Vdbe *p){.  p-
2b90: 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 31  >runOnlyOnce = 1
2ba0: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
2bb0: 54 45 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c 69  TE_DEBUG /* sqli
2bc0: 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72  te3AssertMayAbor
2bd0: 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f 2a  t() logic */../*
2be0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
2bf0: 67 20 74 79 70 65 20 61 6e 64 20 66 75 6e 63 74  g type and funct
2c00: 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f 20  ion are used to 
2c10: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
2c20: 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 69  all opcodes.** i
2c30: 6e 20 61 20 56 64 62 65 20 6d 61 69 6e 20 70 72  n a Vdbe main pr
2c40: 6f 67 72 61 6d 20 61 6e 64 20 65 61 63 68 20 6f  ogram and each o
2c50: 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61  f the sub-progra
2c60: 6d 73 20 28 74 72 69 67 67 65 72 73 29 20 69 74  ms (triggers) it
2c70: 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20   may .** invoke 
2c80: 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 69  directly or indi
2c90: 72 65 63 74 6c 79 2e 20 49 74 20 73 68 6f 75 6c  rectly. It shoul
2ca0: 64 20 62 65 20 75 73 65 64 20 61 73 20 66 6f 6c  d be used as fol
2cb0: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70  lows:.**.**   Op
2cc0: 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62 65   *pOp;.**   Vdbe
2cd0: 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 2a 2a  OpIter sIter;.**
2ce0: 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26 73 49  .**   memset(&sI
2cf0: 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ter, 0, sizeof(s
2d00: 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49 74  Iter));.**   sIt
2d10: 65 72 2e 76 20 3d 20 76 3b 20 20 20 20 20 20 20  er.v = v;       
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d30: 20 20 20 20 20 2f 2f 20 76 20 69 73 20 6f 66 20       // v is of 
2d40: 74 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20 20  type Vdbe* .**  
2d50: 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f   while( (pOp = o
2d60: 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65 72  pIterNext(&sIter
2d70: 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20  )) ){.**     // 
2d80: 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 74  Do something wit
2d90: 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a 20  h pOp.**   }.** 
2da0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2db0: 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53  v->db, sIter.apS
2dc0: 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70 65  ub);.** .*/.type
2dd0: 64 65 66 20 73 74 72 75 63 74 20 56 64 62 65 4f  def struct VdbeO
2de0: 70 49 74 65 72 20 56 64 62 65 4f 70 49 74 65 72  pIter VdbeOpIter
2df0: 3b 0a 73 74 72 75 63 74 20 56 64 62 65 4f 70 49  ;.struct VdbeOpI
2e00: 74 65 72 20 7b 0a 20 20 56 64 62 65 20 2a 76 3b  ter {.  Vdbe *v;
2e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e20: 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 69 74     /* Vdbe to it
2e30: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68  erate through th
2e40: 65 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f 0a  e opcodes of */.
2e50: 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61    SubProgram **a
2e60: 70 53 75 62 3b 20 20 20 20 20 20 20 20 2f 2a 20  pSub;        /* 
2e70: 41 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67  Array of subprog
2e80: 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  rams */.  int nS
2e90: 75 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ub;             
2ea0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2eb0: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 70 53  f entries in apS
2ec0: 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64 64  ub */.  int iAdd
2ed0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
2ee0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
2ef0: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
2f00: 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  n to return */. 
2f10: 20 69 6e 74 20 69 53 75 62 3b 20 20 20 20 20 20   int iSub;      
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
2f30: 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c   = main program,
2f40: 20 31 20 3d 20 66 69 72 73 74 20 73 75 62 2d 70   1 = first sub-p
2f50: 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a 7d  rogram etc. */.}
2f60: 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f 70 49  ;.static Op *opI
2f70: 74 65 72 4e 65 78 74 28 56 64 62 65 4f 70 49 74  terNext(VdbeOpIt
2f80: 65 72 20 2a 70 29 7b 0a 20 20 56 64 62 65 20 2a  er *p){.  Vdbe *
2f90: 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20 2a  v = p->v;.  Op *
2fa0: 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a  pRet = 0;.  Op *
2fb0: 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b 0a  aOp;.  int nOp;.
2fc0: 0a 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3c 3d  .  if( p->iSub<=
2fd0: 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20 20  p->nSub ){..    
2fe0: 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20 29  if( p->iSub==0 )
2ff0: 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 76 2d  {.      aOp = v-
3000: 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20  >aOp;.      nOp 
3010: 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 65  = v->nOp;.    }e
3020: 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d  lse{.      aOp =
3030: 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75   p->apSub[p->iSu
3040: 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20 20  b-1]->aOp;.     
3050: 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b   nOp = p->apSub[
3060: 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70 3b  p->iSub-1]->nOp;
3070: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
3080: 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70 20  t( p->iAddr<nOp 
3090: 29 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d 20 26  );..    pRet = &
30a0: 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a 20  aOp[p->iAddr];. 
30b0: 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a 20     p->iAddr++;. 
30c0: 20 20 20 69 66 28 20 70 2d 3e 69 41 64 64 72 3d     if( p->iAddr=
30d0: 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 70 2d  =nOp ){.      p-
30e0: 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20 70  >iSub++;.      p
30f0: 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20 20 20  ->iAddr = 0;.   
3100: 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 70 52   }.  .    if( pR
3110: 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53  et->p4type==P4_S
3120: 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20  UBPROGRAM ){.   
3130: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28     int nByte = (
3140: 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f  p->nSub+1)*sizeo
3150: 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a  f(SubProgram*);.
3160: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
3170: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d     for(j=0; j<p-
3180: 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nSub; j++){.   
3190: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 70 53 75       if( p->apSu
31a0: 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e 70  b[j]==pRet->p4.p
31b0: 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b  Program ) break;
31c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
31d0: 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29 7b  f( j==p->nSub ){
31e0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75  .        p->apSu
31f0: 62 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  b = sqlite3DbRea
3200: 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64 62  llocOrFree(v->db
3210: 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79 74  , p->apSub, nByt
3220: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
3230: 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20 20  !p->apSub ){.   
3240: 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b         pRet = 0;
3250: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
3260: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53            p->apS
3270: 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d 20  ub[p->nSub++] = 
3280: 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61  pRet->p4.pProgra
3290: 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  m;.        }.   
32a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
32b0: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
32c0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66  ../*.** Check if
32d0: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 73 74 6f   the program sto
32e0: 72 65 64 20 69 6e 20 74 68 65 20 56 4d 20 61 73  red in the VM as
32f0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50  sociated with pP
3300: 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72 6f  arse may.** thro
3310: 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65 70  w an ABORT excep
3320: 74 69 6f 6e 20 28 63 61 75 73 69 6e 67 20 74 68  tion (causing th
3330: 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74  e statement, but
3340: 20 6e 6f 74 20 65 6e 74 69 72 65 20 74 72 61 6e   not entire tran
3350: 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65  saction.** to be
3360: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 20 54   rolled back). T
3370: 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  his condition is
3380: 20 74 72 75 65 20 69 66 20 74 68 65 20 6d 61 69   true if the mai
3390: 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20 61 6e 79  n program or any
33a0: 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72 61 6d 73  .** sub-programs
33b0: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6f 66   contains any of
33c0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
33d0: 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61  **.**   *  OP_Ha
33e0: 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54  lt with P1=SQLIT
33f0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64  E_CONSTRAINT and
3400: 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a   P2=OE_Abort..**
3410: 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 49 66 4e     *  OP_HaltIfN
3420: 75 6c 6c 20 77 69 74 68 20 50 31 3d 53 51 4c 49  ull with P1=SQLI
3430: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e  TE_CONSTRAINT an
3440: 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a  d P2=OE_Abort..*
3450: 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f  *   *  OP_Destro
3460: 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70  y.**   *  OP_VUp
3470: 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  date.**   *  OP_
3480: 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20 20  VRename.**   *  
3490: 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 77 69 74  OP_FkCounter wit
34a0: 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65 64 69 61  h P2==0 (immedia
34b0: 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  te foreign key c
34c0: 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a 20 20 20  onstraint).**   
34d0: 2a 20 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c  *  OP_CreateTabl
34e0: 65 20 61 6e 64 20 4f 50 5f 49 6e 69 74 43 6f 72  e and OP_InitCor
34f0: 6f 75 74 69 6e 65 20 28 66 6f 72 20 43 52 45 41  outine (for CREA
3500: 54 45 20 54 41 42 4c 45 20 41 53 20 53 45 4c 45  TE TABLE AS SELE
3510: 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  CT ...).**.** Th
3520: 65 6e 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  en check that th
3530: 65 20 76 61 6c 75 65 20 6f 66 20 50 61 72 73 65  e value of Parse
3540: 2e 6d 61 79 41 62 6f 72 74 20 69 73 20 74 72 75  .mayAbort is tru
3550: 65 20 69 66 20 61 6e 0a 2a 2a 20 41 42 4f 52 54  e if an.** ABORT
3560: 20 6d 61 79 20 62 65 20 74 68 72 6f 77 6e 2c 20   may be thrown, 
3570: 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  or false otherwi
3580: 73 65 2e 20 52 65 74 75 72 6e 20 74 72 75 65 20  se. Return true 
3590: 69 66 20 69 74 20 64 6f 65 73 0a 2a 2a 20 6d 61  if it does.** ma
35a0: 74 63 68 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  tch, or false ot
35b0: 68 65 72 77 69 73 65 2e 20 54 68 69 73 20 66 75  herwise. This fu
35c0: 6e 63 74 69 6f 6e 20 69 73 20 69 6e 74 65 6e 64  nction is intend
35d0: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 61 73  ed to be used as
35e0: 0a 2a 2a 20 70 61 72 74 20 6f 66 20 61 6e 20 61  .** part of an a
35f0: 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 20  ssert statement 
3600: 69 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e  in the compiler.
3610: 20 53 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a   Similar to:.**.
3620: 2a 2a 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  **   assert( sql
3630: 69 74 65 33 56 64 62 65 41 73 73 65 72 74 4d 61  ite3VdbeAssertMa
3640: 79 41 62 6f 72 74 28 70 50 61 72 73 65 2d 3e 70  yAbort(pParse->p
3650: 56 64 62 65 2c 20 70 50 61 72 73 65 2d 3e 6d 61  Vdbe, pParse->ma
3660: 79 41 62 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69 6e  yAbort) );.*/.in
3670: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73  t sqlite3VdbeAss
3680: 65 72 74 4d 61 79 41 62 6f 72 74 28 56 64 62 65  ertMayAbort(Vdbe
3690: 20 2a 76 2c 20 69 6e 74 20 6d 61 79 41 62 6f 72   *v, int mayAbor
36a0: 74 29 7b 0a 20 20 69 6e 74 20 68 61 73 41 62 6f  t){.  int hasAbo
36b0: 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61  rt = 0;.  int ha
36c0: 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 30 3b 0a  sFkCounter = 0;.
36d0: 20 20 69 6e 74 20 68 61 73 43 72 65 61 74 65 54    int hasCreateT
36e0: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  able = 0;.  int 
36f0: 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  hasInitCoroutine
3700: 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b   = 0;.  Op *pOp;
3710: 0a 20 20 56 64 62 65 4f 70 49 74 65 72 20 73 49  .  VdbeOpIter sI
3720: 74 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  ter;.  memset(&s
3730: 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
3740: 73 49 74 65 72 29 29 3b 0a 20 20 73 49 74 65 72  sIter));.  sIter
3750: 2e 76 20 3d 20 76 3b 0a 0a 20 20 77 68 69 6c 65  .v = v;..  while
3760: 28 20 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e  ( (pOp = opIterN
3770: 65 78 74 28 26 73 49 74 65 72 29 29 21 3d 30 20  ext(&sIter))!=0 
3780: 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 63 6f 64  ){.    int opcod
3790: 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b  e = pOp->opcode;
37a0: 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d  .    if( opcode=
37b0: 3d 4f 50 5f 44 65 73 74 72 6f 79 20 7c 7c 20 6f  =OP_Destroy || o
37c0: 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74  pcode==OP_VUpdat
37d0: 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f  e || opcode==OP_
37e0: 56 52 65 6e 61 6d 65 20 0a 20 20 20 20 20 7c 7c  VRename .     ||
37f0: 20 28 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61   ((opcode==OP_Ha
3800: 6c 74 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  lt || opcode==OP
3810: 5f 48 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20  _HaltIfNull) .  
3820: 20 20 20 20 26 26 20 28 28 70 4f 70 2d 3e 70 31      && ((pOp->p1
3830: 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43  &0xff)==SQLITE_C
3840: 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70  ONSTRAINT && pOp
3850: 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29  ->p2==OE_Abort))
3860: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 68 61  .    ){.      ha
3870: 73 41 62 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20  sAbort = 1;.    
3880: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3890: 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f     if( opcode==O
38a0: 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20 29 20  P_CreateTable ) 
38b0: 68 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 3d  hasCreateTable =
38c0: 20 31 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f   1;.    if( opco
38d0: 64 65 3d 3d 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  de==OP_InitCorou
38e0: 74 69 6e 65 20 29 20 68 61 73 49 6e 69 74 43 6f  tine ) hasInitCo
38f0: 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 23 69 66  routine = 1;.#if
3900: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3910: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20  _FOREIGN_KEY.   
3920: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
3930: 46 6b 43 6f 75 6e 74 65 72 20 26 26 20 70 4f 70  FkCounter && pOp
3940: 2d 3e 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1==0 && pOp->
3950: 70 32 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 68  p2==1 ){.      h
3960: 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 31 3b  asFkCounter = 1;
3970: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
3980: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
3990: 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61  e(v->db, sIter.a
39a0: 70 53 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74  pSub);..  /* Ret
39b0: 75 72 6e 20 74 72 75 65 20 69 66 20 68 61 73 41  urn true if hasA
39c0: 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20  bort==mayAbort. 
39d0: 4f 72 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  Or if a malloc f
39e0: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e  ailure occurred.
39f0: 0a 20 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20  .  ** If malloc 
3a00: 66 61 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  failed, then the
3a10: 20 77 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62   while() loop ab
3a20: 6f 76 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  ove may not have
3a30: 20 69 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74   iterated.  ** t
3a40: 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64  hrough all opcod
3a50: 65 73 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20  es and hasAbort 
3a60: 6d 61 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72  may be set incor
3a70: 72 65 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20  rectly. Return. 
3a80: 20 2a 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69   ** true for thi
3a90: 73 20 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e  s case to preven
3aa0: 74 20 74 68 65 20 61 73 73 65 72 74 28 29 20 69  t the assert() i
3ab0: 6e 20 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72  n the callers fr
3ac0: 61 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61  ame.  ** from fa
3ad0: 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74  iling.  */.  ret
3ae0: 75 72 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c  urn ( v->db->mal
3af0: 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73  locFailed || has
3b00: 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20  Abort==mayAbort 
3b10: 7c 7c 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 0a  || hasFkCounter.
3b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
3b30: 20 28 68 61 73 43 72 65 61 74 65 54 61 62 6c 65   (hasCreateTable
3b40: 20 26 26 20 68 61 73 49 6e 69 74 43 6f 72 6f 75   && hasInitCorou
3b50: 74 69 6e 65 29 20 29 3b 0a 7d 0a 23 65 6e 64 69  tine) );.}.#endi
3b60: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
3b70: 47 20 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41  G - the sqlite3A
3b80: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20  ssertMayAbort() 
3b90: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a  function */../*.
3ba0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3bb0: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
3bc0: 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65  all opcodes have
3bd0: 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 20   been inserted. 
3be0: 20 49 74 20 6c 6f 6f 70 73 0a 2a 2a 20 74 68 72   It loops.** thr
3bf0: 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 6f 70 63  ough all the opc
3c00: 6f 64 65 73 20 61 6e 64 20 66 69 78 65 73 20 75  odes and fixes u
3c10: 70 20 73 6f 6d 65 20 64 65 74 61 69 6c 73 2e 0a  p some details..
3c20: 2a 2a 0a 2a 2a 20 28 31 29 20 46 6f 72 20 65 61  **.** (1) For ea
3c30: 63 68 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74  ch jump instruct
3c40: 69 6f 6e 20 77 69 74 68 20 61 20 6e 65 67 61 74  ion with a negat
3c50: 69 76 65 20 50 32 20 76 61 6c 75 65 20 28 61 20  ive P2 value (a 
3c60: 6c 61 62 65 6c 29 0a 2a 2a 20 20 20 20 20 72 65  label).**     re
3c70: 73 6f 6c 76 65 20 74 68 65 20 50 32 20 76 61 6c  solve the P2 val
3c80: 75 65 20 74 6f 20 61 6e 20 61 63 74 75 61 6c 20  ue to an actual 
3c90: 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 28  address..**.** (
3ca0: 32 29 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6d  2) Compute the m
3cb0: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
3cc0: 20 61 72 67 75 6d 65 6e 74 73 20 75 73 65 64 20   arguments used 
3cd0: 62 79 20 61 6e 79 20 53 51 4c 20 66 75 6e 63 74  by any SQL funct
3ce0: 69 6f 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 73  ion.**     and s
3cf0: 74 6f 72 65 20 74 68 61 74 20 76 61 6c 75 65 20  tore that value 
3d00: 69 6e 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  in *pMaxFuncArgs
3d10: 2e 0a 2a 2a 0a 2a 2a 20 28 33 29 20 55 70 64 61  ..**.** (3) Upda
3d20: 74 65 20 74 68 65 20 56 64 62 65 2e 72 65 61 64  te the Vdbe.read
3d30: 4f 6e 6c 79 20 61 6e 64 20 56 64 62 65 2e 62 49  Only and Vdbe.bI
3d40: 73 52 65 61 64 65 72 20 66 6c 61 67 73 20 74 6f  sReader flags to
3d50: 20 61 63 63 75 72 61 74 65 6c 79 0a 2a 2a 20 20   accurately.**  
3d60: 20 20 20 69 6e 64 69 63 61 74 65 20 77 68 61 74     indicate what
3d70: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
3d80: 61 74 65 6d 65 6e 74 20 61 63 74 75 61 6c 6c 79  atement actually
3d90: 20 64 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 34 29   does..**.** (4)
3da0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
3db0: 70 34 2e 78 41 64 76 61 6e 63 65 20 70 6f 69 6e  p4.xAdvance poin
3dc0: 74 65 72 20 6f 6e 20 6f 70 63 6f 64 65 73 20 74  ter on opcodes t
3dd0: 68 61 74 20 75 73 65 20 69 74 2e 0a 2a 2a 0a 2a  hat use it..**.*
3de0: 2a 20 28 35 29 20 52 65 63 6c 61 69 6d 20 74 68  * (5) Reclaim th
3df0: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
3e00: 65 64 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 6c  ed for storing l
3e10: 61 62 65 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  abels..*/.static
3e20: 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32 56   void resolveP2V
3e30: 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20 69  alues(Vdbe *p, i
3e40: 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  nt *pMaxFuncArgs
3e50: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
3e60: 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a 70 4d  t nMaxArgs = *pM
3e70: 61 78 46 75 6e 63 41 72 67 73 3b 0a 20 20 4f 70  axFuncArgs;.  Op
3e80: 20 2a 70 4f 70 3b 0a 20 20 50 61 72 73 65 20 2a   *pOp;.  Parse *
3e90: 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72  pParse = p->pPar
3ea0: 73 65 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65  se;.  int *aLabe
3eb0: 6c 20 3d 20 70 50 61 72 73 65 2d 3e 61 4c 61 62  l = pParse->aLab
3ec0: 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e 6c  el;.  p->readOnl
3ed0: 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 62 49 73 52  y = 1;.  p->bIsR
3ee0: 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 66 6f 72  eader = 0;.  for
3ef0: 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70  (pOp=p->aOp, i=p
3f00: 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69  ->nOp-1; i>=0; i
3f10: 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  --, pOp++){.    
3f20: 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d  u8 opcode = pOp-
3f30: 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 2f 2a  >opcode;..    /*
3f40: 20 4e 4f 54 45 3a 20 42 65 20 73 75 72 65 20 74   NOTE: Be sure t
3f50: 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70 63 6f 64  o update mkopcod
3f60: 65 68 2e 61 77 6b 20 77 68 65 6e 20 61 64 64 69  eh.awk when addi
3f70: 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e 67 0a 20  ng or removing. 
3f80: 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72 6f 6d     ** cases from
3f90: 20 74 68 69 73 20 73 77 69 74 63 68 21 20 2a 2f   this switch! */
3fa0: 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70 63  .    switch( opc
3fb0: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ode ){.      cas
3fc0: 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  e OP_Transaction
3fd0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
3fe0: 70 4f 70 2d 3e 70 32 21 3d 30 20 29 20 70 2d 3e  pOp->p2!=0 ) p->
3ff0: 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20  readOnly = 0;.  
4000: 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20 74 68        /* fall th
4010: 72 75 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  ru */.      }.  
4020: 20 20 20 20 63 61 73 65 20 4f 50 5f 41 75 74 6f      case OP_Auto
4030: 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20 20 63 61  Commit:.      ca
4040: 73 65 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 3a  se OP_Savepoint:
4050: 20 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 62 49   {.        p->bI
4060: 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20  sReader = 1;.   
4070: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4080: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
4090: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
40a0: 20 20 63 61 73 65 20 4f 50 5f 43 68 65 63 6b 70    case OP_Checkp
40b0: 6f 69 6e 74 3a 0a 23 65 6e 64 69 66 0a 20 20 20  oint:.#endif.   
40c0: 20 20 20 63 61 73 65 20 4f 50 5f 56 61 63 75 75     case OP_Vacuu
40d0: 6d 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  m:.      case OP
40e0: 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b 0a  _JournalMode: {.
40f0: 20 20 20 20 20 20 20 20 70 2d 3e 72 65 61 64 4f          p->readO
4100: 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nly = 0;.       
4110: 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20   p->bIsReader = 
4120: 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  1;.        break
4130: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
4140: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
4150: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
4160: 20 63 61 73 65 20 4f 50 5f 56 55 70 64 61 74 65   case OP_VUpdate
4170: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
4180: 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73  pOp->p2>nMaxArgs
4190: 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f   ) nMaxArgs = pO
41a0: 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 62  p->p2;.        b
41b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
41c0: 20 20 20 20 63 61 73 65 20 4f 50 5f 56 46 69 6c      case OP_VFil
41d0: 74 65 72 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  ter: {.        i
41e0: 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 61 73  nt n;.        as
41f0: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d 20 69  sert( p->nOp - i
4200: 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20 20 20   >= 3 );.       
4210: 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d   assert( pOp[-1]
4220: 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65  .opcode==OP_Inte
4230: 67 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20 6e  ger );.        n
4240: 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20   = pOp[-1].p1;. 
4250: 20 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61         if( n>nMa
4260: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73  xArgs ) nMaxArgs
4270: 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 62 72   = n;.        br
4280: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  eak;.      }.#en
4290: 64 69 66 0a 20 20 20 20 20 20 63 61 73 65 20 4f  dif.      case O
42a0: 50 5f 4e 65 78 74 3a 0a 20 20 20 20 20 20 63 61  P_Next:.      ca
42b0: 73 65 20 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e  se OP_NextIfOpen
42c0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  :.      case OP_
42d0: 53 6f 72 74 65 72 4e 65 78 74 3a 20 7b 0a 20 20  SorterNext: {.  
42e0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41        pOp->p4.xA
42f0: 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74 65 33  dvance = sqlite3
4300: 42 74 72 65 65 4e 65 78 74 3b 0a 20 20 20 20 20  BtreeNext;.     
4310: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
4320: 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20   P4_ADVANCE;.   
4330: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4340: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f    }.      case O
4350: 50 5f 50 72 65 76 3a 0a 20 20 20 20 20 20 63 61  P_Prev:.      ca
4360: 73 65 20 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e  se OP_PrevIfOpen
4370: 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  : {.        pOp-
4380: 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73  >p4.xAdvance = s
4390: 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
43a0: 6f 75 73 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ous;.        pOp
43b0: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44  ->p4type = P4_AD
43c0: 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 62  VANCE;.        b
43d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
43e0: 20 20 7d 0a 0a 20 20 20 20 70 4f 70 2d 3e 6f 70    }..    pOp->op
43f0: 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33 4f  flags = sqlite3O
4400: 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 6f 70  pcodeProperty[op
4410: 63 6f 64 65 5d 3b 0a 20 20 20 20 69 66 28 20 28  code];.    if( (
4420: 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f  pOp->opflags & O
4430: 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26  PFLG_JUMP)!=0 &&
4440: 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20   pOp->p2<0 ){.  
4450: 20 20 20 20 61 73 73 65 72 74 28 20 41 44 44 52      assert( ADDR
4460: 28 70 4f 70 2d 3e 70 32 29 3c 70 50 61 72 73 65  (pOp->p2)<pParse
4470: 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20  ->nLabel );.    
4480: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62    pOp->p2 = aLab
4490: 65 6c 5b 41 44 44 52 28 70 4f 70 2d 3e 70 32 29  el[ADDR(pOp->p2)
44a0: 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  ];.    }.  }.  s
44b0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
44c0: 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 4c 61 62  db, pParse->aLab
44d0: 65 6c 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61  el);.  pParse->a
44e0: 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 70 50 61  Label = 0;.  pPa
44f0: 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 3d 20 30 3b  rse->nLabel = 0;
4500: 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  .  *pMaxFuncArgs
4510: 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 20 20 61   = nMaxArgs;.  a
4520: 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61  ssert( p->bIsRea
4530: 64 65 72 21 3d 30 20 7c 7c 20 44 62 4d 61 73 6b  der!=0 || DbMask
4540: 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65  AllZero(p->btree
4550: 4d 61 73 6b 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Mask) );.}../*.*
4560: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64  * Return the add
4570: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
4580: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
4590: 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a  be inserted..*/.
45a0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
45b0: 75 72 72 65 6e 74 41 64 64 72 28 56 64 62 65 20  urrentAddr(Vdbe 
45c0: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
45d0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
45e0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65  GIC_INIT );.  re
45f0: 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a  turn p->nOp;.}..
4600: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
4610: 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f  ion returns a po
4620: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72 72  inter to the arr
4630: 61 79 20 6f 66 20 6f 70 63 6f 64 65 73 20 61 73  ay of opcodes as
4640: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
4650: 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64   the Vdbe passed
4660: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
4670: 67 75 6d 65 6e 74 2e 20 49 74 20 69 73 20 74 68  gument. It is th
4680: 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e  e callers respon
4690: 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61  sibility.** to a
46a0: 72 72 61 6e 67 65 20 66 6f 72 20 74 68 65 20 72  rrange for the r
46b0: 65 74 75 72 6e 65 64 20 61 72 72 61 79 20 74 6f  eturned array to
46c0: 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   be eventually f
46d0: 72 65 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a  reed using the .
46e0: 2a 2a 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  ** vdbeFreeOpArr
46f0: 61 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ay() function..*
4700: 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75  *.** Before retu
4710: 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20  rning, *pnOp is 
4720: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
4730: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
4740: 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  the returned.** 
4750: 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e  array. Also, *pn
4760: 4d 61 78 41 72 67 20 69 73 20 73 65 74 20 74 6f  MaxArg is set to
4770: 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 69   the larger of i
4780: 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  ts current value
4790: 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d   and .** the num
47a0: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
47b0: 6e 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67  n the Vdbe.apArg
47c0: 5b 5d 20 61 72 72 61 79 20 72 65 71 75 69 72 65  [] array require
47d0: 64 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  d to execute the
47e0: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 70 72   .** returned pr
47f0: 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70  ogram..*/.VdbeOp
4800: 20 2a 73 71 6c 69 74 65 33 56 64 62 65 54 61 6b   *sqlite3VdbeTak
4810: 65 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 70  eOpArray(Vdbe *p
4820: 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74  , int *pnOp, int
4830: 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56   *pnMaxArg){.  V
4840: 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e  dbeOp *aOp = p->
4850: 61 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61  aOp;.  assert( a
4860: 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61  Op && !p->db->ma
4870: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20  llocFailed );.. 
4880: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 73   /* Check that s
4890: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
48a0: 72 65 65 28 29 20 77 61 73 20 6e 6f 74 20 63 61  ree() was not ca
48b0: 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 56 4d 20  lled on this VM 
48c0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d  */.  assert( DbM
48d0: 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74  askAllZero(p->bt
48e0: 72 65 65 4d 61 73 6b 29 20 29 3b 0a 0a 20 20 72  reeMask) );..  r
48f0: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70  esolveP2Values(p
4900: 2c 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a  , pnMaxArg);.  *
4910: 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20  pnOp = p->nOp;. 
4920: 20 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72   p->aOp = 0;.  r
4930: 65 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a  eturn aOp;.}../*
4940: 0a 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20  .** Add a whole 
4950: 6c 69 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f  list of operatio
4960: 6e 73 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74  ns to the operat
4970: 69 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75  ion stack.  Retu
4980: 72 6e 20 74 68 65 0a 2a 2a 20 61 64 64 72 65 73  rn the.** addres
4990: 73 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  s of the first o
49a0: 70 65 72 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a  peration added..
49b0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
49c0: 62 65 41 64 64 4f 70 4c 69 73 74 28 56 64 62 65  beAddOpList(Vdbe
49d0: 20 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64   *p, int nOp, Vd
49e0: 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a  beOpList const *
49f0: 61 4f 70 2c 20 69 6e 74 20 69 4c 69 6e 65 6e 6f  aOp, int iLineno
4a00: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 69  ){.  int addr, i
4a10: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74  ;.  VdbeOp *pOut
4a20: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 70 3e  ;.  assert( nOp>
4a30: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
4a40: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
4a50: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
4a60: 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e  ( p->nOp + nOp >
4a70: 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41   p->pParse->nOpA
4a80: 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41 72  lloc && growOpAr
4a90: 72 61 79 28 70 2c 20 6e 4f 70 29 20 29 7b 0a 20  ray(p, nOp) ){. 
4aa0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
4ab0: 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70  .  addr = p->nOp
4ac0: 3b 0a 20 20 70 4f 75 74 20 3d 20 26 70 2d 3e 61  ;.  pOut = &p->a
4ad0: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 6f 72 28  Op[addr];.  for(
4ae0: 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c  i=0; i<nOp; i++,
4af0: 20 61 4f 70 2b 2b 2c 20 70 4f 75 74 2b 2b 29 7b   aOp++, pOut++){
4b00: 0a 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64  .    pOut->opcod
4b10: 65 20 3d 20 61 4f 70 2d 3e 6f 70 63 6f 64 65 3b  e = aOp->opcode;
4b20: 0a 20 20 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20  .    pOut->p1 = 
4b30: 61 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 70 4f 75  aOp->p1;.    pOu
4b40: 74 2d 3e 70 32 20 3d 20 61 4f 70 2d 3e 70 32 3b  t->p2 = aOp->p2;
4b50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 4f 70  .    assert( aOp
4b60: 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20 20 70  ->p2>=0 );.    p
4b70: 4f 75 74 2d 3e 70 33 20 3d 20 61 4f 70 2d 3e 70  Out->p3 = aOp->p
4b80: 33 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 74  3;.    pOut->p4t
4b90: 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44  ype = P4_NOTUSED
4ba0: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70  ;.    pOut->p4.p
4bb0: 20 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e   = 0;.    pOut->
4bc0: 70 35 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  p5 = 0;.#ifdef S
4bd0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50  QLITE_ENABLE_EXP
4be0: 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20  LAIN_COMMENTS.  
4bf0: 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74    pOut->zComment
4c00: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 0;.#endif.#if
4c10: 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f  def SQLITE_VDBE_
4c20: 43 4f 56 45 52 41 47 45 0a 20 20 20 20 70 4f 75  COVERAGE.    pOu
4c30: 74 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c  t->iSrcLine = iL
4c40: 69 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20  ineno+i;.#else. 
4c50: 20 20 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f     (void)iLineno
4c60: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
4c70: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
4c80: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67   if( p->db->flag
4c90: 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
4ca0: 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
4cb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
4cc0: 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c  intOp(0, i+addr,
4cd0: 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d   &p->aOp[i+addr]
4ce0: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
4cf0: 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20    }.  p->nOp += 
4d00: 6e 4f 70 3b 0a 20 20 72 65 74 75 72 6e 20 61 64  nOp;.  return ad
4d10: 64 72 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  dr;.}..#if defin
4d20: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
4d30: 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
4d40: 29 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65  )./*.** Add an e
4d50: 6e 74 72 79 20 74 6f 20 74 68 65 20 61 72 72 61  ntry to the arra
4d60: 79 20 6f 66 20 63 6f 75 6e 74 65 72 73 20 6d 61  y of counters ma
4d70: 6e 61 67 65 64 20 62 79 20 73 71 6c 69 74 65 33  naged by sqlite3
4d80: 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73  _stmt_scanstatus
4d90: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
4da0: 74 65 33 56 64 62 65 53 63 61 6e 53 74 61 74 75  te3VdbeScanStatu
4db0: 73 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  s(.  Vdbe *p,   
4dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4dd0: 20 20 20 20 20 2f 2a 20 56 4d 20 74 6f 20 61 64       /* VM to ad
4de0: 64 20 73 63 61 6e 73 74 61 74 75 73 28 29 20 74  d scanstatus() t
4df0: 6f 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45  o */.  int addrE
4e00: 78 70 6c 61 69 6e 2c 20 20 20 20 20 20 20 20 20  xplain,         
4e10: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
4e20: 73 20 6f 66 20 4f 50 5f 45 78 70 6c 61 69 6e 20  s of OP_Explain 
4e30: 28 6f 72 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20  (or 0) */.  int 
4e40: 61 64 64 72 4c 6f 6f 70 2c 20 20 20 20 20 20 20  addrLoop,       
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
4e60: 64 64 72 65 73 73 20 6f 66 20 6c 6f 6f 70 20 63  ddress of loop c
4e70: 6f 75 6e 74 65 72 20 2a 2f 20 0a 20 20 69 6e 74  ounter */ .  int
4e80: 20 61 64 64 72 56 69 73 69 74 2c 20 20 20 20 20   addrVisit,     
4e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4ea0: 41 64 64 72 65 73 73 20 6f 66 20 72 6f 77 73 20  Address of rows 
4eb0: 76 69 73 69 74 65 64 20 63 6f 75 6e 74 65 72 20  visited counter 
4ec0: 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 45 73 74  */.  LogEst nEst
4ed0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4ee0: 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65       /* Estimate
4ef0: 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  d number of outp
4f00: 75 74 20 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6e  ut rows */.  con
4f10: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
4f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4f30: 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 6f 72  Name of table or
4f40: 20 69 6e 64 65 78 20 62 65 69 6e 67 20 73 63 61   index being sca
4f50: 6e 6e 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  nned */.){.  int
4f60: 20 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 63   nByte = (p->nSc
4f70: 61 6e 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28 53  an+1) * sizeof(S
4f80: 63 61 6e 53 74 61 74 75 73 29 3b 0a 20 20 53 63  canStatus);.  Sc
4f90: 61 6e 53 74 61 74 75 73 20 2a 61 4e 65 77 3b 0a  anStatus *aNew;.
4fa0: 20 20 61 4e 65 77 20 3d 20 28 53 63 61 6e 53 74    aNew = (ScanSt
4fb0: 61 74 75 73 2a 29 73 71 6c 69 74 65 33 44 62 52  atus*)sqlite3DbR
4fc0: 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d  ealloc(p->db, p-
4fd0: 3e 61 53 63 61 6e 2c 20 6e 42 79 74 65 29 3b 0a  >aScan, nByte);.
4fe0: 20 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20    if( aNew ){.  
4ff0: 20 20 53 63 61 6e 53 74 61 74 75 73 20 2a 70 4e    ScanStatus *pN
5000: 65 77 20 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e 53  ew = &aNew[p->nS
5010: 63 61 6e 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65 77  can++];.    pNew
5020: 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20  ->addrExplain = 
5030: 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20  addrExplain;.   
5040: 20 70 4e 65 77 2d 3e 61 64 64 72 4c 6f 6f 70 20   pNew->addrLoop 
5050: 3d 20 61 64 64 72 4c 6f 6f 70 3b 0a 20 20 20 20  = addrLoop;.    
5060: 70 4e 65 77 2d 3e 61 64 64 72 56 69 73 69 74 20  pNew->addrVisit 
5070: 3d 20 61 64 64 72 56 69 73 69 74 3b 0a 20 20 20  = addrVisit;.   
5080: 20 70 4e 65 77 2d 3e 6e 45 73 74 20 3d 20 6e 45   pNew->nEst = nE
5090: 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4e  st;.    pNew->zN
50a0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
50b0: 74 72 44 75 70 28 70 2d 3e 64 62 2c 20 7a 4e 61  trDup(p->db, zNa
50c0: 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 61 53 63 61  me);.    p->aSca
50d0: 6e 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a  n = aNew;.  }.}.
50e0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43  #endif.../*.** C
50f0: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
5100: 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 2c 20 6f  of the opcode, o
5110: 72 20 50 31 2c 20 50 32 2c 20 50 33 2c 20 6f 72  r P1, P2, P3, or
5120: 20 50 35 20 6f 70 65 72 61 6e 64 73 0a 2a 2a 20   P5 operands.** 
5130: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
5140: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
5150: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
5160: 68 61 6e 67 65 4f 70 63 6f 64 65 28 56 64 62 65  hangeOpcode(Vdbe
5170: 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 75   *p, u32 addr, u
5180: 38 20 69 4e 65 77 4f 70 63 6f 64 65 29 7b 0a 20  8 iNewOpcode){. 
5190: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
51a0: 70 28 70 2c 61 64 64 72 29 2d 3e 6f 70 63 6f 64  p(p,addr)->opcod
51b0: 65 20 3d 20 69 4e 65 77 4f 70 63 6f 64 65 3b 0a  e = iNewOpcode;.
51c0: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
51d0: 62 65 43 68 61 6e 67 65 50 31 28 56 64 62 65 20  beChangeP1(Vdbe 
51e0: 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e  *p, u32 addr, in
51f0: 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65  t val){.  sqlite
5200: 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64  3VdbeGetOp(p,add
5210: 72 29 2d 3e 70 31 20 3d 20 76 61 6c 3b 0a 7d 0a  r)->p1 = val;.}.
5220: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
5230: 43 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70  ChangeP2(Vdbe *p
5240: 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20  , u32 addr, int 
5250: 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  val){.  sqlite3V
5260: 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29  dbeGetOp(p,addr)
5270: 2d 3e 70 32 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f  ->p2 = val;.}.vo
5280: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
5290: 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20  angeP3(Vdbe *p, 
52a0: 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61  u32 addr, int va
52b0: 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  l){.  sqlite3Vdb
52c0: 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e  eGetOp(p,addr)->
52d0: 70 33 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64  p3 = val;.}.void
52e0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
52f0: 67 65 50 35 28 56 64 62 65 20 2a 70 2c 20 75 38  geP5(Vdbe *p, u8
5300: 20 70 35 29 7b 0a 20 20 73 71 6c 69 74 65 33 56   p5){.  sqlite3V
5310: 64 62 65 47 65 74 4f 70 28 70 2c 2d 31 29 2d 3e  dbeGetOp(p,-1)->
5320: 70 35 20 3d 20 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a  p5 = p5;.}../*.*
5330: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 50 32 20  * Change the P2 
5340: 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72  operand of instr
5350: 75 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74  uction addr so t
5360: 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
5370: 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73 20  .** the address 
5380: 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  of the next inst
5390: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f  ruction to be co
53a0: 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ded..*/.void sql
53b0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
53c0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
53d0: 64 72 29 7b 0a 20 20 70 2d 3e 70 50 61 72 73 65  dr){.  p->pParse
53e0: 2d 3e 69 46 69 78 65 64 4f 70 20 3d 20 70 2d 3e  ->iFixedOp = p->
53f0: 6e 4f 70 20 2d 20 31 3b 0a 20 20 73 71 6c 69 74  nOp - 1;.  sqlit
5400: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70  e3VdbeChangeP2(p
5410: 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b  , addr, p->nOp);
5420: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
5430: 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20  e input FuncDef 
5440: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68  structure is eph
5450: 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65  emeral, then fre
5460: 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65  e it.  If.** the
5470: 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20   FuncDef is not 
5480: 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64  ephermal, then d
5490: 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74  o nothing..*/.st
54a0: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70  atic void freeEp
54b0: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
54c0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e  sqlite3 *db, Fun
54d0: 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69  cDef *pDef){.  i
54e0: 66 28 20 41 4c 57 41 59 53 28 70 44 65 66 29 20  f( ALWAYS(pDef) 
54f0: 26 26 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c  && (pDef->funcFl
5500: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
5510: 43 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20  C_EPHEM)!=0 ){. 
5520: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
5530: 28 64 62 2c 20 70 44 65 66 29 3b 0a 20 20 7d 0a  (db, pDef);.  }.
5540: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  }..static void v
5550: 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73  dbeFreeOpArray(s
5560: 71 6c 69 74 65 33 20 2a 2c 20 4f 70 20 2a 2c 20  qlite3 *, Op *, 
5570: 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  int);../*.** Del
5580: 65 74 65 20 61 20 50 34 20 76 61 6c 75 65 20 69  ete a P4 value i
5590: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a  f necessary..*/.
55a0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
55b0: 50 34 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  P4(sqlite3 *db, 
55c0: 69 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64  int p4type, void
55d0: 20 2a 70 34 29 7b 0a 20 20 69 66 28 20 70 34 20   *p4){.  if( p4 
55e0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  ){.    assert( d
55f0: 62 20 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28  b );.    switch(
5600: 20 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 20   p4type ){.     
5610: 20 63 61 73 65 20 50 34 5f 46 55 4e 43 43 54 58   case P4_FUNCCTX
5620: 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65  : {.        free
5630: 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f  EphemeralFunctio
5640: 6e 28 64 62 2c 20 28 28 73 71 6c 69 74 65 33 5f  n(db, ((sqlite3_
5650: 63 6f 6e 74 65 78 74 2a 29 70 34 29 2d 3e 70 46  context*)p4)->pF
5660: 75 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  unc);.        /*
5670: 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e   Fall through in
5680: 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73 65  to the next case
5690: 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
56a0: 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a    case P4_REAL:.
56b0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e        case P4_IN
56c0: 54 36 34 3a 0a 20 20 20 20 20 20 63 61 73 65 20  T64:.      case 
56d0: 50 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20  P4_DYNAMIC:.    
56e0: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52    case P4_INTARR
56f0: 41 59 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  AY: {.        sq
5700: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5710: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
5720: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
5730: 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46    case P4_KEYINF
5740: 4f 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  O: {.        if(
5750: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
5760: 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4b 65  d==0 ) sqlite3Ke
5770: 79 49 6e 66 6f 55 6e 72 65 66 28 28 4b 65 79 49  yInfoUnref((KeyI
5780: 6e 66 6f 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  nfo*)p4);.      
5790: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
57a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
57b0: 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e  NABLE_CURSOR_HIN
57c0: 54 53 0a 20 20 20 20 20 20 63 61 73 65 20 50 34  TS.      case P4
57d0: 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 20  _EXPR: {.       
57e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
57f0: 74 65 28 64 62 2c 20 28 45 78 70 72 2a 29 70 34  te(db, (Expr*)p4
5800: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
5810: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
5820: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d  .      case P4_M
5830: 50 52 49 4e 54 46 3a 20 7b 0a 20 20 20 20 20 20  PRINTF: {.      
5840: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
5850: 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69  sFreed==0 ) sqli
5860: 74 65 33 5f 66 72 65 65 28 70 34 29 3b 0a 20 20  te3_free(p4);.  
5870: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5880: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
5890: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P4_FUNCDEF: {.  
58a0: 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65        freeEpheme
58b0: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ralFunction(db, 
58c0: 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20  (FuncDef*)p4);. 
58d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
58e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
58f0: 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20   P4_MEM: {.     
5900: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
5910: 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20  esFreed==0 ){.  
5920: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5930: 61 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65  alueFree((sqlite
5940: 33 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20  3_value*)p4);.  
5950: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5960: 20 20 20 20 20 20 20 4d 65 6d 20 2a 70 20 3d 20         Mem *p = 
5970: 28 4d 65 6d 2a 29 70 34 3b 0a 20 20 20 20 20 20  (Mem*)p4;.      
5980: 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c      if( p->szMal
5990: 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 44 62 46  loc ) sqlite3DbF
59a0: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c  ree(db, p->zMall
59b0: 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  oc);.          s
59c0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
59d0: 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   p);.        }. 
59e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
59f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
5a00: 20 50 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20   P4_VTAB : {.   
5a10: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42       if( db->pnB
5a20: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73  ytesFreed==0 ) s
5a30: 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b  qlite3VtabUnlock
5a40: 28 28 56 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a  ((VTable *)p4);.
5a50: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5a60: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5a70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
5a80: 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  he space allocat
5a90: 65 64 20 66 6f 72 20 61 4f 70 20 61 6e 64 20 61  ed for aOp and a
5aa0: 6e 79 20 70 34 20 76 61 6c 75 65 73 20 61 6c 6c  ny p4 values all
5ab0: 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 0a 2a  ocated for the.*
5ac0: 2a 20 6f 70 63 6f 64 65 73 20 63 6f 6e 74 61 69  * opcodes contai
5ad0: 6e 65 64 20 77 69 74 68 69 6e 2e 20 49 66 20 61  ned within. If a
5ae0: 4f 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69  Op is not NULL i
5af0: 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  t is assumed to 
5b00: 63 6f 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20  contain .** nOp 
5b10: 65 6e 74 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61  entries. .*/.sta
5b20: 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65  tic void vdbeFre
5b30: 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33  eOpArray(sqlite3
5b40: 20 2a 64 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69   *db, Op *aOp, i
5b50: 6e 74 20 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61  nt nOp){.  if( a
5b60: 4f 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f  Op ){.    Op *pO
5b70: 70 3b 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 61  p;.    for(pOp=a
5b80: 4f 70 3b 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70  Op; pOp<&aOp[nOp
5b90: 5d 3b 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20  ]; pOp++){.     
5ba0: 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d   freeP4(db, pOp-
5bb0: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34  >p4type, pOp->p4
5bc0: 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  .p);.#ifdef SQLI
5bd0: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
5be0: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20  N_COMMENTS.     
5bf0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
5c00: 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  b, pOp->zComment
5c10: 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a 20  );.#endif     . 
5c20: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
5c30: 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 4f 70  e3DbFree(db, aOp
5c40: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b  );.}../*.** Link
5c50: 20 74 68 65 20 53 75 62 50 72 6f 67 72 61 6d 20   the SubProgram 
5c60: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
5c70: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
5c80: 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65 20 6c 69  ment into the li
5c90: 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74 20 61 74 20  nked.** list at 
5ca0: 56 64 62 65 2e 70 53 75 62 50 72 6f 67 72 61 6d  Vdbe.pSubProgram
5cb0: 2e 20 54 68 69 73 20 6c 69 73 74 20 69 73 20 75  . This list is u
5cc0: 73 65 64 20 74 6f 20 64 65 6c 65 74 65 20 61 6c  sed to delete al
5cd0: 6c 20 73 75 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a  l sub-program.**
5ce0: 20 6f 62 6a 65 63 74 73 20 77 68 65 6e 20 74 68   objects when th
5cf0: 65 20 56 4d 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  e VM is no longe
5d00: 72 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 76  r required..*/.v
5d10: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c  oid sqlite3VdbeL
5d20: 69 6e 6b 53 75 62 50 72 6f 67 72 61 6d 28 56 64  inkSubProgram(Vd
5d30: 62 65 20 2a 70 56 64 62 65 2c 20 53 75 62 50 72  be *pVdbe, SubPr
5d40: 6f 67 72 61 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e  ogram *p){.  p->
5d50: 70 4e 65 78 74 20 3d 20 70 56 64 62 65 2d 3e 70  pNext = pVdbe->p
5d60: 50 72 6f 67 72 61 6d 3b 0a 20 20 70 56 64 62 65  Program;.  pVdbe
5d70: 2d 3e 70 50 72 6f 67 72 61 6d 20 3d 20 70 3b 0a  ->pProgram = p;.
5d80: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
5d90: 74 68 65 20 6f 70 63 6f 64 65 20 61 74 20 61 64  the opcode at ad
5da0: 64 72 20 69 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a  dr into OP_Noop.
5db0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
5dc0: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
5dd0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
5de0: 72 29 7b 0a 20 20 69 66 28 20 61 64 64 72 3c 70  r){.  if( addr<p
5df0: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 56 64 62  ->nOp ){.    Vdb
5e00: 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61  eOp *pOp = &p->a
5e10: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 73 71  Op[addr];.    sq
5e20: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
5e30: 62 3b 0a 20 20 20 20 66 72 65 65 50 34 28 64 62  b;.    freeP4(db
5e40: 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70  , pOp->p4type, p
5e50: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 6d  Op->p4.p);.    m
5e60: 65 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20 73 69  emset(pOp, 0, si
5e70: 7a 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20  zeof(pOp[0]));. 
5e80: 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
5e90: 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 0a 7d 0a   OP_Noop;.  }.}.
5ea0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 61  ./*.** If the la
5eb0: 73 74 20 6f 70 63 6f 64 65 20 69 73 20 22 6f 70  st opcode is "op
5ec0: 22 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20  " and it is not 
5ed0: 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  a jump destinati
5ee0: 6f 6e 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 6d 6f  on,.** then remo
5ef0: 76 65 20 69 74 2e 20 20 52 65 74 75 72 6e 20 74  ve it.  Return t
5f00: 72 75 65 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20  rue if and only 
5f10: 69 66 20 61 6e 20 6f 70 63 6f 64 65 20 77 61 73  if an opcode was
5f20: 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74   removed..*/.int
5f30: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
5f40: 74 65 50 72 69 6f 72 4f 70 63 6f 64 65 28 56 64  tePriorOpcode(Vd
5f50: 62 65 20 2a 70 2c 20 75 38 20 6f 70 29 7b 0a 20  be *p, u8 op){. 
5f60: 20 69 66 28 20 28 70 2d 3e 6e 4f 70 2d 31 29 3e   if( (p->nOp-1)>
5f70: 28 70 2d 3e 70 50 61 72 73 65 2d 3e 69 46 69 78  (p->pParse->iFix
5f80: 65 64 4f 70 29 20 26 26 20 70 2d 3e 61 4f 70 5b  edOp) && p->aOp[
5f90: 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65  p->nOp-1].opcode
5fa0: 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  ==op ){.    sqli
5fb0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
5fc0: 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70 2d 31 29  oop(p, p->nOp-1)
5fd0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
5fe0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
5ff0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 0;.  }.}../*
6000: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
6010: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f  alue of the P4 o
6020: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
6030: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
6040: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
6050: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65  ne is useful whe
6060: 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61  n a large progra
6070: 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d  m is loaded from
6080: 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72   a.** static arr
6090: 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ay using sqlite3
60a0: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75  VdbeAddOpList bu
60b0: 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b  t we want to mak
60c0: 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72  e a.** few minor
60d0: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
60e0: 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49  program..**.** I
60f0: 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20  f n>=0 then the 
6100: 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79  P4 operand is dy
6110: 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74  namic, meaning t
6120: 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a  hat a copy of.**
6130: 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d   the string is m
6140: 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ade into memory 
6150: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
6160: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
6170: 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d  ** A value of n=
6180: 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79  =0 means copy by
6190: 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f  tes of zP4 up to
61a0: 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74   and including t
61b0: 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c  he.** first null
61c0: 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74   byte.  If n>0 t
61d0: 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74  hen copy n+1 byt
61e0: 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 20 0a 2a  es of zP4..** .*
61f0: 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f  * Other values o
6200: 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20  f n (P4_STATIC, 
6210: 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29  P4_COLLSEQ etc.)
6220: 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a   indicate that z
6230: 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20  P4 points.** to 
6240: 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75  a string or stru
6250: 63 74 75 72 65 20 74 68 61 74 20 69 73 20 67 75  cture that is gu
6260: 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73  aranteed to exis
6270: 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69  t for the lifeti
6280: 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62  me of.** the Vdb
6290: 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65  e. In these case
62a0: 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f  s we can just co
62b0: 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a  py the pointer..
62c0: 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20  **.** If addr<0 
62d0: 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f  then change P4 o
62e0: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
62f0: 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73  tly inserted ins
6300: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
6310: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
6320: 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69  ngeP4(Vdbe *p, i
6330: 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63  nt addr, const c
6340: 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29  har *zP4, int n)
6350: 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73  {.  Op *pOp;.  s
6360: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73  qlite3 *db;.  as
6370: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
6380: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
6390: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
63a0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
63b0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d  );.  if( p->aOp=
63c0: 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
63d0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66  Failed ){.    if
63e0: 28 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 7b 0a  ( n!=P4_VTAB ){.
63f0: 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c        freeP4(db,
6400: 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61   n, (void*)*(cha
6410: 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 7d  r**)&zP4);.    }
6420: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
6430: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
6440: 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  p>0 );.  assert(
6450: 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a   addr<p->nOp );.
6460: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
6470: 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f      addr = p->nO
6480: 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70  p - 1;.  }.  pOp
6490: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
64a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
64b0: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4e 4f 54 55  >p4type==P4_NOTU
64c0: 53 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f  SED.       || pO
64d0: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e  p->p4type==P4_IN
64e0: 54 33 32 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f  T32.       || pO
64f0: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4b 45  p->p4type==P4_KE
6500: 59 49 4e 46 4f 20 29 3b 0a 20 20 66 72 65 65 50  YINFO );.  freeP
6510: 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70  4(db, pOp->p4typ
6520: 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20  e, pOp->p4.p);. 
6530: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a   pOp->p4.p = 0;.
6540: 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33    if( n==P4_INT3
6550: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65  2 ){.    /* Note
6560: 3a 20 74 68 69 73 20 63 61 73 74 20 69 73 20 73  : this cast is s
6570: 61 66 65 2c 20 62 65 63 61 75 73 65 20 74 68 65  afe, because the
6580: 20 6f 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69   origin data poi
6590: 6e 74 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20  nt was an int.  
65a0: 20 20 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61    ** that was ca
65b0: 73 74 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63  st to a (const c
65c0: 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70  har *). */.    p
65d0: 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54  Op->p4.i = SQLIT
65e0: 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34  E_PTR_TO_INT(zP4
65f0: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  );.    pOp->p4ty
6600: 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20  pe = P4_INT32;. 
6610: 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 34 3d 3d   }else if( zP4==
6620: 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  0 ){.    pOp->p4
6630: 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d  .p = 0;.    pOp-
6640: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54  >p4type = P4_NOT
6650: 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  USED;.  }else if
6660: 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20  ( n==P4_KEYINFO 
6670: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  ){.    pOp->p4.p
6680: 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20   = (void*)zP4;. 
6690: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
66a0: 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 23 69 66   P4_KEYINFO;.#if
66b0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
66c0: 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20  E_CURSOR_HINTS. 
66d0: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34   }else if( n==P4
66e0: 5f 45 58 50 52 20 29 7b 0a 20 20 20 20 2f 2a 20  _EXPR ){.    /* 
66f0: 52 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 66  Responsibility f
6700: 6f 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  or deleting the 
6710: 45 78 70 72 20 74 72 65 65 20 69 73 20 68 61 6e  Expr tree is han
6720: 64 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a  ded over to the.
6730: 20 20 20 20 2a 2a 20 56 44 42 45 20 62 79 20 74      ** VDBE by t
6740: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  his operation.  
6750: 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  The caller shoul
6760: 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 69  d have already i
6770: 6e 76 6f 6b 65 64 0a 20 20 20 20 2a 2a 20 73 71  nvoked.    ** sq
6780: 6c 69 74 65 33 45 78 70 72 44 75 70 28 29 20 6f  lite3ExprDup() o
6790: 72 20 77 68 61 74 65 76 65 72 20 6f 74 68 65 72  r whatever other
67a0: 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 65 64   routine is need
67b0: 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 0a 20 20  ed to make a .  
67c0: 20 20 2a 2a 20 70 72 69 76 61 74 65 20 63 6f 70    ** private cop
67d0: 79 20 6f 66 20 74 68 65 20 74 72 65 65 2e 20 2a  y of the tree. *
67e0: 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 45  /.    pOp->p4.pE
67f0: 78 70 72 20 3d 20 28 45 78 70 72 2a 29 7a 50 34  xpr = (Expr*)zP4
6800: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
6810: 65 20 3d 20 50 34 5f 45 58 50 52 3b 0a 23 65 6e  e = P4_EXPR;.#en
6820: 64 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  dif.  }else if( 
6830: 6e 3d 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20 20  n==P4_VTAB ){.  
6840: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76    pOp->p4.p = (v
6850: 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f  oid*)zP4;.    pO
6860: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 56  p->p4type = P4_V
6870: 54 41 42 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  TAB;.    sqlite3
6880: 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c 65  VtabLock((VTable
6890: 20 2a 29 7a 50 34 29 3b 0a 20 20 20 20 61 73 73   *)zP4);.    ass
68a0: 65 72 74 28 20 28 28 56 54 61 62 6c 65 20 2a 29  ert( ((VTable *)
68b0: 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62 20  zP4)->db==p->db 
68c0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  );.  }else if( n
68d0: 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70  <0 ){.    pOp->p
68e0: 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34  4.p = (void*)zP4
68f0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
6900: 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72  e = (signed char
6910: 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  )n;.  }else{.   
6920: 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20   if( n==0 ) n = 
6930: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
6940: 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  zP4);.    pOp->p
6950: 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 53  4.z = sqlite3DbS
6960: 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50  trNDup(p->db, zP
6970: 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  4, n);.    pOp->
6980: 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41  p4type = P4_DYNA
6990: 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  MIC;.  }.}../*.*
69a0: 2a 20 53 65 74 20 74 68 65 20 50 34 20 6f 6e 20  * Set the P4 on 
69b0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
69c0: 79 20 61 64 64 65 64 20 6f 70 63 6f 64 65 20 74  y added opcode t
69d0: 6f 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 66 6f  o the KeyInfo fo
69e0: 72 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 67  r the.** index g
69f0: 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  iven..*/.void sq
6a00: 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65  lite3VdbeSetP4Ke
6a10: 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61  yInfo(Parse *pPa
6a20: 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78  rse, Index *pIdx
6a30: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
6a40: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
6a50: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
6a60: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d    assert( pIdx!=
6a70: 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  0 );.  sqlite3Vd
6a80: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
6a90: 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  , (char*)sqlite3
6aa0: 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70  KeyInfoOfIndex(p
6ab0: 50 61 72 73 65 2c 20 70 49 64 78 29 2c 0a 20 20  Parse, pIdx),.  
6ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ad0: 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b      P4_KEYINFO);
6ae0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
6af0: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
6b00: 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20  _COMMENTS./*.** 
6b10: 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65  Change the comme
6b20: 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
6b30: 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e  ecently coded in
6b40: 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a  struction.  Or.*
6b50: 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70  * insert a No-op
6b60: 20 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d   and add the com
6b70: 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77  ment to that new
6b80: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54   instruction.  T
6b90: 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65  his.** makes the
6ba0: 20 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20   code easier to 
6bb0: 72 65 61 64 20 64 75 72 69 6e 67 20 64 65 62 75  read during debu
6bc0: 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20  gging.  None of 
6bd0: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20  this happens.** 
6be0: 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20  in a production 
6bf0: 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  build..*/.static
6c00: 20 76 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65   void vdbeVComme
6c10: 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  nt(Vdbe *p, cons
6c20: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
6c30: 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20   va_list ap){.  
6c40: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
6c50: 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b   || p->aOp==0 );
6c60: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f  .  assert( p->aO
6c70: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70  p==0 || p->aOp[p
6c80: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
6c90: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  t==0 || p->db->m
6ca0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
6cb0: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20   if( p->nOp ){. 
6cc0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f     assert( p->aO
6cd0: 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  p );.    sqlite3
6ce0: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  DbFree(p->db, p-
6cf0: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
6d00: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d  Comment);.    p-
6d10: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
6d20: 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65  Comment = sqlite
6d30: 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c  3VMPrintf(p->db,
6d40: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
6d50: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
6d60: 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62  3VdbeComment(Vdb
6d70: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
6d80: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
6d90: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
6da0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61   if( p ){.    va
6db0: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
6dc0: 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f  at);.    vdbeVCo
6dd0: 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74  mment(p, zFormat
6de0: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e  , ap);.    va_en
6df0: 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  d(ap);.  }.}.voi
6e00: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f  d sqlite3VdbeNoo
6e10: 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70  pComment(Vdbe *p
6e20: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
6e30: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
6e40: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28  a_list ap;.  if(
6e50: 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   p ){.    sqlite
6e60: 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f  3VdbeAddOp0(p, O
6e70: 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f  P_Noop);.    va_
6e80: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
6e90: 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d  t);.    vdbeVCom
6ea0: 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c  ment(p, zFormat,
6eb0: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64   ap);.    va_end
6ec0: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  (ap);.  }.}.#end
6ed0: 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f  if  /* NDEBUG */
6ee0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
6ef0: 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a  VDBE_COVERAGE./*
6f00: 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75  .** Set the valu
6f10: 65 20 69 66 20 74 68 65 20 69 53 72 63 4c 69 6e  e if the iSrcLin
6f20: 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20  e field for the 
6f30: 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 64 65 64  previously coded
6f40: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
6f50: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6f60: 65 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56  eSetLineNumber(V
6f70: 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e  dbe *v, int iLin
6f80: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e){.  sqlite3Vdb
6f90: 65 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53  eGetOp(v,-1)->iS
6fa0: 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a  rcLine = iLine;.
6fb0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
6fc0: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
6fd0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
6fe0: 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72  n the opcode for
6ff0: 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73   a given address
7000: 2e 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73  .  If the addres
7010: 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a  s is -1, then.**
7020: 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74   return the most
7030: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
7040: 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  ed opcode..**.**
7050: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
7060: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61  ocation error ha
7070: 73 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72  s occurred prior
7080: 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   to the calling 
7090: 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  of this.** routi
70a0: 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74  ne, then a point
70b0: 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64  er to a dummy Vd
70c0: 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74  beOp will be ret
70d0: 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63  urned.  That opc
70e0: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62  ode.** is readab
70f0: 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61  le but not writa
7100: 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69  ble, though it i
7110: 73 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74  s cast to a writ
7120: 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54  able value..** T
7130: 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64  he return of a d
7140: 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f  ummy opcode allo
7150: 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63  ws the call to c
7160: 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e  ontinue function
7170: 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 6e 20  ing.** after an 
7180: 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75  OOM fault withou
7190: 74 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63  t having to chec
71a0: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
71b0: 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20  return from .** 
71c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
71d0: 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
71e0: 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68    But because th
71f0: 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69  e dummy.opcode i
7200: 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69  s 0,.** dummy wi
7210: 6c 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74  ll never be writ
7220: 74 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73  ten to.  This is
7230: 20 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64   verified by cod
7240: 65 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64  e inspection and
7250: 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77  .** by running w
7260: 69 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f  ith Valgrind..*/
7270: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33  .VdbeOp *sqlite3
7280: 56 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a  VdbeGetOp(Vdbe *
7290: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
72a0: 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69 65 73  /* C89 specifies
72b0: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61   that the consta
72c0: 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20  nt "dummy" will 
72d0: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  be initialized t
72e0: 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73  o all.  ** zeros
72f0: 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72 72 65  , which is corre
7300: 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61  ct.  MSVC genera
7310: 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e  tes a warning, n
7320: 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a  evertheless. */.
7330: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
7340: 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72  dummy;  /* Ignor
7350: 65 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69  e the MSVC warni
7360: 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74  ng about no init
7370: 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73  ializer */.  ass
7380: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
7390: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
73a0: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
73b0: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
73c0: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61  nOp - 1;.  }.  a
73d0: 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20  ssert( (addr>=0 
73e0: 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20  && addr<p->nOp) 
73f0: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
7400: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
7410: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
7420: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
7430: 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d  n (VdbeOp*)&dumm
7440: 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
7450: 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61  return &p->aOp[a
7460: 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  ddr];.  }.}..#if
7470: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
7480: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
7490: 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52  OMMENTS)./*.** R
74a0: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
74b0: 20 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f   value for one o
74c0: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73  f the parameters
74d0: 20 74 6f 20 74 68 65 20 6f 70 63 6f 64 65 20 70   to the opcode p
74e0: 4f 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  Op.** determined
74f0: 20 62 79 20 63 68 61 72 61 63 74 65 72 20 63 2e   by character c.
7500: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
7510: 72 61 6e 73 6c 61 74 65 50 28 63 68 61 72 20 63  ranslateP(char c
7520: 2c 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29  , const Op *pOp)
7530: 7b 0a 20 20 69 66 28 20 63 3d 3d 27 31 27 20 29  {.  if( c=='1' )
7540: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b   return pOp->p1;
7550: 0a 20 20 69 66 28 20 63 3d 3d 27 32 27 20 29 20  .  if( c=='2' ) 
7560: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a  return pOp->p2;.
7570: 20 20 69 66 28 20 63 3d 3d 27 33 27 20 29 20 72    if( c=='3' ) r
7580: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20  eturn pOp->p3;. 
7590: 20 69 66 28 20 63 3d 3d 27 34 27 20 29 20 72 65   if( c=='4' ) re
75a0: 74 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a  turn pOp->p4.i;.
75b0: 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35    return pOp->p5
75c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
75d0: 74 65 20 61 20 73 74 72 69 6e 67 20 66 6f 72 20  te a string for 
75e0: 74 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69  the "comment" fi
75f0: 65 6c 64 20 6f 66 20 61 20 56 44 42 45 20 6f 70  eld of a VDBE op
7600: 63 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a  code listing..**
7610: 0a 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73 69 73  .** The Synopsis
7620: 3a 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65  : field in comme
7630: 6e 74 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e  nts in the vdbe.
7640: 63 20 73 6f 75 72 63 65 20 66 69 6c 65 20 67 65  c source file ge
7650: 74 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20  ts converted.** 
7660: 74 6f 20 61 6e 20 65 78 74 72 61 20 73 74 72 69  to an extra stri
7670: 6e 67 20 74 68 61 74 20 69 73 20 61 70 70 65 6e  ng that is appen
7680: 64 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74  ded to the sqlit
7690: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20  e3OpcodeName(). 
76a0: 20 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e   In the.** absen
76b0: 63 65 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d  ce of other comm
76c0: 65 6e 74 73 2c 20 74 68 69 73 20 73 79 6e 6f 70  ents, this synop
76d0: 73 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20  sis becomes the 
76e0: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f  comment on the o
76f0: 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74  pcode..** Some t
7700: 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72  ranslation occur
7710: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22  s:.**.**       "
7720: 50 58 22 20 20 20 20 20 20 2d 3e 20 20 22 72 5b  PX"      ->  "r[
7730: 58 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22 50 58  X]".**       "PX
7740: 40 50 59 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e  @PY"   ->  "r[X.
7750: 2e 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b  .X+Y-1]"  or "r[
7760: 78 5d 22 20 69 66 20 79 20 69 73 20 30 20 6f 72  x]" if y is 0 or
7770: 20 31 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40   1.**       "PX@
7780: 50 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e  PY+1" ->  "r[X..
7790: 58 2b 59 5d 22 20 20 20 20 6f 72 20 22 72 5b 78  X+Y]"    or "r[x
77a0: 5d 22 20 69 66 20 79 20 69 73 20 30 0a 2a 2a 20  ]" if y is 0.** 
77b0: 20 20 20 20 20 20 22 50 59 2e 2e 50 59 22 20 20        "PY..PY"  
77c0: 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20  ->  "r[X..Y]"   
77d0: 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20     or "r[x]" if 
77e0: 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69  y<=x.*/.static i
77f0: 6e 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e  nt displayCommen
7800: 74 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70  t(.  const Op *p
7810: 4f 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  Op,     /* The o
7820: 70 63 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d  pcode to be comm
7830: 65 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ented */.  const
7840: 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a   char *zP4,   /*
7850: 20 50 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61   Previously obta
7860: 69 6e 65 64 20 76 61 6c 75 65 20 66 6f 72 20 50  ined value for P
7870: 34 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65  4 */.  char *zTe
7880: 6d 70 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69  mp,       /* Wri
7890: 74 65 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  te result here *
78a0: 2f 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20 20 20  /.  int nTemp   
78b0: 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
78c0: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65  available in zTe
78d0: 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  mp[] */.){.  con
78e0: 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65  st char *zOpName
78f0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
7900: 7a 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74  zSynopsis;.  int
7910: 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20   nOpName;.  int 
7920: 69 69 2c 20 6a 6a 3b 0a 20 20 7a 4f 70 4e 61 6d  ii, jj;.  zOpNam
7930: 65 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  e = sqlite3Opcod
7940: 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64  eName(pOp->opcod
7950: 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d 20  e);.  nOpName = 
7960: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
7970: 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  zOpName);.  if( 
7980: 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b  zOpName[nOpName+
7990: 31 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 65  1] ){.    int se
79a0: 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 63  enCom = 0;.    c
79b0: 68 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e 6f  har c;.    zSyno
79c0: 70 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b  psis = zOpName +
79d0: 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a 20  = nOpName + 1;. 
79e0: 20 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20     for(ii=jj=0; 
79f0: 6a 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28 63  jj<nTemp-1 && (c
7a00: 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d   = zSynopsis[ii]
7a10: 29 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  )!=0; ii++){.   
7a20: 20 20 20 69 66 28 20 63 3d 3d 27 50 27 20 29 7b     if( c=='P' ){
7a30: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 53 79  .        c = zSy
7a40: 6e 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20  nopsis[++ii];.  
7a50: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 34 27        if( c=='4'
7a60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
7a70: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
7a80: 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a  Temp-jj, zTemp+j
7a90: 6a 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a 20  j, "%s", zP4);. 
7aa0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
7ab0: 20 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20 20   c=='X' ){.     
7ac0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
7ad0: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20  rintf(nTemp-jj, 
7ae0: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20  zTemp+jj, "%s", 
7af0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a  pOp->zComment);.
7b00: 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 43 6f            seenCo
7b10: 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  m = 1;.        }
7b20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
7b30: 69 6e 74 20 76 31 20 3d 20 74 72 61 6e 73 6c 61  int v1 = transla
7b40: 74 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20 20  teP(c, pOp);.   
7b50: 20 20 20 20 20 20 20 69 6e 74 20 76 32 3b 0a 20         int v2;. 
7b60: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7b70: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d  _snprintf(nTemp-
7b80: 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25  jj, zTemp+jj, "%
7b90: 64 22 2c 20 76 31 29 3b 0a 20 20 20 20 20 20 20  d", v1);.       
7ba0: 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a     if( strncmp(z
7bb0: 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22  Synopsis+ii+1, "
7bc0: 40 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20 20  @P", 2)==0 ){.  
7bd0: 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20            ii += 
7be0: 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  3;.            j
7bf0: 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  j += sqlite3Strl
7c00: 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a  en30(zTemp+jj);.
7c10: 20 20 20 20 20 20 20 20 20 20 20 20 76 32 20 3d              v2 =
7c20: 20 74 72 61 6e 73 6c 61 74 65 50 28 7a 53 79 6e   translateP(zSyn
7c30: 6f 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29 3b  opsis[ii], pOp);
7c40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
7c50: 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73   strncmp(zSynops
7c60: 69 73 2b 69 69 2b 31 2c 22 2b 31 22 2c 32 29 3d  is+ii+1,"+1",2)=
7c70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
7c80: 20 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20 20      ii += 2;.   
7c90: 20 20 20 20 20 20 20 20 20 20 20 76 32 2b 2b 3b             v2++;
7ca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
7cb0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76             if( v
7cc0: 32 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  2>1 ){.         
7cd0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
7ce0: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20  rintf(nTemp-jj, 
7cf0: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22  zTemp+jj, "..%d"
7d00: 2c 20 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20 20  , v1+v2-1);.    
7d10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7d20: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
7d30: 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b  rncmp(zSynopsis+
7d40: 69 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34 29  ii+1, "..P3", 4)
7d50: 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d  ==0 && pOp->p3==
7d60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
7d70: 20 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20   ii += 4;.      
7d80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
7d90: 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71          jj += sq
7da0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
7db0: 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 7d  emp+jj);.      }
7dc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54  else{.        zT
7dd0: 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20  emp[jj++] = c;. 
7de0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
7df0: 20 69 66 28 20 21 73 65 65 6e 43 6f 6d 20 26 26   if( !seenCom &&
7e00: 20 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20 70   jj<nTemp-5 && p
7e10: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a  Op->zComment ){.
7e20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
7e30: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
7e40: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73   zTemp+jj, "; %s
7e50: 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  ", pOp->zComment
7e60: 29 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73  );.      jj += s
7e70: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
7e80: 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a  Temp+jj);.    }.
7e90: 20 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d 70      if( jj<nTemp
7ea0: 20 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30   ) zTemp[jj] = 0
7eb0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f  ;.  }else if( pO
7ec0: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20  p->zComment ){. 
7ed0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
7ee0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
7ef0: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f  , "%s", pOp->zCo
7f00: 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20 3d  mment);.    jj =
7f10: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
7f20: 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65  (zTemp);.  }else
7f30: 7b 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d  {.    zTemp[0] =
7f40: 20 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b 0a   0;.    jj = 0;.
7f50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a 3b    }.  return jj;
7f60: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
7f70: 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69  ITE_DEBUG */..#i
7f80: 66 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50  f VDBE_DISPLAY_P
7f90: 34 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  4 && defined(SQL
7fa0: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
7fb0: 52 5f 48 49 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 54  R_HINTS)./*.** T
7fc0: 72 61 6e 73 6c 61 74 65 20 74 68 65 20 50 34 2e  ranslate the P4.
7fd0: 70 45 78 70 72 20 76 61 6c 75 65 20 66 6f 72 20  pExpr value for 
7fe0: 61 6e 20 4f 50 5f 43 75 72 73 6f 72 48 69 6e 74  an OP_CursorHint
7ff0: 20 6f 70 63 6f 64 65 20 69 6e 74 6f 20 74 65 78   opcode into tex
8000: 74 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 65  t.** that can be
8010: 20 64 69 73 70 6c 61 79 65 64 20 69 6e 20 74 68   displayed in th
8020: 65 20 50 34 20 63 6f 6c 75 6d 6e 20 6f 66 20 45  e P4 column of E
8030: 58 50 4c 41 49 4e 20 6f 75 74 70 75 74 2e 0a 2a  XPLAIN output..*
8040: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69 73  /.static int dis
8050: 70 6c 61 79 50 34 45 78 70 72 28 69 6e 74 20 6e  playP4Expr(int n
8060: 54 65 6d 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d  Temp, char *zTem
8070: 70 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  p, Expr *pExpr){
8080: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8090: 4f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 3b  Op = 0;.  int n;
80a0: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
80b0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
80c0: 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20   TK_STRING:.    
80d0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
80e0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
80f0: 20 22 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e   "%Q", pExpr->u.
8100: 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62  zToken);.      b
8110: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8120: 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 20  K_INTEGER:.     
8130: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
8140: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
8150: 22 25 64 22 2c 20 70 45 78 70 72 2d 3e 75 2e 69  "%d", pExpr->u.i
8160: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72  Value);.      br
8170: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8180: 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 73 71 6c  _NULL:.      sql
8190: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
81a0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 4e 55 4c  emp, zTemp, "NUL
81b0: 4c 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  L");.      break
81c0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  ;.    case TK_RE
81d0: 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  GISTER: {.      
81e0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
81f0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
8200: 72 5b 25 64 5d 22 2c 20 70 45 78 70 72 2d 3e 69  r[%d]", pExpr->i
8210: 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72  Table);.      br
8220: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
8230: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
8240: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
8250: 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
8260: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
8270: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
8280: 54 65 6d 70 2c 20 22 72 6f 77 69 64 22 29 3b 0a  Temp, "rowid");.
8290: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
82a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
82b0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
82c0: 6d 70 2c 20 22 63 25 64 22 2c 20 28 69 6e 74 29  mp, "c%d", (int)
82d0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
82e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
82f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
8300: 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20  case TK_LT:     
8310: 20 7a 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20 20   zOp = "LT";    
8320: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8330: 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 4f  e TK_LE:      zO
8340: 70 20 3d 20 22 4c 45 22 3b 20 20 20 20 20 20 62  p = "LE";      b
8350: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8360: 4b 5f 47 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_GT:      zOp =
8370: 20 22 47 54 22 3b 20 20 20 20 20 20 62 72 65 61   "GT";      brea
8380: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  k;.    case TK_G
8390: 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 47  E:      zOp = "G
83a0: 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  E";      break;.
83b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20      case TK_NE: 
83c0: 20 20 20 20 20 7a 4f 70 20 3d 20 22 4e 45 22 3b       zOp = "NE";
83d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
83e0: 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20   case TK_EQ:    
83f0: 20 20 7a 4f 70 20 3d 20 22 45 51 22 3b 20 20 20    zOp = "EQ";   
8400: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8410: 73 65 20 54 4b 5f 49 53 3a 20 20 20 20 20 20 7a  se TK_IS:      z
8420: 4f 70 20 3d 20 22 49 53 22 3b 20 20 20 20 20 20  Op = "IS";      
8430: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8440: 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 7a 4f 70 20  TK_ISNOT:   zOp 
8450: 3d 20 22 49 53 4e 4f 54 22 3b 20 20 20 62 72 65  = "ISNOT";   bre
8460: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8470: 41 4e 44 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22  AND:     zOp = "
8480: 41 4e 44 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  AND";     break;
8490: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
84a0: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4f 52 22        zOp = "OR"
84b0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
84c0: 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20    case TK_PLUS: 
84d0: 20 20 20 7a 4f 70 20 3d 20 22 41 44 44 22 3b 20     zOp = "ADD"; 
84e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
84f0: 61 73 65 20 54 4b 5f 53 54 41 52 3a 20 20 20 20  ase TK_STAR:    
8500: 7a 4f 70 20 3d 20 22 4d 55 4c 22 3b 20 20 20 20  zOp = "MUL";    
8510: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8520: 20 54 4b 5f 4d 49 4e 55 53 3a 20 20 20 7a 4f 70   TK_MINUS:   zOp
8530: 20 3d 20 22 53 55 42 22 3b 20 20 20 20 20 62 72   = "SUB";     br
8540: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8550: 5f 52 45 4d 3a 20 20 20 20 20 7a 4f 70 20 3d 20  _REM:     zOp = 
8560: 22 52 45 4d 22 3b 20 20 20 20 20 62 72 65 61 6b  "REM";     break
8570: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  ;.    case TK_BI
8580: 54 41 4e 44 3a 20 20 7a 4f 70 20 3d 20 22 42 49  TAND:  zOp = "BI
8590: 54 41 4e 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20  TAND";  break;. 
85a0: 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52     case TK_BITOR
85b0: 3a 20 20 20 7a 4f 70 20 3d 20 22 42 49 54 4f 52  :   zOp = "BITOR
85c0: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
85d0: 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20  case TK_SLASH:  
85e0: 20 7a 4f 70 20 3d 20 22 44 49 56 22 3b 20 20 20   zOp = "DIV";   
85f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8600: 65 20 54 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 4f  e TK_LSHIFT:  zO
8610: 70 20 3d 20 22 4c 53 48 49 46 54 22 3b 20 20 62  p = "LSHIFT";  b
8620: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8630: 4b 5f 52 53 48 49 46 54 3a 20 20 7a 4f 70 20 3d  K_RSHIFT:  zOp =
8640: 20 22 52 53 48 49 46 54 22 3b 20 20 62 72 65 61   "RSHIFT";  brea
8650: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  k;.    case TK_C
8660: 4f 4e 43 41 54 3a 20 20 7a 4f 70 20 3d 20 22 43  ONCAT:  zOp = "C
8670: 4f 4e 43 41 54 22 3b 20 20 62 72 65 61 6b 3b 0a  ONCAT";  break;.
8680: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e      case TK_UMIN
8690: 55 53 3a 20 20 7a 4f 70 20 3d 20 22 4d 49 4e 55  US:  zOp = "MINU
86a0: 53 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  S";   break;.   
86b0: 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20   case TK_UPLUS: 
86c0: 20 20 7a 4f 70 20 3d 20 22 50 4c 55 53 22 3b 20    zOp = "PLUS"; 
86d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
86e0: 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 7a  se TK_BITNOT:  z
86f0: 4f 70 20 3d 20 22 42 49 54 4e 4f 54 22 3b 20 20  Op = "BITNOT";  
8700: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8710: 54 4b 5f 4e 4f 54 3a 20 20 20 20 20 7a 4f 70 20  TK_NOT:     zOp 
8720: 3d 20 22 4e 4f 54 22 3b 20 20 20 20 20 62 72 65  = "NOT";     bre
8730: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8740: 49 53 4e 55 4c 4c 3a 20 20 7a 4f 70 20 3d 20 22  ISNULL:  zOp = "
8750: 49 53 4e 55 4c 4c 22 3b 20 20 62 72 65 61 6b 3b  ISNULL";  break;
8760: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
8770: 4e 55 4c 4c 3a 20 7a 4f 70 20 3d 20 22 4e 4f 54  NULL: zOp = "NOT
8780: 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a 20  NULL"; break;.. 
8790: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
87a0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
87b0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
87c0: 20 22 25 73 22 2c 20 22 65 78 70 72 22 29 3b 0a   "%s", "expr");.
87d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
87e0: 0a 0a 20 20 69 66 28 20 7a 4f 70 20 29 7b 0a 20  ..  if( zOp ){. 
87f0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
8800: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
8810: 2c 20 22 25 73 28 22 2c 20 7a 4f 70 29 3b 0a 20  , "%s(", zOp);. 
8820: 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74     n = sqlite3St
8830: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20  rlen30(zTemp);. 
8840: 20 20 20 6e 20 2b 3d 20 64 69 73 70 6c 61 79 50     n += displayP
8850: 34 45 78 70 72 28 6e 54 65 6d 70 2d 6e 2c 20 7a  4Expr(nTemp-n, z
8860: 54 65 6d 70 2b 6e 2c 20 70 45 78 70 72 2d 3e 70  Temp+n, pExpr->p
8870: 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 6e  Left);.    if( n
8880: 3c 6e 54 65 6d 70 2d 31 20 26 26 20 70 45 78 70  <nTemp-1 && pExp
8890: 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20  r->pRight ){.   
88a0: 20 20 20 7a 54 65 6d 70 5b 6e 2b 2b 5d 20 3d 20     zTemp[n++] = 
88b0: 27 2c 27 3b 0a 20 20 20 20 20 20 6e 20 2b 3d 20  ',';.      n += 
88c0: 64 69 73 70 6c 61 79 50 34 45 78 70 72 28 6e 54  displayP4Expr(nT
88d0: 65 6d 70 2d 6e 2c 20 7a 54 65 6d 70 2b 6e 2c 20  emp-n, zTemp+n, 
88e0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
88f0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
8900: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
8910: 2d 6e 2c 20 7a 54 65 6d 70 2b 6e 2c 20 22 29 22  -n, zTemp+n, ")"
8920: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
8930: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
8940: 7a 54 65 6d 70 29 3b 0a 7d 0a 23 65 6e 64 69 66  zTemp);.}.#endif
8950: 20 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c 41 59   /* VDBE_DISPLAY
8960: 5f 50 34 20 26 26 20 64 65 66 69 6e 65 64 28 53  _P4 && defined(S
8970: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
8980: 53 4f 52 5f 48 49 4e 54 53 29 20 2a 2f 0a 0a 0a  SOR_HINTS) */...
8990: 23 69 66 20 56 44 42 45 5f 44 49 53 50 4c 41 59  #if VDBE_DISPLAY
89a0: 5f 50 34 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  _P4./*.** Comput
89b0: 65 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  e a string that 
89c0: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 50 34  describes the P4
89d0: 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
89e0: 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65  n opcode..** Use
89f0: 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72   zTemp for any r
8a00: 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72  equired temporar
8a10: 79 20 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a  y buffer space..
8a20: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
8a30: 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f  displayP4(Op *pO
8a40: 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20  p, char *zTemp, 
8a50: 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68  int nTemp){.  ch
8a60: 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b  ar *zP4 = zTemp;
8a70: 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d 70  .  assert( nTemp
8a80: 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74 63 68  >=20 );.  switch
8a90: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b  ( pOp->p4type ){
8aa0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59  .    case P4_KEY
8ab0: 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e  INFO: {.      in
8ac0: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65  t i, j;.      Ke
8ad0: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
8ae0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e  = pOp->p4.pKeyIn
8af0: 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  fo;.      assert
8b00: 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
8b10: 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20  tOrder!=0 );.   
8b20: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
8b30: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
8b40: 2c 20 22 6b 28 25 64 22 2c 20 70 4b 65 79 49 6e  , "k(%d", pKeyIn
8b50: 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20  fo->nField);.   
8b60: 20 20 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74     i = sqlite3St
8b70: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20  rlen30(zTemp);. 
8b80: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
8b90: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
8ba0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
8bb0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
8bc0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
8bd0: 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  [j];.        con
8be0: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d  st char *zColl =
8bf0: 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e   pColl ? pColl->
8c00: 7a 4e 61 6d 65 20 3a 20 22 6e 69 6c 22 3b 0a 20  zName : "nil";. 
8c10: 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73         int n = s
8c20: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
8c30: 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  Coll);.        i
8c40: 66 28 20 6e 3d 3d 36 20 26 26 20 6d 65 6d 63 6d  f( n==6 && memcm
8c50: 70 28 7a 43 6f 6c 6c 2c 22 42 49 4e 41 52 59 22  p(zColl,"BINARY"
8c60: 2c 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,6)==0 ){.      
8c70: 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 22 42 22 3b      zColl = "B";
8c80: 0a 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 31  .          n = 1
8c90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8ca0: 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d      if( i+n>nTem
8cb0: 70 2d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20  p-7 ){.         
8cc0: 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69   memcpy(&zTemp[i
8cd0: 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20  ],",...",4);.   
8ce0: 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20         i += 4;. 
8cf0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
8d00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8d10: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
8d20: 2c 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ,';.        if( 
8d30: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
8d40: 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20  rder[j] ){.     
8d50: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
8d60: 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 7d  = '-';.        }
8d70: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
8d80: 26 7a 54 65 6d 70 5b 69 5d 2c 20 7a 43 6f 6c 6c  &zTemp[i], zColl
8d90: 2c 20 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , n+1);.        
8da0: 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a  i += n;.      }.
8db0: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
8dc0: 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54   = ')';.      zT
8dd0: 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[i] = 0;.    
8de0: 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d    assert( i<nTem
8df0: 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p );.      break
8e00: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
8e10: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
8e20: 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20 63 61  SOR_HINTS.    ca
8e30: 73 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20  se P4_EXPR: {.  
8e40: 20 20 20 20 64 69 73 70 6c 61 79 50 34 45 78 70      displayP4Exp
8e50: 72 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  r(nTemp, zTemp, 
8e60: 70 4f 70 2d 3e 70 34 2e 70 45 78 70 72 29 3b 0a  pOp->p4.pExpr);.
8e70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8e80: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
8e90: 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b  se P4_COLLSEQ: {
8ea0: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
8eb0: 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e  pColl = pOp->p4.
8ec0: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c  pColl;.      sql
8ed0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
8ee0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 28 25 2e  emp, zTemp, "(%.
8ef0: 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e  20s)", pColl->zN
8f00: 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ame);.      brea
8f10: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
8f20: 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a  e P4_FUNCDEF: {.
8f30: 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
8f40: 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46  Def = pOp->p4.pF
8f50: 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  unc;.      sqlit
8f60: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
8f70: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 25 64  p, zTemp, "%s(%d
8f80: 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c  )", pDef->zName,
8f90: 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20   pDef->nArg);.  
8fa0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8fb0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
8fc0: 45 42 55 47 0a 20 20 20 20 63 61 73 65 20 50 34  EBUG.    case P4
8fd0: 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20  _FUNCCTX: {.    
8fe0: 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20    FuncDef *pDef 
8ff0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78 2d 3e  = pOp->p4.pCtx->
9000: 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c  pFunc;.      sql
9010: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
9020: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28  emp, zTemp, "%s(
9030: 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d  %d)", pDef->zNam
9040: 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a  e, pDef->nArg);.
9050: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9060: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
9070: 73 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20  se P4_INT64: {. 
9080: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
9090: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
90a0: 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70  mp, "%lld", *pOp
90b0: 2d 3e 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20  ->p4.pI64);.    
90c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
90d0: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32     case P4_INT32
90e0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
90f0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
9100: 2c 20 7a 54 65 6d 70 2c 20 22 25 64 22 2c 20 70  , zTemp, "%d", p
9110: 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20  Op->p4.i);.     
9120: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9130: 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 20    case P4_REAL: 
9140: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
9150: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
9160: 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20  zTemp, "%.16g", 
9170: 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b  *pOp->p4.pReal);
9180: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9190: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
91a0: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d  MEM: {.      Mem
91b0: 20 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34   *pMem = pOp->p4
91c0: 2e 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28  .pMem;.      if(
91d0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
91e0: 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20  EM_Str ){.      
91f0: 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b    zP4 = pMem->z;
9200: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
9210: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
9220: 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20  EM_Int ){.      
9230: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
9240: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
9250: 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75   "%lld", pMem->u
9260: 2e 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .i);.      }else
9270: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
9280: 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20   & MEM_Real ){. 
9290: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
92a0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
92b0: 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 70  Temp, "%.16g", p
92c0: 4d 65 6d 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20  Mem->u.r);.     
92d0: 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d   }else if( pMem-
92e0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
92f0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
9300: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
9310: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 4e 55 4c  emp, zTemp, "NUL
9320: 4c 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  L");.      }else
9330: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
9340: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
9350: 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20  MEM_Blob );.    
9360: 20 20 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62      zP4 = "(blob
9370: 29 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  )";.      }.    
9380: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
9390: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
93a0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
93b0: 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42      case P4_VTAB
93c0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
93d0: 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20  3_vtab *pVtab = 
93e0: 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70  pOp->p4.pVtab->p
93f0: 56 74 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69  Vtab;.      sqli
9400: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
9410: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 76 74 61 62  mp, zTemp, "vtab
9420: 3a 25 70 22 2c 20 70 56 74 61 62 29 3b 0a 20 20  :%p", pVtab);.  
9430: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9440: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
9450: 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a   P4_INTARRAY: {.
9460: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
9470: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
9480: 65 6d 70 2c 20 22 69 6e 74 61 72 72 61 79 22 29  emp, "intarray")
9490: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
94a0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
94b0: 5f 53 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20  _SUBPROGRAM: {. 
94c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
94d0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
94e0: 6d 70 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a  mp, "program");.
94f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9500: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 41   }.    case P4_A
9510: 44 56 41 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20  DVANCE: {.      
9520: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20  zTemp[0] = 0;.  
9530: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9540: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
9550: 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d        zP4 = pOp-
9560: 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28  >p4.z;.      if(
9570: 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20   zP4==0 ){.     
9580: 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a     zP4 = zTemp;.
9590: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d          zTemp[0]
95a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
95b0: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
95c0: 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65  ( zP4!=0 );.  re
95d0: 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64  turn zP4;.}.#end
95e0: 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c  if /* VDBE_DISPL
95f0: 41 59 5f 50 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  AY_P4 */../*.** 
9600: 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56  Declare to the V
9610: 64 62 65 20 74 68 61 74 20 74 68 65 20 42 54 72  dbe that the BTr
9620: 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d  ee object at db-
9630: 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e  >aDb[i] is used.
9640: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70 61  .**.** The prepa
9650: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6e  red statements n
9660: 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e 20 61  eed to know in a
9670: 64 76 61 6e 63 65 20 74 68 65 20 63 6f 6d 70 6c  dvance the compl
9680: 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20 61 74  ete set of.** at
9690: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
96a0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
96b0: 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20 74 68  e.  A mask of th
96c0: 65 73 65 20 64 61 74 61 62 61 73 65 73 0a 2a 2a  ese databases.**
96d0: 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 69   is maintained i
96e0: 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2e 20  n p->btreeMask. 
96f0: 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b   The p->lockMask
9700: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 75   value is the su
9710: 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62 74  bset of.** p->bt
9720: 72 65 65 4d 61 73 6b 20 6f 66 20 64 61 74 61 62  reeMask of datab
9730: 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 72  ases that will r
9740: 65 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e 0a 2a  equire a lock..*
9750: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
9760: 62 65 55 73 65 73 42 74 72 65 65 28 56 64 62 65  beUsesBtree(Vdbe
9770: 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61   *p, int i){.  a
9780: 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
9790: 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69  <p->db->nDb && i
97a0: 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 79 44 62  <(int)sizeof(yDb
97b0: 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73  Mask)*8 );.  ass
97c0: 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a 65  ert( i<(int)size
97d0: 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29  of(p->btreeMask)
97e0: 2a 38 20 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65  *8 );.  DbMaskSe
97f0: 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20  t(p->btreeMask, 
9800: 69 29 3b 0a 20 20 69 66 28 20 69 21 3d 31 20 26  i);.  if( i!=1 &
9810: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 68  & sqlite3BtreeSh
9820: 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e 61 44  arable(p->db->aD
9830: 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20  b[i].pBt) ){.   
9840: 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 6c 6f   DbMaskSet(p->lo
9850: 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 7d 0a  ckMask, i);.  }.
9860: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
9870: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
9880: 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c  ED_CACHE) && SQL
9890: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30  ITE_THREADSAFE>0
98a0: 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65  ./*.** If SQLite
98b0: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20   is compiled to 
98c0: 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63  support shared-c
98d0: 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74 6f  ache mode and to
98e0: 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2c 0a   be threadsafe,.
98f0: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
9900: 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74 65  obtains the mute
9910: 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
9920: 68 20 65 61 63 68 20 42 74 53 68 61 72 65 64 20  h each BtShared 
9930: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68 61  structure.** tha
9940: 74 20 6d 61 79 20 62 65 20 61 63 63 65 73 73 65  t may be accesse
9950: 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73  d by the VM pass
9960: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
9970: 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20 69  t. In doing so i
9980: 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73 20 74  t also.** sets t
9990: 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 6d  he BtShared.db m
99a0: 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20 6f 66  ember of each of
99b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74   the BtShared st
99c0: 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75 72 69  ructures, ensuri
99d0: 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  ng.** that the c
99e0: 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61 6e 64  orrect busy-hand
99f0: 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73 20  ler callback is 
9a00: 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71 75 69  invoked if requi
9a10: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  red..**.** If SQ
9a20: 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65  Lite is not thre
9a30: 61 64 73 61 66 65 20 62 75 74 20 64 6f 65 73 20  adsafe but does 
9a40: 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63  support shared-c
9a50: 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 0a  ache mode, then.
9a60: 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  ** sqlite3BtreeE
9a70: 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f 6b 65  nter() is invoke
9a80: 64 20 74 6f 20 73 65 74 20 74 68 65 20 42 74 53  d to set the BtS
9a90: 68 61 72 65 64 2e 64 62 20 76 61 72 69 61 62 6c  hared.db variabl
9aa0: 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20  es.** of all of 
9ab0: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
9ac0: 72 65 73 20 61 63 63 65 73 73 69 62 6c 65 20 76  res accessible v
9ad0: 69 61 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ia the database 
9ae0: 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63  handle .** assoc
9af0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
9b00: 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  M..**.** If SQLi
9b10: 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64  te is not thread
9b20: 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f  safe and does no
9b30: 74 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  t support shared
9b40: 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 69  -cache mode, thi
9b50: 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  s.** function is
9b60: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
9b70: 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b  The p->btreeMask
9b80: 20 66 69 65 6c 64 20 69 73 20 61 20 62 69 74 6d   field is a bitm
9b90: 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72 65 65  ask of all btree
9ba0: 73 20 74 68 61 74 20 74 68 65 20 70 72 65 70 61  s that the prepa
9bb0: 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  red .** statemen
9bc0: 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20 75 73  t p will ever us
9bd0: 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74 68 65  e.  Let N be the
9be0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20   number of bits 
9bf0: 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 0a  in p->btreeMask.
9c00: 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
9c10: 20 74 6f 20 62 74 72 65 65 73 20 74 68 61 74 20   to btrees that 
9c20: 75 73 65 20 73 68 61 72 65 64 20 63 61 63 68 65  use shared cache
9c30: 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75 6e 74  .  Then the runt
9c40: 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20 72  ime of.** this r
9c50: 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e 20 20  outine is N*N.  
9c60: 42 75 74 20 61 73 20 4e 20 69 73 20 72 61 72 65  But as N is rare
9c70: 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31 2c 20  ly more than 1, 
9c80: 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 0a  this should not.
9c90: 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e  ** be a problem.
9ca0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9cb0: 56 64 62 65 45 6e 74 65 72 28 56 64 62 65 20 2a  VdbeEnter(Vdbe *
9cc0: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  p){.  int i;.  s
9cd0: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62  qlite3 *db;.  Db
9ce0: 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62   *aDb;.  int nDb
9cf0: 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41 6c  ;.  if( DbMaskAl
9d00: 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73  lZero(p->lockMas
9d10: 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  k) ) return;  /*
9d20: 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   The common case
9d30: 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62   */.  db = p->db
9d40: 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44  ;.  aDb = db->aD
9d50: 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e  b;.  nDb = db->n
9d60: 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  Db;.  for(i=0; i
9d70: 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nDb; i++){.    
9d80: 69 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d 61  if( i!=1 && DbMa
9d90: 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61  skTest(p->lockMa
9da0: 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53 28  sk,i) && ALWAYS(
9db0: 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29  aDb[i].pBt!=0) )
9dc0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
9dd0: 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b 69 5d  treeEnter(aDb[i]
9de0: 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  .pBt);.    }.  }
9df0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .}.#endif..#if !
9e00: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
9e10: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
9e20: 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45  ) && SQLITE_THRE
9e30: 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55  ADSAFE>0./*.** U
9e40: 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65  nlock all of the
9e50: 20 62 74 72 65 65 73 20 70 72 65 76 69 6f 75 73   btrees previous
9e60: 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61 20 63  ly locked by a c
9e70: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64  all to sqlite3Vd
9e80: 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a 73 74  beEnter()..*/.st
9e90: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
9ea0: 4c 49 4e 45 20 76 6f 69 64 20 76 64 62 65 4c 65  LINE void vdbeLe
9eb0: 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ave(Vdbe *p){.  
9ec0: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
9ed0: 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b   *db;.  Db *aDb;
9ee0: 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 64 62  .  int nDb;.  db
9ef0: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20   = p->db;.  aDb 
9f00: 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62  = db->aDb;.  nDb
9f10: 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f   = db->nDb;.  fo
9f20: 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b  r(i=0; i<nDb; i+
9f30: 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31  +){.    if( i!=1
9f40: 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28 70   && DbMaskTest(p
9f50: 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26  ->lockMask,i) &&
9f60: 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70   ALWAYS(aDb[i].p
9f70: 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  Bt!=0) ){.      
9f80: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
9f90: 65 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20  e(aDb[i].pBt);. 
9fa0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20     }.  }.}.void 
9fb0: 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
9fc0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28  (Vdbe *p){.  if(
9fd0: 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70   DbMaskAllZero(p
9fe0: 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65  ->lockMask) ) re
9ff0: 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f  turn;  /* The co
a000: 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 76  mmon case */.  v
a010: 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 7d 0a 23  dbeLeave(p);.}.#
a020: 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
a030: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
a040: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
a050: 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20  TE_DEBUG)./*.** 
a060: 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f  Print a single o
a070: 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75  pcode.  This rou
a080: 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
a090: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
a0a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
a0b0: 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45  VdbePrintOp(FILE
a0c0: 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20   *pOut, int pc, 
a0d0: 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72  Op *pOp){.  char
a0e0: 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50   *zP4;.  char zP
a0f0: 74 72 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20 7a  tr[50];.  char z
a100: 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74  Com[100];.  stat
a110: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ic const char *z
a120: 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25  Format1 = "%4d %
a130: 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 34 64  -13s %4d %4d %4d
a140: 20 25 2d 31 33 73 20 25 2e 32 58 20 25 73 5c 6e   %-13s %.2X %s\n
a150: 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30  ";.  if( pOut==0
a160: 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74   ) pOut = stdout
a170: 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61  ;.  zP4 = displa
a180: 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73  yP4(pOp, zPtr, s
a190: 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 23 69  izeof(zPtr));.#i
a1a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
a1b0: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
a1c0: 4e 54 53 0a 20 20 64 69 73 70 6c 61 79 43 6f 6d  NTS.  displayCom
a1d0: 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 7a  ment(pOp, zP4, z
a1e0: 43 6f 6d 2c 20 73 69 7a 65 6f 66 28 7a 43 6f 6d  Com, sizeof(zCom
a1f0: 29 29 3b 0a 23 65 6c 73 65 0a 20 20 7a 43 6f 6d  ));.#else.  zCom
a200: 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  [0] = 0;.#endif.
a210: 20 20 2f 2a 20 4e 42 3a 20 20 54 68 65 20 73 71    /* NB:  The sq
a220: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
a230: 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d  ) function is im
a240: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 6f 64  plemented by cod
a250: 65 20 63 72 65 61 74 65 64 0a 20 20 2a 2a 20 62  e created.  ** b
a260: 79 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  y the mkopcodeh.
a270: 61 77 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f 64 65  awk and mkopcode
a280: 63 2e 61 77 6b 20 73 63 72 69 70 74 73 20 77 68  c.awk scripts wh
a290: 69 63 68 20 65 78 74 72 61 63 74 20 74 68 65 0a  ich extract the.
a2a0: 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e    ** information
a2b0: 20 66 72 6f 6d 20 74 68 65 20 76 64 62 65 2e 63   from the vdbe.c
a2c0: 20 73 6f 75 72 63 65 20 74 65 78 74 20 2a 2f 0a   source text */.
a2d0: 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20    fprintf(pOut, 
a2e0: 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20  zFormat1, pc, . 
a2f0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f       sqlite3Opco
a300: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
a310: 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f  de), pOp->p1, pO
a320: 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20  p->p2, pOp->p3, 
a330: 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20 20  zP4, pOp->p5,.  
a340: 20 20 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20      zCom.  );.  
a350: 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a  fflush(pOut);.}.
a360: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
a370: 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f  lease an array o
a380: 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73  f N Mem elements
a390: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a3a0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
a3b0: 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  Mem *p, int N){.
a3c0: 20 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a    if( p && N ){.
a3d0: 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 20 3d 20      Mem *pEnd = 
a3e0: 26 70 5b 4e 5d 3b 0a 20 20 20 20 73 71 6c 69 74  &p[N];.    sqlit
a3f0: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
a400: 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f 66 61      u8 malloc_fa
a410: 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f  iled = db->mallo
a420: 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 69 66 28  cFailed;.    if(
a430: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
a440: 64 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20  d ){.      do{. 
a450: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 7a         if( p->sz
a460: 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33  Malloc ) sqlite3
a470: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d  DbFree(db, p->zM
a480: 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d 77  alloc);.      }w
a490: 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64  hile( (++p)<pEnd
a4a0: 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
a4b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a  ;.    }.    do{.
a4c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 26        assert( (&
a4d0: 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70  p[1])==pEnd || p
a4e0: 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20  [0].db==p[1].db 
a4f0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a500: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
a510: 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 70  kMemInvariants(p
a520: 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54  ) );..      /* T
a530: 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61  his block is rea
a540: 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76  lly an inlined v
a550: 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  ersion of sqlite
a560: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
a570: 29 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  ).      ** that 
a580: 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20  takes advantage 
a590: 6f 66 20 74 68 65 20 66 61 63 74 20 74 68 61 74  of the fact that
a5a0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
a5b0: 20 76 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20   value is .     
a5c0: 20 2a 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f   ** being set to
a5d0: 20 4e 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65   NULL after rele
a5e0: 61 73 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69  asing any dynami
a5f0: 63 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20  c resources..   
a600: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
a610: 68 65 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e  he justification
a620: 20 66 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67   for duplicating
a630: 20 63 6f 64 65 20 69 73 20 74 68 61 74 20 61 63   code is that ac
a640: 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20  cording to .    
a650: 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20    ** callgrind, 
a660: 74 68 69 73 20 63 61 75 73 65 73 20 61 20 63 65  this causes a ce
a670: 72 74 61 69 6e 20 74 65 73 74 20 63 61 73 65 20  rtain test case 
a680: 74 6f 20 68 69 74 20 74 68 65 20 43 50 55 20 34  to hit the CPU 4
a690: 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72  .7 .      ** per
a6a0: 63 65 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c  cent less (x86 l
a6b0: 69 6e 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f  inux, gcc versio
a6c0: 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68  n 4.1.2, -O6) th
a6d0: 61 6e 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20  an if .      ** 
a6e0: 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73  sqlite3MemReleas
a6f0: 65 28 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20  e() were called 
a700: 66 72 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20  from here. With 
a710: 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a  -O2, this jumps.
a720: 20 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20        ** to 6.6 
a730: 70 65 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73  percent. The tes
a740: 74 20 63 61 73 65 20 69 73 20 69 6e 73 65 72 74  t case is insert
a750: 69 6e 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e  ing 1000 rows in
a760: 74 6f 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20  to a table .    
a770: 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64    ** with no ind
a780: 65 78 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e  exes using a sin
a790: 67 6c 65 20 70 72 65 70 61 72 65 64 20 49 4e 53  gle prepared INS
a7a0: 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62  ERT statement, b
a7b0: 69 6e 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20  ind() .      ** 
a7c0: 61 6e 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73  and reset(). Ins
a7d0: 65 72 74 73 20 61 72 65 20 67 72 6f 75 70 65 64  erts are grouped
a7e0: 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74   into a transact
a7f0: 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
a800: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
a810: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 41 67 67  >flags & MEM_Agg
a820: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
a830: 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  se( p->flags & M
a840: 45 4d 5f 44 79 6e 20 29 3b 0a 20 20 20 20 20 20  EM_Dyn );.      
a850: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61  testcase( p->fla
a860: 67 73 20 26 20 4d 45 4d 5f 46 72 61 6d 65 20 29  gs & MEM_Frame )
a870: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
a880: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
a890: 5f 52 6f 77 53 65 74 20 29 3b 0a 20 20 20 20 20  _RowSet );.     
a8a0: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d   if( p->flags&(M
a8b0: 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d  EM_Agg|MEM_Dyn|M
a8c0: 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77  EM_Frame|MEM_Row
a8d0: 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Set) ){.        
a8e0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
a8f0: 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20  lease(p);.      
a900: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 7a 4d  }else if( p->szM
a910: 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20  alloc ){.       
a920: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
a930: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
a940: 20 20 20 20 20 20 20 20 70 2d 3e 73 7a 4d 61 6c          p->szMal
a950: 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  loc = 0;.      }
a960: 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73  ..      p->flags
a970: 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64   = MEM_Undefined
a980: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b  ;.    }while( (+
a990: 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20  +p)<pEnd );.    
a9a0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a9b0: 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64   = malloc_failed
a9c0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
a9d0: 65 6c 65 74 65 20 61 20 56 64 62 65 46 72 61 6d  elete a VdbeFram
a9e0: 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74 73  e object and its
a9f0: 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65 46   contents. VdbeF
aa00: 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72 65  rame objects are
aa10: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  .** allocated by
aa20: 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20   the OP_Program 
aa30: 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74 65  opcode in sqlite
aa40: 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a  3VdbeExec()..*/.
aa50: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
aa60: 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62 65  FrameDelete(Vdbe
aa70: 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Frame *p){.  int
aa80: 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20   i;.  Mem *aMem 
aa90: 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70  = VdbeFrameMem(p
aaa0: 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  );.  VdbeCursor 
aab0: 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65 43  **apCsr = (VdbeC
aac0: 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70  ursor **)&aMem[p
aad0: 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20  ->nChildMem];.  
aae0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
aaf0: 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20  hildCsr; i++){. 
ab00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
ab10: 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61  eeCursor(p->v, a
ab20: 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pCsr[i]);.  }.  
ab30: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
ab40: 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d  aMem, p->nChildM
ab50: 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  em);.  sqlite3Db
ab60: 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70  Free(p->v->db, p
ab70: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
ab80: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
ab90: 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c  N./*.** Give a l
aba0: 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72  isting of the pr
abb0: 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72  ogram in the vir
abc0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a  tual machine..**
abd0: 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63  .** The interfac
abe0: 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  e is the same as
abf0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
ac00: 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64  ().  But instead
ac10: 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74   of.** running t
ac20: 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f  he code, it invo
ac30: 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  kes the callback
ac40: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69   once for each i
ac50: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
ac60: 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20 75  his feature is u
ac70: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
ac80: 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a   "EXPLAIN"..**.*
ac90: 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69  * When p->explai
aca0: 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72  n==1, each instr
acb0: 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64  uction is listed
acc0: 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78  .  When.** p->ex
acd0: 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f  plain==2, only O
ace0: 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75  P_Explain instru
acf0: 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65  ctions are liste
ad00: 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61  d and these.** a
ad10: 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69  re shown in a di
ad20: 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20  fferent format. 
ad30: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69   p->explain==2 i
ad40: 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  s used to implem
ad50: 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51  ent.** EXPLAIN Q
ad60: 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a  UERY PLAN..**.**
ad70: 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e   When p->explain
ad80: 3d 3d 31 2c 20 66 69 72 73 74 20 74 68 65 20 6d  ==1, first the m
ad90: 61 69 6e 20 70 72 6f 67 72 61 6d 20 69 73 20 6c  ain program is l
ada0: 69 73 74 65 64 2c 20 74 68 65 6e 20 65 61 63 68  isted, then each
adb0: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69 67 67   of.** the trigg
adc0: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61  er subprograms a
add0: 72 65 20 6c 69 73 74 65 64 20 6f 6e 65 20 62 79  re listed one by
ade0: 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   one..*/.int sql
adf0: 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20  ite3VdbeList(.  
ae00: 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20 20  Vdbe *p         
ae10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
ae20: 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e   VDBE */.){.  in
ae30: 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20  t nRow;         
ae40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae50: 20 20 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20     /* Stop when 
ae60: 72 6f 77 20 63 6f 75 6e 74 20 72 65 61 63 68 65  row count reache
ae70: 73 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20  s this */.  int 
ae80: 6e 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  nSub = 0;       
ae90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aea0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75   /* Number of su
aeb0: 62 2d 76 64 62 65 73 20 73 65 65 6e 20 73 6f 20  b-vdbes seen so 
aec0: 66 61 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67  far */.  SubProg
aed0: 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b  ram **apSub = 0;
aee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aef0: 20 41 72 72 61 79 20 6f 66 20 73 75 62 2d 76 64   Array of sub-vd
af00: 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53  bes */.  Mem *pS
af10: 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ub = 0;         
af20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
af30: 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c   Memory cell hol
af40: 64 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72  d array of subpr
af50: 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ogs */.  sqlite3
af60: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20   *db = p->db;   
af70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
af80: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
af90: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
afa0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
afb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afc0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
afd0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  er */.  int rc =
afe0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
aff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b000: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
b010: 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d   Mem *pMem = &p-
b020: 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20  >aMem[1];       
b030: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
b040: 65 6d 20 6f 66 20 72 65 73 75 6c 74 20 73 65 74  em of result set
b050: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
b060: 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61  ->explain );.  a
b070: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
b080: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
b090: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
b0a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
b0b0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42   p->rc==SQLITE_B
b0c0: 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  USY || p->rc==SQ
b0d0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20  LITE_NOMEM );.. 
b0e0: 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20   /* Even though 
b0f0: 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73  this opcode does
b100: 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63   not use dynamic
b110: 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a   strings for.  *
b120: 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65  * the result, re
b130: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79  sult columns may
b140: 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20   become dynamic 
b150: 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c  if the user call
b160: 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63  s.  ** sqlite3_c
b170: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20  olumn_text16(), 
b180: 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c  causing a transl
b190: 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20  ation to UTF-16 
b1a0: 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  encoding..  */. 
b1b0: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
b1c0: 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e  (pMem, 8);.  p->
b1d0: 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a  pResultSet = 0;.
b1e0: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
b1f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
b200: 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e    /* This happen
b210: 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  s if a malloc() 
b220: 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f  inside a call to
b230: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
b240: 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a  text() or.    **
b250: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
b260: 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e  text16() failed.
b270: 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c    */.    db->mal
b280: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
b290: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b2a0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
b2b0: 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  * When the numbe
b2c0: 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
b2d0: 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20 74   reaches nRow, t
b2e0: 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20 20  hat means the.  
b2f0: 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20 66  ** listing has f
b300: 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c 69  inished and sqli
b310: 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75 6c  te3_step() shoul
b320: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
b330: 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20  DONE..  ** nRow 
b340: 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  is the sum of th
b350: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
b360: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f   in the main pro
b370: 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20  gram, plus.  ** 
b380: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e  the sum of the n
b390: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
b3a0: 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75 62   all trigger sub
b3b0: 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74  programs encount
b3c0: 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72  ered.  ** so far
b3d0: 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75  .  The nRow valu
b3e0: 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20  e will increase 
b3f0: 61 73 20 6e 65 77 20 74 72 69 67 67 65 72 20 73  as new trigger s
b400: 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a 20  ubprograms are. 
b410: 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   ** encountered,
b420: 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20   but p->pc will 
b430: 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63 68  eventually catch
b440: 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a   up to nRow..  *
b450: 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f  /.  nRow = p->nO
b460: 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  p;.  if( p->expl
b470: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a  ain==1 ){.    /*
b480: 20 54 68 65 20 66 69 72 73 74 20 38 20 6d 65 6d   The first 8 mem
b490: 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75 73  ory cells are us
b4a0: 65 64 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ed for the resul
b4b0: 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77 69  t set.  So we wi
b4c0: 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e  ll.    ** comman
b4d0: 64 65 65 72 20 74 68 65 20 39 74 68 20 63 65 6c  deer the 9th cel
b4e0: 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f 72  l to use as stor
b4f0: 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61 79  age for an array
b500: 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20 20   of pointers.   
b510: 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20 73   ** to trigger s
b520: 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68 65  ubprograms.  The
b530: 20 56 44 42 45 20 69 73 20 67 75 61 72 61 6e 74   VDBE is guarant
b540: 65 65 64 20 74 6f 20 68 61 76 65 20 61 74 20 6c  eed to have at l
b550: 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63 65  east 9.    ** ce
b560: 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  lls.  */.    ass
b570: 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29  ert( p->nMem>9 )
b580: 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d  ;.    pSub = &p-
b590: 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66  >aMem[9];.    if
b5a0: 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45  ( pSub->flags&ME
b5b0: 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20  M_Blob ){.      
b5c0: 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20  /* On the first 
b5d0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
b5e0: 73 74 65 70 28 29 2c 20 70 53 75 62 20 77 69 6c  step(), pSub wil
b5f0: 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20  l hold a NULL.  
b600: 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  It is.      ** i
b610: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20  nitialized to a 
b620: 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f 53  BLOB by the P4_S
b630: 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65 73  UBPROGRAM proces
b640: 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77  sing logic below
b650: 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20 3d   */.      nSub =
b660: 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28   pSub->n/sizeof(
b670: 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70  Vdbe*);.      ap
b680: 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61  Sub = (SubProgra
b690: 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20  m **)pSub->z;.  
b6a0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
b6b0: 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20   i<nSub; i++){. 
b6c0: 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53       nRow += apS
b6d0: 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20  ub[i]->nOp;.    
b6e0: 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20  }.  }..  do{.   
b6f0: 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20   i = p->pc++;.  
b700: 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26  }while( i<nRow &
b710: 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  & p->explain==2 
b720: 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  && p->aOp[i].opc
b730: 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20  ode!=OP_Explain 
b740: 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77  );.  if( i>=nRow
b750: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
b760: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
b770: 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
b780: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d  .  }else if( db-
b790: 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65  >u1.isInterrupte
b7a0: 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
b7b0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
b7c0: 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  T;.    rc = SQLI
b7d0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71  TE_ERROR;.    sq
b7e0: 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70  lite3VdbeError(p
b7f0: 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
b800: 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65  p->rc));.  }else
b810: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 34 3b  {.    char *zP4;
b820: 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  .    Op *pOp;.  
b830: 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70 20 29    if( i<p->nOp )
b840: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  {.      /* The o
b850: 75 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d 62 65  utput line numbe
b860: 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  r is small enoug
b870: 68 20 74 68 61 74 20 77 65 20 61 72 65 20 73 74  h that we are st
b880: 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20 20 20  ill in the.     
b890: 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d   ** main program
b8a0: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70 20 3d  . */.      pOp =
b8b0: 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20   &p->aOp[i];.   
b8c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
b8d0: 20 57 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c   We are currentl
b8e0: 79 20 6c 69 73 74 69 6e 67 20 73 75 62 70 72 6f  y listing subpro
b8f0: 67 72 61 6d 73 2e 20 20 46 69 67 75 72 65 20 6f  grams.  Figure o
b900: 75 74 20 77 68 69 63 68 20 6f 6e 65 20 61 6e 64  ut which one and
b910: 0a 20 20 20 20 20 20 2a 2a 20 70 69 63 6b 20 75  .      ** pick u
b920: 70 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  p the appropriat
b930: 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20  e opcode. */.   
b940: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
b950: 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20  i -= p->nOp;.   
b960: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61     for(j=0; i>=a
b970: 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b  pSub[j]->nOp; j+
b980: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2d 3d  +){.        i -=
b990: 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a   apSub[j]->nOp;.
b9a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f        }.      pO
b9b0: 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d 3e 61  p = &apSub[j]->a
b9c0: 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  Op[i];.    }.   
b9d0: 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d   if( p->explain=
b9e0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d  =1 ){.      pMem
b9f0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
ba00: 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  t;.      pMem->u
ba10: 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20  .i = i;         
ba20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba30: 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61         /* Progra
ba40: 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  m counter */.   
ba50: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20     pMem++;.  .  
ba60: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
ba70: 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d  = MEM_Static|MEM
ba80: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
ba90: 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28       pMem->z = (
baa0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f 70 63  char*)sqlite3Opc
bab0: 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63  odeName(pOp->opc
bac0: 6f 64 65 29 3b 20 2f 2a 20 4f 70 63 6f 64 65 20  ode); /* Opcode 
bad0: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
bae0: 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20   pMem->z!=0 );. 
baf0: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73       pMem->n = s
bb00: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
bb10: 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70  Mem->z);.      p
bb20: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
bb30: 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d  E_UTF8;.      pM
bb40: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  em++;..      /* 
bb50: 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72  When an OP_Progr
bb60: 61 6d 20 6f 70 63 6f 64 65 20 69 73 20 65 6e 63  am opcode is enc
bb70: 6f 75 6e 74 65 72 20 28 74 68 65 20 6f 6e 6c 79  ounter (the only
bb80: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 68 61 73   opcode that has
bb90: 0a 20 20 20 20 20 20 2a 2a 20 61 20 50 34 5f 53  .      ** a P4_S
bba0: 55 42 50 52 4f 47 52 41 4d 20 61 72 67 75 6d 65  UBPROGRAM argume
bbb0: 6e 74 29 2c 20 65 78 70 61 6e 64 20 74 68 65 20  nt), expand the 
bbc0: 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61  size of the arra
bbd0: 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d 73  y of subprograms
bbe0: 0a 20 20 20 20 20 20 2a 2a 20 6b 65 70 74 20 69  .      ** kept i
bbf0: 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74  n p->aMem[9].z t
bc00: 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65 77 20 70  o hold the new p
bc10: 72 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d 69 6e  rogram - assumin
bc20: 67 20 74 68 69 73 20 73 75 62 70 72 6f 67 72 61  g this subprogra
bc30: 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e  m.      ** has n
bc40: 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ot already been 
bc50: 73 65 65 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  seen..      */. 
bc60: 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34       if( pOp->p4
bc70: 74 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47  type==P4_SUBPROG
bc80: 52 41 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  RAM ){.        i
bc90: 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e 53 75 62  nt nByte = (nSub
bca0: 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72  +1)*sizeof(SubPr
bcb0: 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20  ogram*);.       
bcc0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
bcd0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b  for(j=0; j<nSub;
bce0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
bcf0: 20 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d 3d 70   if( apSub[j]==p
bd00: 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20  Op->p4.pProgram 
bd10: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
bd20: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
bd30: 3d 3d 6e 53 75 62 20 26 26 20 53 51 4c 49 54 45  ==nSub && SQLITE
bd40: 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64 62 65  _OK==sqlite3Vdbe
bd50: 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c 20 6e 42  MemGrow(pSub, nB
bd60: 79 74 65 2c 20 6e 53 75 62 21 3d 30 29 20 29 7b  yte, nSub!=0) ){
bd70: 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62  .          apSub
bd80: 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a   = (SubProgram *
bd90: 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 20  *)pSub->z;.     
bda0: 20 20 20 20 20 61 70 53 75 62 5b 6e 53 75 62 2b       apSub[nSub+
bdb0: 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72  +] = pOp->p4.pPr
bdc0: 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 20  ogram;.         
bdd0: 20 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20   pSub->flags |= 
bde0: 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20  MEM_Blob;.      
bdf0: 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53      pSub->n = nS
be00: 75 62 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f  ub*sizeof(SubPro
be10: 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20  gram*);.        
be20: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
be30: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
be40: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
be50: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d  pMem->u.i = pOp-
be60: 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  >p1;            
be70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
be80: 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b   P1 */.    pMem+
be90: 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  +;..    pMem->fl
bea0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
beb0: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70     pMem->u.i = p
bec0: 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20  Op->p2;         
bed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bee0: 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d   /* P2 */.    pM
bef0: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d  em++;..    pMem-
bf00: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
bf10: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  ;.    pMem->u.i 
bf20: 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20  = pOp->p3;      
bf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf40: 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20      /* P3 */.   
bf50: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66   pMem++;..    if
bf60: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
bf70: 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70  ClearAndResize(p
bf80: 4d 65 6d 2c 20 31 30 30 29 20 29 7b 20 2f 2a 20  Mem, 100) ){ /* 
bf90: 50 34 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  P4 */.      asse
bfa0: 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  rt( p->db->mallo
bfb0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
bfc0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
bfd0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
bfe0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
bff0: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
c000: 20 20 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61      zP4 = displa
c010: 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a  yP4(pOp, pMem->z
c020: 2c 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63  , pMem->szMalloc
c030: 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 34 21 3d  );.    if( zP4!=
c040: 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20  pMem->z ){.     
c050: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
c060: 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50 34 2c  etStr(pMem, zP4,
c070: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
c080: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
c090: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
c0a0: 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  Mem->z!=0 );.   
c0b0: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c     pMem->n = sql
c0c0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65  ite3Strlen30(pMe
c0d0: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65  m->z);.      pMe
c0e0: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
c0f0: 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20  UTF8;.    }.    
c100: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28  pMem++;..    if(
c110: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
c120: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
c130: 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41  te3VdbeMemClearA
c140: 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 34  ndResize(pMem, 4
c150: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
c160: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ert( p->db->mall
c170: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
c180: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c190: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
c1a0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
c1b0: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  gs = MEM_Str|MEM
c1c0: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65  _Term;.      pMe
c1d0: 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20  m->n = 2;.      
c1e0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
c1f0: 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e  (3, pMem->z, "%.
c200: 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20  2x", pOp->p5);  
c210: 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20   /* P5 */.      
c220: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
c230: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70  TE_UTF8;.      p
c240: 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66  Mem++;.  .#ifdef
c250: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45   SQLITE_ENABLE_E
c260: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a  XPLAIN_COMMENTS.
c270: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
c280: 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64  3VdbeMemClearAnd
c290: 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 35 30 30  Resize(pMem, 500
c2a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
c2b0: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ert( p->db->mall
c2c0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
c2d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c2e0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
c2f0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
c300: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  gs = MEM_Str|MEM
c310: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65  _Term;.      pMe
c320: 6d 2d 3e 6e 20 3d 20 64 69 73 70 6c 61 79 43 6f  m->n = displayCo
c330: 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20  mment(pOp, zP4, 
c340: 70 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20  pMem->z, 500);. 
c350: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
c360: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65   SQLITE_UTF8;.#e
c370: 6c 73 65 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  lse.      pMem->
c380: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
c390: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c3a0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65          /* Comme
c3b0: 6e 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20  nt */.#endif.   
c3c0: 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43   }..    p->nResC
c3d0: 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70  olumn = 8 - 4*(p
c3e0: 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20  ->explain-1);.  
c3f0: 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20    p->pResultSet 
c400: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20  = &p->aMem[1];. 
c410: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
c420: 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53  E_OK;.    rc = S
c430: 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20  QLITE_ROW;.  }. 
c440: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
c450: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
c460: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a  MIT_EXPLAIN */..
c470: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
c480: 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  BUG./*.** Print 
c490: 74 68 65 20 53 51 4c 20 74 68 61 74 20 77 61 73  the SQL that was
c4a0: 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74   used to generat
c4b0: 65 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d  e a VDBE program
c4c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
c4d0: 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64  3VdbePrintSql(Vd
c4e0: 62 65 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20  be *p){.  const 
c4f0: 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 69  char *z = 0;.  i
c500: 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20  f( p->zSql ){.  
c510: 20 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c 3b 0a 20    z = p->zSql;. 
c520: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4f   }else if( p->nO
c530: 70 3e 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73  p>=1 ){.    cons
c540: 74 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20  t VdbeOp *pOp = 
c550: 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 20 20  &p->aOp[0];.    
c560: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
c570: 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d  =OP_Init && pOp-
c580: 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20  >p4.z!=0 ){.    
c590: 20 20 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b    z = pOp->p4.z;
c5a0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 71  .      while( sq
c5b0: 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a 29  lite3Isspace(*z)
c5c0: 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   ) z++;.    }.  
c5d0: 7d 0a 20 20 69 66 28 20 7a 20 29 20 70 72 69 6e  }.  if( z ) prin
c5e0: 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22  tf("SQL: [%s]\n"
c5f0: 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  , z);.}.#endif..
c600: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
c610: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20  ITE_OMIT_TRACE) 
c620: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
c630: 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
c640: 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e  )./*.** Print an
c650: 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67 65   IOTRACE message
c660: 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e   showing SQL con
c670: 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tent..*/.void sq
c680: 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61 63 65  lite3VdbeIOTrace
c690: 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  Sql(Vdbe *p){.  
c6a0: 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70  int nOp = p->nOp
c6b0: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b  ;.  VdbeOp *pOp;
c6c0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6f  .  if( sqlite3Io
c6d0: 54 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72  Trace==0 ) retur
c6e0: 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29  n;.  if( nOp<1 )
c6f0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d   return;.  pOp =
c700: 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69   &p->aOp[0];.  i
c710: 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
c720: 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e  OP_Init && pOp->
c730: 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69  p4.z!=0 ){.    i
c740: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61  nt i, j;.    cha
c750: 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73  r z[1000];.    s
c760: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
c770: 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25  sizeof(z), z, "%
c780: 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  s", pOp->p4.z);.
c790: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c      for(i=0; sql
c7a0: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d  ite3Isspace(z[i]
c7b0: 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f  ); i++){}.    fo
c7c0: 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  r(j=0; z[i]; i++
c7d0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
c7e0: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d  ite3Isspace(z[i]
c7f0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
c800: 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a   z[i-1]!=' ' ){.
c810: 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d            z[j++]
c820: 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20   = ' ';.        
c830: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
c840: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
c850: 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  z[i];.      }.  
c860: 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30    }.    z[j] = 0
c870: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54  ;.    sqlite3IoT
c880: 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c  race("SQL %s\n",
c890: 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69   z);.  }.}.#endi
c8a0: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
c8b0: 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49 54  T_TRACE && SQLIT
c8c0: 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
c8d0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63   */../*.** Alloc
c8e0: 61 74 65 20 73 70 61 63 65 20 66 72 6f 6d 20 61  ate space from a
c8f0: 20 66 69 78 65 64 20 73 69 7a 65 20 62 75 66 66   fixed size buff
c900: 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  er and return a 
c910: 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68  pointer to.** th
c920: 61 74 20 73 70 61 63 65 2e 20 20 49 66 20 69 6e  at space.  If in
c930: 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
c940: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72   is available, r
c950: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  eturn NULL..**.*
c960: 2a 20 54 68 65 20 70 42 75 66 20 70 61 72 61 6d  * The pBuf param
c970: 65 74 65 72 20 69 73 20 74 68 65 20 69 6e 69 74  eter is the init
c980: 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 61 20 70  ial value of a p
c990: 6f 69 6e 74 65 72 20 77 68 69 63 68 20 77 69 6c  ointer which wil
c9a0: 6c 0a 2a 2a 20 72 65 63 65 69 76 65 20 74 68 65  l.** receive the
c9b0: 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 70 42   new memory.  pB
c9c0: 75 66 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 4e  uf is normally N
c9d0: 55 4c 4c 2e 20 20 49 66 20 70 42 75 66 20 69 73  ULL.  If pBuf is
c9e0: 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74   not.** NULL, it
c9f0: 20 6d 65 61 6e 73 20 74 68 61 74 20 6d 65 6d 6f   means that memo
ca00: 72 79 20 73 70 61 63 65 20 68 61 73 20 61 6c 72  ry space has alr
ca10: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
ca20: 74 65 64 20 61 6e 64 20 74 68 61 74 0a 2a 2a 20  ted and that.** 
ca30: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  this routine sho
ca40: 75 6c 64 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65  uld not allocate
ca50: 20 61 6e 79 20 6e 65 77 20 6d 65 6d 6f 72 79 2e   any new memory.
ca60: 20 20 57 68 65 6e 20 70 42 75 66 20 69 73 20 6e    When pBuf is n
ca70: 6f 74 0a 2a 2a 20 4e 55 4c 4c 20 73 69 6d 70 6c  ot.** NULL simpl
ca80: 79 20 72 65 74 75 72 6e 20 70 42 75 66 2e 20 20  y return pBuf.  
ca90: 4f 6e 6c 79 20 61 6c 6c 6f 63 61 74 65 20 6e 65  Only allocate ne
caa0: 77 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 77  w memory space w
cab0: 68 65 6e 20 70 42 75 66 0a 2a 2a 20 69 73 20 4e  hen pBuf.** is N
cac0: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65  ULL..**.** nByte
cad0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
cae0: 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
caf0: 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 70   needed..**.** p
cb00: 46 72 6f 6d 20 70 6f 69 6e 74 73 20 74 6f 20 2a  From points to *
cb10: 70 6e 46 72 6f 6d 20 62 79 74 65 73 20 6f 66 20  pnFrom bytes of 
cb20: 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65 2e  available space.
cb30: 20 20 4e 65 77 20 73 70 61 63 65 20 69 73 20 61    New space is a
cb40: 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 72 6f 6d  llocated.** from
cb50: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
cb60: 70 46 72 6f 6d 20 62 75 66 66 65 72 20 61 6e 64  pFrom buffer and
cb70: 20 2a 70 6e 46 72 6f 6d 20 69 73 20 64 65 63 72   *pnFrom is decr
cb80: 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a  emented..**.** *
cb90: 70 6e 4e 65 65 64 65 64 20 69 73 20 61 20 63 6f  pnNeeded is a co
cba0: 75 6e 74 65 72 20 6f 66 20 74 68 65 20 6e 75 6d  unter of the num
cbb0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
cbc0: 73 70 61 63 65 20 74 68 61 74 20 68 61 76 65 20  space that have 
cbd0: 66 61 69 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c  failed.** to all
cbe0: 6f 63 61 74 65 2e 20 20 49 66 20 74 68 65 72 65  ocate.  If there
cbf0: 20 69 73 20 69 6e 73 75 66 66 69 63 69 65 6e 74   is insufficient
cc00: 20 73 70 61 63 65 20 69 6e 20 70 46 72 6f 6d 20   space in pFrom 
cc10: 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a  to satisfy the.*
cc20: 2a 20 72 65 71 75 65 73 74 2c 20 74 68 65 6e 20  * request, then 
cc30: 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 4e 65 65  increment *pnNee
cc40: 64 65 64 20 62 79 20 74 68 65 20 61 6d 6f 75 6e  ded by the amoun
cc50: 74 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74  t of the request
cc60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
cc70: 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20   *allocSpace(.  
cc80: 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20  void *pBuf,     
cc90: 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 72 65       /* Where re
cca0: 74 75 72 6e 20 70 6f 69 6e 74 65 72 20 77 69 6c  turn pointer wil
ccb0: 6c 20 62 65 20 73 74 6f 72 65 64 20 2a 2f 0a 20  l be stored */. 
ccc0: 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20   int nByte,     
ccd0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
cce0: 6f 66 20 62 79 74 65 73 20 74 6f 20 61 6c 6c 6f  of bytes to allo
ccf0: 63 61 74 65 20 2a 2f 0a 20 20 75 38 20 2a 70 46  cate */.  u8 *pF
cd00: 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rom,           /
cd10: 2a 20 4d 65 6d 6f 72 79 20 61 76 61 69 6c 61 62  * Memory availab
cd20: 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f  le for allocatio
cd30: 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 46 72  n */.  int *pnFr
cd40: 6f 6d 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49  om,         /* I
cd50: 4e 2f 4f 55 54 3a 20 53 70 61 63 65 20 61 76 61  N/OUT: Space ava
cd60: 69 6c 61 62 6c 65 20 61 74 20 70 46 72 6f 6d 20  ilable at pFrom 
cd70: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4e 65 65 64  */.  int *pnNeed
cd80: 65 64 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ed        /* If 
cd90: 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 6e 6f  allocation canno
cda0: 74 20 62 65 20 6d 61 64 65 2c 20 69 6e 63 72 65  t be made, incre
cdb0: 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 2a 2f 0a  ment *pnByte */.
cdc0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  ){.  assert( EIG
cdd0: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
cde0: 54 28 70 46 72 6f 6d 29 20 29 3b 0a 20 20 69 66  T(pFrom) );.  if
cdf0: 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20  ( pBuf==0 ){.   
ce00: 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28   nByte = ROUND8(
ce10: 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
ce20: 6e 42 79 74 65 20 3c 3d 20 2a 70 6e 46 72 6f 6d  nByte <= *pnFrom
ce30: 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e 46 72 6f   ){.      *pnFro
ce40: 6d 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20  m -= nByte;.    
ce50: 20 20 70 42 75 66 20 3d 20 26 70 46 72 6f 6d 5b    pBuf = &pFrom[
ce60: 2a 70 6e 46 72 6f 6d 5d 3b 0a 20 20 20 20 7d 65  *pnFrom];.    }e
ce70: 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 6e 4e 65  lse{.      *pnNe
ce80: 65 64 65 64 20 2b 3d 20 6e 42 79 74 65 3b 0a 20  eded += nByte;. 
ce90: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
cea0: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
ceb0: 49 47 4e 4d 45 4e 54 28 70 42 75 66 29 20 29 3b  IGNMENT(pBuf) );
cec0: 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a  .  return pBuf;.
ced0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 20  }../*.** Rewind 
cee0: 74 68 65 20 56 44 42 45 20 62 61 63 6b 20 74 6f  the VDBE back to
cef0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 69   the beginning i
cf00: 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66 6f  n preparation fo
cf10: 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 74 2e  r.** running it.
cf20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
cf30: 56 64 62 65 52 65 77 69 6e 64 28 56 64 62 65 20  VdbeRewind(Vdbe 
cf40: 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  *p){.#if defined
cf50: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c  (SQLITE_DEBUG) |
cf60: 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  | defined(VDBE_P
cf70: 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b  ROFILE).  int i;
cf80: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
cf90: 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
cfa0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
cfb0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
cfc0: 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f  ..  /* There sho
cfd0: 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74 20  uld be at least 
cfe0: 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f  one opcode..  */
cff0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
d000: 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  p>0 );..  /* Set
d010: 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44   the magic to VD
d020: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f  BE_MAGIC_RUN soo
d030: 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20  ner rather than 
d040: 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d  later. */.  p->m
d050: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
d060: 43 5f 52 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53  C_RUN;..#ifdef S
d070: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f  QLITE_DEBUG.  fo
d080: 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 4d 65 6d  r(i=1; i<p->nMem
d090: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
d0a0: 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64  rt( p->aMem[i].d
d0b0: 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a  b==p->db );.  }.
d0c0: 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d  #endif.  p->pc =
d0d0: 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53   -1;.  p->rc = S
d0e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65  QLITE_OK;.  p->e
d0f0: 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f  rrorAction = OE_
d100: 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 6d 61 67 69  Abort;.  p->magi
d110: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  c = VDBE_MAGIC_R
d120: 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65  UN;.  p->nChange
d130: 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65   = 0;.  p->cache
d140: 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69  Ctr = 1;.  p->mi
d150: 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74  nWriteFileFormat
d160: 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74   = 255;.  p->iSt
d170: 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70  atement = 0;.  p
d180: 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20  ->nFkConstraint 
d190: 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45  = 0;.#ifdef VDBE
d1a0: 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69  _PROFILE.  for(i
d1b0: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
d1c0: 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69  +){.    p->aOp[i
d1d0: 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70  ].cnt = 0;.    p
d1e0: 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20  ->aOp[i].cycles 
d1f0: 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 0;.  }.#endif.
d200: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  }../*.** Prepare
d210: 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   a virtual machi
d220: 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  ne for execution
d230: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74   for the first t
d240: 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20 63 72 65  ime after.** cre
d250: 61 74 69 6e 67 20 74 68 65 20 76 69 72 74 75 61  ating the virtua
d260: 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 69 73  l machine.  This
d270: 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73   involves things
d280: 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f   such.** as allo
d290: 63 61 74 69 6e 67 20 72 65 67 69 73 74 65 72 73  cating registers
d2a0: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e   and initializin
d2b0: 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f  g the program co
d2c0: 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20  unter..** After 
d2d0: 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
d2e0: 70 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20  prepped, it can 
d2f0: 62 65 20 65 78 65 63 75 74 65 64 20 62 79 20 6f  be executed by o
d300: 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61  ne or more.** ca
d310: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64  lls to sqlite3Vd
d320: 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a  beExec().  .**.*
d330: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
d340: 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65 78  may be called ex
d350: 61 63 74 6c 79 20 6f 6e 63 65 20 6f 6e 20 65 61  actly once on ea
d360: 63 68 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ch virtual machi
d370: 6e 65 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 69  ne..** After thi
d380: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
d390: 6c 65 64 20 74 68 65 20 56 4d 20 68 61 73 20 62  led the VM has b
d3a0: 65 65 6e 20 22 70 61 63 6b 61 67 65 64 22 20 61  een "packaged" a
d3b0: 6e 64 20 69 73 20 72 65 61 64 79 0a 2a 2a 20 74  nd is ready.** t
d3c0: 6f 20 72 75 6e 2e 20 20 41 66 74 65 72 20 74 68  o run.  After th
d3d0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
d3e0: 6c 6c 65 64 2c 20 66 75 72 74 68 65 72 20 63 61  lled, further ca
d3f0: 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74  lls to .** sqlit
d400: 65 33 56 64 62 65 41 64 64 4f 70 28 29 20 66 75  e3VdbeAddOp() fu
d410: 6e 63 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 68  nctions are proh
d420: 69 62 69 74 65 64 2e 20 20 54 68 69 73 20 72 6f  ibited.  This ro
d430: 75 74 69 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74  utine disconnect
d440: 73 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 66 72  s.** the Vdbe fr
d450: 6f 6d 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  om the Parse obj
d460: 65 63 74 20 74 68 61 74 20 68 65 6c 70 65 64 20  ect that helped 
d470: 67 65 6e 65 72 61 74 65 20 69 74 20 73 6f 20 74  generate it so t
d480: 68 61 74 20 74 68 65 0a 2a 2a 20 74 68 65 20 56  hat the.** the V
d490: 64 62 65 20 62 65 63 6f 6d 65 73 20 61 6e 20 69  dbe becomes an i
d4a0: 6e 64 65 70 65 6e 64 65 6e 74 20 65 6e 74 69 74  ndependent entit
d4b0: 79 20 61 6e 64 20 74 68 65 20 50 61 72 73 65 20  y and the Parse 
d4c0: 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a  object can be.**
d4d0: 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a   destroyed..**.*
d4e0: 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65  * Use the sqlite
d4f0: 33 56 64 62 65 52 65 77 69 6e 64 28 29 20 70 72  3VdbeRewind() pr
d500: 6f 63 65 64 75 72 65 20 74 6f 20 72 65 73 74 6f  ocedure to resto
d510: 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63  re a virtual mac
d520: 68 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20  hine back.** to 
d530: 69 74 73 20 69 6e 69 74 69 61 6c 20 73 74 61 74  its initial stat
d540: 65 20 61 66 74 65 72 20 69 74 20 68 61 73 20 62  e after it has b
d550: 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64  een run..*/.void
d560: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
d570: 52 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70  Ready(.  Vdbe *p
d580: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d590: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
d5a0: 44 42 45 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  DBE */.  Parse *
d5b0: 70 50 61 72 73 65 20 20 20 20 20 20 20 20 20 20  pParse          
d5c0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
d5d0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b  ng context */.){
d5e0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d600: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
d610: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
d620: 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20    int nVar;     
d630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d640: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
d650: 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e  rameters */.  in
d660: 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20  t nMem;         
d670: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d680: 4e 75 6d 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d  Number of VM mem
d690: 6f 72 79 20 72 65 67 69 73 74 65 72 73 20 2a 2f  ory registers */
d6a0: 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20  .  int nCursor; 
d6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
d6d0: 75 72 73 6f 72 73 20 72 65 71 75 69 72 65 64 20  ursors required 
d6e0: 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20  */.  int nArg;  
d6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d700: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d710: 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 73 75   arguments in su
d720: 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69  bprograms */.  i
d730: 6e 74 20 6e 4f 6e 63 65 3b 20 20 20 20 20 20 20  nt nOnce;       
d740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d750: 20 4e 75 6d 62 65 72 20 6f 66 20 4f 50 5f 4f 6e   Number of OP_On
d760: 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  ce instructions 
d770: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
d780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d790: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
d7a0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72  ter */.  int nFr
d7b0: 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ee;             
d7c0: 20 20 20 20 20 20 20 20 2f 2a 20 41 76 61 69 6c          /* Avail
d7d0: 61 62 6c 65 20 66 72 65 65 20 73 70 61 63 65 20  able free space 
d7e0: 2a 2f 0a 20 20 75 38 20 2a 7a 43 73 72 3b 20 20  */.  u8 *zCsr;  
d7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d800: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76      /* Memory av
d810: 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f  ailable for allo
d820: 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  cation */.  int 
d830: 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
d840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
d850: 77 20 6d 75 63 68 20 65 78 74 72 61 20 6d 65 6d  w much extra mem
d860: 6f 72 79 20 69 73 20 6e 65 65 64 65 64 20 2a 2f  ory is needed */
d870: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ..  assert( p!=0
d880: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
d890: 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65  >nOp>0 );.  asse
d8a0: 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b  rt( pParse!=0 );
d8b0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
d8c0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
d8d0: 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74  INIT );.  assert
d8e0: 28 20 70 50 61 72 73 65 3d 3d 70 2d 3e 70 50 61  ( pParse==p->pPa
d8f0: 72 73 65 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d  rse );.  db = p-
d900: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64  >db;.  assert( d
d910: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
d920: 3d 30 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70  =0 );.  nVar = p
d930: 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e  Parse->nVar;.  n
d940: 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
d950: 65 6d 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20  em;.  nCursor = 
d960: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20  pParse->nTab;.  
d970: 6e 41 72 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nArg = pParse->n
d980: 4d 61 78 41 72 67 3b 0a 20 20 6e 4f 6e 63 65 20  MaxArg;.  nOnce 
d990: 3d 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 3b  = pParse->nOnce;
d9a0: 0a 20 20 69 66 28 20 6e 4f 6e 63 65 3d 3d 30 20  .  if( nOnce==0 
d9b0: 29 20 6e 4f 6e 63 65 20 3d 20 31 3b 20 2f 2a 20  ) nOnce = 1; /* 
d9c0: 45 6e 73 75 72 65 20 61 74 20 6c 65 61 73 74 20  Ensure at least 
d9d0: 6f 6e 65 20 62 79 74 65 20 69 6e 20 70 2d 3e 61  one byte in p->a
d9e0: 4f 6e 63 65 46 6c 61 67 5b 5d 20 2a 2f 0a 20 20  OnceFlag[] */.  
d9f0: 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 63  .  /* For each c
da00: 75 72 73 6f 72 20 72 65 71 75 69 72 65 64 2c 20  ursor required, 
da10: 61 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20  also allocate a 
da20: 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d  memory cell. Mem
da30: 6f 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28  ory.  ** cells (
da40: 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e  nMem+1-nCursor).
da50: 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65  .nMem, inclusive
da60: 2c 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  , will never be 
da70: 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65  used by.  ** the
da80: 20 76 64 62 65 20 70 72 6f 67 72 61 6d 2e 20 49   vdbe program. I
da90: 6e 73 74 65 61 64 20 74 68 65 79 20 61 72 65 20  nstead they are 
daa0: 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
dab0: 20 73 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20   space for.  ** 
dac0: 56 64 62 65 43 75 72 73 6f 72 2f 42 74 43 75 72  VdbeCursor/BtCur
dad0: 73 6f 72 20 73 74 72 75 63 74 75 72 65 73 2e 20  sor structures. 
dae0: 54 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f  The blob of memo
daf0: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
db00: 74 68 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20  th .  ** cursor 
db10: 30 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d  0 is stored in m
db20: 65 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e  emory cell nMem.
db30: 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d   Memory cell (nM
db40: 65 6d 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65  em-1).  ** store
db50: 73 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65  s the blob of me
db60: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
db70: 77 69 74 68 20 63 75 72 73 6f 72 20 31 2c 20 65  with cursor 1, e
db80: 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65  tc..  **.  ** Se
db90: 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65  e also: allocate
dba0: 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20  Cursor()..  */. 
dbb0: 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72   nMem += nCursor
dbc0: 3b 0a 0a 20 20 2f 2a 20 7a 43 73 72 20 77 69 6c  ;..  /* zCsr wil
dbd0: 6c 20 69 6e 69 74 69 61 6c 6c 79 20 70 6f 69 6e  l initially poin
dbe0: 74 20 74 6f 20 6e 46 72 65 65 20 62 79 74 65 73  t to nFree bytes
dbf0: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
dc00: 20 61 74 20 74 68 65 0a 20 20 2a 2a 20 65 6e 64   at the.  ** end
dc10: 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61   of the opcode a
dc20: 72 72 61 79 2c 20 70 2d 3e 61 4f 70 2e 20 20 54  rray, p->aOp.  T
dc30: 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 6f  he computation o
dc40: 66 20 6e 46 72 65 65 20 69 73 0a 20 20 2a 2a 20  f nFree is.  ** 
dc50: 63 6f 6e 73 65 72 76 61 74 69 76 65 20 2d 20 69  conservative - i
dc60: 74 20 6d 69 67 68 74 20 62 65 20 73 6d 61 6c 6c  t might be small
dc70: 65 72 20 74 68 61 6e 20 74 68 65 20 74 72 75 65  er than the true
dc80: 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 0a   number of free.
dc90: 20 20 2a 2a 20 62 79 74 65 73 2c 20 62 75 74 20    ** bytes, but 
dca0: 6e 65 76 65 72 20 6c 61 72 67 65 72 2e 20 20 6e  never larger.  n
dcb0: 46 72 65 65 20 6d 75 73 74 20 62 65 20 61 20 6d  Free must be a m
dcc0: 75 6c 74 69 70 6c 65 20 6f 66 20 38 20 2d 20 69  ultiple of 8 - i
dcd0: 74 20 69 73 0a 20 20 2a 2a 20 72 6f 75 6e 64 65  t is.  ** rounde
dce0: 64 20 64 6f 77 6e 20 69 66 20 69 73 20 6e 6f 74  d down if is not
dcf0: 2e 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 52 4f 55  ..  */.  n = ROU
dd00: 4e 44 38 28 73 69 7a 65 6f 66 28 4f 70 29 2a 70  ND8(sizeof(Op)*p
dd10: 2d 3e 6e 4f 70 29 3b 20 20 20 20 20 20 20 20 20  ->nOp);         
dd20: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
dd30: 20 6f 70 63 6f 64 65 20 73 70 61 63 65 20 75 73   opcode space us
dd40: 65 64 20 2a 2f 0a 20 20 7a 43 73 72 20 3d 20 26  ed */.  zCsr = &
dd50: 28 28 75 38 2a 29 70 2d 3e 61 4f 70 29 5b 6e 5d  ((u8*)p->aOp)[n]
dd60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dd70: 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 6f 70      /* Unused op
dd80: 63 6f 64 65 20 73 70 61 63 65 20 2a 2f 0a 20 20  code space */.  
dd90: 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
dda0: 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 7a 43 73  TE_ALIGNMENT(zCs
ddb0: 72 29 20 29 3b 0a 20 20 6e 46 72 65 65 20 3d 20  r) );.  nFree = 
ddc0: 52 4f 55 4e 44 44 4f 57 4e 38 28 70 50 61 72 73  ROUNDDOWN8(pPars
ddd0: 65 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 20 2d 20 6e  e->szOpAlloc - n
dde0: 29 3b 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20  );  /* Bytes of 
ddf0: 75 6e 75 73 65 64 20 73 70 61 63 65 20 2a 2f 0a  unused space */.
de00: 20 20 61 73 73 65 72 74 28 20 6e 46 72 65 65 3e    assert( nFree>
de10: 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 46 72 65  =0 );.  if( nFre
de20: 65 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  e>0 ){.    memse
de30: 74 28 7a 43 73 72 2c 20 30 2c 20 6e 46 72 65 65  t(zCsr, 0, nFree
de40: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 45  );.    assert( E
de50: 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
de60: 45 4e 54 28 26 7a 43 73 72 5b 6e 46 72 65 65 5d  ENT(&zCsr[nFree]
de70: 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 73 6f  ) );.  }..  reso
de80: 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26  lveP2Values(p, &
de90: 6e 41 72 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73  nArg);.  p->uses
dea0: 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75  StmtJournal = (u
deb0: 38 29 28 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c  8)(pParse->isMul
dec0: 74 69 57 72 69 74 65 20 26 26 20 70 50 61 72 73  tiWrite && pPars
ded0: 65 2d 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20  e->mayAbort);.  
dee0: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
def0: 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29  ain && nMem<10 )
df00: 7b 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b  {.    nMem = 10;
df10: 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70 69 72 65  .  }.  p->expire
df20: 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d  d = 0;..  /* Mem
df30: 6f 72 79 20 66 6f 72 20 72 65 67 69 73 74 65 72  ory for register
df40: 73 2c 20 70 61 72 61 6d 65 74 65 72 73 2c 20 63  s, parameters, c
df50: 75 72 73 6f 72 2c 20 65 74 63 2c 20 69 73 20 61  ursor, etc, is a
df60: 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 77 6f 0a  llocated in two.
df70: 20 20 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f 6e    ** passes.  On
df80: 20 74 68 65 20 66 69 72 73 74 20 70 61 73 73 2c   the first pass,
df90: 20 77 65 20 74 72 79 20 74 6f 20 72 65 75 73 65   we try to reuse
dfa0: 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 61 74   unused space at
dfb0: 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 64 20 6f   the .  ** end o
dfc0: 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72  f the opcode arr
dfd0: 61 79 2e 20 20 49 66 20 77 65 20 61 72 65 20 75  ay.  If we are u
dfe0: 6e 61 62 6c 65 20 74 6f 20 73 61 74 69 73 66 79  nable to satisfy
dff0: 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a   all memory.  **
e000: 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 62 79   requirements by
e010: 20 72 65 75 73 69 6e 67 20 74 68 65 20 6f 70 63   reusing the opc
e020: 6f 64 65 20 61 72 72 61 79 20 74 61 69 6c 2c 20  ode array tail, 
e030: 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a  then the second.
e040: 20 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20 66    ** pass will f
e050: 69 6c 6c 20 69 6e 20 74 68 65 20 72 65 73 74 20  ill in the rest 
e060: 75 73 69 6e 67 20 61 20 66 72 65 73 68 20 61 6c  using a fresh al
e070: 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a  location.  .  **
e080: 0a 20 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70  .  ** This two-p
e090: 61 73 73 20 61 70 70 72 6f 61 63 68 20 74 68 61  ass approach tha
e0a0: 74 20 72 65 75 73 65 73 20 61 73 20 6d 75 63 68  t reuses as much
e0b0: 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69   memory as possi
e0c0: 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68  ble from.  ** th
e0d0: 65 20 6c 65 66 74 6f 76 65 72 20 73 70 61 63 65  e leftover space
e0e0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
e0f0: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20  he opcode array 
e100: 63 61 6e 20 73 69 67 6e 69 66 69 63 61 6e 74 6c  can significantl
e110: 79 0a 20 20 2a 2a 20 72 65 64 75 63 65 20 74 68  y.  ** reduce th
e120: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f  e amount of memo
e130: 72 79 20 68 65 6c 64 20 62 79 20 61 20 70 72 65  ry held by a pre
e140: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
e150: 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20 20  .  */.  do {.   
e160: 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 20 20   nByte = 0;.    
e170: 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53  p->aMem = allocS
e180: 70 61 63 65 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d  pace(p->aMem, nM
e190: 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20  em*sizeof(Mem), 
e1a0: 7a 43 73 72 2c 20 26 6e 46 72 65 65 2c 20 26 6e  zCsr, &nFree, &n
e1b0: 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 56  Byte);.    p->aV
e1c0: 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  ar = allocSpace(
e1d0: 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73 69  p->aVar, nVar*si
e1e0: 7a 65 6f 66 28 4d 65 6d 29 2c 20 7a 43 73 72 2c  zeof(Mem), zCsr,
e1f0: 20 26 6e 46 72 65 65 2c 20 26 6e 42 79 74 65 29   &nFree, &nByte)
e200: 3b 0a 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d  ;.    p->apArg =
e210: 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61   allocSpace(p->a
e220: 70 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f  pArg, nArg*sizeo
e230: 66 28 4d 65 6d 2a 29 2c 20 7a 43 73 72 2c 20 26  f(Mem*), zCsr, &
e240: 6e 46 72 65 65 2c 20 26 6e 42 79 74 65 29 3b 0a  nFree, &nByte);.
e250: 20 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20 61      p->azVar = a
e260: 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 7a 56  llocSpace(p->azV
e270: 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28  ar, nVar*sizeof(
e280: 63 68 61 72 2a 29 2c 20 7a 43 73 72 2c 20 26 6e  char*), zCsr, &n
e290: 46 72 65 65 2c 20 26 6e 42 79 74 65 29 3b 0a 20  Free, &nByte);. 
e2a0: 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c     p->apCsr = al
e2b0: 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70 43 73  locSpace(p->apCs
e2c0: 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f  r, nCursor*sizeo
e2d0: 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29 2c 0a  f(VdbeCursor*),.
e2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2f0: 20 20 20 20 20 20 20 20 20 20 7a 43 73 72 2c 20            zCsr, 
e300: 26 6e 46 72 65 65 2c 20 26 6e 42 79 74 65 29 3b  &nFree, &nByte);
e310: 0a 20 20 20 20 70 2d 3e 61 4f 6e 63 65 46 6c 61  .    p->aOnceFla
e320: 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  g = allocSpace(p
e330: 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 6e 4f 6e  ->aOnceFlag, nOn
e340: 63 65 2c 20 7a 43 73 72 2c 20 26 6e 46 72 65 65  ce, zCsr, &nFree
e350: 2c 20 26 6e 42 79 74 65 29 3b 0a 23 69 66 64 65  , &nByte);.#ifde
e360: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
e370: 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
e380: 20 20 20 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20      p->anExec = 
e390: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 6e  allocSpace(p->an
e3a0: 45 78 65 63 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a  Exec, p->nOp*siz
e3b0: 65 6f 66 28 69 36 34 29 2c 20 7a 43 73 72 2c 20  eof(i64), zCsr, 
e3c0: 26 6e 46 72 65 65 2c 20 26 6e 42 79 74 65 29 3b  &nFree, &nByte);
e3d0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
e3e0: 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 70  nByte ){.      p
e3f0: 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65  ->pFree = sqlite
e400: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
e410: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a  , nByte);.    }.
e420: 20 20 20 20 7a 43 73 72 20 3d 20 70 2d 3e 70 46      zCsr = p->pF
e430: 72 65 65 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d  ree;.    nFree =
e440: 20 6e 42 79 74 65 3b 0a 20 20 7d 77 68 69 6c 65   nByte;.  }while
e450: 28 20 6e 42 79 74 65 20 26 26 20 21 64 62 2d 3e  ( nByte && !db->
e460: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
e470: 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20  .  p->nCursor = 
e480: 6e 43 75 72 73 6f 72 3b 0a 20 20 70 2d 3e 6e 4f  nCursor;.  p->nO
e490: 6e 63 65 46 6c 61 67 20 3d 20 6e 4f 6e 63 65 3b  nceFlag = nOnce;
e4a0: 0a 20 20 69 66 28 20 70 2d 3e 61 56 61 72 20 29  .  if( p->aVar )
e4b0: 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20  {.    p->nVar = 
e4c0: 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20 20  (ynVar)nVar;.   
e4d0: 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72   for(n=0; n<nVar
e4e0: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d  ; n++){.      p-
e4f0: 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d  >aVar[n].flags =
e500: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20   MEM_Null;.     
e510: 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d   p->aVar[n].db =
e520: 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   db;.    }.  }. 
e530: 20 69 66 28 20 70 2d 3e 61 7a 56 61 72 20 26 26   if( p->azVar &&
e540: 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3e 30   pParse->nzVar>0
e550: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 7a 56 61 72   ){.    p->nzVar
e560: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72   = pParse->nzVar
e570: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e  ;.    memcpy(p->
e580: 61 7a 56 61 72 2c 20 70 50 61 72 73 65 2d 3e 61  azVar, pParse->a
e590: 7a 56 61 72 2c 20 70 2d 3e 6e 7a 56 61 72 2a 73  zVar, p->nzVar*s
e5a0: 69 7a 65 6f 66 28 70 2d 3e 61 7a 56 61 72 5b 30  izeof(p->azVar[0
e5b0: 5d 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ]));.    memset(
e5c0: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 30  pParse->azVar, 0
e5d0: 2c 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 2a  , pParse->nzVar*
e5e0: 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61  sizeof(pParse->a
e5f0: 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20  zVar[0]));.  }. 
e600: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a   if( p->aMem ){.
e610: 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20      p->aMem--;  
e620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e630: 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f      /* aMem[] go
e640: 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20  es from 1..nMem 
e650: 2a 2f 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d  */.    p->nMem =
e660: 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20   nMem;          
e670: 20 20 20 20 20 20 20 2f 2a 20 20 20 20 20 20 20         /*       
e680: 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d  not from 0..nMem
e690: 2d 31 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6e 3d  -1 */.    for(n=
e6a0: 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29  1; n<=nMem; n++)
e6b0: 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b  {.      p->aMem[
e6c0: 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55  n].flags = MEM_U
e6d0: 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 20 20  ndefined;.      
e6e0: 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20  p->aMem[n].db = 
e6f0: 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  db;.    }.  }.  
e700: 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 70 50 61  p->explain = pPa
e710: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a 20 20  rse->explain;.  
e720: 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e  sqlite3VdbeRewin
e730: 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  d(p);.}../*.** C
e740: 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75 72 73  lose a VDBE curs
e750: 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61  or and release a
e760: 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65 73  ll the resources
e770: 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a   that cursor .**
e780: 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64   happens to hold
e790: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
e7a0: 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28  3VdbeFreeCursor(
e7b0: 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72  Vdbe *p, VdbeCur
e7c0: 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28  sor *pCx){.  if(
e7d0: 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72   pCx==0 ){.    r
e7e0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
e7f0: 65 72 74 28 20 70 43 78 2d 3e 70 42 74 3d 3d 30  ert( pCx->pBt==0
e800: 20 7c 7c 20 70 43 78 2d 3e 65 43 75 72 54 79 70   || pCx->eCurTyp
e810: 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45  e==CURTYPE_BTREE
e820: 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 43   );.  switch( pC
e830: 78 2d 3e 65 43 75 72 54 79 70 65 20 29 7b 0a 20  x->eCurType ){. 
e840: 20 20 20 63 61 73 65 20 43 55 52 54 59 50 45 5f     case CURTYPE_
e850: 53 4f 52 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  SORTER: {.      
e860: 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65  sqlite3VdbeSorte
e870: 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20 70 43  rClose(p->db, pC
e880: 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  x);.      break;
e890: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
e8a0: 43 55 52 54 59 50 45 5f 42 54 52 45 45 3a 20 7b  CURTYPE_BTREE: {
e8b0: 0a 20 20 20 20 20 20 69 66 28 20 70 43 78 2d 3e  .      if( pCx->
e8c0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pBt ){.        s
e8d0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
e8e0: 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20 20  (pCx->pBt);.    
e8f0: 20 20 20 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e      /* The pCx->
e900: 70 43 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20  pCursor will be 
e910: 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69 63 61  close automatica
e920: 6c 6c 79 2c 20 69 66 20 69 74 20 65 78 69 73 74  lly, if it exist
e930: 73 2c 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a  s, by.        **
e940: 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e   the call above.
e950: 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   */.      }else{
e960: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
e970: 20 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72   pCx->uc.pCursor
e980: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73  !=0 );.        s
e990: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
e9a0: 43 75 72 73 6f 72 28 70 43 78 2d 3e 75 63 2e 70  Cursor(pCx->uc.p
e9b0: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d  Cursor);.      }
e9c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e9d0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
e9e0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
e9f0: 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 43 55  ABLE.    case CU
ea00: 52 54 59 50 45 5f 56 54 41 42 3a 20 7b 0a 20 20  RTYPE_VTAB: {.  
ea10: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62      sqlite3_vtab
ea20: 5f 63 75 72 73 6f 72 20 2a 70 56 43 75 72 20 3d  _cursor *pVCur =
ea30: 20 70 43 78 2d 3e 75 63 2e 70 56 43 75 72 3b 0a   pCx->uc.pVCur;.
ea40: 20 20 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69        const sqli
ea50: 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64  te3_module *pMod
ea60: 75 6c 65 20 3d 20 70 56 43 75 72 2d 3e 70 56 74  ule = pVCur->pVt
ea70: 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20  ab->pModule;.   
ea80: 20 20 20 61 73 73 65 72 74 28 20 70 56 43 75 72     assert( pVCur
ea90: 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 3e 30 20  ->pVtab->nRef>0 
eaa0: 29 3b 0a 20 20 20 20 20 20 70 56 43 75 72 2d 3e  );.      pVCur->
eab0: 70 56 74 61 62 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  pVtab->nRef--;. 
eac0: 20 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43       pModule->xC
ead0: 6c 6f 73 65 28 70 56 43 75 72 29 3b 0a 20 20 20  lose(pVCur);.   
eae0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
eaf0: 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a  #endif.  }.}../*
eb00: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75  .** Close all cu
eb10: 72 73 6f 72 73 20 69 6e 20 74 68 65 20 63 75 72  rsors in the cur
eb20: 72 65 6e 74 20 66 72 61 6d 65 2e 0a 2a 2f 0a 73  rent frame..*/.s
eb30: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65  tatic void close
eb40: 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 56  CursorsInFrame(V
eb50: 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  dbe *p){.  if( p
eb60: 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20 69  ->apCsr ){.    i
eb70: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
eb80: 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b  0; i<p->nCursor;
eb90: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64 62   i++){.      Vdb
eba0: 65 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d  eCursor *pC = p-
ebb0: 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20  >apCsr[i];.     
ebc0: 20 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20 20   if( pC ){.     
ebd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
ebe0: 65 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b  eeCursor(p, pC);
ebf0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43 73  .        p->apCs
ec00: 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  r[i] = 0;.      
ec10: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
ec20: 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 76 61  *.** Copy the va
ec30: 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74  lues stored in t
ec40: 68 65 20 56 64 62 65 46 72 61 6d 65 20 73 74 72  he VdbeFrame str
ec50: 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 56 64  ucture to its Vd
ec60: 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 75  be. This.** is u
ec70: 73 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  sed, for example
ec80: 2c 20 77 68 65 6e 20 61 20 74 72 69 67 67 65 72  , when a trigger
ec90: 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20   sub-program is 
eca0: 68 61 6c 74 65 64 20 74 6f 20 72 65 73 74 6f 72  halted to restor
ecb0: 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20  e.** control to 
ecc0: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
ecd0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ece0: 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65  VdbeFrameRestore
ecf0: 28 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61  (VdbeFrame *pFra
ed00: 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  me){.  Vdbe *v =
ed10: 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 63 6c   pFrame->v;.  cl
ed20: 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d  oseCursorsInFram
ed30: 65 28 76 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  e(v);.#ifdef SQL
ed40: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
ed50: 53 43 41 4e 53 54 41 54 55 53 0a 20 20 76 2d 3e  SCANSTATUS.  v->
ed60: 61 6e 45 78 65 63 20 3d 20 70 46 72 61 6d 65 2d  anExec = pFrame-
ed70: 3e 61 6e 45 78 65 63 3b 0a 23 65 6e 64 69 66 0a  >anExec;.#endif.
ed80: 20 20 76 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d    v->aOnceFlag =
ed90: 20 70 46 72 61 6d 65 2d 3e 61 4f 6e 63 65 46 6c   pFrame->aOnceFl
eda0: 61 67 3b 0a 20 20 76 2d 3e 6e 4f 6e 63 65 46 6c  ag;.  v->nOnceFl
edb0: 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 6e  ag = pFrame->nOn
edc0: 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 61 4f 70  ceFlag;.  v->aOp
edd0: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a   = pFrame->aOp;.
ede0: 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d    v->nOp = pFram
edf0: 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65  e->nOp;.  v->aMe
ee00: 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d  m = pFrame->aMem
ee10: 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46  ;.  v->nMem = pF
ee20: 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d  rame->nMem;.  v-
ee30: 3e 61 70 43 73 72 20 3d 20 70 46 72 61 6d 65 2d  >apCsr = pFrame-
ee40: 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75  >apCsr;.  v->nCu
ee50: 72 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  rsor = pFrame->n
ee60: 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d  Cursor;.  v->db-
ee70: 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 46 72  >lastRowid = pFr
ee80: 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a  ame->lastRowid;.
ee90: 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70    v->nChange = p
eea0: 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a  Frame->nChange;.
eeb0: 20 20 76 2d 3e 64 62 2d 3e 6e 43 68 61 6e 67 65    v->db->nChange
eec0: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 44 62 43 68   = pFrame->nDbCh
eed0: 61 6e 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 70  ange;.  return p
eee0: 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a  Frame->pc;.}../*
eef0: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75  .** Close all cu
ef00: 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  rsors..**.** Als
ef10: 6f 20 72 65 6c 65 61 73 65 20 61 6e 79 20 64 79  o release any dy
ef20: 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c  namic memory hel
ef30: 64 20 62 79 20 74 68 65 20 56 4d 20 69 6e 20 74  d by the VM in t
ef40: 68 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d  he Vdbe.aMem mem
ef50: 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72  ory .** cell arr
ef60: 61 79 2e 20 54 68 69 73 20 69 73 20 6e 65 63 65  ay. This is nece
ef70: 73 73 61 72 79 20 61 73 20 74 68 65 20 6d 65 6d  ssary as the mem
ef80: 6f 72 79 20 63 65 6c 6c 20 61 72 72 61 79 20 6d  ory cell array m
ef90: 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f  ay contain.** po
efa0: 69 6e 74 65 72 73 20 74 6f 20 56 64 62 65 46 72  inters to VdbeFr
efb0: 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77 68 69  ame objects, whi
efc0: 63 68 20 6d 61 79 20 69 6e 20 74 75 72 6e 20 63  ch may in turn c
efd0: 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20  ontain pointers 
efe0: 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f  to.** open curso
eff0: 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rs..*/.static vo
f000: 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f  id closeAllCurso
f010: 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  rs(Vdbe *p){.  i
f020: 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a  f( p->pFrame ){.
f030: 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70      VdbeFrame *p
f040: 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70  Frame;.    for(p
f050: 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b  Frame=p->pFrame;
f060: 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74   pFrame->pParent
f070: 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d  ; pFrame=pFrame-
f080: 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 73  >pParent);.    s
f090: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52  qlite3VdbeFrameR
f0a0: 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a  estore(pFrame);.
f0b0: 20 20 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20      p->pFrame = 
f0c0: 30 3b 0a 20 20 20 20 70 2d 3e 6e 46 72 61 6d 65  0;.    p->nFrame
f0d0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
f0e0: 72 74 28 20 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30  rt( p->nFrame==0
f0f0: 20 29 3b 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f   );.  closeCurso
f100: 72 73 49 6e 46 72 61 6d 65 28 70 29 3b 0a 20 20  rsInFrame(p);.  
f110: 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20  if( p->aMem ){. 
f120: 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72     releaseMemArr
f130: 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20  ay(&p->aMem[1], 
f140: 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20  p->nMem);.  }.  
f150: 77 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72  while( p->pDelFr
f160: 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46  ame ){.    VdbeF
f170: 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e  rame *pDel = p->
f180: 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70  pDelFrame;.    p
f190: 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70 44  ->pDelFrame = pD
f1a0: 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20  el->pParent;.   
f1b0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
f1c0: 65 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20  eDelete(pDel);. 
f1d0: 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20   }..  /* Delete 
f1e0: 61 6e 79 20 61 75 78 64 61 74 61 20 61 6c 6c 6f  any auxdata allo
f1f0: 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 62 79 20  cations made by 
f200: 74 68 65 20 56 4d 20 2a 2f 0a 20 20 69 66 28 20  the VM */.  if( 
f210: 70 2d 3e 70 41 75 78 44 61 74 61 20 29 20 73 71  p->pAuxData ) sq
f220: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41  lite3VdbeDeleteA
f230: 75 78 44 61 74 61 28 70 2c 20 2d 31 2c 20 30 29  uxData(p, -1, 0)
f240: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
f250: 41 75 78 44 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a  AuxData==0 );.}.
f260: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
f270: 74 68 65 20 56 4d 20 61 66 74 65 72 20 61 20 73  the VM after a s
f280: 69 6e 67 6c 65 20 72 75 6e 2e 0a 2a 2f 0a 73 74  ingle run..*/.st
f290: 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75  atic void Cleanu
f2a0: 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  p(Vdbe *p){.  sq
f2b0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
f2c0: 62 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b;..#ifdef SQLIT
f2d0: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45 78 65  E_DEBUG.  /* Exe
f2e0: 63 75 74 65 20 61 73 73 65 72 74 28 29 20 73 74  cute assert() st
f2f0: 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75  atements to ensu
f300: 72 65 20 74 68 61 74 20 74 68 65 20 56 64 62 65  re that the Vdbe
f310: 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20 20  .apCsr[] and .  
f320: 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20 61  ** Vdbe.aMem[] a
f330: 72 72 61 79 73 20 68 61 76 65 20 61 6c 72 65 61  rrays have alrea
f340: 64 79 20 62 65 65 6e 20 63 6c 65 61 6e 65 64 20  dy been cleaned 
f350: 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  up.  */.  int i;
f360: 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20  .  if( p->apCsr 
f370: 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e  ) for(i=0; i<p->
f380: 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73  nCursor; i++) as
f390: 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69  sert( p->apCsr[i
f3a0: 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  ]==0 );.  if( p-
f3b0: 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72  >aMem ){.    for
f3c0: 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d  (i=1; i<=p->nMem
f3d0: 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70  ; i++) assert( p
f3e0: 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d  ->aMem[i].flags=
f3f0: 3d 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 20 29  =MEM_Undefined )
f400: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
f410: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
f420: 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
f430: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
f440: 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74  .  p->pResultSet
f450: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   = 0;.}../*.** S
f460: 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
f470: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
f480: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
f490: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53 51  urned by this SQ
f4a0: 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20  L.** statement. 
f4b0: 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20  This is now set 
f4c0: 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
f4d0: 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75 72   rather than dur
f4e0: 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  ing.** execution
f4f0: 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72 6f   of the vdbe pro
f500: 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c  gram so that sql
f510: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
f520: 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61  t() can.** be ca
f530: 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73  lled on an SQL s
f540: 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20  tatement before 
f550: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a  sqlite3_step()..
f560: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
f570: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64  dbeSetNumCols(Vd
f580: 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43  be *p, int nResC
f590: 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70  olumn){.  Mem *p
f5a0: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e  ColName;.  int n
f5b0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
f5c0: 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65  = p->db;..  rele
f5d0: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
f5e0: 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73  ColName, p->nRes
f5f0: 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
f600: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
f610: 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61  ee(db, p->aColNa
f620: 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43  me);.  n = nResC
f630: 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b  olumn*COLNAME_N;
f640: 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  .  p->nResColumn
f650: 20 3d 20 28 75 31 36 29 6e 52 65 73 43 6f 6c 75   = (u16)nResColu
f660: 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d  mn;.  p->aColNam
f670: 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28  e = pColName = (
f680: 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  Mem*)sqlite3DbMa
f690: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
f6a0: 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20  eof(Mem)*n );.  
f6b0: 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d  if( p->aColName=
f6c0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77  =0 ) return;.  w
f6d0: 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b  hile( n-- > 0 ){
f6e0: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66  .    pColName->f
f6f0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
f700: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64  .    pColName->d
f710: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 70  b = p->db;.    p
f720: 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d  ColName++;.  }.}
f730: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
f740: 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27  name of the idx'
f750: 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20  th column to be 
f760: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
f770: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
f780: 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20  * zName must be 
f790: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  a pointer to a n
f7a0: 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul terminated st
f7b0: 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ring..**.** This
f7c0: 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61   call must be ma
f7d0: 64 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  de after a call 
f7e0: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  to sqlite3VdbeSe
f7f0: 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a  tNumCols()..**.*
f800: 2a 20 54 68 65 20 66 69 6e 61 6c 20 70 61 72 61  * The final para
f810: 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73  meter, xDel, mus
f820: 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49  t be one of SQLI
f830: 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49  TE_DYNAMIC, SQLI
f840: 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20  TE_STATIC.** or 
f850: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
f860: 2e 20 49 66 20 69 74 20 69 73 20 53 51 4c 49 54  . If it is SQLIT
f870: 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20  E_DYNAMIC, then 
f880: 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
f890: 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d  ed.** to by zNam
f8a0: 65 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  e will be freed 
f8b0: 62 79 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  by sqlite3DbFree
f8c0: 28 29 20 77 68 65 6e 20 74 68 65 20 76 64 62 65  () when the vdbe
f8d0: 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a   is destroyed..*
f8e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
f8f0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56  eSetColName(.  V
f900: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
f910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f920: 2f 2a 20 56 64 62 65 20 62 65 69 6e 67 20 63 6f  /* Vdbe being co
f930: 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e  nfigured */.  in
f940: 74 20 69 64 78 2c 20 20 20 20 20 20 20 20 20 20  t idx,          
f950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f960: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
f970: 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73 20  n zName applies 
f980: 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c  to */.  int var,
f990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
f9b0: 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a  of the COLNAME_*
f9c0: 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20   constants */.  
f9d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
f9e0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
f9f0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
fa00: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
fa10: 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20   name */.  void 
fa20: 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 20  (*xDel)(void*)  
fa30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
fa40: 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74  emory management
fa50: 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 7a 4e   strategy for zN
fa60: 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ame */.){.  int 
fa70: 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e  rc;.  Mem *pColN
fa80: 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ame;.  assert( i
fa90: 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  dx<p->nResColumn
faa0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61   );.  assert( va
fab0: 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20  r<COLNAME_N );. 
fac0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
fad0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
fae0: 61 73 73 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c  assert( !zName |
faf0: 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44  | xDel!=SQLITE_D
fb00: 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 72 65  YNAMIC );.    re
fb10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
fb20: 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  M;.  }.  assert(
fb30: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20   p->aColName!=0 
fb40: 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  );.  pColName = 
fb50: 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64  &(p->aColName[id
fb60: 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c  x+var*p->nResCol
fb70: 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71  umn]);.  rc = sq
fb80: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
fb90: 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61  tr(pColName, zNa
fba0: 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
fbb0: 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73  TF8, xDel);.  as
fbc0: 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21  sert( rc!=0 || !
fbd0: 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61  zName || (pColNa
fbe0: 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65  me->flags&MEM_Te
fbf0: 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  rm)!=0 );.  retu
fc00: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
fc10: 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  A read or write 
fc20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
fc30: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63  or may not be ac
fc40: 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65  tive on database
fc50: 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49   handle.** db. I
fc60: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
fc70: 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69  is active, commi
fc80: 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69  t it. If there i
fc90: 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61  s a.** write-tra
fca0: 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e  nsaction spannin
fcb0: 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  g more than one 
fcc0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
fcd0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74  his routine.** t
fce0: 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65  akes care of the
fcf0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
fd00: 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61  trickery..*/.sta
fd10: 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d  tic int vdbeComm
fd20: 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  it(sqlite3 *db, 
fd30: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
fd40: 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20  i;.  int nTrans 
fd50: 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  = 0;  /* Number 
fd60: 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74  of databases wit
fd70: 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74  h an active writ
fd80: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  e-transaction */
fd90: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
fda0: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65  TE_OK;.  int nee
fdb0: 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23  dXcommit = 0;..#
fdc0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
fdd0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
fde0: 20 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70   /* With this op
fdf0: 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61  tion, sqlite3Vta
fe00: 62 53 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e  bSync() is defin
fe10: 65 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20  ed to be simply 
fe20: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  .  ** SQLITE_OK 
fe30: 73 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64  so p is not used
fe40: 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44  . .  */.  UNUSED
fe50: 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23  _PARAMETER(p);.#
fe60: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f  endif..  /* Befo
fe70: 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  re doing anythin
fe80: 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65  g else, call the
fe90: 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63   xSync() callbac
fea0: 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76  k for any.  ** v
feb0: 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61  irtual module ta
fec0: 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20  bles written in 
fed0: 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
fee0: 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20  . This has to.  
fef0: 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72  ** be done befor
ff00: 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68  e determining wh
ff10: 65 74 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a  ether a master j
ff20: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a  ournal file is .
ff30: 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61    ** required, a
ff40: 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c  s an xSync() cal
ff50: 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e  lback may add an
ff60: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
ff70: 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74  se.  ** to the t
ff80: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
ff90: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
ffa0: 74 61 62 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a  tabSync(db, p);.
ffb0: 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  /* This loop 
ffc0: 64 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69  determines (a) i
ffd0: 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f  f the commit hoo
ffe0: 6b 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f  k should be invo
fff0: 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29  ked and.  ** (b)
10000 20 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61   how many databa
10010 73 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70  se files have op
10020 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
10030 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a  tions, not .  **
10040 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74   including the t
10050 65 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28 62  emp database. (b
10060 29 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62  ) is important b
10070 65 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74  ecause if more t
10080 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61  han .  ** one da
10090 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
100a0 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
100b0 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73  ansaction, a mas
100c0 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  ter journal.  **
100d0 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65   file is require
100e0 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20  d for an atomic 
100f0 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20  commit..  */ .  
10100 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
10110 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
10120 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
10130 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
10140 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
10150 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
10160 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
10170 29 7b 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f  ){.      needXco
10180 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
10190 69 66 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e  if( i!=1 ) nTran
101a0 73 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  s++;.      sqlit
101b0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
101c0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
101d0 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73  lite3PagerExclus
101e0 69 76 65 4c 6f 63 6b 28 73 71 6c 69 74 65 33 42  iveLock(sqlite3B
101f0 74 72 65 65 50 61 67 65 72 28 70 42 74 29 29 3b  treePager(pBt));
10200 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
10210 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a 20  reeLeave(pBt);. 
10220 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
10230 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
10240 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
10250 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
10260 65 20 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d  e are any write-
10270 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20  transactions at 
10280 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20  all, invoke the 
10290 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20  commit hook */. 
102a0 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74   if( needXcommit
102b0 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43   && db->xCommitC
102c0 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 72  allback ){.    r
102d0 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43  c = db->xCommitC
102e0 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d  allback(db->pCom
102f0 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66 28  mitArg);.    if(
10300 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
10310 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  urn SQLITE_CONST
10320 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b  RAINT_COMMITHOOK
10330 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
10340 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73  * The simple cas
10350 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e  e - no more than
10360 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
10370 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67  le (not counting
10380 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64   the.  ** TEMP d
10390 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20 74  atabase) has a t
103a0 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
103b0 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f  e.   There is no
103c0 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20   need for the.  
103d0 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  ** master-journa
103e0 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  l..  **.  ** If 
103f0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
10400 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
10410 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73  GetFilename() is
10420 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20   a zero length. 
10430 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d   ** string, it m
10440 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61  eans the main da
10450 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72  tabase is :memor
10460 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69 6c  y: or a temp fil
10470 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61  e.  In .  ** tha
10480 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f 74  t case we do not
10490 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20   support atomic 
104a0 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69  multi-file commi
104b0 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20 0a  ts, so use the .
104c0 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73 65    ** simple case
104d0 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a   then too..  */.
104e0 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
104f0 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33  Strlen30(sqlite3
10500 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
10510 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
10520 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d  ).   || nTrans<=
10530 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  1.  ){.    for(i
10540 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
10550 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
10560 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
10570 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
10580 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
10590 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
105a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
105b0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
105c0 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20  e(pBt, 0);.     
105d0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
105e0 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f   Do the commit o
105f0 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62  nly if all datab
10600 61 73 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c  ases successfull
10610 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65  y complete phase
10620 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f   1. .    ** If o
10630 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65 65 43  ne of the BtreeC
10640 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
10650 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69  calls fails, thi
10660 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20  s indicates an. 
10670 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77     ** IO error w
10680 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72  hile deleting or
10690 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f   truncating a jo
106a0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69  urnal file. It i
106b0 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20  s unlikely,.    
106c0 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70  ** but could hap
106d0 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  pen. In this cas
106e0 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73  e abandon proces
106f0 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20  sing and return 
10700 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a  the error..    *
10710 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  /.    for(i=0; r
10720 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
10730 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
10740 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
10750 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
10760 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
10770 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
10780 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
10790 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
107a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
107b0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
107c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
107d0 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f     sqlite3VtabCo
107e0 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a  mmit(db);.    }.
107f0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f    }..  /* The co
10800 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65  mplex case - The
10810 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69  re is a multi-fi
10820 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  le write-transac
10830 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a  tion active..  *
10840 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20  * This requires 
10850 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
10860 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20   file to ensure 
10870 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
10880 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65  is.  ** committe
10890 64 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20  d atomically..  
108a0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
108b0 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20  E_OMIT_DISKIO.  
108c0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
108d0 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64 62  3_vfs *pVfs = db
108e0 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20  ->pVfs;.    int 
108f0 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
10900 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
10910 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e  = 0;   /* File-n
10920 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74  ame for the mast
10930 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  er journal */.  
10940 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d    char const *zM
10950 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  ainFile = sqlite
10960 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
10970 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
10980 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
10990 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30  ile *pMaster = 0
109a0 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  ;.    i64 offset
109b0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65   = 0;.    int re
109c0 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 72 79  s;.    int retry
109d0 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69  Count = 0;.    i
109e0 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20  nt nMainFile;.. 
109f0 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d     /* Select a m
10a00 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10a10 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e  le name */.    n
10a20 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74  MainFile = sqlit
10a30 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69 6e  e3Strlen30(zMain
10a40 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73 74  File);.    zMast
10a50 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  er = sqlite3MPri
10a60 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58 58  ntf(db, "%s-mjXX
10a70 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69 6e  XXXX9XXz", zMain
10a80 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  File);.    if( z
10a90 4d 61 73 74 65 72 3d 3d 30 20 29 20 72 65 74 75  Master==0 ) retu
10aa0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
10ab0 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
10ac0 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20  u32 iRandom;.   
10ad0 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e     if( retryCoun
10ae0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
10af0 20 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 30 20   retryCount>100 
10b00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
10b10 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
10b20 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65  FULL, "MJ delete
10b30 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b  : %s", zMaster);
10b40 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10b50 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
10b60 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
10b70 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
10b80 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
10b90 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29   retryCount==1 )
10ba0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
10bb0 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46  te3_log(SQLITE_F
10bc0 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65  ULL, "MJ collide
10bd0 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b  : %s", zMaster);
10be0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10bf0 20 7d 0a 20 20 20 20 20 20 72 65 74 72 79 43 6f   }.      retryCo
10c00 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  unt++;.      sql
10c10 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
10c20 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c  sizeof(iRandom),
10c30 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20   &iRandom);.    
10c40 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
10c50 74 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b  tf(13, &zMaster[
10c60 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a  nMainFile], "-mj
10c70 25 30 36 58 39 25 30 32 58 22 2c 0a 20 20 20 20  %06X9%02X",.    
10c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c90 20 20 20 20 20 20 20 20 20 20 20 28 69 52 61 6e             (iRan
10ca0 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 66 66  dom>>8)&0xffffff
10cb0 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b  , iRandom&0xff);
10cc0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 6e  .      /* The an
10cd0 74 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 63 68  tipenultimate ch
10ce0 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 6d  aracter of the m
10cf0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
10d00 6d 65 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a  me must.      **
10d10 20 62 65 20 22 39 22 20 74 6f 20 61 76 6f 69 64   be "9" to avoid
10d20 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73   name collisions
10d30 20 77 68 65 6e 20 75 73 69 6e 67 20 38 2b 33 20   when using 8+3 
10d40 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20  filenames. */.  
10d50 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d 61 73      assert( zMas
10d60 74 65 72 5b 73 71 6c 69 74 65 33 53 74 72 6c 65  ter[sqlite3Strle
10d70 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d  n30(zMaster)-3]=
10d80 3d 27 39 27 20 29 3b 0a 20 20 20 20 20 20 73 71  ='9' );.      sq
10d90 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
10da0 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73  (zMainFile, zMas
10db0 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ter);.      rc =
10dc0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
10dd0 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
10de0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
10df0 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20  ISTS, &res);.   
10e00 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
10e10 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b  ITE_OK && res );
10e20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
10e30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10e40 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74  /* Open the mast
10e50 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  er journal. */. 
10e60 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
10e70 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56  3OsOpenMalloc(pV
10e80 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d  fs, zMaster, &pM
10e90 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20  aster, .        
10ea0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
10eb0 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
10ec0 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20  PEN_CREATE|.    
10ed0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
10ee0 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49  N_EXCLUSIVE|SQLI
10ef0 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
10f00 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20  OURNAL, 0.      
10f10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
10f20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10f30 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
10f40 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
10f50 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
10f60 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20   rc;.    }. .   
10f70 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61   /* Write the na
10f80 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62  me of each datab
10f90 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ase file in the 
10fa0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f  transaction into
10fb0 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20   the new.    ** 
10fc0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
10fd0 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ile. If an error
10fe0 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20   occurs at this 
10ff0 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20  point close.    
11000 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ** and delete th
11010 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11020 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69   file. All the i
11030 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
11040 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73  l files.    ** s
11050 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27  till have 'null'
11060 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a   as the master j
11070 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20  ournal pointer, 
11080 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c  so they will rol
11090 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e  l.    ** back in
110a0 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61  dependently if a
110b0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e   failure occurs.
110c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
110d0 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
110e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
110f0 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
11100 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
11110 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
11120 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
11130 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f  .        char co
11140 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c  nst *zFile = sql
11150 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72  ite3BtreeGetJour
11160 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20  nalname(pBt);.  
11170 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d        if( zFile=
11180 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11190 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67  continue;  /* Ig
111a0 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d  nore TEMP and :m
111b0 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73  emory: databases
111c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
111d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 46        assert( zF
111e0 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20  ile[0]!=0 );.   
111f0 20 20 20 20 20 69 66 28 20 21 6e 65 65 64 53 79       if( !needSy
11200 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33 42 74  nc && !sqlite3Bt
11210 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28  reeSyncDisabled(
11220 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
11230 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a    needSync = 1;.
11240 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11250 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
11260 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a  Write(pMaster, z
11270 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53 74 72  File, sqlite3Str
11280 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20  len30(zFile)+1, 
11290 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  offset);.       
112a0 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c 69 74   offset += sqlit
112b0 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
112c0 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28  )+1;.        if(
112d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
112e0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
112f0 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
11300 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
11310 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
11320 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
11330 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
11340 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
11350 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
11360 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
11370 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11380 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
11390 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72   Sync the master
113a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
113b0 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55  f the IOCAP_SEQU
113c0 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20  ENTIAL device.  
113d0 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74    ** flag is set
113e0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   this is not req
113f0 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
11400 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20 0a    if( needSync .
11410 20 20 20 20 20 26 26 20 30 3d 3d 28 73 71 6c 69       && 0==(sqli
11420 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
11430 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73 74  cteristics(pMast
11440 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  er)&SQLITE_IOCAP
11450 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 20  _SEQUENTIAL).   
11460 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    && SQLITE_OK!=
11470 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  (rc = sqlite3OsS
11480 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c  ync(pMaster, SQL
11490 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
114a0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73  ).    ){.      s
114b0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
114c0 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
114d0 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
114e0 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
114f0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
11500 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
11510 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
11520 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
11530 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74     /* Sync all t
11540 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f  he db files invo
11550 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e  lved in the tran
11560 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d  saction. The sam
11570 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65  e call.    ** se
11580 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ts the master jo
11590 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e  urnal pointer in
115a0 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c   each individual
115b0 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
115c0 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
115d0 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74  urs here, do not
115e0 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
115f0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
11600 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
11610 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75  f the error occu
11620 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66 69  rs during the fi
11630 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  rst call to.    
11640 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
11650 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c  ommitPhaseOne(),
11660 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   then there is a
11670 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
11680 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a  .    ** master j
11690 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c  ournal file will
116a0 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75   be orphaned. Bu
116b0 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65  t we cannot dele
116c0 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e  te it,.    ** in
116d0 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65 72   case the master
116e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
116f0 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69  me was written i
11700 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  nto the journal.
11710 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f      ** file befo
11720 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f  re the failure o
11730 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  ccurred..    */.
11740 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
11750 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
11760 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
11770 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
11780 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
11790 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
117a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
117b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
117c0 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c  mitPhaseOne(pBt,
117d0 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
117e0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
117f0 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
11800 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73  pMaster);.    as
11810 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
11820 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66 28  _BUSY );.    if(
11830 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11840 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
11850 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
11860 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
11870 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
11880 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61  /* Delete the ma
11890 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
118a0 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20  e. This commits 
118b0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
118c0 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f   After.    ** do
118d0 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69 72  ing this the dir
118e0 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64  ectory is synced
118f0 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e   again before an
11900 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20  y individual.   
11910 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
11920 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65  files are delete
11930 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  d..    */.    rc
11940 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
11950 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
11960 2c 20 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20  , needSync);.   
11970 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
11980 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
11990 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
119a0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
119b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
119c0 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66   }..    /* All f
119d0 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f  iles and directo
119e0 72 69 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ries have alread
119f0 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73  y been synced, s
11a00 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  o the following.
11a10 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20      ** calls to 
11a20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
11a30 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 72 65  itPhaseTwo() are
11a40 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69   only closing fi
11a50 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64  les and.    ** d
11a60 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63  eleting or trunc
11a70 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20  ating journals. 
11a80 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  If something goe
11a90 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20  s wrong while.  
11aa0 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70    ** this is hap
11ab0 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 20  pening we don't 
11ac0 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65  really care. The
11ad0 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68   integrity of th
11ae0 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
11af0 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20  tion is already 
11b00 67 75 61 72 61 6e 74 65 65 64 2c 20 62 75 74 20  guaranteed, but 
11b10 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64  some stray 'cold
11b20 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a  ' journals.    *
11b30 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61  * may be lying a
11b40 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67  round. Returning
11b50 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77   an error code w
11b60 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72  on't help matter
11b70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 69  s..    */.    di
11b80 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
11b90 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20  io_errors();.   
11ba0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
11bb0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
11bc0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
11bd0 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
11be0 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
11bf0 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
11c00 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
11c10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
11c20 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
11c30 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20 20 20  wo(pBt, 1);.    
11c40 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
11c50 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
11c60 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62  lloc();.    enab
11c70 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
11c80 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73  errors();..    s
11c90 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74  qlite3VtabCommit
11ca0 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
11cb0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
11cc0 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ../* .** This ro
11cd0 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61  utine checks tha
11ce0 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e 6e 56  t the sqlite3.nV
11cf0 64 62 65 41 63 74 69 76 65 20 63 6f 75 6e 74 20  dbeActive count 
11d00 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63  variable.** matc
11d10 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hes the number o
11d20 66 20 76 64 62 65 27 73 20 69 6e 20 74 68 65 20  f vdbe's in the 
11d30 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56 64  list sqlite3.pVd
11d40 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63  be that are.** c
11d50 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 2e  urrently active.
11d60 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61   An assertion fa
11d70 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20 63  ils if the two c
11d80 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74  ounts do not mat
11d90 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ch..** This is a
11da0 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d  n internal self-
11db0 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20  check only - it 
11dc0 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74  is not an essent
11dd0 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a  ial processing.*
11de0 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  * step..**.** Th
11df0 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  is is a no-op if
11e00 20 4e 44 45 42 55 47 20 69 73 20 64 65 66 69 6e   NDEBUG is defin
11e10 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ed..*/.#ifndef N
11e20 44 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69  DEBUG.static voi
11e30 64 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62  d checkActiveVdb
11e40 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62  eCnt(sqlite3 *db
11e50 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
11e60 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69  int cnt = 0;.  i
11e70 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20  nt nWrite = 0;. 
11e80 20 69 6e 74 20 6e 52 65 61 64 20 3d 20 30 3b 0a   int nRead = 0;.
11e90 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b    p = db->pVdbe;
11ea0 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
11eb0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
11ec0 74 6d 74 5f 62 75 73 79 28 28 73 71 6c 69 74 65  tmt_busy((sqlite
11ed0 33 5f 73 74 6d 74 2a 29 70 29 20 29 7b 0a 20 20  3_stmt*)p) ){.  
11ee0 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20      cnt++;.     
11ef0 20 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79   if( p->readOnly
11f00 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a  ==0 ) nWrite++;.
11f10 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73        if( p->bIs
11f20 52 65 61 64 65 72 20 29 20 6e 52 65 61 64 2b 2b  Reader ) nRead++
11f30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20  ;.    }.    p = 
11f40 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
11f50 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d  assert( cnt==db-
11f60 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 3b 0a  >nVdbeActive );.
11f70 20 20 61 73 73 65 72 74 28 20 6e 57 72 69 74 65    assert( nWrite
11f80 3d 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  ==db->nVdbeWrite
11f90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52   );.  assert( nR
11fa0 65 61 64 3d 3d 64 62 2d 3e 6e 56 64 62 65 52 65  ead==db->nVdbeRe
11fb0 61 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64  ad );.}.#else.#d
11fc0 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76  efine checkActiv
11fd0 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64  eVdbeCnt(x).#end
11fe0 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
11ff0 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
12000 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
12010 6e 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74  nt opened a stat
12020 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f  ement-transactio
12030 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e  n,.** close it n
12040 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f 70  ow. Argument eOp
12050 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
12060 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
12070 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49  CK or.** SAVEPOI
12080 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 69  NT_RELEASE. If i
12090 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  t is SAVEPOINT_R
120a0 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 68  OLLBACK, then th
120b0 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74  e statement.** t
120c0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
120d0 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65 4f  lled back. If eO
120e0 70 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  p is SAVEPOINT_R
120f0 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68 65  ELEASE, then the
12100 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74   .** statement t
12110 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
12120 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  mmitted..**.** I
12130 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
12140 63 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f  curs, an SQLITE_
12150 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20  IOERR_XXX error 
12160 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
12170 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  . .** Otherwise 
12180 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
12190 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  t sqlite3VdbeClo
121a0 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65  seStatement(Vdbe
121b0 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20   *p, int eOp){. 
121c0 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20   sqlite3 *const 
121d0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e  db = p->db;.  in
121e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
121f0 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 2d 3e 69 53  ;..  /* If p->iS
12200 74 61 74 65 6d 65 6e 74 20 69 73 20 67 72 65 61  tatement is grea
12210 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ter than zero, t
12220 68 65 6e 20 74 68 69 73 20 56 64 62 65 20 6f 70  hen this Vdbe op
12230 65 6e 65 64 20 61 20 0a 20 20 2a 2a 20 73 74 61  ened a .  ** sta
12240 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
12250 6f 6e 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  on that should b
12260 65 20 63 6c 6f 73 65 64 20 68 65 72 65 2e 20 54  e closed here. T
12270 68 65 20 6f 6e 6c 79 20 65 78 63 65 70 74 69 6f  he only exceptio
12280 6e 0a 20 20 2a 2a 20 69 73 20 74 68 61 74 20 61  n.  ** is that a
12290 6e 20 49 4f 20 65 72 72 6f 72 20 6d 61 79 20 68  n IO error may h
122a0 61 76 65 20 6f 63 63 75 72 72 65 64 2c 20 63 61  ave occurred, ca
122b0 75 73 69 6e 67 20 61 6e 20 65 6d 65 72 67 65 6e  using an emergen
122c0 63 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a  cy rollback..  *
122d0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 28  * In this case (
122e0 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d  db->nStatement==
122f0 30 29 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73  0), and there is
12300 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e 0a   nothing to do..
12310 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e    */.  if( db->n
12320 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e  Statement && p->
12330 69 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20  iStatement ){.  
12340 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e    int i;.    con
12350 73 74 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  st int iSavepoin
12360 74 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e  t = p->iStatemen
12370 74 2d 31 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  t-1;..    assert
12380 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  ( eOp==SAVEPOINT
12390 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70  _ROLLBACK || eOp
123a0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
123b0 41 53 45 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ASE);.    assert
123c0 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  ( db->nStatement
123d0 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
123e0 28 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d  ( p->iStatement=
123f0 3d 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  =(db->nStatement
12400 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29  +db->nSavepoint)
12410 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30   );..    for(i=0
12420 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
12430 29 7b 20 0a 20 20 20 20 20 20 69 6e 74 20 72 63  ){ .      int rc
12440 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  2 = SQLITE_OK;. 
12450 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
12460 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
12470 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
12480 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  ){.        if( e
12490 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op==SAVEPOINT_RO
124a0 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
124b0 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
124c0 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
124d0 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  pBt, SAVEPOINT_R
124e0 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f  OLLBACK, iSavepo
124f0 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  int);.        }.
12500 20 20 20 20 20 20 20 20 69 66 28 20 72 63 32 3d          if( rc2=
12510 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12520 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71          rc2 = sq
12530 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
12540 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49  int(pBt, SAVEPOI
12550 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76  NT_RELEASE, iSav
12560 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  epoint);.       
12570 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
12580 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
12590 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 72            rc = r
125a0 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  c2;.        }.  
125b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
125c0 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d  db->nStatement--
125d0 3b 0a 20 20 20 20 70 2d 3e 69 53 74 61 74 65 6d  ;.    p->iStatem
125e0 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  ent = 0;..    if
125f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
12600 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 4f 70  ){.      if( eOp
12610 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
12620 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  BACK ){.        
12630 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
12640 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41  Savepoint(db, SA
12650 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
12660 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
12670 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
12680 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
12690 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
126a0 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f  qlite3VtabSavepo
126b0 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e  int(db, SAVEPOIN
126c0 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65  T_RELEASE, iSave
126d0 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a  point);.      }.
126e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
126f0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
12700 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65  ransaction is be
12710 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c  ing rolled back,
12720 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74 68   also restore th
12730 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  e .    ** databa
12740 73 65 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72  se handles defer
12750 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  red constraint c
12760 6f 75 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61  ounter to the va
12770 6c 75 65 20 69 74 20 68 61 64 20 77 68 65 6e 20  lue it had when 
12780 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74  .    ** the stat
12790 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
127a0 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a  n was opened.  *
127b0 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53  /.    if( eOp==S
127c0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
127d0 4b 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6e  K ){.      db->n
127e0 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70  DeferredCons = p
127f0 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a  ->nStmtDefCons;.
12800 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72        db->nDefer
12810 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e  redImmCons = p->
12820 6e 53 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 3b  nStmtDefImmCons;
12830 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
12840 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
12850 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
12860 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
12870 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
12880 65 64 20 62 79 20 74 68 65 20 64 61 74 61 62 61  ed by the databa
12890 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73  se .** handle as
128a0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
128b0 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61  e VM passed as a
128c0 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62  n argument is ab
128d0 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f  out to be .** co
128e0 6d 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65 72  mmitted. 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 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  g deferred forei
12910 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
12920 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c  t.** violations,
12930 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
12940 52 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65 2c  RROR. Otherwise,
12950 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
12960 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
12970 75 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76 69  utstanding FK vi
12980 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68 69  olations and thi
12990 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
129a0 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52  ns .** SQLITE_ER
129b0 52 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65 73  ROR, set the res
129c0 75 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74 6f  ult of the VM to
129d0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
129e0 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a  NT_FOREIGNKEY.**
129f0 20 61 6e 64 20 77 72 69 74 65 20 61 6e 20 65 72   and write an er
12a00 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69  ror message to i
12a10 74 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53  t. Then return S
12a20 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a  QLITE_ERROR..*/.
12a30 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12a40 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
12a50 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
12a60 68 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20  heckFk(Vdbe *p, 
12a70 69 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20  int deferred){. 
12a80 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
12a90 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66  ->db;.  if( (def
12aa0 65 72 72 65 64 20 26 26 20 28 64 62 2d 3e 6e 44  erred && (db->nD
12ab0 65 66 65 72 72 65 64 43 6f 6e 73 2b 64 62 2d 3e  eferredCons+db->
12ac0 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
12ad0 29 3e 30 29 20 0a 20 20 20 7c 7c 20 28 21 64 65  )>0) .   || (!de
12ae0 66 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b  ferred && p->nFk
12af0 43 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 0a 20  Constraint>0) . 
12b00 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
12b10 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
12b20 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20  T_FOREIGNKEY;.  
12b30 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e    p->errorAction
12b40 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20   = OE_Abort;.   
12b50 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f   sqlite3VdbeErro
12b60 72 28 70 2c 20 22 46 4f 52 45 49 47 4e 20 4b 45  r(p, "FOREIGN KE
12b70 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  Y constraint fai
12b80 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72  led");.    retur
12b90 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
12ba0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
12bb0 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
12bc0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
12bd0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
12be0 68 65 20 77 68 65 6e 20 61 20 56 44 42 45 20 74  he when a VDBE t
12bf0 72 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49  ries to halt.  I
12c00 66 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61  f the VDBE.** ha
12c10 73 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61  s made changes a
12c20 6e 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d  nd is in autocom
12c30 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63  mit mode, then c
12c40 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63  ommit those.** c
12c50 68 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f  hanges.  If a ro
12c60 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64  llback is needed
12c70 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f  , then do the ro
12c80 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  llback..**.** Th
12c90 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
12ca0 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f  e only way to mo
12cb0 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ve the state of 
12cc0 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c  a VM from.** SQL
12cd0 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f  ITE_MAGIC_RUN to
12ce0 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41   SQLITE_MAGIC_HA
12cf0 4c 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c  LT.  It is harml
12d00 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74  ess to.** call t
12d10 68 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74  his on a VM that
12d20 20 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54   is in the SQLIT
12d30 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61  E_MAGIC_HALT sta
12d40 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  te..**.** Return
12d50 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20   an error code. 
12d60 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63   If the commit c
12d70 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  ould not complet
12d80 65 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20  e because of.** 
12d90 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c  lock contention,
12da0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
12db0 55 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f  USY.  If SQLITE_
12dc0 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
12dd0 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  , it.** means th
12de0 65 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20  e close did not 
12df0 68 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73  happen and needs
12e00 20 74 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e   to be repeated.
12e10 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
12e20 64 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29  dbeHalt(Vdbe *p)
12e30 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
12e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e50 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73      /* Used to s
12e60 74 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72  tore transient r
12e70 65 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20  eturn codes */. 
12e80 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
12e90 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  ->db;..  /* This
12ea0 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69   function contai
12eb0 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61  ns the logic tha
12ec0 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20  t determines if 
12ed0 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20  a statement or. 
12ee0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
12ef0 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65  will be committe
12f00 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
12f10 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
12f20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69  the.  ** executi
12f30 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74 75  on of this virtu
12f40 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a  al machine. .  *
12f50 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66  *.  ** If any of
12f60 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
12f70 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a  rrors occur:.  *
12f80 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  *.  **     SQLIT
12f90 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20  E_NOMEM.  **    
12fa0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20   SQLITE_IOERR.  
12fb0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55  **     SQLITE_FU
12fc0 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  LL.  **     SQLI
12fd0 54 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a  TE_INTERRUPT.  *
12fe0 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20  *.  ** Then the 
12ff0 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d  internal cache m
13000 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c  ight have been l
13010 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73  eft in an incons
13020 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74  istent.  ** stat
13030 65 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72  e.  We need to r
13040 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74  ollback the stat
13050 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
13060 6e 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a 20  n, if there is. 
13070 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20   ** one, or the 
13080 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63  complete transac
13090 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73  tion if there is
130a0 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72   no statement tr
130b0 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
130c0 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
130d0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
130e0 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
130f0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
13100 28 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 29  ( p->aOnceFlag )
13110 20 6d 65 6d 73 65 74 28 70 2d 3e 61 4f 6e 63 65   memset(p->aOnce
13120 46 6c 61 67 2c 20 30 2c 20 70 2d 3e 6e 4f 6e 63  Flag, 0, p->nOnc
13130 65 46 6c 61 67 29 3b 0a 20 20 63 6c 6f 73 65 41  eFlag);.  closeA
13140 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20  llCursors(p);.  
13150 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44  if( p->magic!=VD
13160 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a  BE_MAGIC_RUN ){.
13170 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13180 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63  E_OK;.  }.  chec
13190 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64  kActiveVdbeCnt(d
131a0 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d  b);..  /* No com
131b0 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
131c0 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 70 72  needed if the pr
131d0 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72  ogram never star
131e0 74 65 64 20 6f 72 20 69 66 20 74 68 65 0a 20 20  ted or if the.  
131f0 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
13200 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 64 20 6f   does not read o
13210 72 20 77 72 69 74 65 20 61 20 64 61 74 61 62 61  r write a databa
13220 73 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 69  se file.  */.  i
13230 66 28 20 70 2d 3e 70 63 3e 3d 30 20 26 26 20 70  f( p->pc>=0 && p
13240 2d 3e 62 49 73 52 65 61 64 65 72 20 29 7b 0a 20  ->bIsReader ){. 
13250 20 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a     int mrc;   /*
13260 20 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63   Primary error c
13270 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a  ode from p->rc *
13280 2f 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65  /.    int eState
13290 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20  mentOp = 0;.    
132a0 69 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72 72  int isSpecialErr
132b0 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  or;            /
132c0 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66  * Set to true if
132d0 20 61 20 27 73 70 65 63 69 61 6c 27 20 65 72 72   a 'special' err
132e0 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f  or */..    /* Lo
132f0 63 6b 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73  ck all btrees us
13300 65 64 20 62 79 20 74 68 65 20 73 74 61 74 65 6d  ed by the statem
13310 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ent */.    sqlit
13320 65 33 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a  e3VdbeEnter(p);.
13330 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  .    /* Check fo
13340 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65  r one of the spe
13350 63 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20  cial errors */. 
13360 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26     mrc = p->rc &
13370 20 30 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65   0xff;.    isSpe
13380 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d  cialError = mrc=
13390 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
133a0 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   mrc==SQLITE_IOE
133b0 52 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RR.             
133c0 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d          || mrc==
133d0 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
133e0 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
133f0 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73  FULL;.    if( is
13400 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a  SpecialError ){.
13410 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
13420 71 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f  query was read-o
13430 6e 6c 79 20 61 6e 64 20 74 68 65 20 65 72 72 6f  nly and the erro
13440 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45  r code is SQLITE
13450 5f 49 4e 54 45 52 52 55 50 54 2c 20 0a 20 20 20  _INTERRUPT, .   
13460 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63     ** no rollbac
13470 6b 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20  k is necessary. 
13480 4f 74 68 65 72 77 69 73 65 2c 20 61 74 20 6c 65  Otherwise, at le
13490 61 73 74 20 61 20 73 61 76 65 70 6f 69 6e 74 20  ast a savepoint 
134a0 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  .      ** transa
134b0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f  ction must be ro
134c0 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 72 65 73  lled back to res
134d0 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
134e0 65 20 74 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a  e to a .      **
134f0 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74   consistent stat
13500 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
13510 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65    ** Even if the
13520 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65   statement is re
13530 61 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69  ad-only, it is i
13540 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 65 72 66  mportant to perf
13550 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20 73  orm.      ** a s
13560 74 61 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e  tatement or tran
13570 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b  saction rollback
13580 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74   operation. If t
13590 68 65 20 65 72 72 6f 72 20 0a 20 20 20 20 20 20  he error .      
135a0 2a 2a 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  ** occurred whil
135b0 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
135c0 20 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f   journal, sub-jo
135d0 75 72 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73  urnal or databas
135e0 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20  e.      ** file 
135f0 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66  as part of an ef
13600 66 6f 72 74 20 74 6f 20 66 72 65 65 20 75 70 20  fort to free up 
13610 63 61 63 68 65 20 73 70 61 63 65 20 28 73 65 65  cache space (see
13620 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20   function.      
13630 2a 2a 20 70 61 67 65 72 53 74 72 65 73 73 28 29  ** pagerStress()
13640 20 69 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68   in pager.c), th
13650 65 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65  e rollback is re
13660 71 75 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72  quired to restor
13670 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  e .      ** the 
13680 70 61 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69  pager to a consi
13690 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20  stent state..   
136a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
136b0 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20  !p->readOnly || 
136c0 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45  mrc!=SQLITE_INTE
136d0 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20  RRUPT ){.       
136e0 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54   if( (mrc==SQLIT
136f0 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d  E_NOMEM || mrc==
13700 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20  SQLITE_FULL) && 
13710 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e  p->usesStmtJourn
13720 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  al ){.          
13730 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53  eStatementOp = S
13740 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
13750 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  K;.        }else
13760 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
13770 65 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20  e are forced to 
13780 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63  roll back the ac
13790 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
137a0 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20  . Before doing. 
137b0 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20           ** so, 
137c0 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20  abort any other 
137d0 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20  statements this 
137e0 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79  handle currently
137f0 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20   has active..   
13800 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
13810 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
13820 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
13830 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
13840 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
13850 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
13860 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
13870 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
13880 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  t = 1;.         
13890 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
138a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
138b0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
138c0 20 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64   Check for immed
138d0 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  iate foreign key
138e0 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a   violations. */.
138f0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
13900 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13910 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65    sqlite3VdbeChe
13920 63 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20  ckFk(p, 0);.    
13930 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
13940 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66  he auto-commit f
13950 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74  lag is set and t
13960 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  his is the only 
13970 61 63 74 69 76 65 20 77 72 69 74 65 72 20 0a 20  active writer . 
13980 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77     ** VM, then w
13990 65 20 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f  e do either a co
139a0 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  mmit or rollback
139b0 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
139c0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20  transaction. .  
139d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65    **.    ** Note
139e0 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73  : This block als
139f0 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66  o runs if one of
13a00 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72   the special err
13a10 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20  ors handled .   
13a20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63   ** above has oc
13a30 63 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a  curred. .    */.
13a40 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
13a50 56 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a  VtabInSync(db) .
13a60 20 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f       && db->auto
13a70 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20  Commit .     && 
13a80 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d  db->nVdbeWrite==
13a90 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29  (p->readOnly==0)
13aa0 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69   .    ){.      i
13ab0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
13ac0 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72  _OK || (p->error
13ad0 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20  Action==OE_Fail 
13ae0 26 26 20 21 69 73 53 70 65 63 69 61 6c 45 72 72  && !isSpecialErr
13af0 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  or) ){.        r
13b00 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  c = sqlite3VdbeC
13b10 68 65 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20  heckFk(p, 1);.  
13b20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
13b30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13b40 20 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70       if( NEVER(p
13b50 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20  ->readOnly) ){. 
13b60 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
13b70 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a  e3VdbeLeave(p);.
13b80 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
13b90 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
13ba0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
13bb0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
13bc0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f  TE_CONSTRAINT_FO
13bd0 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20  REIGNKEY;.      
13be0 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20    }else{ .      
13bf0 20 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d      /* The auto-
13c00 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74  commit flag is t
13c10 72 75 65 2c 20 74 68 65 20 76 64 62 65 20 70 72  rue, the vdbe pr
13c20 6f 67 72 61 6d 20 77 61 73 20 73 75 63 63 65 73  ogram was succes
13c30 73 66 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20  sful .          
13c40 2a 2a 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52  ** or hit an 'OR
13c50 20 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e   FAIL' constrain
13c60 74 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  t and there are 
13c70 6e 6f 20 64 65 66 65 72 72 65 64 20 66 6f 72 65  no deferred fore
13c80 69 67 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ign.          **
13c90 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73   key constraints
13ca0 20 74 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20   to hold up the 
13cb0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69  transaction. Thi
13cc0 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74  s means a commit
13cd0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69   .          ** i
13ce0 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  s required. */. 
13cf0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64           rc = vd
13d00 62 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b  beCommit(db, p);
13d10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13d20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13d30 45 5f 42 55 53 59 20 26 26 20 70 2d 3e 72 65 61  E_BUSY && p->rea
13d40 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20  dOnly ){.       
13d50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65     sqlite3VdbeLe
13d60 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ave(p);.        
13d70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13d80 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65  BUSY;.        }e
13d90 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49  lse if( rc!=SQLI
13da0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
13db0 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
13dc0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13dd0 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
13de0 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20  SQLITE_OK);.    
13df0 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
13e00 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
13e10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64  lse{.          d
13e20 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
13e30 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
13e40 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
13e50 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  Cons = 0;.      
13e60 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
13e70 20 7e 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b   ~SQLITE_DeferFK
13e80 73 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  s;.          sql
13e90 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e  ite3CommitIntern
13ea0 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20  alChanges(db);. 
13eb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13ec0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
13ed0 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
13ee0 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
13ef0 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61  .        p->nCha
13f00 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  nge = 0;.      }
13f10 0a 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74  .      db->nStat
13f20 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d  ement = 0;.    }
13f30 65 6c 73 65 20 69 66 28 20 65 53 74 61 74 65 6d  else if( eStatem
13f40 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20  entOp==0 ){.    
13f50 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
13f60 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72  ITE_OK || p->err
13f70 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69  orAction==OE_Fai
13f80 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74  l ){.        eSt
13f90 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45  atementOp = SAVE
13fa0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20  POINT_RELEASE;. 
13fb0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
13fc0 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f  ->errorAction==O
13fd0 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20  E_Abort ){.     
13fe0 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20     eStatementOp 
13ff0 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  = SAVEPOINT_ROLL
14000 42 41 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  BACK;.      }els
14010 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
14020 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
14030 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  , SQLITE_ABORT_R
14040 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20  OLLBACK);.      
14050 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
14060 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
14070 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
14080 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
14090 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
140a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
140b0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74    .    /* If eSt
140c0 61 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e  atementOp is non
140d0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74  -zero, then a st
140e0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
140f0 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20  ion needs to.   
14100 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64   ** be committed
14110 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   or rolled back.
14120 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62   Call sqlite3Vdb
14130 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
14140 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73  ) to.    ** do s
14150 6f 2e 20 49 66 20 74 68 69 73 20 6f 70 65 72 61  o. If this opera
14160 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20  tion returns an 
14170 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63  error, and the c
14180 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  urrent statement
14190 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f  .    ** error co
141a0 64 65 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20  de is SQLITE_OK 
141b0 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  or SQLITE_CONSTR
141c0 41 49 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f  AINT, then promo
141d0 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75  te the.    ** cu
141e0 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20  rrent statement 
141f0 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20  error code..    
14200 2a 2f 0a 20 20 20 20 69 66 28 20 65 53 74 61 74  */.    if( eStat
14210 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20  ementOp ){.     
14220 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
14230 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
14240 70 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29  p, eStatementOp)
14250 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
14260 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
14270 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
14280 7c 20 28 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d  | (p->rc&0xff)==
14290 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
142a0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  T ){.          p
142b0 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
142c0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
142d0 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
142e0 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  g);.          p-
142f0 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
14300 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14310 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
14320 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42  ll(db, SQLITE_AB
14330 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20  ORT_ROLLBACK);. 
14340 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c         sqlite3Cl
14350 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
14360 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61  );.        db->a
14370 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  utoCommit = 1;. 
14380 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67         p->nChang
14390 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
143a0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
143b0 66 20 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e  f this was an IN
143c0 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20  SERT, UPDATE or 
143d0 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73 74  DELETE and no st
143e0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
143f0 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20 62  ion.    ** has b
14400 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c  een rolled back,
14410 20 75 70 64 61 74 65 20 74 68 65 20 64 61 74 61   update the data
14420 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
14430 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20  change-counter. 
14440 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
14450 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29  p->changeCntOn )
14460 7b 0a 20 20 20 20 20 20 69 66 28 20 65 53 74 61  {.      if( eSta
14470 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f  tementOp!=SAVEPO
14480 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
14490 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
144a0 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62  dbeSetChanges(db
144b0 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20  , p->nChange);. 
144c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
144d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
144e0 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29  etChanges(db, 0)
144f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14500 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
14510 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
14520 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 73 20  lease the locks 
14530 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
14540 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  beLeave(p);.  }.
14550 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75  .  /* We have su
14560 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65  ccessfully halte
14570 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65  d and closed the
14580 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69   VM.  Record thi
14590 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28  s fact. */.  if(
145a0 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
145b0 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65   db->nVdbeActive
145c0 2d 2d 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  --;.    if( !p->
145d0 72 65 61 64 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e  readOnly ) db->n
145e0 56 64 62 65 57 72 69 74 65 2d 2d 3b 0a 20 20 20  VdbeWrite--;.   
145f0 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65   if( p->bIsReade
14600 72 20 29 20 64 62 2d 3e 6e 56 64 62 65 52 65 61  r ) db->nVdbeRea
14610 64 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  d--;.    assert(
14620 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65   db->nVdbeActive
14630 3e 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20  >=db->nVdbeRead 
14640 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
14650 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 3d 64 62  b->nVdbeRead>=db
14660 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a  ->nVdbeWrite );.
14670 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
14680 6e 56 64 62 65 57 72 69 74 65 3e 3d 30 20 29 3b  nVdbeWrite>=0 );
14690 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20  .  }.  p->magic 
146a0 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  = VDBE_MAGIC_HAL
146b0 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65  T;.  checkActive
146c0 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 69  VdbeCnt(db);.  i
146d0 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
146e0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d  Failed ){.    p-
146f0 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
14700 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  EM;.  }..  /* If
14710 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   the auto-commit
14720 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20   flag is set to 
14730 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c  true, then any l
14740 6f 63 6b 73 20 74 68 61 74 20 77 65 72 65 20 68  ocks that were h
14750 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e  eld.  ** by conn
14760 65 63 74 69 6f 6e 20 64 62 20 68 61 76 65 20 6e  ection db have n
14770 6f 77 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  ow been released
14780 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f  . Call sqlite3Co
14790 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64  nnectionUnlocked
147a0 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f  () .  ** to invo
147b0 6b 65 20 61 6e 79 20 72 65 71 75 69 72 65 64 20  ke any required 
147c0 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61  unlock-notify ca
147d0 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20  llbacks..  */.  
147e0 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  if( db->autoComm
147f0 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
14800 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63  3ConnectionUnloc
14810 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20  ked(db);.  }..  
14820 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62  assert( db->nVdb
14830 65 41 63 74 69 76 65 3e 30 20 7c 7c 20 64 62 2d  eActive>0 || db-
14840 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c  >autoCommit==0 |
14850 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  | db->nStatement
14860 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
14870 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42  (p->rc==SQLITE_B
14880 55 53 59 20 3f 20 53 51 4c 49 54 45 5f 42 55 53  USY ? SQLITE_BUS
14890 59 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  Y : SQLITE_OK);.
148a0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56  }.../*.** Each V
148b0 44 42 45 20 68 6f 6c 64 73 20 74 68 65 20 72 65  DBE holds the re
148c0 73 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73 74  sult of the most
148d0 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f   recent sqlite3_
148e0 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69  step() call.** i
148f0 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69 73 20 72  n p->rc.  This r
14900 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 61 74  outine sets that
14910 20 72 65 73 75 6c 74 20 62 61 63 6b 20 74 6f 20   result back to 
14920 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f  SQLITE_OK..*/.vo
14930 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  id sqlite3VdbeRe
14940 73 65 74 53 74 65 70 52 65 73 75 6c 74 28 56 64  setStepResult(Vd
14950 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20  be *p){.  p->rc 
14960 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  = SQLITE_OK;.}..
14970 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 65  /*.** Copy the e
14980 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72  rror code and er
14990 72 6f 72 20 6d 65 73 73 61 67 65 20 62 65 6c 6f  ror message belo
149a0 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 56 44 42  nging to the VDB
149b0 45 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  E passed.** as t
149c0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
149d0 74 20 74 6f 20 69 74 73 20 64 61 74 61 62 61 73  t to its databas
149e0 65 20 68 61 6e 64 6c 65 20 28 73 6f 20 74 68 61  e handle (so tha
149f0 74 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20 0a  t they will be .
14a00 2a 2a 20 72 65 74 75 72 6e 65 64 20 62 79 20 63  ** returned by c
14a10 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 5f  alls to sqlite3_
14a20 65 72 72 63 6f 64 65 28 29 20 61 6e 64 20 73 71  errcode() and sq
14a30 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 29 2e  lite3_errmsg()).
14a40 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
14a50 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6c  tion does not cl
14a60 65 61 72 20 74 68 65 20 56 44 42 45 20 65 72 72  ear the VDBE err
14a70 6f 72 20 63 6f 64 65 20 6f 72 20 6d 65 73 73 61  or code or messa
14a80 67 65 2c 20 6a 75 73 74 0a 2a 2a 20 63 6f 70 69  ge, just.** copi
14a90 65 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20 64  es them to the d
14aa0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a  atabase handle..
14ab0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
14ac0 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28  beTransferError(
14ad0 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
14ae0 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
14af0 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72  .  int rc = p->r
14b00 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 45 72 72  c;.  if( p->zErr
14b10 4d 73 67 20 29 7b 0a 20 20 20 20 75 38 20 6d 61  Msg ){.    u8 ma
14b20 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 64 62 2d  llocFailed = db-
14b30 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20  >mallocFailed;. 
14b40 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
14b50 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
14b60 20 20 20 69 66 28 20 64 62 2d 3e 70 45 72 72 3d     if( db->pErr=
14b70 3d 30 20 29 20 64 62 2d 3e 70 45 72 72 20 3d 20  =0 ) db->pErr = 
14b80 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
14b90 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  db);.    sqlite3
14ba0 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e  ValueSetStr(db->
14bb0 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72  pErr, -1, p->zEr
14bc0 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  rMsg, SQLITE_UTF
14bd0 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  8, SQLITE_TRANSI
14be0 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
14bf0 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
14c00 28 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c  ();.    db->mall
14c10 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f  ocFailed = mallo
14c20 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 64 62 2d  cFailed;.    db-
14c30 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20  >errCode = rc;. 
14c40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
14c50 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29  te3Error(db, rc)
14c60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
14c70 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
14c80 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f  ITE_ENABLE_SQLLO
14c90 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 53 51  G./*.** If an SQ
14ca0 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c  LITE_CONFIG_SQLL
14cb0 4f 47 20 68 6f 6f 6b 20 69 73 20 72 65 67 69 73  OG hook is regis
14cc0 74 65 72 65 64 20 61 6e 64 20 74 68 65 20 56 4d  tered and the VM
14cd0 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2c 20 0a   has been run, .
14ce0 2a 2a 20 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f  ** invoke it..*/
14cf0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
14d00 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 56 64  eInvokeSqllog(Vd
14d10 62 65 20 2a 76 29 7b 0a 20 20 69 66 28 20 73 71  be *v){.  if( sq
14d20 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
14d30 67 2e 78 53 71 6c 6c 6f 67 20 26 26 20 76 2d 3e  g.xSqllog && v->
14d40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
14d50 20 76 2d 3e 7a 53 71 6c 20 26 26 20 76 2d 3e 70   v->zSql && v->p
14d60 63 3e 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  c>=0 ){.    char
14d70 20 2a 7a 45 78 70 61 6e 64 65 64 20 3d 20 73 71   *zExpanded = sq
14d80 6c 69 74 65 33 56 64 62 65 45 78 70 61 6e 64 53  lite3VdbeExpandS
14d90 71 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a  ql(v, v->zSql);.
14da0 20 20 20 20 61 73 73 65 72 74 28 20 76 2d 3e 64      assert( v->d
14db0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20  b->init.busy==0 
14dc0 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 78 70 61  );.    if( zExpa
14dd0 6e 64 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71  nded ){.      sq
14de0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
14df0 67 2e 78 53 71 6c 6c 6f 67 28 0a 20 20 20 20 20  g.xSqllog(.     
14e00 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
14e10 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67  alConfig.pSqllog
14e20 41 72 67 2c 20 76 2d 3e 64 62 2c 20 7a 45 78 70  Arg, v->db, zExp
14e30 61 6e 64 65 64 2c 20 31 0a 20 20 20 20 20 20 29  anded, 1.      )
14e40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
14e50 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 7a 45 78  bFree(v->db, zEx
14e60 70 61 6e 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20  panded);.    }. 
14e70 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
14e80 69 6e 65 20 76 64 62 65 49 6e 76 6f 6b 65 53 71  ine vdbeInvokeSq
14e90 6c 6c 6f 67 28 78 29 0a 23 65 6e 64 69 66 0a 0a  llog(x).#endif..
14ea0 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61  /*.** Clean up a
14eb0 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63   VDBE after exec
14ec0 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74  ution but do not
14ed0 20 64 65 6c 65 74 65 20 74 68 65 20 56 44 42 45   delete the VDBE
14ee0 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72   just yet..** Wr
14ef0 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ite any error me
14f00 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45  ssages into *pzE
14f10 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74  rrMsg.  Return t
14f20 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a  he result code..
14f30 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73  **.** After this
14f40 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c   routine is run,
14f50 20 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64   the VDBE should
14f60 20 62 65 20 72 65 61 64 79 20 74 6f 20 62 65 20   be ready to be 
14f70 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69  executed.** agai
14f80 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b  n..**.** To look
14f90 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77   at it another w
14fa0 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ay, this routine
14fb0 20 72 65 73 65 74 73 20 74 68 65 20 73 74 61 74   resets the stat
14fc0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74  e of the.** virt
14fd0 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d  ual machine from
14fe0 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20   VDBE_MAGIC_RUN 
14ff0 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41  or VDBE_MAGIC_HA
15000 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44  LT back to.** VD
15010 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a  BE_MAGIC_INIT..*
15020 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
15030 65 52 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b  eReset(Vdbe *p){
15040 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
15050 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20    db = p->db;.. 
15060 20 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69   /* If the VM di
15070 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d  d not run to com
15080 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74  pletion or if it
15090 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a   encountered an.
150a0 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e    ** error, then
150b0 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61   it might not ha
150c0 76 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70  ve been halted p
150d0 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c  roperly.  So hal
150e0 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20  t.  ** it now.. 
150f0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
15100 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20  eHalt(p);..  /* 
15110 49 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  If the VDBE has 
15120 62 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74  be run even part
15130 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e  ially, then tran
15140 73 66 65 72 20 74 68 65 20 65 72 72 6f 72 20 63  sfer the error c
15150 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72  ode.  ** and err
15160 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20  or message from 
15170 74 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68  the VDBE into th
15180 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
15190 73 74 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a  structure.  But.
151a0 20 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45    ** if the VDBE
151b0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73   has just been s
151c0 65 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61  et to run but ha
151d0 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65  s not actually e
151e0 78 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a  xecuted any.  **
151f0 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65   instructions ye
15200 74 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69  t, leave the mai
15210 6e 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72  n database error
15220 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63   information unc
15230 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  hanged..  */.  i
15240 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  f( p->pc>=0 ){. 
15250 20 20 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c     vdbeInvokeSql
15260 6c 6f 67 28 70 29 3b 0a 20 20 20 20 73 71 6c 69  log(p);.    sqli
15270 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72 45  te3VdbeTransferE
15280 72 72 6f 72 28 70 29 3b 0a 20 20 20 20 73 71 6c  rror(p);.    sql
15290 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
152a0 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
152b0 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
152c0 20 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e      if( p->runOn
152d0 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 69  lyOnce ) p->expi
152e0 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  red = 1;.  }else
152f0 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d   if( p->rc && p-
15300 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20  >expired ){.    
15310 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 66  /* The expired f
15320 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74  lag was set on t
15330 68 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 74  he VDBE before t
15340 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20  he first call.  
15350 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f    ** to sqlite3_
15360 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73  step(). For cons
15370 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73  istency (since s
15380 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 61  qlite3_step() wa
15390 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29  s.    ** called)
153a0 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61  , set the databa
153b0 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73  se error in this
153c0 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20   case as well.. 
153d0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
153e0 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62  3ErrorWithMsg(db
153f0 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a 45 72 72  , p->rc, p->zErr
15400 4d 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20  Msg ? "%s" : 0, 
15410 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
15420 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
15430 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
15440 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
15450 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
15460 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79  claim all memory
15470 20 75 73 65 64 20 62 79 20 74 68 65 20 56 44 42   used by the VDB
15480 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70  E.  */.  Cleanup
15490 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20  (p);..  /* Save 
154a0 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d  profiling inform
154b0 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20  ation from this 
154c0 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23  VDBE run..  */.#
154d0 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
154e0 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20  LE.  {.    FILE 
154f0 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64  *out = fopen("vd
15500 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c  be_profile.out",
15510 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f   "a");.    if( o
15520 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ut ){.      int 
15530 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  i;.      fprintf
15540 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a  (out, "---- ");.
15550 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
15560 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
15570 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
15580 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61  ut, "%02x", p->a
15590 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20  Op[i].opcode);. 
155a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72       }.      fpr
155b0 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
155c0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a 53  .      if( p->zS
155d0 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  ql ){.        ch
155e0 61 72 20 63 2c 20 70 63 20 3d 20 30 3b 0a 20 20  ar c, pc = 0;.  
155f0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
15600 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20  t, "-- ");.     
15610 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d     for(i=0; (c =
15620 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21 3d 30 3b   p->zSql[i])!=0;
15630 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
15640 20 69 66 28 20 70 63 3d 3d 27 5c 6e 27 20 29 20   if( pc=='\n' ) 
15650 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  fprintf(out, "--
15660 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   ");.          p
15670 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20  utc(c, out);.   
15680 20 20 20 20 20 20 20 70 63 20 3d 20 63 3b 0a 20         pc = c;. 
15690 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
156a0 20 69 66 28 20 70 63 21 3d 27 5c 6e 27 20 29 20   if( pc!='\n' ) 
156b0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
156c0 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
156d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
156e0 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
156f0 20 20 20 63 68 61 72 20 7a 48 64 72 5b 31 30 30     char zHdr[100
15700 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ];.        sqlit
15710 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
15720 6f 66 28 7a 48 64 72 29 2c 20 7a 48 64 72 2c 20  of(zHdr), zHdr, 
15730 22 25 36 75 20 25 31 32 6c 6c 75 20 25 38 6c 6c  "%6u %12llu %8ll
15740 75 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  u ",.           
15750 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20  p->aOp[i].cnt,. 
15760 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
15770 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20  [i].cycles,.    
15780 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
15790 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b  .cnt>0 ? p->aOp[
157a0 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70  i].cycles/p->aOp
157b0 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20  [i].cnt : 0.    
157c0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 66      );.        f
157d0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22  printf(out, "%s"
157e0 2c 20 7a 48 64 72 29 3b 0a 20 20 20 20 20 20 20  , zHdr);.       
157f0 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
15800 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e  tOp(out, i, &p->
15810 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d  aOp[i]);.      }
15820 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75  .      fclose(ou
15830 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  t);.    }.  }.#e
15840 6e 64 69 66 0a 20 20 70 2d 3e 69 43 75 72 72 65  ndif.  p->iCurre
15850 6e 74 54 69 6d 65 20 3d 20 30 3b 0a 20 20 70 2d  ntTime = 0;.  p-
15860 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
15870 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75  GIC_INIT;.  retu
15880 72 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65  rn p->rc & db->e
15890 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a  rrMask;.}. ./*.*
158a0 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64  * Clean up and d
158b0 65 6c 65 74 65 20 61 20 56 44 42 45 20 61 66 74  elete a VDBE aft
158c0 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52  er execution.  R
158d0 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
158e0 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65   which is.** the
158f0 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57   result code.  W
15900 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d  rite any error m
15910 65 73 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f  essage text into
15920 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69   *pzErrMsg..*/.i
15930 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 69  nt sqlite3VdbeFi
15940 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b  nalize(Vdbe *p){
15950 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
15960 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e  TE_OK;.  if( p->
15970 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
15980 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69  C_RUN || p->magi
15990 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41  c==VDBE_MAGIC_HA
159a0 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  LT ){.    rc = s
159b0 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28  qlite3VdbeReset(
159c0 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  p);.    assert( 
159d0 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72  (rc & p->db->err
159e0 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d  Mask)==rc );.  }
159f0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  .  sqlite3VdbeDe
15a00 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75 72  lete(p);.  retur
15a10 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
15a20 66 20 70 61 72 61 6d 65 74 65 72 20 69 4f 70 20  f parameter iOp 
15a30 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
15a40 6f 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74  o, then invoke t
15a50 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f  he destructor fo
15a60 72 0a 2a 2a 20 61 6c 6c 20 61 75 78 69 6c 69 61  r.** all auxilia
15a70 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73  ry data pointers
15a80 20 63 75 72 72 65 6e 74 6c 79 20 63 61 63 68 65   currently cache
15a90 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73  d by the VM pass
15aa0 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 66 69 72  ed as.** the fir
15ab0 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  st argument..**.
15ac0 2a 2a 20 4f 72 2c 20 69 66 20 69 4f 70 20 69 73  ** Or, if iOp is
15ad0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
15ae0 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20   equal to zero, 
15af0 74 68 65 6e 20 74 68 65 20 64 65 73 74 72 75 63  then the destruc
15b00 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 69  tor is.** only i
15b10 6e 76 6f 6b 65 64 20 66 6f 72 20 74 68 6f 73 65  nvoked for those
15b20 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 20   auxiliary data 
15b30 70 6f 69 6e 74 65 72 73 20 63 72 65 61 74 65 64  pointers created
15b40 20 62 79 20 74 68 65 20 75 73 65 72 20 0a 2a 2a   by the user .**
15b50 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65   function invoke
15b60 64 20 62 79 20 74 68 65 20 4f 50 5f 46 75 6e 63  d by the OP_Func
15b70 74 69 6f 6e 20 6f 70 63 6f 64 65 20 61 74 20 69  tion opcode at i
15b80 6e 73 74 72 75 63 74 69 6f 6e 20 69 4f 70 20 6f  nstruction iOp o
15b90 66 20 0a 2a 2a 20 56 4d 20 70 56 64 62 65 2c 20  f .** VM pVdbe, 
15ba0 61 6e 64 20 6f 6e 6c 79 20 74 68 65 6e 20 69 66  and only then if
15bb0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65  :.**.**    * the
15bc0 20 61 73 73 6f 63 69 61 74 65 64 20 66 75 6e 63   associated func
15bd0 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 69  tion parameter i
15be0 73 20 74 68 65 20 33 32 6e 64 20 6f 72 20 6c 61  s the 32nd or la
15bf0 74 65 72 20 28 63 6f 75 6e 74 69 6e 67 0a 2a 2a  ter (counting.**
15c00 20 20 20 20 20 20 66 72 6f 6d 20 6c 65 66 74 20        from left 
15c10 74 6f 20 72 69 67 68 74 29 2c 20 6f 72 0a 2a 2a  to right), or.**
15c20 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 63 6f 72  .**    * the cor
15c30 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69  responding bit i
15c40 6e 20 61 72 67 75 6d 65 6e 74 20 6d 61 73 6b 20  n argument mask 
15c50 69 73 20 63 6c 65 61 72 20 28 77 68 65 72 65 20  is clear (where 
15c60 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 20  the first.**    
15c70 20 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d    function param
15c80 65 74 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 73  eter corresponds
15c90 20 74 6f 20 62 69 74 20 30 20 65 74 63 2e 29 2e   to bit 0 etc.).
15ca0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
15cb0 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74  VdbeDeleteAuxDat
15cc0 61 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 69  a(Vdbe *pVdbe, i
15cd0 6e 74 20 69 4f 70 2c 20 69 6e 74 20 6d 61 73 6b  nt iOp, int mask
15ce0 29 7b 0a 20 20 41 75 78 44 61 74 61 20 2a 2a 70  ){.  AuxData **p
15cf0 70 20 3d 20 26 70 56 64 62 65 2d 3e 70 41 75 78  p = &pVdbe->pAux
15d00 44 61 74 61 3b 0a 20 20 77 68 69 6c 65 28 20 2a  Data;.  while( *
15d10 70 70 20 29 7b 0a 20 20 20 20 41 75 78 44 61 74  pp ){.    AuxDat
15d20 61 20 2a 70 41 75 78 20 3d 20 2a 70 70 3b 0a 20  a *pAux = *pp;. 
15d30 20 20 20 69 66 28 20 28 69 4f 70 3c 30 29 0a 20     if( (iOp<0). 
15d40 20 20 20 20 7c 7c 20 28 70 41 75 78 2d 3e 69 4f      || (pAux->iO
15d50 70 3d 3d 69 4f 70 20 26 26 20 28 70 41 75 78 2d  p==iOp && (pAux-
15d60 3e 69 41 72 67 3e 33 31 20 7c 7c 20 21 28 6d 61  >iArg>31 || !(ma
15d70 73 6b 20 26 20 4d 41 53 4b 42 49 54 33 32 28 70  sk & MASKBIT32(p
15d80 41 75 78 2d 3e 69 41 72 67 29 29 29 29 0a 20 20  Aux->iArg)))).  
15d90 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63    ){.      testc
15da0 61 73 65 28 20 70 41 75 78 2d 3e 69 41 72 67 3d  ase( pAux->iArg=
15db0 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  =31 );.      if(
15dc0 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 29   pAux->xDelete )
15dd0 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e  {.        pAux->
15de0 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 41  xDelete(pAux->pA
15df0 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ux);.      }.   
15e00 20 20 20 2a 70 70 20 3d 20 70 41 75 78 2d 3e 70     *pp = pAux->p
15e10 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Next;.      sqli
15e20 74 65 33 44 62 46 72 65 65 28 70 56 64 62 65 2d  te3DbFree(pVdbe-
15e30 3e 64 62 2c 20 70 41 75 78 29 3b 0a 20 20 20 20  >db, pAux);.    
15e40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 3d  }else{.      pp=
15e50 20 26 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20   &pAux->pNext;. 
15e60 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
15e70 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72  * Free all memor
15e80 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
15e90 68 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65  h the Vdbe passe
15ea0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
15eb0 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78 63  argument,.** exc
15ec0 65 70 74 20 66 6f 72 20 6f 62 6a 65 63 74 20 69  ept for object i
15ed0 74 73 65 6c 66 2c 20 77 68 69 63 68 20 69 73 20  tself, which is 
15ee0 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a  preserved..**.**
15ef0 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
15f00 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e  between this fun
15f10 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74 65  ction and sqlite
15f20 33 56 64 62 65 44 65 6c 65 74 65 28 29 20 69 73  3VdbeDelete() is
15f30 20 74 68 61 74 0a 2a 2a 20 56 64 62 65 44 65 6c   that.** VdbeDel
15f40 65 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69 6e  ete() also unlin
15f50 6b 73 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d  ks the Vdbe from
15f60 20 74 68 65 20 6c 69 73 74 20 6f 66 20 56 4d 73   the list of VMs
15f70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
15f80 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
15f90 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20   connection and 
15fa0 66 72 65 65 73 20 74 68 65 20 6f 62 6a 65 63 74  frees the object
15fb0 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69 64   itself..*/.void
15fc0 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61   sqlite3VdbeClea
15fd0 72 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20  rObject(sqlite3 
15fe0 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20  *db, Vdbe *p){. 
15ff0 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53 75   SubProgram *pSu
16000 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 6e 74  b, *pNext;.  int
16010 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   i;.  assert( p-
16020 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d  >db==0 || p->db=
16030 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73 65  =db );.  release
16040 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72  MemArray(p->aVar
16050 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 72 65  , p->nVar);.  re
16060 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
16070 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52  >aColName, p->nR
16080 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
16090 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d  _N);.  for(pSub=
160a0 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53 75  p->pProgram; pSu
160b0 62 3b 20 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a  b; pSub=pNext){.
160c0 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53 75 62      pNext = pSub
160d0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76 64 62  ->pNext;.    vdb
160e0 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c  eFreeOpArray(db,
160f0 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62   pSub->aOp, pSub
16100 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69  ->nOp);.    sqli
16110 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
16120 75 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ub);.  }.  for(i
16130 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20 69 3e 3d  =p->nzVar-1; i>=
16140 30 3b 20 69 2d 2d 29 20 73 71 6c 69 74 65 33 44  0; i--) sqlite3D
16150 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a 56  bFree(db, p->azV
16160 61 72 5b 69 5d 29 3b 0a 20 20 76 64 62 65 46 72  ar[i]);.  vdbeFr
16170 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 2d  eeOpArray(db, p-
16180 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20  >aOp, p->nOp);. 
16190 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
161a0 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b  b, p->aColName);
161b0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
161c0 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20  (db, p->zSql);. 
161d0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
161e0 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 23 69  b, p->pFree);.#i
161f0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
16200 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54  LE_STMT_SCANSTAT
16210 55 53 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  US.  for(i=0; i<
16220 70 2d 3e 6e 53 63 61 6e 3b 20 69 2b 2b 29 7b 0a  p->nScan; i++){.
16230 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
16240 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 5b 69  e(db, p->aScan[i
16250 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ].zName);.  }.  
16260 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
16270 2c 20 70 2d 3e 61 53 63 61 6e 29 3b 0a 23 65 6e  , p->aScan);.#en
16280 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  dif.}../*.** Del
16290 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44  ete an entire VD
162a0 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  BE..*/.void sqli
162b0 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 56 64  te3VdbeDelete(Vd
162c0 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
162d0 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e 45  3 *db;..  if( NE
162e0 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75  VER(p==0) ) retu
162f0 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62  rn;.  db = p->db
16300 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
16310 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
16320 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
16330 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f  qlite3VdbeClearO
16340 62 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 20 20  bject(db, p);.  
16350 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a  if( p->pPrev ){.
16360 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e      p->pPrev->pN
16370 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
16380 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
16390 65 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d  ert( db->pVdbe==
163a0 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64  p );.    db->pVd
163b0 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  be = p->pNext;. 
163c0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78   }.  if( p->pNex
163d0 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78  t ){.    p->pNex
163e0 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50  t->pPrev = p->pP
163f0 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61  rev;.  }.  p->ma
16400 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
16410 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d  _DEAD;.  p->db =
16420 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46   0;.  sqlite3DbF
16430 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  ree(db, p);.}../
16440 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20  *.** The cursor 
16450 22 70 22 20 68 61 73 20 61 20 70 65 6e 64 69 6e  "p" has a pendin
16460 67 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e  g seek operation
16470 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20 79 65   that has not ye
16480 74 20 62 65 65 6e 0a 2a 2a 20 63 61 72 72 69 65  t been.** carrie
16490 64 20 6f 75 74 2e 20 20 53 65 65 6b 20 74 68 65  d out.  Seek the
164a0 20 63 75 72 73 6f 72 20 6e 6f 77 2e 20 20 49 66   cursor now.  If
164b0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
164c0 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20  , return.** the 
164d0 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
164e0 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
164f0 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49  c int SQLITE_NOI
16500 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 44 65 66 65  NLINE handleDefe
16510 72 72 65 64 4d 6f 76 65 74 6f 28 56 64 62 65 43  rredMoveto(VdbeC
16520 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74  ursor *p){.  int
16530 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66   res, rc;.#ifdef
16540 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 65   SQLITE_TEST.  e
16550 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
16560 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a  3_search_count;.
16570 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
16580 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65   p->deferredMove
16590 74 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  to );.  assert( 
165a0 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20  p->isTable );.  
165b0 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72 54  assert( p->eCurT
165c0 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
165d0 45 45 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  EE );.  rc = sql
165e0 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
165f0 6e 70 61 63 6b 65 64 28 70 2d 3e 75 63 2e 70 43  npacked(p->uc.pC
16600 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76  ursor, 0, p->mov
16610 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72  etoTarget, 0, &r
16620 65 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  es);.  if( rc ) 
16630 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28  return rc;.  if(
16640 20 72 65 73 21 3d 30 20 29 20 72 65 74 75 72 6e   res!=0 ) return
16650 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
16660 42 4b 50 54 3b 0a 23 69 66 64 65 66 20 53 51 4c  BKPT;.#ifdef SQL
16670 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
16680 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b  e3_search_count+
16690 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 64  +;.#endif.  p->d
166a0 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
166b0 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74 61  0;.  p->cacheSta
166c0 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
166d0 45 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  E;.  return SQLI
166e0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
166f0 53 6f 6d 65 74 68 69 6e 67 20 68 61 73 20 6d 6f  Something has mo
16700 76 65 64 20 63 75 72 73 6f 72 20 22 70 22 20 6f  ved cursor "p" o
16710 75 74 20 6f 66 20 70 6c 61 63 65 2e 20 20 4d 61  ut of place.  Ma
16720 79 62 65 20 74 68 65 20 72 6f 77 20 69 74 20 77  ybe the row it w
16730 61 73 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f  as.** pointed to
16740 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74   was deleted out
16750 20 66 72 6f 6d 20 75 6e 64 65 72 20 69 74 2e 20   from under it. 
16760 20 4f 72 20 6d 61 79 62 65 20 74 68 65 20 62 74   Or maybe the bt
16770 72 65 65 20 77 61 73 0a 2a 2a 20 72 65 62 61 6c  ree was.** rebal
16780 61 6e 63 65 64 2e 20 20 57 68 61 74 65 76 65 72  anced.  Whatever
16790 20 74 68 65 20 63 61 75 73 65 2c 20 74 72 79 20   the cause, try 
167a0 74 6f 20 72 65 73 74 6f 72 65 20 22 70 22 20 74  to restore "p" t
167b0 6f 20 74 68 65 20 70 6c 61 63 65 20 69 74 0a 2a  o the place it.*
167c0 2a 20 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f  * is supposed to
167d0 20 62 65 20 70 6f 69 6e 74 69 6e 67 2e 20 20 49   be pointing.  I
167e0 66 20 74 68 65 20 72 6f 77 20 77 61 73 20 64 65  f the row was de
167f0 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
16800 6e 64 65 72 20 74 68 65 0a 2a 2a 20 63 75 72 73  nder the.** curs
16810 6f 72 2c 20 73 65 74 20 74 68 65 20 63 75 72 73  or, set the curs
16820 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  or to point to a
16830 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a 73 74   NULL row..*/.st
16840 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
16850 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 4d  NOINLINE handleM
16860 6f 76 65 64 43 75 72 73 6f 72 28 56 64 62 65 43  ovedCursor(VdbeC
16870 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74  ursor *p){.  int
16880 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 2c   isDifferentRow,
16890 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
168a0 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
168b0 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 61  YPE_BTREE );.  a
168c0 73 73 65 72 74 28 20 70 2d 3e 75 63 2e 70 43 75  ssert( p->uc.pCu
168d0 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  rsor!=0 );.  ass
168e0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
168f0 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
16900 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29  p->uc.pCursor) )
16910 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
16920 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f  BtreeCursorResto
16930 72 65 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72  re(p->uc.pCursor
16940 2c 20 26 69 73 44 69 66 66 65 72 65 6e 74 52 6f  , &isDifferentRo
16950 77 29 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74  w);.  p->cacheSt
16960 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
16970 4c 45 3b 0a 20 20 69 66 28 20 69 73 44 69 66 66  LE;.  if( isDiff
16980 65 72 65 6e 74 52 6f 77 20 29 20 70 2d 3e 6e 75  erentRow ) p->nu
16990 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72 65 74  llRow = 1;.  ret
169a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
169b0 20 43 68 65 63 6b 20 74 6f 20 65 6e 73 75 72 65   Check to ensure
169c0 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
169d0 20 69 73 20 76 61 6c 69 64 2e 20 20 52 65 73 74   is valid.  Rest
169e0 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  ore the cursor.*
169f0 2a 20 69 66 20 6e 65 65 64 20 62 65 2e 20 20 52  * if need be.  R
16a00 65 74 75 72 6e 20 61 6e 79 20 49 2f 4f 20 65 72  eturn any I/O er
16a10 72 6f 72 20 66 72 6f 6d 20 74 68 65 20 72 65 73  ror from the res
16a20 74 6f 72 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  tore operation..
16a30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
16a40 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28  beCursorRestore(
16a50 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a  VdbeCursor *p){.
16a60 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75    assert( p->eCu
16a70 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
16a80 54 52 45 45 20 29 3b 0a 20 20 69 66 28 20 73 71  TREE );.  if( sq
16a90 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
16aa0 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70  HasMoved(p->uc.p
16ab0 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 72  Cursor) ){.    r
16ac0 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65  eturn handleMove
16ad0 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a  dCursor(p);.  }.
16ae0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16af0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  OK;.}../*.** Mak
16b00 65 20 73 75 72 65 20 74 68 65 20 63 75 72 73 6f  e sure the curso
16b10 72 20 70 20 69 73 20 72 65 61 64 79 20 74 6f 20  r p is ready to 
16b20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68  read or write th
16b30 65 20 72 6f 77 20 74 6f 20 77 68 69 63 68 20 69  e row to which i
16b40 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6f  t.** was last po
16b50 73 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 75 72  sitioned.  Retur
16b60 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
16b70 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20  if an OOM fault 
16b80 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20  or I/O error.** 
16b90 70 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d  prevents us from
16ba0 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68 65   positioning the
16bb0 20 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20 63   cursor to its c
16bc0 6f 72 72 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e  orrect position.
16bd0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65  .**.** If a Move
16be0 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  To operation is 
16bf0 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67  pending on the g
16c00 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65  iven cursor, the
16c10 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76  n do that.** Mov
16c20 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20  eTo now.  If no 
16c30 6d 6f 76 65 20 69 73 20 70 65 6e 64 69 6e 67 2c  move is pending,
16c40 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
16c50 20 74 68 65 20 72 6f 77 20 68 61 73 20 62 65 65   the row has bee
16c60 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75 74  n.** deleted out
16c70 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20   from under the 
16c80 63 75 72 73 6f 72 20 61 6e 64 20 69 66 20 69 74  cursor and if it
16c90 20 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 20 72   has, mark the r
16ca0 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20  ow as.** a NULL 
16cb0 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  row..**.** If th
16cc0 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65  e cursor is alre
16cd0 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
16ce0 74 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77 20  the correct row 
16cf0 61 6e 64 20 74 68 61 74 20 72 6f 77 20 68 61 73  and that row has
16d00 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c  .** not been del
16d10 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
16d20 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 2c 20  der the cursor, 
16d30 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
16d40 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
16d50 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
16d60 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62  CursorMoveto(Vdb
16d70 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69  eCursor *p){.  i
16d80 66 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d  f( p->eCurType==
16d90 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 7b  CURTYPE_BTREE ){
16da0 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 65 66 65  .    if( p->defe
16db0 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20  rredMoveto ){.  
16dc0 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c      return handl
16dd0 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28  eDeferredMoveto(
16de0 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  p);.    }.    if
16df0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
16e00 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e  rsorHasMoved(p->
16e10 75 63 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20  uc.pCursor) ){. 
16e20 20 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64       return hand
16e30 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29  leMovedCursor(p)
16e40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
16e50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16e60 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
16e70 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  lowing functions
16e80 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56  :.**.** sqlite3V
16e90 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a  dbeSerialType().
16ea0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
16eb0 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a  rialTypeLen().**
16ec0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
16ed0 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74  alLen().** sqlit
16ee0 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
16ef0 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
16f00 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a  SerialGet().**.*
16f10 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68  * encapsulate th
16f20 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72 69  e code that seri
16f30 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f  alizes values fo
16f40 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c  r storage in SQL
16f50 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20  ite.** data and 
16f60 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45  index records. E
16f70 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76  ach serialized v
16f80 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  alue consists of
16f90 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79   a.** 'serial-ty
16fa0 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f  pe' and a blob o
16fb0 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72 69  f data. The seri
16fc0 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d  al type is an 8-
16fd0 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a  byte unsigned.**
16fe0 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64   integer, stored
16ff0 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   as a varint..**
17000 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65  .** In an SQLite
17010 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74   index record, t
17020 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
17030 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c  s stored directl
17040 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  y before.** the 
17050 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61  blob of data tha
17060 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  t it corresponds
17070 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20   to. In a table 
17080 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69  record, all seri
17090 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20  al.** types are 
170a0 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74  stored at the st
170b0 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72  art of the recor
170c0 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73  d, and the blobs
170d0 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74   of data at.** t
170e0 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68  he end. Hence th
170f0 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c  ese functions al
17100 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74  low the caller t
17110 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20  o handle the.** 
17120 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20  serial-type and 
17130 64 61 74 61 20 62 6c 6f 62 20 73 65 70 61 72 61  data blob separa
17140 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tely..**.** The 
17150 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20  following table 
17160 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76 61  describes the va
17170 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c  rious storage cl
17180 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a  asses for data:.
17190 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74  **.**   serial t
171a0 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65 73  ype        bytes
171b0 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74 79   of data      ty
171c0 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  pe.**   --------
171d0 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
171e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d  ----------    --
171f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
17200 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
17210 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
17220 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a           NULL.**
17230 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
17240 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
17250 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
17260 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
17270 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
17280 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
17290 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
172a0 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20  r.**      3     
172b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172c0 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  3            sig
172d0 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
172e0 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20      4           
172f0 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20 20            4     
17300 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
17310 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20  teger.**      5 
17320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17330 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
17340 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
17350 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20 20  **      6       
17360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
17370 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
17380 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
17390 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20 20    7             
173a0 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20          8       
173b0 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a       IEEE float.
173c0 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20 20  **      8       
173d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
173e0 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
173f0 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a  er constant 0.**
17400 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20 20        9         
17410 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
17420 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
17430 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20   constant 1.**  
17440 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20 20     10,11        
17450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17460 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20         reserved 
17470 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a  for expansion.**
17480 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76      N>=12 and ev
17490 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f  en       (N-12)/
174a0 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a  2        BLOB.**
174b0 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64      N>=13 and od
174c0 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f  d        (N-13)/
174d0 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a  2        text.**
174e0 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20  .** The 8 and 9 
174f0 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65 64  types were added
17500 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20   in 3.3.0, file 
17510 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72  format 4.  Prior
17520 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20   versions.** of 
17530 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20  SQLite will not 
17540 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65  understand those
17550 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a   serial types..*
17560 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
17570 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20  the serial-type 
17580 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
17590 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f  ored in pMem..*/
175a0 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
175b0 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a  SerialType(Mem *
175c0 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66  pMem, int file_f
175d0 6f 72 6d 61 74 2c 20 75 33 32 20 2a 70 4c 65 6e  ormat, u32 *pLen
175e0 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  ){.  int flags =
175f0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20   pMem->flags;.  
17600 75 33 32 20 6e 3b 0a 0a 20 20 61 73 73 65 72 74  u32 n;..  assert
17610 28 20 70 4c 65 6e 21 3d 30 20 29 3b 0a 20 20 69  ( pLen!=0 );.  i
17620 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c  f( flags&MEM_Nul
17630 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d  l ){.    *pLen =
17640 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   0;.    return 0
17650 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
17660 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20  s&MEM_Int ){.   
17670 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77   /* Figure out w
17680 68 65 74 68 65 72 20 74 6f 20 75 73 65 20 31 2c  hether to use 1,
17690 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62 79   2, 4, 6 or 8 by
176a0 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69  tes. */.#   defi
176b0 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28 28  ne MAX_6BYTE (((
176c0 28 69 36 34 29 30 78 30 30 30 30 38 30 30 30 29  (i64)0x00008000)
176d0 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36 34  <<32)-1).    i64
176e0 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a   i = pMem->u.i;.
176f0 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20 69      u64 u;.    i
17700 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( i<0 ){.      
17710 75 20 3d 20 7e 69 3b 0a 20 20 20 20 7d 65 6c 73  u = ~i;.    }els
17720 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69 3b 0a  e{.      u = i;.
17730 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c      }.    if( u<
17740 3d 31 32 37 20 29 7b 0a 20 20 20 20 20 20 69 66  =127 ){.      if
17750 28 20 28 69 26 31 29 3d 3d 69 20 26 26 20 66 69  ( (i&1)==i && fi
17760 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a  le_format>=4 ){.
17770 20 20 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20          *pLen = 
17780 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
17790 6e 20 38 2b 28 75 33 32 29 75 3b 0a 20 20 20 20  n 8+(u32)u;.    
177a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
177b0 20 2a 70 4c 65 6e 20 3d 20 31 3b 0a 20 20 20 20   *pLen = 1;.    
177c0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
177d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
177e0 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29 7b 20  if( u<=32767 ){ 
177f0 2a 70 4c 65 6e 20 3d 20 32 3b 20 72 65 74 75 72  *pLen = 2; retur
17800 6e 20 32 3b 20 7d 0a 20 20 20 20 69 66 28 20 75  n 2; }.    if( u
17810 3c 3d 38 33 38 38 36 30 37 20 29 7b 20 2a 70 4c  <=8388607 ){ *pL
17820 65 6e 20 3d 20 33 3b 20 72 65 74 75 72 6e 20 33  en = 3; return 3
17830 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 32  ; }.    if( u<=2
17840 31 34 37 34 38 33 36 34 37 20 29 7b 20 2a 70 4c  147483647 ){ *pL
17850 65 6e 20 3d 20 34 3b 20 72 65 74 75 72 6e 20 34  en = 4; return 4
17860 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d  ; }.    if( u<=M
17870 41 58 5f 36 42 59 54 45 20 29 7b 20 2a 70 4c 65  AX_6BYTE ){ *pLe
17880 6e 20 3d 20 36 3b 20 72 65 74 75 72 6e 20 35 3b  n = 6; return 5;
17890 20 7d 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38   }.    *pLen = 8
178a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a  ;.    return 6;.
178b0 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26    }.  if( flags&
178c0 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
178d0 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20 20 20 72  *pLen = 8;.    r
178e0 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61  eturn 7;.  }.  a
178f0 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d  ssert( pMem->db-
17900 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
17910 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c   flags&(MEM_Str|
17920 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 61  MEM_Blob) );.  a
17930 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3e 3d  ssert( pMem->n>=
17940 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75 33 32 29  0 );.  n = (u32)
17950 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66  pMem->n;.  if( f
17960 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
17970 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d  ){.    n += pMem
17980 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20  ->u.nZero;.  }. 
17990 20 2a 70 4c 65 6e 20 3d 20 6e 3b 0a 20 20 72 65   *pLen = n;.  re
179a0 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32  turn ((n*2) + 12
179b0 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53   + ((flags&MEM_S
179c0 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a  tr)!=0));.}../*.
179d0 2a 2a 20 54 68 65 20 73 69 7a 65 73 20 66 6f 72  ** The sizes for
179e0 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 6c 65   serial types le
179f0 73 73 20 74 68 61 6e 20 31 32 38 0a 2a 2f 0a 73  ss than 128.*/.s
17a00 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 73  tatic const u8 s
17a10 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53  qlite3SmallTypeS
17a20 69 7a 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  izes[] = {.     
17a30 20 20 20 2f 2a 20 20 30 20 20 20 31 20 20 20 32     /*  0   1   2
17a40 20 20 20 33 20 20 20 34 20 20 20 35 20 20 20 36     3   4   5   6
17a50 20 20 20 37 20 20 20 38 20 20 20 39 20 2a 2f 20     7   8   9 */ 
17a60 20 20 0a 2f 2a 20 20 20 30 20 2a 2f 20 20 20 30    ./*   0 */   0
17a70 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c 20 20 34  ,  1,  2,  3,  4
17a80 2c 20 20 36 2c 20 20 38 2c 20 20 38 2c 20 20 30  ,  6,  8,  8,  0
17a90 2c 20 20 30 2c 0a 2f 2a 20 20 31 30 20 2a 2f 20  ,  0,./*  10 */ 
17aa0 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
17ab0 20 20 31 2c 20 20 31 2c 20 20 32 2c 20 20 32 2c    1,  1,  2,  2,
17ac0 20 20 33 2c 20 20 33 2c 0a 2f 2a 20 20 32 30 20    3,  3,./*  20 
17ad0 2a 2f 20 20 20 34 2c 20 20 34 2c 20 20 35 2c 20  */   4,  4,  5, 
17ae0 20 35 2c 20 20 36 2c 20 20 36 2c 20 20 37 2c 20   5,  6,  6,  7, 
17af0 20 37 2c 20 20 38 2c 20 20 38 2c 0a 2f 2a 20 20   7,  8,  8,./*  
17b00 33 30 20 2a 2f 20 20 20 39 2c 20 20 39 2c 20 31  30 */   9,  9, 1
17b10 30 2c 20 31 30 2c 20 31 31 2c 20 31 31 2c 20 31  0, 10, 11, 11, 1
17b20 32 2c 20 31 32 2c 20 31 33 2c 20 31 33 2c 0a 2f  2, 12, 13, 13,./
17b30 2a 20 20 34 30 20 2a 2f 20 20 31 34 2c 20 31 34  *  40 */  14, 14
17b40 2c 20 31 35 2c 20 31 35 2c 20 31 36 2c 20 31 36  , 15, 15, 16, 16
17b50 2c 20 31 37 2c 20 31 37 2c 20 31 38 2c 20 31 38  , 17, 17, 18, 18
17b60 2c 0a 2f 2a 20 20 35 30 20 2a 2f 20 20 31 39 2c  ,./*  50 */  19,
17b70 20 31 39 2c 20 32 30 2c 20 32 30 2c 20 32 31 2c   19, 20, 20, 21,
17b80 20 32 31 2c 20 32 32 2c 20 32 32 2c 20 32 33 2c   21, 22, 22, 23,
17b90 20 32 33 2c 0a 2f 2a 20 20 36 30 20 2a 2f 20 20   23,./*  60 */  
17ba0 32 34 2c 20 32 34 2c 20 32 35 2c 20 32 35 2c 20  24, 24, 25, 25, 
17bb0 32 36 2c 20 32 36 2c 20 32 37 2c 20 32 37 2c 20  26, 26, 27, 27, 
17bc0 32 38 2c 20 32 38 2c 0a 2f 2a 20 20 37 30 20 2a  28, 28,./*  70 *
17bd0 2f 20 20 32 39 2c 20 32 39 2c 20 33 30 2c 20 33  /  29, 29, 30, 3
17be0 30 2c 20 33 31 2c 20 33 31 2c 20 33 32 2c 20 33  0, 31, 31, 32, 3
17bf0 32 2c 20 33 33 2c 20 33 33 2c 0a 2f 2a 20 20 38  2, 33, 33,./*  8
17c00 30 20 2a 2f 20 20 33 34 2c 20 33 34 2c 20 33 35  0 */  34, 34, 35
17c10 2c 20 33 35 2c 20 33 36 2c 20 33 36 2c 20 33 37  , 35, 36, 36, 37
17c20 2c 20 33 37 2c 20 33 38 2c 20 33 38 2c 0a 2f 2a  , 37, 38, 38,./*
17c30 20 20 39 30 20 2a 2f 20 20 33 39 2c 20 33 39 2c    90 */  39, 39,
17c40 20 34 30 2c 20 34 30 2c 20 34 31 2c 20 34 31 2c   40, 40, 41, 41,
17c50 20 34 32 2c 20 34 32 2c 20 34 33 2c 20 34 33 2c   42, 42, 43, 43,
17c60 0a 2f 2a 20 31 30 30 20 2a 2f 20 20 34 34 2c 20  ./* 100 */  44, 
17c70 34 34 2c 20 34 35 2c 20 34 35 2c 20 34 36 2c 20  44, 45, 45, 46, 
17c80 34 36 2c 20 34 37 2c 20 34 37 2c 20 34 38 2c 20  46, 47, 47, 48, 
17c90 34 38 2c 0a 2f 2a 20 31 31 30 20 2a 2f 20 20 34  48,./* 110 */  4
17ca0 39 2c 20 34 39 2c 20 35 30 2c 20 35 30 2c 20 35  9, 49, 50, 50, 5
17cb0 31 2c 20 35 31 2c 20 35 32 2c 20 35 32 2c 20 35  1, 51, 52, 52, 5
17cc0 33 2c 20 35 33 2c 0a 2f 2a 20 31 32 30 20 2a 2f  3, 53,./* 120 */
17cd0 20 20 35 34 2c 20 35 34 2c 20 35 35 2c 20 35 35    54, 54, 55, 55
17ce0 2c 20 35 36 2c 20 35 36 2c 20 35 37 2c 20 35 37  , 56, 56, 57, 57
17cf0 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .};../*.** Retur
17d00 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  n the length of 
17d10 74 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70  the data corresp
17d20 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75  onding to the su
17d30 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79  pplied serial-ty
17d40 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  pe..*/.u32 sqlit
17d50 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
17d60 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74  Len(u32 serial_t
17d70 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69  ype){.  if( seri
17d80 61 6c 5f 74 79 70 65 3e 3d 31 32 38 20 29 7b 0a  al_type>=128 ){.
17d90 20 20 20 20 72 65 74 75 72 6e 20 28 73 65 72 69      return (seri
17da0 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20  al_type-12)/2;. 
17db0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
17dc0 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  rt( serial_type<
17dd0 31 32 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  12 .            
17de0 7c 7c 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54  || sqlite3SmallT
17df0 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f  ypeSizes[serial_
17e00 74 79 70 65 5d 3d 3d 28 73 65 72 69 61 6c 5f 74  type]==(serial_t
17e10 79 70 65 20 2d 20 31 32 29 2f 32 20 29 3b 0a 20  ype - 12)/2 );. 
17e20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
17e30 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b  3SmallTypeSizes[
17e40 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20  serial_type];.  
17e50 7d 0a 7d 0a 75 38 20 73 71 6c 69 74 65 33 56 64  }.}.u8 sqlite3Vd
17e60 62 65 4f 6e 65 42 79 74 65 53 65 72 69 61 6c 54  beOneByteSerialT
17e70 79 70 65 4c 65 6e 28 75 38 20 73 65 72 69 61 6c  ypeLen(u8 serial
17e80 5f 74 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74  _type){.  assert
17e90 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32  ( serial_type<12
17ea0 38 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  8 );.  return sq
17eb0 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69  lite3SmallTypeSi
17ec0 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d  zes[serial_type]
17ed0 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ;  .}../*.** If 
17ee0 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72 63  we are on an arc
17ef0 68 69 74 65 63 74 75 72 65 20 77 69 74 68 20 6d  hitecture with m
17f00 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61  ixed-endian floa
17f10 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20  ting .** points 
17f20 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e 20  (ex: ARM7) then 
17f30 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20 34  swap the lower 4
17f40 20 62 79 74 65 73 20 77 69 74 68 20 74 68 65 20   bytes with the 
17f50 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74 65  .** upper 4 byte
17f60 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  s.  Return the r
17f70 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  esult..**.** For
17f80 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74 75   most architectu
17f90 72 65 73 2c 20 74 68 69 73 20 69 73 20 61 20 6e  res, this is a n
17fa0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74  o-op..**.** (lat
17fb0 65 72 29 3a 20 20 49 74 20 69 73 20 72 65 70 6f  er):  It is repo
17fc0 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74 20  rted to me that 
17fd0 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e  the mixed-endian
17fe0 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41   problem.** on A
17ff0 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65 20  RM7 is an issue 
18000 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77 69  with GCC, not wi
18010 74 68 20 74 68 65 20 41 52 4d 37 20 63 68 69 70  th the ARM7 chip
18020 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74  .  It seems.** t
18030 68 61 74 20 65 61 72 6c 79 20 76 65 72 73 69 6f  hat early versio
18040 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65 64  ns of GCC stored
18050 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20 6f   the two words o
18060 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c  f a 64-bit.** fl
18070 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67  oat in the wrong
18080 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68 61   order.  And tha
18090 74 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e  t error has been
180a0 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65   propagated.** e
180b0 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65 20  ver since.  The 
180c0 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63  blame is not nec
180d0 65 73 73 61 72 69 6c 79 20 77 69 74 68 20 47 43  essarily with GC
180e0 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43  C, though..** GC
180f0 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75 73  C might have jus
18100 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70 72  t copying the pr
18110 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72 69  oblem from a pri
18120 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20  or compiler..** 
18130 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74  I am also told t
18140 68 61 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f  hat newer versio
18150 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74 20 66  ns of GCC that f
18160 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65 6e  ollow a differen
18170 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68 65  t.** ABI get the
18180 20 62 79 74 65 20 6f 72 64 65 72 20 72 69 67 68   byte order righ
18190 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70  t..**.** Develop
181a0 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74 65  ers using SQLite
181b0 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f 75   on an ARM7 shou
181c0 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72  ld compile and r
181d0 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c  un their.** appl
181e0 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44  ication using -D
181f0 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20 61  SQLITE_DEBUG=1 a
18200 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20 57  t least once.  W
18210 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61  ith DEBUG.** ena
18220 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65 72  bled, some asser
18230 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e  ts below will en
18240 73 75 72 65 20 74 68 61 74 20 74 68 65 20 62 79  sure that the by
18250 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66  te order of.** f
18260 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
18270 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63 74 2e  lues is correct.
18280 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d  .**.** (2007-08-
18290 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 20 56  30)  Frank van V
182a0 75 67 74 20 68 61 73 20 73 74 75 64 69 65 64 20  ugt has studied 
182b0 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f  this problem clo
182c0 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20  sely.** and has 
182d0 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69 6e 67  send his finding
182e0 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20  s to the SQLite 
182f0 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 72 61  developers.  Fra
18300 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 68 61  nk.** writes tha
18310 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72  t some Linux ker
18320 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61 74  nels offer float
18330 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 77 61  ing point hardwa
18340 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20  re.** emulation 
18350 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 20 33  that uses only 3
18360 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 73 20  2-bit mantissas 
18370 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66 75 6c  instead of a ful
18380 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61 73  l .** 48-bits as
18390 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
183a0 20 49 45 45 45 20 73 74 61 6e 64 61 72 64 2e 20   IEEE standard. 
183b0 20 28 54 68 69 73 20 69 73 20 74 68 65 0a 2a 2a   (This is the.**
183c0 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53 54   CONFIG_FPE_FAST
183d0 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e  FPE option.)  On
183e0 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c 20 66   such systems, f
183f0 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a  loating point.**
18400 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 62   byte swapping b
18410 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d 70  ecomes very comp
18420 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61 76 6f  licated.  To avo
18430 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20  id problems,.** 
18440 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 62 79  the necessary by
18450 74 65 20 73 77 61 70 70 69 6e 67 20 69 73 20 63  te swapping is c
18460 61 72 72 69 65 64 20 6f 75 74 20 75 73 69 6e 67  arried out using
18470 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65   a 64-bit intege
18480 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e  r.** rather than
18490 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e   a 64-bit float.
184a0 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65 73 20    Frank assures 
184b0 75 73 20 74 68 61 74 20 74 68 65 20 63 6f 64 65  us that the code
184c0 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66   here.** works f
184d0 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 68 65  or him.  We, the
184e0 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 61 76   developers, hav
184f0 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64 65  e no way to inde
18500 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72  pendently.** ver
18510 69 66 79 20 74 68 69 73 2c 20 62 75 74 20 46 72  ify this, but Fr
18520 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f  ank seems to kno
18530 77 20 77 68 61 74 20 68 65 20 69 73 20 74 61 6c  w what he is tal
18540 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f  king about.** so
18550 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a   we trust him..*
18560 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
18570 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42  MIXED_ENDIAN_64B
18580 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63 20  IT_FLOAT.static 
18590 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28 75 36  u64 floatSwap(u6
185a0 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b  4 in){.  union {
185b0 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20  .    u64 r;.    
185c0 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b  u32 i[2];.  } u;
185d0 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72  .  u32 t;..  u.r
185e0 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69   = in;.  t = u.i
185f0 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20  [0];.  u.i[0] = 
18600 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d  u.i[1];.  u.i[1]
18610 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 20 75   = t;.  return u
18620 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73  .r;.}.# define s
18630 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
18640 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c 6f 61  oat(X)  X = floa
18650 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65 0a 23  tSwap(X).#else.#
18660 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65   define swapMixe
18670 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a  dEndianFloat(X).
18680 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72  #endif../*.** Wr
18690 69 74 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a  ite the serializ
186a0 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72  ed data blob for
186b0 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   the value store
186c0 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a  d in pMem into .
186d0 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61 73  ** buf. It is as
186e0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63  sumed that the c
186f0 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61  aller has alloca
18700 74 65 64 20 73 75 66 66 69 63 69 65 6e 74 20 73  ted sufficient s
18710 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  pace..** Return 
18720 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
18730 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a  tes written..**.
18740 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65 20 61  ** nBuf is the a
18750 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 6c  mount of space l
18760 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20 54  eft in buf[].  T
18770 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73  he caller is res
18780 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66 6f 72 20  ponsible.** for 
18790 61 6c 6c 6f 63 61 74 69 6e 67 20 65 6e 6f 75 67  allocating enoug
187a0 68 20 73 70 61 63 65 20 74 6f 20 62 75 66 5b 5d  h space to buf[]
187b0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74   to hold the ent
187c0 69 72 65 20 66 69 65 6c 64 2c 20 65 78 63 6c 75  ire field, exclu
187d0 73 69 76 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70  sive.** of the p
187e0 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 62 79 74  Mem->u.nZero byt
187f0 65 73 20 66 6f 72 20 61 20 4d 45 4d 5f 5a 65 72  es for a MEM_Zer
18800 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 52  o value..**.** R
18810 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
18820 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
18830 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
18840 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62  buf[].  The numb
18850 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69  er.** of bytes i
18860 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  n the zero-fille
18870 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64  d tail is includ
18880 65 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  ed in the return
18890 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69   value only.** i
188a0 66 20 74 68 6f 73 65 20 62 79 74 65 73 20 77 65  f those bytes we
188b0 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66  re zeroed in buf
188c0 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69  []..*/ .u32 sqli
188d0 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74  te3VdbeSerialPut
188e0 28 75 38 20 2a 62 75 66 2c 20 4d 65 6d 20 2a 70  (u8 *buf, Mem *p
188f0 4d 65 6d 2c 20 75 33 32 20 73 65 72 69 61 6c 5f  Mem, u32 serial_
18900 74 79 70 65 29 7b 0a 20 20 75 33 32 20 6c 65 6e  type){.  u32 len
18910 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  ;..  /* Integer 
18920 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66  and Real */.  if
18930 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37  ( serial_type<=7
18940 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e   && serial_type>
18950 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a  0 ){.    u64 v;.
18960 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 69      u32 i;.    i
18970 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
18980 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  7 ){.      asser
18990 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69  t( sizeof(v)==si
189a0 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 20  zeof(pMem->u.r) 
189b0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
189c0 26 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20  &v, &pMem->u.r, 
189d0 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20  sizeof(v));.    
189e0 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
189f0 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d  nFloat(v);.    }
18a00 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20  else{.      v = 
18a10 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d  pMem->u.i;.    }
18a20 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73  .    len = i = s
18a30 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53  qlite3SmallTypeS
18a40 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65  izes[serial_type
18a50 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ];.    assert( i
18a60 3e 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  >0 );.    do{.  
18a70 20 20 20 20 62 75 66 5b 2d 2d 69 5d 20 3d 20 28      buf[--i] = (
18a80 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20  u8)(v&0xFF);.   
18a90 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20     v >>= 8;.    
18aa0 7d 77 68 69 6c 65 28 20 69 20 29 3b 0a 20 20 20  }while( i );.   
18ab0 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d   return len;.  }
18ac0 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72  ..  /* String or
18ad0 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73   blob */.  if( s
18ae0 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29  erial_type>=12 )
18af0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  {.    assert( pM
18b00 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e  em->n + ((pMem->
18b10 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
18b20 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a  )?pMem->u.nZero:
18b30 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
18b40 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56  == (int)sqlite3V
18b50 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
18b60 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b  (serial_type) );
18b70 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d  .    len = pMem-
18b80 3e 6e 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e  >n;.    if( len>
18b90 30 20 29 20 6d 65 6d 63 70 79 28 62 75 66 2c 20  0 ) memcpy(buf, 
18ba0 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20  pMem->z, len);. 
18bb0 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
18bc0 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72   }..  /* NULL or
18bd0 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20   constants 0 or 
18be0 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b  1 */.  return 0;
18bf0 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 22 78 22  .}../* Input "x"
18c00 20 69 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f   is a sequence o
18c10 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 61  f unsigned chara
18c20 63 74 65 72 73 20 74 68 61 74 20 72 65 70 72 65  cters that repre
18c30 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67 2d 65 6e  sent a.** big-en
18c40 64 69 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 52  dian integer.  R
18c50 65 74 75 72 6e 20 74 68 65 20 65 71 75 69 76 61  eturn the equiva
18c60 6c 65 6e 74 20 6e 61 74 69 76 65 20 69 6e 74 65  lent native inte
18c70 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4f  ger.*/.#define O
18c80 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20  NE_BYTE_INT(x)  
18c90 20 20 28 28 69 38 29 28 78 29 5b 30 5d 29 0a 23    ((i8)(x)[0]).#
18ca0 64 65 66 69 6e 65 20 54 57 4f 5f 42 59 54 45 5f  define TWO_BYTE_
18cb0 49 4e 54 28 78 29 20 20 20 20 28 32 35 36 2a 28  INT(x)    (256*(
18cc0 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 78 29 5b  i8)((x)[0])|(x)[
18cd0 31 5d 29 0a 23 64 65 66 69 6e 65 20 54 48 52 45  1]).#define THRE
18ce0 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 28  E_BYTE_INT(x)  (
18cf0 36 35 35 33 36 2a 28 69 38 29 28 28 78 29 5b 30  65536*(i8)((x)[0
18d00 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 29 7c 28  ])|((x)[1]<<8)|(
18d10 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e 65 20 46  x)[2]).#define F
18d20 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 78 29  OUR_BYTE_UINT(x)
18d30 20 20 28 28 28 75 33 32 29 28 78 29 5b 30 5d 3c    (((u32)(x)[0]<
18d40 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36  <24)|((x)[1]<<16
18d50 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78  )|((x)[2]<<8)|(x
18d60 29 5b 33 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f  )[3]).#define FO
18d70 55 52 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 28  UR_BYTE_INT(x) (
18d80 31 36 37 37 37 32 31 36 2a 28 69 38 29 28 28 78  16777216*(i8)((x
18d90 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 31  )[0])|((x)[1]<<1
18da0 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28  6)|((x)[2]<<8)|(
18db0 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65  x)[3])../*.** De
18dc0 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61  serialize the da
18dd0 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20  ta blob pointed 
18de0 74 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 72  to by buf as ser
18df0 69 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f  ial type serial_
18e00 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72  type.** and stor
18e10 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
18e20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68  pMem.  Return th
18e30 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
18e40 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  s read..**.** Th
18e50 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
18e60 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 74 77  mplemented as tw
18e70 6f 20 73 65 70 61 72 61 74 65 20 72 6f 75 74 69  o separate routi
18e80 6e 65 73 20 66 6f 72 20 70 65 72 66 6f 72 6d 61  nes for performa
18e90 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 66 65 77 20  nce..** The few 
18ea0 63 61 73 65 73 20 74 68 61 74 20 72 65 71 75 69  cases that requi
18eb0 72 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  re local variabl
18ec0 65 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 6f 75  es are broken ou
18ed0 74 20 69 6e 74 6f 20 61 20 73 65 70 61 72 61 74  t into a separat
18ee0 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 6f 20  e.** routine so 
18ef0 74 68 61 74 20 69 6e 20 6d 6f 73 74 20 63 61 73  that in most cas
18f00 65 73 20 74 68 65 20 6f 76 65 72 68 65 61 64 20  es the overhead 
18f10 6f 66 20 6d 6f 76 69 6e 67 20 74 68 65 20 73 74  of moving the st
18f20 61 63 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 69  ack pointer.** i
18f30 73 20 61 76 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73  s avoided..*/ .s
18f40 74 61 74 69 63 20 75 33 32 20 53 51 4c 49 54 45  tatic u32 SQLITE
18f50 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65 72 69 61 6c  _NOINLINE serial
18f60 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73  Get(.  const uns
18f70 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c  igned char *buf,
18f80 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
18f90 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72  o deserialize fr
18fa0 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69  om */.  u32 seri
18fb0 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20  al_type,        
18fc0 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20        /* Serial 
18fd0 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c  type to deserial
18fe0 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ize */.  Mem *pM
18ff0 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  em              
19000 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
19010 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76   cell to write v
19020 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a  alue into */.){.
19030 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42    u64 x = FOUR_B
19040 59 54 45 5f 55 49 4e 54 28 62 75 66 29 3b 0a 20  YTE_UINT(buf);. 
19050 20 75 33 32 20 79 20 3d 20 46 4f 55 52 5f 42 59   u32 y = FOUR_BY
19060 54 45 5f 55 49 4e 54 28 62 75 66 2b 34 29 3b 0a  TE_UINT(buf+4);.
19070 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 2b 20    x = (x<<32) + 
19080 79 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  y;.  if( serial_
19090 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 2f  type==6 ){.    /
190a0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
190b0 2d 32 39 38 35 31 2d 35 32 32 37 32 20 56 61 6c  -29851-52272 Val
190c0 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
190d0 61 6e 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a  an 64-bit.    **
190e0 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74   twos-complement
190f0 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20   integer. */.   
19100 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69   pMem->u.i = *(i
19110 36 34 2a 29 26 78 3b 0a 20 20 20 20 70 4d 65 6d  64*)&x;.    pMem
19120 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
19130 74 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  t;.    testcase(
19140 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
19150 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
19160 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
19170 37 33 34 33 2d 34 39 31 31 34 20 56 61 6c 75 65  7343-49114 Value
19180 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e   is a big-endian
19190 20 49 45 45 45 20 37 35 34 2d 32 30 30 38 20 36   IEEE 754-2008 6
191a0 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 66 6c 6f  4-bit.    ** flo
191b0 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75 6d 62  ating point numb
191c0 65 72 2e 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  er. */.#if !defi
191d0 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 21  ned(NDEBUG) && !
191e0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
191f0 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
19200 4e 54 29 0a 20 20 20 20 2f 2a 20 56 65 72 69 66  NT).    /* Verif
19210 79 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20  y that integers 
19220 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  and floating poi
19230 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68  nt values use th
19240 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20 62 79  e same.    ** by
19250 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74  te order.  Or, t
19260 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49  hat if SQLITE_MI
19270 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54  XED_ENDIAN_64BIT
19280 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 2a 2a  _FLOAT is.    **
19290 20 64 65 66 69 6e 65 64 20 74 68 61 74 20 36 34   defined that 64
192a0 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f  -bit floating po
192b0 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c  int values reall
192c0 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20  y are mixed.    
192d0 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 2a  ** endian..    *
192e0 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  /.    static con
192f0 73 74 20 75 36 34 20 74 31 20 3d 20 28 28 75 36  st u64 t1 = ((u6
19300 34 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33  4)0x3ff00000)<<3
19310 32 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  2;.    static co
19320 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20  nst double r1 = 
19330 31 2e 30 3b 0a 20 20 20 20 75 36 34 20 74 32 20  1.0;.    u64 t2 
19340 3d 20 74 31 3b 0a 20 20 20 20 73 77 61 70 4d 69  = t1;.    swapMi
19350 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74  xedEndianFloat(t
19360 32 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  2);.    assert( 
19370 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65  sizeof(r1)==size
19380 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70  of(t2) && memcmp
19390 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f  (&r1, &t2, sizeo
193a0 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e  f(r1))==0 );.#en
193b0 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
193c0 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20  sizeof(x)==8 && 
193d0 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72  sizeof(pMem->u.r
193e0 29 3d 3d 38 20 29 3b 0a 20 20 20 20 73 77 61 70  )==8 );.    swap
193f0 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
19400 28 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  (x);.    memcpy(
19410 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20  &pMem->u.r, &x, 
19420 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20  sizeof(x));.    
19430 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71  pMem->flags = sq
19440 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d  lite3IsNaN(pMem-
19450 3e 75 2e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c  >u.r) ? MEM_Null
19460 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d   : MEM_Real;.  }
19470 0a 20 20 72 65 74 75 72 6e 20 38 3b 0a 7d 0a 75  .  return 8;.}.u
19480 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
19490 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74  rialGet(.  const
194a0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
194b0 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66  buf,     /* Buff
194c0 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  er to deserializ
194d0 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  e from */.  u32 
194e0 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20  serial_type,    
194f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72            /* Ser
19500 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65  ial type to dese
19510 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d  rialize */.  Mem
19520 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20   *pMem          
19530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
19540 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69  mory cell to wri
19550 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f  te value into */
19560 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65  .){.  switch( se
19570 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
19580 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52   case 10:   /* R
19590 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
195a0 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61  re use */.    ca
195b0 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65  se 11:   /* Rese
195c0 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
195d0 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  use */.    case 
195e0 30 3a 20 7b 20 20 2f 2a 20 4e 75 6c 6c 20 2a 2f  0: {  /* Null */
195f0 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
19600 43 45 2d 4f 46 3a 20 52 2d 32 34 30 37 38 2d 30  CE-OF: R-24078-0
19610 39 33 37 35 20 56 61 6c 75 65 20 69 73 20 61 20  9375 Value is a 
19620 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 70  NULL. */.      p
19630 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
19640 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65  _Null;.      bre
19650 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
19660 73 65 20 31 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  se 1: {.      /*
19670 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
19680 34 34 38 38 35 2d 32 35 31 39 36 20 56 61 6c 75  44885-25196 Valu
19690 65 20 69 73 20 61 6e 20 38 2d 62 69 74 20 74 77  e is an 8-bit tw
196a0 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 0a 20 20  os-complement.  
196b0 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20      ** integer. 
196c0 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
196d0 2e 69 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e  .i = ONE_BYTE_IN
196e0 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
196f0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
19700 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
19710 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
19720 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
19730 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   1;.    }.    ca
19740 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74  se 2: { /* 2-byt
19750 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
19760 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
19770 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 37 39  DENCE-OF: R-4979
19780 34 2d 33 35 30 32 36 20 56 61 6c 75 65 20 69 73  4-35026 Value is
19790 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 31 36   a big-endian 16
197a0 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77  -bit.      ** tw
197b0 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
197c0 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
197d0 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f  pMem->u.i = TWO_
197e0 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
197f0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
19800 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
19810 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
19820 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
19830 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d   return 2;.    }
19840 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f  .    case 3: { /
19850 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 3-byte signed 
19860 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
19870 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
19880 20 52 2d 33 37 38 33 39 2d 35 34 33 30 31 20 56   R-37839-54301 V
19890 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
198a0 64 69 61 6e 20 32 34 2d 62 69 74 0a 20 20 20 20  dian 24-bit.    
198b0 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65    ** twos-comple
198c0 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f  ment integer. */
198d0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
198e0 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e   = THREE_BYTE_IN
198f0 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
19900 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
19910 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
19920 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
19930 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
19940 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   3;.    }.    ca
19950 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74  se 4: { /* 4-byt
19960 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
19970 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
19980 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 38 34  DENCE-OF: R-0184
19990 39 2d 32 36 30 37 39 20 56 61 6c 75 65 20 69 73  9-26079 Value is
199a0 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 33 32   a big-endian 32
199b0 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77  -bit.      ** tw
199c0 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
199d0 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
199e0 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52  pMem->u.i = FOUR
199f0 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
19a00 23 69 66 64 65 66 20 5f 5f 48 50 5f 63 63 20 0a  #ifdef __HP_cc .
19a10 20 20 20 20 20 20 2f 2a 20 57 6f 72 6b 20 61 72        /* Work ar
19a20 6f 75 6e 64 20 61 20 73 69 67 6e 2d 65 78 74 65  ound a sign-exte
19a30 6e 73 69 6f 6e 20 62 75 67 20 69 6e 20 74 68 65  nsion bug in the
19a40 20 48 50 20 63 6f 6d 70 69 6c 65 72 20 66 6f 72   HP compiler for
19a50 20 48 50 2f 55 58 20 2a 2f 0a 20 20 20 20 20 20   HP/UX */.      
19a60 69 66 28 20 62 75 66 5b 30 5d 26 30 78 38 30 20  if( buf[0]&0x80 
19a70 29 20 70 4d 65 6d 2d 3e 75 2e 69 20 7c 3d 20 30  ) pMem->u.i |= 0
19a80 78 66 66 66 66 66 66 66 66 38 30 30 30 30 30 30  xffffffff8000000
19a90 30 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  0LL;.#endif.    
19aa0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
19ab0 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
19ac0 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
19ad0 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
19ae0 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20  turn 4;.    }.  
19af0 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36    case 5: { /* 6
19b00 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
19b10 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  eger */.      /*
19b20 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
19b30 35 30 33 38 35 2d 30 39 36 37 34 20 56 61 6c 75  50385-09674 Valu
19b40 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61  e is a big-endia
19b50 6e 20 34 38 2d 62 69 74 0a 20 20 20 20 20 20 2a  n 48-bit.      *
19b60 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  * twos-complemen
19b70 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  t integer. */.  
19b80 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
19b90 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62  FOUR_BYTE_UINT(b
19ba0 75 66 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31  uf+2) + (((i64)1
19bb0 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f  )<<32)*TWO_BYTE_
19bc0 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20  INT(buf);.      
19bd0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
19be0 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73  M_Int;.      tes
19bf0 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69  tcase( pMem->u.i
19c00 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  <0 );.      retu
19c10 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 6;.    }.    
19c20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62  case 6:   /* 8-b
19c30 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
19c40 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37  er */.    case 7
19c50 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61  : { /* IEEE floa
19c60 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20  ting point */.  
19c70 20 20 20 20 2f 2a 20 54 68 65 73 65 20 75 73 65      /* These use
19c80 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73   local variables
19c90 2c 20 73 6f 20 64 6f 20 74 68 65 6d 20 69 6e 20  , so do them in 
19ca0 61 20 73 65 70 61 72 61 74 65 20 72 6f 75 74 69  a separate routi
19cb0 6e 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  ne.      ** to a
19cc0 76 6f 69 64 20 68 61 76 69 6e 67 20 74 6f 20 6d  void having to m
19cd0 6f 76 65 20 74 68 65 20 66 72 61 6d 65 20 70 6f  ove the frame po
19ce0 69 6e 74 65 72 20 69 6e 20 74 68 65 20 63 6f 6d  inter in the com
19cf0 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  mon case */.    
19d00 20 20 72 65 74 75 72 6e 20 73 65 72 69 61 6c 47    return serialG
19d10 65 74 28 62 75 66 2c 73 65 72 69 61 6c 5f 74 79  et(buf,serial_ty
19d20 70 65 2c 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a  pe,pMem);.    }.
19d30 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f      case 8:    /
19d40 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20  * Integer 0 */. 
19d50 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a     case 9: {  /*
19d60 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20   Integer 1 */.  
19d70 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
19d80 4f 46 3a 20 52 2d 31 32 39 37 36 2d 32 32 38 39  OF: R-12976-2289
19d90 33 20 56 61 6c 75 65 20 69 73 20 74 68 65 20 69  3 Value is the i
19da0 6e 74 65 67 65 72 20 30 2e 20 2a 2f 0a 20 20 20  nteger 0. */.   
19db0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
19dc0 46 3a 20 52 2d 31 38 31 34 33 2d 31 32 31 32 31  F: R-18143-12121
19dd0 20 56 61 6c 75 65 20 69 73 20 74 68 65 20 69 6e   Value is the in
19de0 74 65 67 65 72 20 31 2e 20 2a 2f 0a 20 20 20 20  teger 1. */.    
19df0 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65    pMem->u.i = se
19e00 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20  rial_type-8;.   
19e10 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
19e20 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
19e30 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
19e40 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
19e50 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
19e60 2d 4f 46 3a 20 52 2d 31 34 36 30 36 2d 33 31 35  -OF: R-14606-315
19e70 36 34 20 56 61 6c 75 65 20 69 73 20 61 20 42 4c  64 Value is a BL
19e80 4f 42 20 74 68 61 74 20 69 73 20 28 4e 2d 31 32  OB that is (N-12
19e90 29 2f 32 20 62 79 74 65 73 20 69 6e 0a 20 20 20  )/2 bytes in.   
19ea0 20 20 20 2a 2a 20 6c 65 6e 67 74 68 2e 0a 20 20     ** length..  
19eb0 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
19ec0 4f 46 3a 20 52 2d 32 38 34 30 31 2d 30 30 31 34  OF: R-28401-0014
19ed0 30 20 56 61 6c 75 65 20 69 73 20 61 20 73 74 72  0 Value is a str
19ee0 69 6e 67 20 69 6e 20 74 68 65 20 74 65 78 74 20  ing in the text 
19ef0 65 6e 63 6f 64 69 6e 67 20 61 6e 64 0a 20 20 20  encoding and.   
19f00 20 20 20 2a 2a 20 28 4e 2d 31 33 29 2f 32 20 62     ** (N-13)/2 b
19f10 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20  ytes in length. 
19f20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  */.      static 
19f30 63 6f 6e 73 74 20 75 31 36 20 61 46 6c 61 67 5b  const u16 aFlag[
19f40 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d  ] = { MEM_Blob|M
19f50 45 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f 53 74  EM_Ephem, MEM_St
19f60 72 7c 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20  r|MEM_Ephem };. 
19f70 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28       pMem->z = (
19f80 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20 20  char *)buf;.    
19f90 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 28 73 65 72    pMem->n = (ser
19fa0 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a  ial_type-12)/2;.
19fb0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
19fc0 73 20 3d 20 61 46 6c 61 67 5b 73 65 72 69 61 6c  s = aFlag[serial
19fd0 5f 74 79 70 65 26 31 5d 3b 0a 20 20 20 20 20 20  _type&1];.      
19fe0 72 65 74 75 72 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a  return pMem->n;.
19ff0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1a000 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68  rn 0;.}./*.** Th
1a010 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
1a020 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73  ed to allocate s
1a030 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
1a040 66 6f 72 20 61 6e 20 55 6e 70 61 63 6b 65 64 52  for an UnpackedR
1a050 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75  ecord.** structu
1a060 72 65 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  re large enough 
1a070 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 20  to be used with 
1a080 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1a090 64 55 6e 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20  dUnpack() if.** 
1a0a0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
1a0b0 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
1a0c0 74 6f 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  to KeyInfo struc
1a0d0 74 75 72 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a  ture pKeyInfo..*
1a0e0 2a 0a 2a 2a 20 54 68 65 20 73 70 61 63 65 20 69  *.** The space i
1a0f0 73 20 65 69 74 68 65 72 20 61 6c 6c 6f 63 61 74  s either allocat
1a100 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
1a110 44 62 4d 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72  DbMallocRaw() or
1a120 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20   from within.** 
1a130 74 68 65 20 75 6e 61 6c 69 67 6e 65 64 20 62 75  the unaligned bu
1a140 66 66 65 72 20 70 61 73 73 65 64 20 76 69 61 20  ffer passed via 
1a150 74 68 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 74  the second and t
1a160 68 69 72 64 20 61 72 67 75 6d 65 6e 74 73 20 28  hird arguments (
1a170 70 72 65 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74  presumably.** st
1a180 61 63 6b 20 73 70 61 63 65 29 2e 20 49 66 20 74  ack space). If t
1a190 68 65 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20  he former, then 
1a1a0 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20 74  *ppFree is set t
1a1b0 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74  o a pointer that
1a1c0 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76   should.** be ev
1a1d0 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 62  entually freed b
1a1e0 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69  y the caller usi
1a1f0 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  ng sqlite3DbFree
1a200 28 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 0a  (). Or, if the .
1a210 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f  ** allocation co
1a220 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 70 53 70  mes from the pSp
1a230 61 63 65 2f 73 7a 53 70 61 63 65 20 62 75 66 66  ace/szSpace buff
1a240 65 72 2c 20 2a 70 70 46 72 65 65 20 69 73 20 73  er, *ppFree is s
1a250 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65  et to NULL.** be
1a260 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
1a270 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20  **.** If an OOM 
1a280 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
1a290 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
1a2a0 2a 2f 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  */.UnpackedRecor
1a2b0 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65 41 6c  d *sqlite3VdbeAl
1a2c0 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  locUnpackedRecor
1a2d0 64 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  d(.  KeyInfo *pK
1a2e0 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
1a2f0 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
1a300 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 63 6f 72  ion of the recor
1a310 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70  d */.  char *pSp
1a320 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ace,            
1a330 20 20 20 20 20 20 20 2f 2a 20 55 6e 61 6c 69 67         /* Unalig
1a340 6e 65 64 20 73 70 61 63 65 20 61 76 61 69 6c 61  ned space availa
1a350 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53  ble */.  int szS
1a360 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20  pace,           
1a370 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1a380 20 6f 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20   of pSpace[] in 
1a390 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  bytes */.  char 
1a3a0 2a 2a 70 70 46 72 65 65 20 20 20 20 20 20 20 20  **ppFree        
1a3b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
1a3c0 54 3a 20 43 61 6c 6c 65 72 20 73 68 6f 75 6c 64  T: Caller should
1a3d0 20 66 72 65 65 20 74 68 69 73 20 70 6f 69 6e 74   free this point
1a3e0 65 72 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63  er */.){.  Unpac
1a3f0 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 20 20 20  kedRecord *p;   
1a400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
1a410 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 74 6f  packed record to
1a420 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
1a430 20 6e 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20   nOff;          
1a440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a450 49 6e 63 72 65 6d 65 6e 74 20 70 53 70 61 63 65  Increment pSpace
1a460 20 62 79 20 6e 4f 66 66 20 74 6f 20 61 6c 69 67   by nOff to alig
1a470 6e 20 69 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  n it */.  int nB
1a480 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
1a490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1a4a0 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71  ber of bytes req
1a4b0 75 69 72 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a  uired for *p */.
1a4c0 0a 20 20 2f 2a 20 57 65 20 77 61 6e 74 20 74 6f  .  /* We want to
1a4d0 20 73 68 69 66 74 20 74 68 65 20 70 6f 69 6e 74   shift the point
1a4e0 65 72 20 70 53 70 61 63 65 20 75 70 20 73 75 63  er pSpace up suc
1a4f0 68 20 74 68 61 74 20 69 74 20 69 73 20 38 2d 62  h that it is 8-b
1a500 79 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a  yte aligned..  *
1a510 2a 20 54 68 75 73 2c 20 77 65 20 6e 65 65 64 20  * Thus, we need 
1a520 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 61 20 76  to calculate a v
1a530 61 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77  alue, nOff, betw
1a540 65 65 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f 20  een 0 and 7, to 
1a550 73 68 69 66 74 20 0a 20 20 2a 2a 20 69 74 20 62  shift .  ** it b
1a560 79 2e 20 20 49 66 20 70 53 70 61 63 65 20 69 73  y.  If pSpace is
1a570 20 61 6c 72 65 61 64 79 20 38 2d 62 79 74 65 20   already 8-byte 
1a580 61 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68  aligned, nOff sh
1a590 6f 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20  ould be zero..  
1a5a0 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d  */.  nOff = (8 -
1a5b0 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f   (SQLITE_PTR_TO_
1a5c0 49 4e 54 28 70 53 70 61 63 65 29 20 26 20 37 29  INT(pSpace) & 7)
1a5d0 29 20 26 20 37 3b 0a 20 20 6e 42 79 74 65 20 3d  ) & 7;.  nByte =
1a5e0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55   ROUND8(sizeof(U
1a5f0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 20  npackedRecord)) 
1a600 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70  + sizeof(Mem)*(p
1a610 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b  KeyInfo->nField+
1a620 31 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3e  1);.  if( nByte>
1a630 73 7a 53 70 61 63 65 2b 6e 4f 66 66 20 29 7b 0a  szSpace+nOff ){.
1a640 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65      p = (Unpacke
1a650 64 52 65 63 6f 72 64 20 2a 29 73 71 6c 69 74 65  dRecord *)sqlite
1a660 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65  3DbMallocRaw(pKe
1a670 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65  yInfo->db, nByte
1a680 29 3b 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d  );.    *ppFree =
1a690 20 28 63 68 61 72 20 2a 29 70 3b 0a 20 20 20 20   (char *)p;.    
1a6a0 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 20  if( !p ) return 
1a6b0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1a6c0 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63  p = (UnpackedRec
1a6d0 6f 72 64 2a 29 26 70 53 70 61 63 65 5b 6e 4f 66  ord*)&pSpace[nOf
1a6e0 66 5d 3b 0a 20 20 20 20 2a 70 70 46 72 65 65 20  f];.    *ppFree 
1a6f0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 61  = 0;.  }..  p->a
1a700 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63  Mem = (Mem*)&((c
1a710 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73  har*)p)[ROUND8(s
1a720 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65  izeof(UnpackedRe
1a730 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73 65 72  cord))];.  asser
1a740 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  t( pKeyInfo->aSo
1a750 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
1a760 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  p->pKeyInfo = pK
1a770 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69  eyInfo;.  p->nFi
1a780 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld = pKeyInfo->
1a790 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65  nField + 1;.  re
1a7a0 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
1a7b0 20 47 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d   Given the nKey-
1a7c0 62 79 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66  byte encoding of
1a7d0 20 61 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65   a record in pKe
1a7e0 79 5b 5d 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  y[], populate th
1a7f0 65 20 0a 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65  e .** UnpackedRe
1a800 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 20 69  cord structure i
1a810 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20  ndicated by the 
1a820 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20  fourth argument 
1a830 77 69 74 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  with the.** cont
1a840 65 6e 74 73 20 6f 66 20 74 68 65 20 64 65 63 6f  ents of the deco
1a850 64 65 64 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a  ded record..*/ .
1a860 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
1a870 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20  RecordUnpack(.  
1a880 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1a890 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  o,     /* Inform
1a8a0 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
1a8b0 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f  record format */
1a8c0 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20  .  int nKey,    
1a8d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1a8e0 65 20 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20  e of the binary 
1a8f0 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73  record */.  cons
1a900 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
1a910 20 20 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79     /* The binary
1a920 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70   record */.  Unp
1a930 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 20 20  ackedRecord *p  
1a940 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20      /* Populate 
1a950 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 62  this structure b
1a960 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
1a970 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75   */.){.  const u
1a980 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
1a990 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  ey = (const unsi
1a9a0 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
1a9b0 3b 0a 20 20 69 6e 74 20 64 3b 20 0a 20 20 75 33  ;.  int d; .  u3
1a9c0 32 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  2 idx;          
1a9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a9e0 20 4f 66 66 73 65 74 20 69 6e 20 61 4b 65 79 5b   Offset in aKey[
1a9f0 5d 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  ] to read from *
1aa00 2f 0a 20 20 75 31 36 20 75 3b 20 20 20 20 20 20  /.  u16 u;      
1aa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20      /* Unsigned 
1aa30 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  loop counter */.
1aa40 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d    u32 szHdr;.  M
1aa50 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d  em *pMem = p->aM
1aa60 65 6d 3b 0a 0a 20 20 70 2d 3e 64 65 66 61 75 6c  em;..  p->defaul
1aa70 74 5f 72 63 20 3d 20 30 3b 0a 20 20 61 73 73 65  t_rc = 0;.  asse
1aa80 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
1aa90 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29  LIGNMENT(pMem) )
1aaa0 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 72  ;.  idx = getVar
1aab0 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64  int32(aKey, szHd
1aac0 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b  r);.  d = szHdr;
1aad0 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c  .  u = 0;.  whil
1aae0 65 28 20 69 64 78 3c 73 7a 48 64 72 20 26 26 20  e( idx<szHdr && 
1aaf0 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75  d<=nKey ){.    u
1ab00 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a  32 serial_type;.
1ab10 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56  .    idx += getV
1ab20 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 69 64  arint32(&aKey[id
1ab30 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29  x], serial_type)
1ab40 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20  ;.    pMem->enc 
1ab50 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
1ab60 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20  .    pMem->db = 
1ab70 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20  pKeyInfo->db;.  
1ab80 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73    /* pMem->flags
1ab90 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33   = 0; // sqlite3
1aba0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20  VdbeSerialGet() 
1abb0 77 69 6c 6c 20 73 65 74 20 74 68 69 73 20 66 6f  will set this fo
1abc0 72 20 75 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  r us */.    pMem
1abd0 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a  ->szMalloc = 0;.
1abe0 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33      d += sqlite3
1abf0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
1ac00 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74  Key[d], serial_t
1ac10 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20  ype, pMem);.    
1ac20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20  pMem++;.    if( 
1ac30 28 2b 2b 75 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64  (++u)>=p->nField
1ac40 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
1ac50 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49  assert( u<=pKeyI
1ac60 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20  nfo->nField + 1 
1ac70 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  );.  p->nField =
1ac80 20 75 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54   u;.}..#if SQLIT
1ac90 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68  E_DEBUG./*.** Th
1aca0 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70  is function comp
1acb0 61 72 65 73 20 74 77 6f 20 69 6e 64 65 78 20 6f  ares two index o
1acc0 72 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6b  r table record k
1acd0 65 79 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  eys in the same 
1ace0 77 61 79 0a 2a 2a 20 61 73 20 74 68 65 20 73 71  way.** as the sq
1acf0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1ad00 6f 6d 70 61 72 65 28 29 20 72 6f 75 74 69 6e 65  ompare() routine
1ad10 2e 20 55 6e 6c 69 6b 65 20 56 64 62 65 52 65 63  . Unlike VdbeRec
1ad20 6f 72 64 43 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a  ordCompare(),.**
1ad30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   this function d
1ad40 65 73 65 72 69 61 6c 69 7a 65 73 20 61 6e 64 20  eserializes and 
1ad50 63 6f 6d 70 61 72 65 73 20 76 61 6c 75 65 73 20  compares values 
1ad60 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c  using the.** sql
1ad70 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1ad80 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 4d  t() and sqlite3M
1ad90 65 6d 43 6f 6d 70 61 72 65 28 29 20 66 75 6e 63  emCompare() func
1ada0 74 69 6f 6e 73 2e 20 49 74 20 69 73 20 75 73 65  tions. It is use
1adb0 64 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29  d.** in assert()
1adc0 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65   statements to e
1add0 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6f  nsure that the o
1ade0 70 74 69 6d 69 7a 65 64 20 63 6f 64 65 20 69 6e  ptimized code in
1adf0 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 52  .** sqlite3VdbeR
1ae00 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72  ecordCompare() r
1ae10 65 74 75 72 6e 73 20 72 65 73 75 6c 74 73 20 77  eturns results w
1ae20 69 74 68 20 74 68 65 73 65 20 74 77 6f 20 70 72  ith these two pr
1ae30 69 6d 69 74 69 76 65 73 2e 0a 2a 2a 0a 2a 2a 20  imitives..**.** 
1ae40 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
1ae50 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d  he result of com
1ae60 70 61 72 69 73 6f 6e 20 69 73 20 65 71 75 69 76  parison is equiv
1ae70 61 6c 65 6e 74 20 74 6f 20 64 65 73 69 72 65 64  alent to desired
1ae80 52 65 73 75 6c 74 2e 0a 2a 2a 20 52 65 74 75 72  Result..** Retur
1ae90 6e 20 66 61 6c 73 65 20 69 66 20 74 68 65 72 65  n false if there
1aea0 20 69 73 20 61 20 64 69 73 61 67 72 65 65 6d 65   is a disagreeme
1aeb0 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
1aec0 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  t vdbeRecordComp
1aed0 61 72 65 44 65 62 75 67 28 0a 20 20 69 6e 74 20  areDebug(.  int 
1aee0 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
1aef0 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66  d *pKey1, /* Lef
1af00 74 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  t key */.  const
1af10 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1af20 2a 70 50 4b 65 79 32 2c 20 2f 2a 20 52 69 67 68  *pPKey2, /* Righ
1af30 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64  t key */.  int d
1af40 65 73 69 72 65 64 52 65 73 75 6c 74 20 20 20 20  esiredResult    
1af50 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72           /* Corr
1af60 65 63 74 20 61 6e 73 77 65 72 20 2a 2f 0a 29 7b  ect answer */.){
1af70 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 20  .  u32 d1;      
1af80 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1af90 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
1afa0 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74  ext data element
1afb0 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20   */.  u32 idx1; 
1afc0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1afd0 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
1afe0 66 20 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c  f next header el
1aff0 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73  ement */.  u32 s
1b000 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a  zHdr1;        /*
1b010 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1b020 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20   in header */.  
1b030 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74  int i = 0;.  int
1b040 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74   rc = 0;.  const
1b050 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1b060 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75  aKey1 = (const u
1b070 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
1b080 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  Key1;.  KeyInfo 
1b090 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d  *pKeyInfo;.  Mem
1b0a0 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e   mem1;..  pKeyIn
1b0b0 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65  fo = pPKey2->pKe
1b0c0 79 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 4b 65  yInfo;.  if( pKe
1b0d0 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30 20 29 20 72  yInfo->db==0 ) r
1b0e0 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 31 2e  eturn 1;.  mem1.
1b0f0 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
1b100 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d  enc;.  mem1.db =
1b110 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20   pKeyInfo->db;. 
1b120 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d   /* mem1.flags =
1b130 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20   0;  // Will be 
1b140 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 73  initialized by s
1b150 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1b160 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f  Get() */.  VVA_O
1b170 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  NLY( mem1.szMall
1b180 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c  oc = 0; ) /* Onl
1b190 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65  y needed by asse
1b1a0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
1b1b0 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65  */..  /* Compile
1b1c0 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20  rs may complain 
1b1d0 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73  that mem1.u.i is
1b1e0 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69   potentially uni
1b1f0 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a  nitialized..  **
1b200 20 57 65 20 63 6f 75 6c 64 20 69 6e 69 74 69 61   We could initia
1b210 6c 69 7a 65 20 69 74 2c 20 61 73 20 73 68 6f 77  lize it, as show
1b220 6e 20 68 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e  n here, to silen
1b230 63 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69  ce those complai
1b240 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e  nts..  ** But in
1b250 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20   fact, mem1.u.i 
1b260 77 69 6c 6c 20 6e 65 76 65 72 20 61 63 74 75 61  will never actua
1b270 6c 6c 79 20 62 65 20 75 73 65 64 20 75 6e 69 6e  lly be used unin
1b280 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64  itialized, and d
1b290 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 75  oing .  ** the u
1b2a0 6e 6e 65 63 65 73 73 61 72 79 20 69 6e 69 74 69  nnecessary initi
1b2b0 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20 61 20  alization has a 
1b2c0 6d 65 61 73 75 72 61 62 6c 65 20 6e 65 67 61 74  measurable negat
1b2d0 69 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  ive performance.
1b2e0 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e    ** impact, sin
1b2f0 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ce this routine 
1b300 69 73 20 61 20 76 65 72 79 20 68 69 67 68 20 72  is a very high r
1b310 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20  unner.  And so, 
1b320 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74  we choose.  ** t
1b330 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d  o ignore the com
1b340 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61  piler warnings a
1b350 6e 64 20 6c 65 61 76 65 20 74 68 69 73 20 76 61  nd leave this va
1b360 72 69 61 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c  riable uninitial
1b370 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20  ized..  */.  /* 
1b380 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20   mem1.u.i = 0;  
1b390 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68  // not needed, h
1b3a0 65 72 65 20 74 6f 20 73 69 6c 65 6e 63 65 20 63  ere to silence c
1b3b0 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20  ompiler warning 
1b3c0 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 67  */.  .  idx1 = g
1b3d0 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31  etVarint32(aKey1
1b3e0 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 69 66 28  , szHdr1);.  if(
1b3f0 20 73 7a 48 64 72 31 3e 39 38 33 30 37 20 29 20   szHdr1>98307 ) 
1b400 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1b410 52 52 55 50 54 3b 0a 20 20 64 31 20 3d 20 73 7a  RRUPT;.  d1 = sz
1b420 48 64 72 31 3b 0a 20 20 61 73 73 65 72 74 28 20  Hdr1;.  assert( 
1b430 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
1b440 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65  +pKeyInfo->nXFie
1b450 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65  ld>=pPKey2->nFie
1b460 6c 64 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ld || CORRUPT_DB
1b470 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b   );.  assert( pK
1b480 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
1b490 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
1b4a0 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  t( pKeyInfo->nFi
1b4b0 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  eld>0 );.  asser
1b4c0 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20  t( idx1<=szHdr1 
1b4d0 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
1b4e0 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73  .  do{.    u32 s
1b4f0 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20  erial_type1;..  
1b500 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65    /* Read the se
1b510 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74  rial types for t
1b520 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20  he next element 
1b530 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a  in each key. */.
1b540 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74 56      idx1 += getV
1b550 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b 69  arint32( aKey1+i
1b560 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  dx1, serial_type
1b570 31 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72  1 );..    /* Ver
1b580 69 66 79 20 74 68 61 74 20 74 68 65 72 65 20 69  ify that there i
1b590 73 20 65 6e 6f 75 67 68 20 6b 65 79 20 73 70 61  s enough key spa
1b5a0 63 65 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f 20  ce remaining to 
1b5b0 61 76 6f 69 64 0a 20 20 20 20 2a 2a 20 61 20 62  avoid.    ** a b
1b5c0 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 2e 20  uffer overread. 
1b5d0 20 54 68 65 20 22 64 31 2b 73 65 72 69 61 6c 5f   The "d1+serial_
1b5e0 74 79 70 65 31 2b 32 22 20 73 75 62 65 78 70 72  type1+2" subexpr
1b5f0 65 73 73 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20  ession will.    
1b600 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 67 72 65  ** always be gre
1b610 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
1b620 61 6c 20 74 6f 20 74 68 65 20 61 6d 6f 75 6e 74  al to the amount
1b630 20 6f 66 20 72 65 71 75 69 72 65 64 20 6b 65 79   of required key
1b640 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 55   space..    ** U
1b650 73 65 20 74 68 61 74 20 61 70 70 72 6f 78 69 6d  se that approxim
1b660 61 74 69 6f 6e 20 74 6f 20 61 76 6f 69 64 20 74  ation to avoid t
1b670 68 65 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76  he more expensiv
1b680 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  e call to.    **
1b690 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1b6a0 61 6c 54 79 70 65 4c 65 6e 28 29 20 69 6e 20 74  alTypeLen() in t
1b6b0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a  he common case..
1b6c0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64      */.    if( d
1b6d0 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32  1+serial_type1+2
1b6e0 3e 28 75 33 32 29 6e 4b 65 79 31 0a 20 20 20 20  >(u32)nKey1.    
1b6f0 20 26 26 20 64 31 2b 73 71 6c 69 74 65 33 56 64   && d1+sqlite3Vd
1b700 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
1b710 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 28 75  serial_type1)>(u
1b720 33 32 29 6e 4b 65 79 31 20 0a 20 20 20 20 29 7b  32)nKey1 .    ){
1b730 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1b740 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72    }..    /* Extr
1b750 61 63 74 20 74 68 65 20 76 61 6c 75 65 73 20 74  act the values t
1b760 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20  o be compared.. 
1b770 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20     */.    d1 += 
1b780 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1b790 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c  lGet(&aKey1[d1],
1b7a0 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26   serial_type1, &
1b7b0 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44  mem1);..    /* D
1b7c0 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  o the comparison
1b7d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
1b7e0 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
1b7f0 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79  re(&mem1, &pPKey
1b800 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65 79  2->aMem[i], pKey
1b810 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b  Info->aColl[i]);
1b820 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29  .    if( rc!=0 )
1b830 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1b840 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30  mem1.szMalloc==0
1b850 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d   );  /* See comm
1b860 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20  ent below */.   
1b870 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d     if( pKeyInfo-
1b880 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29  >aSortOrder[i] )
1b890 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
1b8a0 72 63 3b 20 20 2f 2a 20 49 6e 76 65 72 74 20 74  rc;  /* Invert t
1b8b0 68 65 20 72 65 73 75 6c 74 20 66 6f 72 20 44 45  he result for DE
1b8c0 53 43 20 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a  SC sort order. *
1b8d0 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
1b8e0 67 6f 74 6f 20 64 65 62 75 67 43 6f 6d 70 61 72  goto debugCompar
1b8f0 65 45 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  eEnd;.    }.    
1b900 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69  i++;.  }while( i
1b910 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69 3c  dx1<szHdr1 && i<
1b920 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29  pPKey2->nField )
1b930 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72  ;..  /* No memor
1b940 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  y allocation is 
1b950 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d  ever used on mem
1b960 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20 75  1.  Prove this u
1b970 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f  sing.  ** the fo
1b980 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29  llowing assert()
1b990 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72 74  .  If the assert
1b9a0 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64  () fails, it ind
1b9b0 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65  icates a.  ** me
1b9c0 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20  mory leak and a 
1b9d0 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c  need to call sql
1b9e0 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
1b9f0 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a  se(&mem1)..  */.
1ba00 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73    assert( mem1.s
1ba10 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20  zMalloc==0 );.. 
1ba20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d   /* rc==0 here m
1ba30 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66  eans that one of
1ba40 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75   the keys ran ou
1ba50 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a  t of fields and.
1ba60 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65    ** all the fie
1ba70 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70  lds up to that p
1ba80 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e  oint were equal.
1ba90 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66 61   Return the defa
1baa0 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75  ult_rc.  ** valu
1bab0 65 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 50  e.  */.  rc = pP
1bac0 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
1bad0 3b 0a 0a 64 65 62 75 67 43 6f 6d 70 61 72 65 45  ;..debugCompareE
1bae0 6e 64 3a 0a 20 20 69 66 28 20 64 65 73 69 72 65  nd:.  if( desire
1baf0 64 52 65 73 75 6c 74 3d 3d 30 20 26 26 20 72 63  dResult==0 && rc
1bb00 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
1bb10 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65 73    if( desiredRes
1bb20 75 6c 74 3c 30 20 26 26 20 72 63 3c 30 20 29 20  ult<0 && rc<0 ) 
1bb30 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
1bb40 64 65 73 69 72 65 64 52 65 73 75 6c 74 3e 30 20  desiredResult>0 
1bb50 26 26 20 72 63 3e 30 20 29 20 72 65 74 75 72 6e  && rc>0 ) return
1bb60 20 31 3b 0a 20 20 69 66 28 20 43 4f 52 52 55 50   1;.  if( CORRUP
1bb70 54 5f 44 42 20 29 20 72 65 74 75 72 6e 20 31 3b  T_DB ) return 1;
1bb80 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d  .  if( pKeyInfo-
1bb90 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1bba0 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  d ) return 1;.  
1bbb0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
1bbc0 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44  if..#if SQLITE_D
1bbd0 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  EBUG./*.** Count
1bbe0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
1bbf0 69 65 6c 64 73 20 28 61 2e 6b 2e 61 2e 20 63 6f  ields (a.k.a. co
1bc00 6c 75 6d 6e 73 29 20 69 6e 20 74 68 65 20 72 65  lumns) in the re
1bc10 63 6f 72 64 20 67 69 76 65 6e 20 62 79 0a 2a 2a  cord given by.**
1bc20 20 70 4b 65 79 2c 6e 4b 65 79 2e 20 20 54 68 65   pKey,nKey.  The
1bc30 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 69   verify that thi
1bc40 73 20 63 6f 75 6e 74 20 69 73 20 6c 65 73 73 20  s count is less 
1bc50 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
1bc60 20 74 68 65 0a 2a 2a 20 6c 69 6d 69 74 20 67 69   the.** limit gi
1bc70 76 65 6e 20 62 79 20 70 4b 65 79 49 6e 66 6f 2d  ven by pKeyInfo-
1bc80 3e 6e 46 69 65 6c 64 20 2b 20 70 4b 65 79 49 6e  >nField + pKeyIn
1bc90 66 6f 2d 3e 6e 58 46 69 65 6c 64 2e 0a 2a 2a 0a  fo->nXField..**.
1bca0 2a 2a 20 49 66 20 74 68 69 73 20 63 6f 6e 73 74  ** If this const
1bcb0 72 61 69 6e 74 20 69 73 20 6e 6f 74 20 73 61 74  raint is not sat
1bcc0 69 73 66 69 65 64 2c 20 69 74 20 6d 65 61 6e 73  isfied, it means
1bcd0 20 74 68 61 74 20 74 68 65 20 68 69 67 68 2d 73   that the high-s
1bce0 70 65 65 64 0a 2a 2a 20 76 64 62 65 52 65 63 6f  peed.** vdbeReco
1bcf0 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61  rdCompareInt() a
1bd00 6e 64 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  nd vdbeRecordCom
1bd10 70 61 72 65 53 74 72 69 6e 67 28 29 20 72 6f 75  pareString() rou
1bd20 74 69 6e 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f  tines will.** no
1bd30 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  t work correctly
1bd40 2e 20 20 49 66 20 74 68 69 73 20 61 73 73 65 72  .  If this asser
1bd50 74 28 29 20 65 76 65 72 20 66 69 72 65 73 2c 20  t() ever fires, 
1bd60 69 74 20 70 72 6f 62 61 62 6c 79 20 6d 65 61 6e  it probably mean
1bd70 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 4b 65  s.** that the Ke
1bd80 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 6f 72 20  yInfo.nField or 
1bd90 4b 65 79 49 6e 66 6f 2e 6e 58 46 69 65 6c 64 20  KeyInfo.nXField 
1bda0 76 61 6c 75 65 73 20 77 65 72 65 20 63 6f 6d 70  values were comp
1bdb0 75 74 65 64 0a 2a 2a 20 69 6e 63 6f 72 72 65 63  uted.** incorrec
1bdc0 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tly..*/.static v
1bdd0 6f 69 64 20 76 64 62 65 41 73 73 65 72 74 46 69  oid vdbeAssertFi
1bde0 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69  eldCountWithinLi
1bdf0 6d 69 74 73 28 0a 20 20 69 6e 74 20 6e 4b 65 79  mits(.  int nKey
1be00 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
1be10 65 79 2c 20 20 20 2f 2a 20 54 68 65 20 72 65 63  ey,   /* The rec
1be20 6f 72 64 20 74 6f 20 76 65 72 69 66 79 20 2a 2f  ord to verify */
1be30 20 0a 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e 66   .  const KeyInf
1be40 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20 20 20  o *pKeyInfo     
1be50 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20 73 69 7a    /* Compare siz
1be60 65 20 77 69 74 68 20 74 68 69 73 20 4b 65 79 49  e with this KeyI
1be70 6e 66 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nfo */.){.  int 
1be80 6e 46 69 65 6c 64 20 3d 20 30 3b 0a 20 20 75 33  nField = 0;.  u3
1be90 32 20 73 7a 48 64 72 3b 0a 20 20 75 33 32 20 69  2 szHdr;.  u32 i
1bea0 64 78 3b 0a 20 20 75 33 32 20 6e 6f 74 55 73 65  dx;.  u32 notUse
1beb0 64 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  d;.  const unsig
1bec0 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d  ned char *aKey =
1bed0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
1bee0 20 63 68 61 72 2a 29 70 4b 65 79 3b 0a 0a 20 20   char*)pKey;..  
1bef0 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29  if( CORRUPT_DB )
1bf00 20 72 65 74 75 72 6e 3b 0a 20 20 69 64 78 20 3d   return;.  idx =
1bf10 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
1bf20 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 61 73 73  y, szHdr);.  ass
1bf30 65 72 74 28 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a  ert( nKey>=0 );.
1bf40 20 20 61 73 73 65 72 74 28 20 73 7a 48 64 72 3c    assert( szHdr<
1bf50 3d 28 75 33 32 29 6e 4b 65 79 20 29 3b 0a 20 20  =(u32)nKey );.  
1bf60 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72  while( idx<szHdr
1bf70 20 29 7b 0a 20 20 20 20 69 64 78 20 2b 3d 20 67   ){.    idx += g
1bf80 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2b  etVarint32(aKey+
1bf90 69 64 78 2c 20 6e 6f 74 55 73 65 64 29 3b 0a 20  idx, notUsed);. 
1bfa0 20 20 20 6e 46 69 65 6c 64 2b 2b 3b 0a 20 20 7d     nField++;.  }
1bfb0 0a 20 20 61 73 73 65 72 74 28 20 6e 46 69 65 6c  .  assert( nFiel
1bfc0 64 20 3c 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  d <= pKeyInfo->n
1bfd0 46 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e  Field+pKeyInfo->
1bfe0 6e 58 46 69 65 6c 64 20 29 3b 0a 7d 0a 23 65 6c  nXField );.}.#el
1bff0 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65  se.# define vdbe
1c000 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74  AssertFieldCount
1c010 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 41 2c 42  WithinLimits(A,B
1c020 2c 43 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,C).#endif../*.*
1c030 2a 20 42 6f 74 68 20 2a 70 4d 65 6d 31 20 61 6e  * Both *pMem1 an
1c040 64 20 2a 70 4d 65 6d 32 20 63 6f 6e 74 61 69 6e  d *pMem2 contain
1c050 20 73 74 72 69 6e 67 20 76 61 6c 75 65 73 2e 20   string values. 
1c060 43 6f 6d 70 61 72 65 20 74 68 65 20 74 77 6f 20  Compare the two 
1c070 76 61 6c 75 65 73 0a 2a 2a 20 75 73 69 6e 67 20  values.** using 
1c080 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
1c090 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 41 73  quence pColl. As
1c0a0 20 75 73 75 61 6c 2c 20 72 65 74 75 72 6e 20 61   usual, return a
1c0b0 20 6e 65 67 61 74 69 76 65 20 2c 20 7a 65 72 6f   negative , zero
1c0c0 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20  .** or positive 
1c0d0 76 61 6c 75 65 20 69 66 20 2a 70 4d 65 6d 31 20  value if *pMem1 
1c0e0 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
1c0f0 75 61 6c 20 74 6f 20 6f 72 20 67 72 65 61 74 65  ual to or greate
1c100 72 20 74 68 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d  r than .** *pMem
1c110 32 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  2, respectively.
1c120 20 53 69 6d 69 6c 61 72 20 69 6e 20 73 70 69 72   Similar in spir
1c130 69 74 20 74 6f 20 22 72 63 20 3d 20 28 2a 70 4d  it to "rc = (*pM
1c140 65 6d 31 29 20 2d 20 28 2a 70 4d 65 6d 32 29 3b  em1) - (*pMem2);
1c150 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  "..*/.static int
1c160 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53   vdbeCompareMemS
1c170 74 72 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20 4d  tring(.  const M
1c180 65 6d 20 2a 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e  em *pMem1,.  con
1c190 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20  st Mem *pMem2,. 
1c1a0 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a   const CollSeq *
1c1b0 70 43 6f 6c 6c 2c 0a 20 20 75 38 20 2a 70 72 63  pColl,.  u8 *prc
1c1c0 45 72 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Err             
1c1d0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61           /* If a
1c1e0 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 73 65  n OOM occurs, se
1c1f0 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  t to SQLITE_NOME
1c200 4d 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 4d  M */.){.  if( pM
1c210 65 6d 31 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d  em1->enc==pColl-
1c220 3e 65 6e 63 20 29 7b 0a 20 20 20 20 2f 2a 20 54  >enc ){.    /* T
1c230 68 65 20 73 74 72 69 6e 67 73 20 61 72 65 20 61  he strings are a
1c240 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 6f  lready in the co
1c250 72 72 65 63 74 20 65 6e 63 6f 64 69 6e 67 2e 20  rrect encoding. 
1c260 20 43 61 6c 6c 20 74 68 65 0a 20 20 20 20 20 2a   Call the.     *
1c270 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  * comparison fun
1c280 63 74 69 6f 6e 20 64 69 72 65 63 74 6c 79 20 2a  ction directly *
1c290 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 6f  /.    return pCo
1c2a0 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e  ll->xCmp(pColl->
1c2b0 70 55 73 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70  pUser,pMem1->n,p
1c2c0 4d 65 6d 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e  Mem1->z,pMem2->n
1c2d0 2c 70 4d 65 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65  ,pMem2->z);.  }e
1c2e0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  lse{.    int rc;
1c2f0 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  .    const void 
1c300 2a 76 31 2c 20 2a 76 32 3b 0a 20 20 20 20 69 6e  *v1, *v2;.    in
1c310 74 20 6e 31 2c 20 6e 32 3b 0a 20 20 20 20 4d 65  t n1, n2;.    Me
1c320 6d 20 63 31 3b 0a 20 20 20 20 4d 65 6d 20 63 32  m c1;.    Mem c2
1c330 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1c340 65 4d 65 6d 49 6e 69 74 28 26 63 31 2c 20 70 4d  eMemInit(&c1, pM
1c350 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c  em1->db, MEM_Nul
1c360 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  l);.    sqlite3V
1c370 64 62 65 4d 65 6d 49 6e 69 74 28 26 63 32 2c 20  dbeMemInit(&c2, 
1c380 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e  pMem1->db, MEM_N
1c390 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ull);.    sqlite
1c3a0 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43  3VdbeMemShallowC
1c3b0 6f 70 79 28 26 63 31 2c 20 70 4d 65 6d 31 2c 20  opy(&c1, pMem1, 
1c3c0 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20  MEM_Ephem);.    
1c3d0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68  sqlite3VdbeMemSh
1c3e0 61 6c 6c 6f 77 43 6f 70 79 28 26 63 32 2c 20 70  allowCopy(&c2, p
1c3f0 4d 65 6d 32 2c 20 4d 45 4d 5f 45 70 68 65 6d 29  Mem2, MEM_Ephem)
1c400 3b 0a 20 20 20 20 76 31 20 3d 20 73 71 6c 69 74  ;.    v1 = sqlit
1c410 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c  e3ValueText((sql
1c420 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 31 2c  ite3_value*)&c1,
1c430 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20   pColl->enc);.  
1c440 20 20 6e 31 20 3d 20 76 31 3d 3d 30 20 3f 20 30    n1 = v1==0 ? 0
1c450 20 3a 20 63 31 2e 6e 3b 0a 20 20 20 20 76 32 20   : c1.n;.    v2 
1c460 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65  = sqlite3ValueTe
1c470 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  xt((sqlite3_valu
1c480 65 2a 29 26 63 32 2c 20 70 43 6f 6c 6c 2d 3e 65  e*)&c2, pColl->e
1c490 6e 63 29 3b 0a 20 20 20 20 6e 32 20 3d 20 76 32  nc);.    n2 = v2
1c4a0 3d 3d 30 20 3f 20 30 20 3a 20 63 32 2e 6e 3b 0a  ==0 ? 0 : c2.n;.
1c4b0 20 20 20 20 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e      rc = pColl->
1c4c0 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65  xCmp(pColl->pUse
1c4d0 72 2c 20 6e 31 2c 20 76 31 2c 20 6e 32 2c 20 76  r, n1, v1, n2, v
1c4e0 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  2);.    sqlite3V
1c4f0 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63  dbeMemRelease(&c
1c500 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
1c510 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63  dbeMemRelease(&c
1c520 32 29 3b 0a 20 20 20 20 69 66 28 20 28 76 31 3d  2);.    if( (v1=
1c530 3d 30 20 7c 7c 20 76 32 3d 3d 30 29 20 26 26 20  =0 || v2==0) && 
1c540 70 72 63 45 72 72 20 29 20 2a 70 72 63 45 72 72  prcErr ) *prcErr
1c550 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1c560 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1c570 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d    }.}../*.** Com
1c580 70 61 72 65 20 74 77 6f 20 62 6c 6f 62 73 2e 20  pare two blobs. 
1c590 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65   Return negative
1c5a0 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74  , zero, or posit
1c5b0 69 76 65 20 69 66 20 74 68 65 20 66 69 72 73 74  ive if the first
1c5c0 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e  .** is less than
1c5d0 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67  , equal to, or g
1c5e0 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
1c5f0 73 65 63 6f 6e 64 2c 20 72 65 73 70 65 63 74 69  second, respecti
1c600 76 65 6c 79 2e 0a 2a 2a 20 49 66 20 6f 6e 65 20  vely..** If one 
1c610 62 6c 6f 62 20 69 73 20 61 20 70 72 65 66 69 78  blob is a prefix
1c620 20 6f 66 20 74 68 65 20 6f 74 68 65 72 2c 20 74   of the other, t
1c630 68 65 6e 20 74 68 65 20 73 68 6f 72 74 65 72 20  hen the shorter 
1c640 69 73 20 74 68 65 20 6c 65 73 73 6f 72 2e 0a 2a  is the lessor..*
1c650 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
1c660 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 73 71 6c  NOINLINE int sql
1c670 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28  ite3BlobCompare(
1c680 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 31 2c 20  const Mem *pB1, 
1c690 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 32 29 7b  const Mem *pB2){
1c6a0 0a 20 20 69 6e 74 20 63 20 3d 20 6d 65 6d 63 6d  .  int c = memcm
1c6b0 70 28 70 42 31 2d 3e 7a 2c 20 70 42 32 2d 3e 7a  p(pB1->z, pB2->z
1c6c0 2c 20 70 42 31 2d 3e 6e 3e 70 42 32 2d 3e 6e 20  , pB1->n>pB2->n 
1c6d0 3f 20 70 42 32 2d 3e 6e 20 3a 20 70 42 31 2d 3e  ? pB2->n : pB1->
1c6e0 6e 29 3b 0a 20 20 69 66 28 20 63 20 29 20 72 65  n);.  if( c ) re
1c6f0 74 75 72 6e 20 63 3b 0a 20 20 72 65 74 75 72 6e  turn c;.  return
1c700 20 70 42 31 2d 3e 6e 20 2d 20 70 42 32 2d 3e 6e   pB1->n - pB2->n
1c710 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20  ;.}../*.** Do a 
1c720 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74 77 65  comparison betwe
1c730 65 6e 20 61 20 36 34 2d 62 69 74 20 73 69 67 6e  en a 64-bit sign
1c740 65 64 20 69 6e 74 65 67 65 72 20 61 6e 64 20 61  ed integer and a
1c750 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67   64-bit floating
1c760 2d 70 6f 69 6e 74 0a 2a 2a 20 6e 75 6d 62 65 72  -point.** number
1c770 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69  .  Return negati
1c780 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73  ve, zero, or pos
1c790 69 74 69 76 65 20 69 66 20 74 68 65 20 66 69 72  itive if the fir
1c7a0 73 74 20 28 69 36 34 29 20 69 73 20 6c 65 73 73  st (i64) is less
1c7b0 20 74 68 61 6e 2c 0a 2a 2a 20 65 71 75 61 6c 20   than,.** equal 
1c7c0 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74  to, or greater t
1c7d0 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 28  han the second (
1c7e0 64 6f 75 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74  double)..*/.stat
1c7f0 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  ic int sqlite3In
1c800 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 69 36  tFloatCompare(i6
1c810 34 20 69 2c 20 64 6f 75 62 6c 65 20 72 29 7b 0a  4 i, double r){.
1c820 20 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 4f 4e    if( sizeof(LON
1c830 47 44 4f 55 42 4c 45 5f 54 59 50 45 29 3e 38 20  GDOUBLE_TYPE)>8 
1c840 29 7b 0a 20 20 20 20 4c 4f 4e 47 44 4f 55 42 4c  ){.    LONGDOUBL
1c850 45 5f 54 59 50 45 20 78 20 3d 20 28 4c 4f 4e 47  E_TYPE x = (LONG
1c860 44 4f 55 42 4c 45 5f 54 59 50 45 29 69 3b 0a 20  DOUBLE_TYPE)i;. 
1c870 20 20 20 69 66 28 20 78 3c 72 20 29 20 72 65 74     if( x<r ) ret
1c880 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  urn -1;.    if( 
1c890 78 3e 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b  x>r ) return +1;
1c8a0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1c8b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36 34 20   }else{.    i64 
1c8c0 79 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 73 3b  y;.    double s;
1c8d0 0a 20 20 20 20 69 66 28 20 72 3c 2d 39 32 32 33  .    if( r<-9223
1c8e0 33 37 32 30 33 36 38 35 34 37 37 35 38 30 38 2e  372036854775808.
1c8f0 30 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20  0 ) return +1;. 
1c900 20 20 20 69 66 28 20 72 3e 39 32 32 33 33 37 32     if( r>9223372
1c910 30 33 36 38 35 34 37 37 35 38 30 37 2e 30 20 29  036854775807.0 )
1c920 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1c930 79 20 3d 20 28 69 36 34 29 72 3b 0a 20 20 20 20  y = (i64)r;.    
1c940 69 66 28 20 69 3c 79 20 29 20 72 65 74 75 72 6e  if( i<y ) return
1c950 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 3e 79   -1;.    if( i>y
1c960 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 79 3d   ){.      if( y=
1c970 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20  =SMALLEST_INT64 
1c980 26 26 20 72 3e 30 2e 30 20 29 20 72 65 74 75 72  && r>0.0 ) retur
1c990 6e 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75  n -1;.      retu
1c9a0 72 6e 20 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20  rn +1;.    }.   
1c9b0 20 73 20 3d 20 28 64 6f 75 62 6c 65 29 69 3b 0a   s = (double)i;.
1c9c0 20 20 20 20 69 66 28 20 73 3c 72 20 29 20 72 65      if( s<r ) re
1c9d0 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28  turn -1;.    if(
1c9e0 20 73 3e 72 20 29 20 72 65 74 75 72 6e 20 2b 31   s>r ) return +1
1c9f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1ca00 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d    }.}../*.** Com
1ca10 70 61 72 65 20 74 68 65 20 76 61 6c 75 65 73 20  pare the values 
1ca20 63 6f 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65  contained by the
1ca30 20 74 77 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   two memory cell
1ca40 73 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20  s, returning.** 
1ca50 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 20 6f  negative, zero o
1ca60 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 4d  r positive if pM
1ca70 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e  em1 is less than
1ca80 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67  , equal to, or g
1ca90 72 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20 70  reater.** than p
1caa0 4d 65 6d 32 2e 20 53 6f 72 74 69 6e 67 20 6f 72  Mem2. Sorting or
1cab0 64 65 72 20 69 73 20 4e 55 4c 4c 27 73 20 66 69  der is NULL's fi
1cac0 72 73 74 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79  rst, followed by
1cad0 20 6e 75 6d 62 65 72 73 20 28 69 6e 74 65 67 65   numbers (intege
1cae0 72 73 0a 2a 2a 20 61 6e 64 20 72 65 61 6c 73 29  rs.** and reals)
1caf0 20 73 6f 72 74 65 64 20 6e 75 6d 65 72 69 63 61   sorted numerica
1cb00 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79  lly, followed by
1cb10 20 74 65 78 74 20 6f 72 64 65 72 65 64 20 62 79   text ordered by
1cb20 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a   the collating.*
1cb30 2a 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  * sequence pColl
1cb40 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 62 6c 6f   and finally blo
1cb50 62 27 73 20 6f 72 64 65 72 65 64 20 62 79 20 6d  b's ordered by m
1cb60 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  emcmp()..**.** T
1cb70 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61  wo NULL values a
1cb80 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71  re considered eq
1cb90 75 61 6c 20 62 79 20 74 68 69 73 20 66 75 6e 63  ual by this func
1cba0 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
1cbb0 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 63  ite3MemCompare(c
1cbc0 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c  onst Mem *pMem1,
1cbd0 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d   const Mem *pMem
1cbe0 32 2c 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71  2, const CollSeq
1cbf0 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 6e 74 20   *pColl){.  int 
1cc00 66 31 2c 20 66 32 3b 0a 20 20 69 6e 74 20 63 6f  f1, f2;.  int co
1cc10 6d 62 69 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a 20  mbined_flags;.. 
1cc20 20 66 31 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61   f1 = pMem1->fla
1cc30 67 73 3b 0a 20 20 66 32 20 3d 20 70 4d 65 6d 32  gs;.  f2 = pMem2
1cc40 2d 3e 66 6c 61 67 73 3b 0a 20 20 63 6f 6d 62 69  ->flags;.  combi
1cc50 6e 65 64 5f 66 6c 61 67 73 20 3d 20 66 31 7c 66  ned_flags = f1|f
1cc60 32 3b 0a 20 20 61 73 73 65 72 74 28 20 28 63 6f  2;.  assert( (co
1cc70 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 26 20 4d  mbined_flags & M
1cc80 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b  EM_RowSet)==0 );
1cc90 0a 20 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76  . .  /* If one v
1cca0 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20 69 74  alue is NULL, it
1ccb0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68   is less than th
1ccc0 65 20 6f 74 68 65 72 2e 20 49 66 20 62 6f 74 68  e other. If both
1ccd0 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20 61 72 65   values.  ** are
1cce0 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 30 2e   NULL, return 0.
1ccf0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62  .  */.  if( comb
1cd00 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e  ined_flags&MEM_N
1cd10 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ull ){.    retur
1cd20 6e 20 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20  n (f2&MEM_Null) 
1cd30 2d 20 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b  - (f1&MEM_Null);
1cd40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 6c 65  .  }..  /* At le
1cd50 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 74  ast one of the t
1cd60 77 6f 20 76 61 6c 75 65 73 20 69 73 20 61 20 6e  wo values is a n
1cd70 75 6d 62 65 72 0a 20 20 2a 2f 0a 20 20 69 66 28  umber.  */.  if(
1cd80 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26   combined_flags&
1cd90 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61  (MEM_Int|MEM_Rea
1cda0 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66  l) ){.    if( (f
1cdb0 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74  1 & f2 & MEM_Int
1cdc0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
1cdd0 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20 70  ( pMem1->u.i < p
1cde0 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75  Mem2->u.i ) retu
1cdf0 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28  rn -1;.      if(
1ce00 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d   pMem1->u.i > pM
1ce10 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72  em2->u.i ) retur
1ce20 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74 75  n +1;.      retu
1ce30 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
1ce40 69 66 28 20 28 66 31 20 26 20 66 32 20 26 20 4d  if( (f1 & f2 & M
1ce50 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20  EM_Real)!=0 ){. 
1ce60 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e       if( pMem1->
1ce70 75 2e 72 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 72  u.r < pMem2->u.r
1ce80 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
1ce90 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75      if( pMem1->u
1cea0 2e 72 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 72 20  .r > pMem2->u.r 
1ceb0 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20  ) return +1;.   
1cec0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1ced0 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31 26 4d   }.    if( (f1&M
1cee0 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20  EM_Int)!=0 ){.  
1cef0 20 20 20 20 69 66 28 20 28 66 32 26 4d 45 4d 5f      if( (f2&MEM_
1cf00 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  Real)!=0 ){.    
1cf10 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
1cf20 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72  e3IntFloatCompar
1cf30 65 28 70 4d 65 6d 31 2d 3e 75 2e 69 2c 20 70 4d  e(pMem1->u.i, pM
1cf40 65 6d 32 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20  em2->u.r);.     
1cf50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1cf60 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
1cf70 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1cf80 20 28 66 31 26 4d 45 4d 5f 52 65 61 6c 29 21 3d   (f1&MEM_Real)!=
1cf90 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  0 ){.      if( (
1cfa0 66 32 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29  f2&MEM_Int)!=0 )
1cfb0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1cfc0 20 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61   -sqlite3IntFloa
1cfd0 74 43 6f 6d 70 61 72 65 28 70 4d 65 6d 32 2d 3e  tCompare(pMem2->
1cfe0 75 2e 69 2c 20 70 4d 65 6d 31 2d 3e 75 2e 72 29  u.i, pMem1->u.r)
1cff0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1d000 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31         return -1
1d010 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d020 20 20 20 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20      return +1;. 
1d030 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20   }..  /* If one 
1d040 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e  value is a strin
1d050 67 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20  g and the other 
1d060 69 73 20 61 20 62 6c 6f 62 2c 20 74 68 65 20 73  is a blob, the s
1d070 74 72 69 6e 67 20 69 73 20 6c 65 73 73 2e 0a 20  tring is less.. 
1d080 20 2a 2a 20 49 66 20 62 6f 74 68 20 61 72 65 20   ** If both are 
1d090 73 74 72 69 6e 67 73 2c 20 63 6f 6d 70 61 72 65  strings, compare
1d0a0 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61   using the colla
1d0b0 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  ting functions..
1d0c0 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69    */.  if( combi
1d0d0 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 53 74  ned_flags&MEM_St
1d0e0 72 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66 31  r ){.    if( (f1
1d0f0 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29   & MEM_Str)==0 )
1d100 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
1d110 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1d120 28 66 32 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d  (f2 & MEM_Str)==
1d130 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
1d140 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n -1;.    }..   
1d150 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e   assert( pMem1->
1d160 65 6e 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20  enc==pMem2->enc 
1d170 7c 7c 20 70 4d 65 6d 31 2d 3e 64 62 2d 3e 6d 61  || pMem1->db->ma
1d180 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1d190 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d    assert( pMem1-
1d1a0 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  >enc==SQLITE_UTF
1d1b0 38 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  8 || .          
1d1c0 20 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51    pMem1->enc==SQ
1d1d0 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c 20  LITE_UTF16LE || 
1d1e0 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49  pMem1->enc==SQLI
1d1f0 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a 20  TE_UTF16BE );.. 
1d200 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74     /* The collat
1d210 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6d 75 73  ion sequence mus
1d220 74 20 62 65 20 64 65 66 69 6e 65 64 20 61 74 20  t be defined at 
1d230 74 68 69 73 20 70 6f 69 6e 74 2c 20 65 76 65 6e  this point, even
1d240 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 75   if.    ** the u
1d250 73 65 72 20 64 65 6c 65 74 65 73 20 74 68 65 20  ser deletes the 
1d260 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1d270 63 65 20 61 66 74 65 72 20 74 68 65 20 76 64 62  ce after the vdb
1d280 65 20 70 72 6f 67 72 61 6d 20 69 73 0a 20 20 20  e program is.   
1d290 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74 68   ** compiled (th
1d2a0 69 73 20 77 61 73 20 6e 6f 74 20 61 6c 77 61 79  is was not alway
1d2b0 73 20 74 68 65 20 63 61 73 65 29 2e 0a 20 20 20  s the case)..   
1d2c0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1d2d0 21 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d  !pColl || pColl-
1d2e0 3e 78 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69 66  >xCmp );..    if
1d2f0 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
1d300 20 72 65 74 75 72 6e 20 76 64 62 65 43 6f 6d 70   return vdbeComp
1d310 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 70 4d 65  areMemString(pMe
1d320 6d 31 2c 20 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c  m1, pMem2, pColl
1d330 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
1d340 2f 2a 20 49 66 20 61 20 4e 55 4c 4c 20 70 6f 69  /* If a NULL poi
1d350 6e 74 65 72 20 77 61 73 20 70 61 73 73 65 64 20  nter was passed 
1d360 61 73 20 74 68 65 20 63 6f 6c 6c 61 74 65 20 66  as the collate f
1d370 75 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c 20 74 68  unction, fall th
1d380 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74 6f 20  rough.    ** to 
1d390 74 68 65 20 62 6c 6f 62 20 63 61 73 65 20 61 6e  the blob case an
1d3a0 64 20 75 73 65 20 6d 65 6d 63 6d 70 28 29 2e 20  d use memcmp(). 
1d3b0 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 42   */.  }. .  /* B
1d3c0 6f 74 68 20 76 61 6c 75 65 73 20 6d 75 73 74 20  oth values must 
1d3d0 62 65 20 62 6c 6f 62 73 2e 20 20 43 6f 6d 70 61  be blobs.  Compa
1d3e0 72 65 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28  re using memcmp(
1d3f0 29 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ).  */.  return 
1d400 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61  sqlite3BlobCompa
1d410 72 65 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 29  re(pMem1, pMem2)
1d420 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ;.}.../*.** The 
1d430 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70  first argument p
1d440 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
1d450 6e 63 74 69 6f 6e 20 69 73 20 61 20 73 65 72 69  nction is a seri
1d460 61 6c 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a 20  al-type that.** 
1d470 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61  corresponds to a
1d480 6e 20 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c 20  n integer - all 
1d490 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20 31  values between 1
1d4a0 20 61 6e 64 20 39 20 69 6e 63 6c 75 73 69 76 65   and 9 inclusive
1d4b0 20 0a 2a 2a 20 65 78 63 65 70 74 20 37 2e 20 54   .** except 7. T
1d4c0 68 65 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74 73  he second points
1d4d0 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
1d4e0 74 61 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67  taining an integ
1d4f0 65 72 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72 69  er value.** seri
1d500 61 6c 69 7a 65 64 20 61 63 63 6f 72 64 69 6e 67  alized according
1d510 20 74 6f 20 73 65 72 69 61 6c 5f 74 79 70 65 2e   to serial_type.
1d520 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
1d530 65 73 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20 61  eserializes.** a
1d540 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 76  nd returns the v
1d550 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
1d560 69 36 34 20 76 64 62 65 52 65 63 6f 72 64 44 65  i64 vdbeRecordDe
1d570 63 6f 64 65 49 6e 74 28 75 33 32 20 73 65 72 69  codeInt(u32 seri
1d580 61 6c 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 75  al_type, const u
1d590 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20  8 *aKey){.  u32 
1d5a0 79 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  y;.  assert( COR
1d5b0 52 55 50 54 5f 44 42 20 7c 7c 20 28 73 65 72 69  RUPT_DB || (seri
1d5c0 61 6c 5f 74 79 70 65 3e 3d 31 20 26 26 20 73 65  al_type>=1 && se
1d5d0 72 69 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26 20  rial_type<=9 && 
1d5e0 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 37 29 20  serial_type!=7) 
1d5f0 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72  );.  switch( ser
1d600 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20  ial_type ){.    
1d610 63 61 73 65 20 30 3a 0a 20 20 20 20 63 61 73 65  case 0:.    case
1d620 20 31 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61   1:.      testca
1d630 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
1d640 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1d650 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b   ONE_BYTE_INT(aK
1d660 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 32 3a  ey);.    case 2:
1d670 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d680 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
1d690 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 57  .      return TW
1d6a0 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  O_BYTE_INT(aKey)
1d6b0 3b 0a 20 20 20 20 63 61 73 65 20 33 3a 0a 20 20  ;.    case 3:.  
1d6c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
1d6d0 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
1d6e0 20 20 20 20 72 65 74 75 72 6e 20 54 48 52 45 45      return THREE
1d6f0 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
1d700 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 0a 20  .    case 4: {. 
1d710 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1d720 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1d730 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59       y = FOUR_BY
1d740 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
1d750 20 20 20 20 20 72 65 74 75 72 6e 20 28 69 36 34       return (i64
1d760 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20  )*(int*)&y;.    
1d770 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 0a  }.    case 5: {.
1d780 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1d790 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1d7a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 46 4f 55        return FOU
1d7b0 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
1d7c0 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c  +2) + (((i64)1)<
1d7d0 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e  <32)*TWO_BYTE_IN
1d7e0 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20  T(aKey);.    }. 
1d7f0 20 20 20 63 61 73 65 20 36 3a 20 7b 0a 20 20 20     case 6: {.   
1d800 20 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f     u64 x = FOUR_
1d810 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b  BYTE_UINT(aKey);
1d820 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d830 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
1d840 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33  .      x = (x<<3
1d850 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55  2) | FOUR_BYTE_U
1d860 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20  INT(aKey+4);.   
1d870 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a     return (i64)*
1d880 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d 0a  (i64*)&x;.    }.
1d890 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 73    }..  return (s
1d8a0 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 38 29 3b  erial_type - 8);
1d8b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1d8c0 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73  unction compares
1d8d0 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72   the two table r
1d8e0 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63  ows or index rec
1d8f0 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65  ords.** specifie
1d900 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65  d by {nKey1, pKe
1d910 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20  y1} and pPKey2. 
1d920 20 49 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65   It returns a ne
1d930 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20  gative, zero.** 
1d940 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65  or positive inte
1d950 67 65 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c  ger if key1 is l
1d960 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
1d970 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65  to or .** greate
1d980 72 20 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68  r than key2.  Th
1d990 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d  e {nKey1, pKey1}
1d9a0 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 62   key must be a b
1d9b0 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62  lob.** created b
1d9c0 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  y the OP_MakeRec
1d9d0 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68  ord opcode of th
1d9e0 65 20 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b  e VDBE.  The pPK
1d9f0 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20  ey2.** key must 
1da00 62 65 20 61 20 70 61 72 73 65 64 20 6b 65 79 20  be a parsed key 
1da10 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64  such as obtained
1da20 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
1da30 56 64 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e  VdbeParseRecord.
1da40 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  .**.** If argume
1da50 6e 74 20 62 53 6b 69 70 20 69 73 20 6e 6f 6e 2d  nt bSkip is non-
1da60 7a 65 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75  zero, it is assu
1da70 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c  med that the cal
1da80 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 0a  ler has already.
1da90 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  ** determined th
1daa0 61 74 20 74 68 65 20 66 69 72 73 74 20 66 69 65  at the first fie
1dab0 6c 64 73 20 6f 66 20 74 68 65 20 6b 65 79 73 20  lds of the keys 
1dac0 61 72 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a  are equal..**.**
1dad0 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64   Key1 and Key2 d
1dae0 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f  o not have to co
1daf0 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e  ntain the same n
1db00 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e  umber of fields.
1db10 20 49 66 20 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c   If all .** fiel
1db20 64 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69  ds that appear i
1db30 6e 20 62 6f 74 68 20 6b 65 79 73 20 61 72 65 20  n both keys are 
1db40 65 71 75 61 6c 2c 20 74 68 65 6e 20 70 50 4b 65  equal, then pPKe
1db50 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69  y2->default_rc i
1db60 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a  s .** returned..
1db70 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 62 61 73  **.** If databas
1db80 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  e corruption is 
1db90 64 69 73 63 6f 76 65 72 65 64 2c 20 73 65 74 20  discovered, set 
1dba0 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20  pPKey2->errCode 
1dbb0 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f  to .** SQLITE_CO
1dbc0 52 52 55 50 54 20 61 6e 64 20 72 65 74 75 72 6e  RRUPT and return
1dbd0 20 30 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72   0. If an OOM er
1dbe0 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
1dbf0 65 64 2c 20 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e  ed, .** pPKey2->
1dc00 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 20 74  errCode is set t
1dc10 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61  o SQLITE_NOMEM a
1dc20 6e 64 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  nd, if it is not
1dc30 20 4e 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61   NULL, the.** ma
1dc40 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61 67  lloc-failed flag
1dc50 20 73 65 74 20 6f 6e 20 64 61 74 61 62 61 73 65   set on database
1dc60 20 68 61 6e 64 6c 65 20 28 70 50 4b 65 79 32 2d   handle (pPKey2-
1dc70 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a  >pKeyInfo->db)..
1dc80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1dc90 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57  beRecordCompareW
1dca0 69 74 68 53 6b 69 70 28 0a 20 20 69 6e 74 20 6e  ithSkip(.  int n
1dcb0 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
1dcc0 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65   *pKey1,   /* Le
1dcd0 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61  ft key */.  Unpa
1dce0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  ckedRecord *pPKe
1dcf0 79 32 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  y2,         /* R
1dd00 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  ight key */.  in
1dd10 74 20 62 53 6b 69 70 20 20 20 20 20 20 20 20 20  t bSkip         
1dd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dd30 20 49 66 20 74 72 75 65 2c 20 73 6b 69 70 20 74   If true, skip t
1dd40 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 2a  he first field *
1dd50 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20  /.){.  u32 d1;  
1dd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd70 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1dd80 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
1dd90 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e  next data elemen
1dda0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  t */.  int i;   
1ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddc0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1ddd0 6f 66 20 6e 65 78 74 20 66 69 65 6c 64 20 74 6f  of next field to
1dde0 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75 33   compare */.  u3
1ddf0 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20  2 szHdr1;       
1de00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1de10 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20   Size of record 
1de20 68 65 61 64 65 72 20 69 6e 20 62 79 74 65 73 20  header in bytes 
1de30 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20  */.  u32 idx1;  
1de40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de50 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
1de60 66 20 66 69 72 73 74 20 74 79 70 65 20 69 6e 20  f first type in 
1de70 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
1de80 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rc = 0;         
1de90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1dea0 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20  eturn value */. 
1deb0 20 4d 65 6d 20 2a 70 52 68 73 20 3d 20 70 50 4b   Mem *pRhs = pPK
1dec0 65 79 32 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20  ey2->aMem;      
1ded0 20 2f 2a 20 4e 65 78 74 20 66 69 65 6c 64 20 6f   /* Next field o
1dee0 66 20 70 50 4b 65 79 32 20 74 6f 20 63 6f 6d 70  f pPKey2 to comp
1def0 61 72 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  are */.  KeyInfo
1df00 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b   *pKeyInfo = pPK
1df10 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ey2->pKeyInfo;. 
1df20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1df30 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63  char *aKey1 = (c
1df40 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1df50 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4d 65  ar *)pKey1;.  Me
1df60 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66  m mem1;..  /* If
1df70 20 62 53 6b 69 70 20 69 73 20 74 72 75 65 2c 20   bSkip is true, 
1df80 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20  then the caller 
1df90 68 61 73 20 61 6c 72 65 61 64 79 20 64 65 74 65  has already dete
1dfa0 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65 20  rmined that the 
1dfb0 66 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20 65  first.  ** two e
1dfc0 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6b  lements in the k
1dfd0 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20 46  eys are equal. F
1dfe0 69 78 20 74 68 65 20 76 61 72 69 6f 75 73 20 73  ix the various s
1dff0 74 61 63 6b 20 76 61 72 69 61 62 6c 65 73 20 73  tack variables s
1e000 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73  o.  ** that this
1e010 20 72 6f 75 74 69 6e 65 20 62 65 67 69 6e 73 20   routine begins 
1e020 63 6f 6d 70 61 72 69 6e 67 20 61 74 20 74 68 65  comparing at the
1e030 20 73 65 63 6f 6e 64 20 66 69 65 6c 64 2e 20 2a   second field. *
1e040 2f 0a 20 20 69 66 28 20 62 53 6b 69 70 20 29 7b  /.  if( bSkip ){
1e050 0a 20 20 20 20 75 33 32 20 73 31 3b 0a 20 20 20  .    u32 s1;.   
1e060 20 69 64 78 31 20 3d 20 31 20 2b 20 67 65 74 56   idx1 = 1 + getV
1e070 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31  arint32(&aKey1[1
1e080 5d 2c 20 73 31 29 3b 0a 20 20 20 20 73 7a 48 64  ], s1);.    szHd
1e090 72 31 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 20  r1 = aKey1[0];. 
1e0a0 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31 20 2b     d1 = szHdr1 +
1e0b0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1e0c0 61 6c 54 79 70 65 4c 65 6e 28 73 31 29 3b 0a 20  alTypeLen(s1);. 
1e0d0 20 20 20 69 20 3d 20 31 3b 0a 20 20 20 20 70 52     i = 1;.    pR
1e0e0 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  hs++;.  }else{. 
1e0f0 20 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72     idx1 = getVar
1e100 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48  int32(aKey1, szH
1e110 64 72 31 29 3b 0a 20 20 20 20 64 31 20 3d 20 73  dr1);.    d1 = s
1e120 7a 48 64 72 31 3b 0a 20 20 20 20 69 66 28 20 64  zHdr1;.    if( d
1e130 31 3e 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  1>(unsigned)nKey
1e140 31 20 29 7b 20 0a 20 20 20 20 20 20 70 50 4b 65  1 ){ .      pPKe
1e150 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75  y2->errCode = (u
1e160 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  8)SQLITE_CORRUPT
1e170 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74  _BKPT;.      ret
1e180 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 75  urn 0;  /* Corru
1e190 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20  ption */.    }. 
1e1a0 20 20 20 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20     i = 0;.  }.. 
1e1b0 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e   VVA_ONLY( mem1.
1e1c0 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20  szMalloc = 0; ) 
1e1d0 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62  /* Only needed b
1e1e0 79 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  y assert() state
1e1f0 6d 65 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65 72  ments */.  asser
1e200 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  t( pPKey2->pKeyI
1e210 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 50 4b 65  nfo->nField+pPKe
1e220 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58  y2->pKeyInfo->nX
1e230 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e  Field>=pPKey2->n
1e240 46 69 65 6c 64 20 0a 20 20 20 20 20 20 20 7c 7c  Field .       ||
1e250 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
1e260 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d   assert( pPKey2-
1e270 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74  >pKeyInfo->aSort
1e280 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Order!=0 );.  as
1e290 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b  sert( pPKey2->pK
1e2a0 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30  eyInfo->nField>0
1e2b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   );.  assert( id
1e2c0 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f  x1<=szHdr1 || CO
1e2d0 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f  RRUPT_DB );.  do
1e2e0 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
1e2f0 5f 74 79 70 65 3b 0a 0a 20 20 20 20 2f 2a 20 52  _type;..    /* R
1e300 48 53 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  HS is an integer
1e310 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 68 73   */.    if( pRhs
1e320 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
1e330 74 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61  t ){.      seria
1e340 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69  l_type = aKey1[i
1e350 64 78 31 5d 3b 0a 20 20 20 20 20 20 74 65 73 74  dx1];.      test
1e360 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70  case( serial_typ
1e370 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69  e==12 );.      i
1e380 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
1e390 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  10 ){.        rc
1e3a0 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = +1;.      }el
1e3b0 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  se if( serial_ty
1e3c0 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  pe==0 ){.       
1e3d0 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1e3e0 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c  }else if( serial
1e3f0 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20  _type==7 ){.    
1e400 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
1e410 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b  erialGet(&aKey1[
1e420 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  d1], serial_type
1e430 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20  , &mem1);.      
1e440 20 20 72 63 20 3d 20 2d 73 71 6c 69 74 65 33 49    rc = -sqlite3I
1e450 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70  ntFloatCompare(p
1e460 52 68 73 2d 3e 75 2e 69 2c 20 6d 65 6d 31 2e 75  Rhs->u.i, mem1.u
1e470 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .r);.      }else
1e480 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6c 68  {.        i64 lh
1e490 73 20 3d 20 76 64 62 65 52 65 63 6f 72 64 44 65  s = vdbeRecordDe
1e4a0 63 6f 64 65 49 6e 74 28 73 65 72 69 61 6c 5f 74  codeInt(serial_t
1e4b0 79 70 65 2c 20 26 61 4b 65 79 31 5b 64 31 5d 29  ype, &aKey1[d1])
1e4c0 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 72 68  ;.        i64 rh
1e4d0 73 20 3d 20 70 52 68 73 2d 3e 75 2e 69 3b 0a 20  s = pRhs->u.i;. 
1e4e0 20 20 20 20 20 20 20 69 66 28 20 6c 68 73 3c 72         if( lhs<r
1e4f0 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  hs ){.          
1e500 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  rc = -1;.       
1e510 20 7d 65 6c 73 65 20 69 66 28 20 6c 68 73 3e 72   }else if( lhs>r
1e520 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  hs ){.          
1e530 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20  rc = +1;.       
1e540 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1e550 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20  ..    /* RHS is 
1e560 72 65 61 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65  real */.    else
1e570 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73   if( pRhs->flags
1e580 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20   & MEM_Real ){. 
1e590 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65       serial_type
1e5a0 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a   = aKey1[idx1];.
1e5b0 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
1e5c0 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20  _type>=10 ){.   
1e5d0 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74       /* Serial t
1e5e0 79 70 65 73 20 31 32 20 6f 72 20 67 72 65 61 74  ypes 12 or great
1e5f0 65 72 20 61 72 65 20 73 74 72 69 6e 67 73 20 61  er are strings a
1e600 6e 64 20 62 6c 6f 62 73 20 28 67 72 65 61 74 65  nd blobs (greate
1e610 72 20 74 68 61 6e 0a 20 20 20 20 20 20 20 20 2a  r than.        *
1e620 2a 20 6e 75 6d 62 65 72 73 29 2e 20 54 79 70 65  * numbers). Type
1e630 73 20 31 30 20 61 6e 64 20 31 31 20 61 72 65 20  s 10 and 11 are 
1e640 63 75 72 72 65 6e 74 6c 79 20 22 72 65 73 65 72  currently "reser
1e650 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 0a  ved for future .
1e660 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 22 2c          ** use",
1e670 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 72   so it doesn't r
1e680 65 61 6c 6c 79 20 6d 61 74 74 65 72 20 77 68 61  eally matter wha
1e690 74 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  t the results of
1e6a0 20 63 6f 6d 70 61 72 69 6e 67 0a 20 20 20 20 20   comparing.     
1e6b0 20 20 20 2a 2a 20 74 68 65 6d 20 74 6f 20 6e 75     ** them to nu
1e6c0 6d 62 65 72 69 63 20 76 61 6c 75 65 73 20 61 72  mberic values ar
1e6d0 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  e.  */.        r
1e6e0 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65  c = +1;.      }e
1e6f0 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74  lse if( serial_t
1e700 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ype==0 ){.      
1e710 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1e720 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e730 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1e740 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c  lGet(&aKey1[d1],
1e750 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d   serial_type, &m
1e760 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  em1);.        if
1e770 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37  ( serial_type==7
1e780 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
1e790 28 20 6d 65 6d 31 2e 75 2e 72 3c 70 52 68 73 2d  ( mem1.u.r<pRhs-
1e7a0 3e 75 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20  >u.r ){.        
1e7b0 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1e7c0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1e7d0 20 6d 65 6d 31 2e 75 2e 72 3e 70 52 68 73 2d 3e   mem1.u.r>pRhs->
1e7e0 75 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  u.r ){.         
1e7f0 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20     rc = +1;.    
1e800 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e810 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1e820 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 74   rc = sqlite3Int
1e830 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 6d 65 6d  FloatCompare(mem
1e840 31 2e 75 2e 69 2c 20 70 52 68 73 2d 3e 75 2e 72  1.u.i, pRhs->u.r
1e850 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1e860 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1e870 2f 2a 20 52 48 53 20 69 73 20 61 20 73 74 72 69  /* RHS is a stri
1e880 6e 67 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69  ng */.    else i
1e890 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
1e8a0 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20   MEM_Str ){.    
1e8b0 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61    getVarint32(&a
1e8c0 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69  Key1[idx1], seri
1e8d0 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20  al_type);.      
1e8e0 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c  testcase( serial
1e8f0 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20  _type==12 );.   
1e900 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
1e910 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 20 20 20  pe<12 ){.       
1e920 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1e930 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65 72 69  }else if( !(seri
1e940 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20  al_type & 0x01) 
1e950 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1e960 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  +1;.      }else{
1e970 0a 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 6e 20  .        mem1.n 
1e980 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d  = (serial_type -
1e990 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20   12) / 2;.      
1e9a0 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b    testcase( (d1+
1e9b0 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e  mem1.n)==(unsign
1e9c0 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20  ed)nKey1 );.    
1e9d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64      testcase( (d
1e9e0 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e  1+mem1.n+1)==(un
1e9f0 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
1ea00 20 20 20 20 20 20 20 20 69 66 28 20 28 64 31 2b          if( (d1+
1ea10 6d 65 6d 31 2e 6e 29 20 3e 20 28 75 6e 73 69 67  mem1.n) > (unsig
1ea20 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20  ned)nKey1 ){.   
1ea30 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65         pPKey2->e
1ea40 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c  rrCode = (u8)SQL
1ea50 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1ea60 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
1ea70 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1ea80 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69       /* Corrupti
1ea90 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65  on */.        }e
1eaa0 6c 73 65 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  lse if( pKeyInfo
1eab0 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20  ->aColl[i] ){.  
1eac0 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 65 6e 63          mem1.enc
1ead0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
1eae0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  ;.          mem1
1eaf0 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  .db = pKeyInfo->
1eb00 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  db;.          me
1eb10 6d 31 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m1.flags = MEM_S
1eb20 74 72 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  tr;.          me
1eb30 6d 31 2e 7a 20 3d 20 28 63 68 61 72 2a 29 26 61  m1.z = (char*)&a
1eb40 4b 65 79 31 5b 64 31 5d 3b 0a 20 20 20 20 20 20  Key1[d1];.      
1eb50 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d      rc = vdbeCom
1eb60 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20  pareMemString(. 
1eb70 20 20 20 20 20 20 20 20 20 20 20 20 20 26 6d 65               &me
1eb80 6d 31 2c 20 70 52 68 73 2c 20 70 4b 65 79 49 6e  m1, pRhs, pKeyIn
1eb90 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70  fo->aColl[i], &p
1eba0 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 0a 20  PKey2->errCode. 
1ebb0 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
1ebc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ebd0 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20       int nCmp = 
1ebe0 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20 70 52 68 73  MIN(mem1.n, pRhs
1ebf0 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ->n);.          
1ec00 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65  rc = memcmp(&aKe
1ec10 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c  y1[d1], pRhs->z,
1ec20 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20   nCmp);.        
1ec30 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63    if( rc==0 ) rc
1ec40 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20 70 52 68 73   = mem1.n - pRhs
1ec50 2d 3e 6e 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a  ->n; .        }.
1ec60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1ec70 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20 62     /* RHS is a b
1ec80 6c 6f 62 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  lob */.    else 
1ec90 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20  if( pRhs->flags 
1eca0 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20  & MEM_Blob ){.  
1ecb0 20 20 20 20 67 65 74 56 61 72 69 6e 74 33 32 28      getVarint32(
1ecc0 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65  &aKey1[idx1], se
1ecd0 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
1ece0 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69    testcase( seri
1ecf0 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20  al_type==12 );. 
1ed00 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
1ed10 74 79 70 65 3c 31 32 20 7c 7c 20 28 73 65 72 69  type<12 || (seri
1ed20 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20  al_type & 0x01) 
1ed30 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1ed40 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  -1;.      }else{
1ed50 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 74  .        int nSt
1ed60 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  r = (serial_type
1ed70 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20   - 12) / 2;.    
1ed80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64      testcase( (d
1ed90 31 2b 6e 53 74 72 29 3d 3d 28 75 6e 73 69 67 6e  1+nStr)==(unsign
1eda0 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20  ed)nKey1 );.    
1edb0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64      testcase( (d
1edc0 31 2b 6e 53 74 72 2b 31 29 3d 3d 28 75 6e 73 69  1+nStr+1)==(unsi
1edd0 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20  gned)nKey1 );.  
1ede0 20 20 20 20 20 20 69 66 28 20 28 64 31 2b 6e 53        if( (d1+nS
1edf0 74 72 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29  tr) > (unsigned)
1ee00 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20  nKey1 ){.       
1ee10 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f     pPKey2->errCo
1ee20 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f  de = (u8)SQLITE_
1ee30 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1ee40 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
1ee50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ee60 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a   /* Corruption *
1ee70 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  /.        }else{
1ee80 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
1ee90 43 6d 70 20 3d 20 4d 49 4e 28 6e 53 74 72 2c 20  Cmp = MIN(nStr, 
1eea0 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20  pRhs->n);.      
1eeb0 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28      rc = memcmp(
1eec0 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73  &aKey1[d1], pRhs
1eed0 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20  ->z, nCmp);.    
1eee0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20        if( rc==0 
1eef0 29 20 72 63 20 3d 20 6e 53 74 72 20 2d 20 70 52  ) rc = nStr - pR
1ef00 68 73 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 7d  hs->n;.        }
1ef10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1ef20 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 6e 75      /* RHS is nu
1ef30 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 7b 0a  ll */.    else{.
1ef40 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70        serial_typ
1ef50 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b  e = aKey1[idx1];
1ef60 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73 65 72  .      rc = (ser
1ef70 69 61 6c 5f 74 79 70 65 21 3d 30 29 3b 0a 20 20  ial_type!=0);.  
1ef80 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 21    }..    if( rc!
1ef90 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1efa0 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
1efb0 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20  rder[i] ){.     
1efc0 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20     rc = -rc;.   
1efd0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
1efe0 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  t( vdbeRecordCom
1eff0 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
1f000 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
1f010 72 63 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  rc) );.      ass
1f020 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  ert( mem1.szMall
1f030 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65  oc==0 );  /* See
1f040 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a   comment below *
1f050 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  /.      return r
1f060 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 2b  c;.    }..    i+
1f070 2b 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20  +;.    pRhs++;. 
1f080 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33     d1 += sqlite3
1f090 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
1f0a0 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  n(serial_type);.
1f0b0 20 20 20 20 69 64 78 31 20 2b 3d 20 73 71 6c 69      idx1 += sqli
1f0c0 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 73 65 72  te3VarintLen(ser
1f0d0 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 7d 77 68  ial_type);.  }wh
1f0e0 69 6c 65 28 20 69 64 78 31 3c 28 75 6e 73 69 67  ile( idx1<(unsig
1f0f0 6e 65 64 29 73 7a 48 64 72 31 20 26 26 20 69 3c  ned)szHdr1 && i<
1f100 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 26  pPKey2->nField &
1f110 26 20 64 31 3c 3d 28 75 6e 73 69 67 6e 65 64 29  & d1<=(unsigned)
1f120 6e 4b 65 79 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e  nKey1 );..  /* N
1f130 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  o memory allocat
1f140 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64  ion is ever used
1f150 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65   on mem1.  Prove
1f160 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a   this using.  **
1f170 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
1f180 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65  ssert().  If the
1f190 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c   assert() fails,
1f1a0 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a   it indicates a.
1f1b0 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b    ** memory leak
1f1c0 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63   and a need to c
1f1d0 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d  all sqlite3VdbeM
1f1e0 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29  emRelease(&mem1)
1f1f0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1f200 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30  mem1.szMalloc==0
1f210 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20   );..  /* rc==0 
1f220 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20  here means that 
1f230 6f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74  one or both of t
1f240 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20  he keys ran out 
1f250 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20  of fields and.  
1f260 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64  ** all the field
1f270 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69  s up to that poi
1f280 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52  nt were equal. R
1f290 65 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c  eturn the defaul
1f2a0 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  t_rc.  ** value.
1f2b0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 43    */.  assert( C
1f2c0 4f 52 52 55 50 54 5f 44 42 20 0a 20 20 20 20 20  ORRUPT_DB .     
1f2d0 20 20 7c 7c 20 76 64 62 65 52 65 63 6f 72 64 43    || vdbeRecordC
1f2e0 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79  ompareDebug(nKey
1f2f0 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1f300 2c 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  , pPKey2->defaul
1f310 74 5f 72 63 29 20 0a 20 20 20 20 20 20 20 7c 7c  t_rc) .       ||
1f320 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d   pKeyInfo->db->m
1f330 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b  allocFailed.  );
1f340 0a 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65  .  pPKey2->eqSee
1f350 6e 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  n = 1;.  return 
1f360 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
1f370 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  rc;.}.int sqlite
1f380 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1f390 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  re(.  int nKey1,
1f3a0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
1f3b0 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65  y1,   /* Left ke
1f3c0 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
1f3d0 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20  ecord *pPKey2   
1f3e0 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
1f3f0 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75  key */.){.  retu
1f400 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  rn sqlite3VdbeRe
1f410 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53  cordCompareWithS
1f420 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  kip(nKey1, pKey1
1f430 2c 20 70 50 4b 65 79 32 2c 20 30 29 3b 0a 7d 0a  , pPKey2, 0);.}.
1f440 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1f450 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69  ction is an opti
1f460 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  mized version of
1f470 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1f480 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20  rdCompare() .** 
1f490 74 68 61 74 20 28 61 29 20 74 68 65 20 66 69 72  that (a) the fir
1f4a0 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65  st field of pPKe
1f4b0 79 32 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  y2 is an integer
1f4c0 2c 20 61 6e 64 20 28 62 29 20 74 68 65 20 0a 2a  , and (b) the .*
1f4d0 2a 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72  * size-of-header
1f4e0 20 76 61 72 69 6e 74 20 61 74 20 74 68 65 20 73   varint at the s
1f4f0 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e  tart of (pKey1/n
1f500 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20 61 20  Key1) fits in a 
1f510 73 69 6e 67 6c 65 0a 2a 2a 20 62 79 74 65 20 28  single.** byte (
1f520 69 2e 65 2e 20 69 73 20 6c 65 73 73 20 74 68 61  i.e. is less tha
1f530 6e 20 31 32 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f  n 128)..**.** To
1f540 20 61 76 6f 69 64 20 63 6f 6e 63 65 72 6e 73 20   avoid concerns 
1f550 61 62 6f 75 74 20 62 75 66 66 65 72 20 6f 76 65  about buffer ove
1f560 72 72 65 61 64 73 2c 20 74 68 69 73 20 72 6f 75  rreads, this rou
1f570 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  tine is only use
1f580 64 0a 2a 2a 20 6f 6e 20 73 63 68 65 6d 61 73 20  d.** on schemas 
1f590 77 68 65 72 65 20 74 68 65 20 6d 61 78 69 6d 75  where the maximu
1f5a0 6d 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 73  m valid header s
1f5b0 69 7a 65 20 69 73 20 36 33 20 62 79 74 65 73 20  ize is 63 bytes 
1f5c0 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74  or less..*/.stat
1f5d0 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72  ic int vdbeRecor
1f5e0 64 43 6f 6d 70 61 72 65 49 6e 74 28 0a 20 20 69  dCompareInt(.  i
1f5f0 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
1f600 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20  void *pKey1, /* 
1f610 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e  Left key */.  Un
1f620 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
1f630 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52  Key2        /* R
1f640 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20  ight key */.){. 
1f650 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 20   const u8 *aKey 
1f660 3d 20 26 28 28 63 6f 6e 73 74 20 75 38 2a 29 70  = &((const u8*)p
1f670 4b 65 79 31 29 5b 2a 28 63 6f 6e 73 74 20 75 38  Key1)[*(const u8
1f680 2a 29 70 4b 65 79 31 20 26 20 30 78 33 46 5d 3b  *)pKey1 & 0x3F];
1f690 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79  .  int serial_ty
1f6a0 70 65 20 3d 20 28 28 63 6f 6e 73 74 20 75 38 2a  pe = ((const u8*
1f6b0 29 70 4b 65 79 31 29 5b 31 5d 3b 0a 20 20 69 6e  )pKey1)[1];.  in
1f6c0 74 20 72 65 73 3b 0a 20 20 75 33 32 20 79 3b 0a  t res;.  u32 y;.
1f6d0 20 20 75 36 34 20 78 3b 0a 20 20 69 36 34 20 76    u64 x;.  i64 v
1f6e0 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b   = pPKey2->aMem[
1f6f0 30 5d 2e 75 2e 69 3b 0a 20 20 69 36 34 20 6c 68  0].u.i;.  i64 lh
1f700 73 3b 0a 0a 20 20 76 64 62 65 41 73 73 65 72 74  s;..  vdbeAssert
1f710 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e  FieldCountWithin
1f720 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b  Limits(nKey1, pK
1f730 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ey1, pPKey2->pKe
1f740 79 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  yInfo);.  assert
1f750 28 20 28 2a 28 75 38 2a 29 70 4b 65 79 31 29 3c  ( (*(u8*)pKey1)<
1f760 3d 30 78 33 46 20 7c 7c 20 43 4f 52 52 55 50 54  =0x3F || CORRUPT
1f770 5f 44 42 20 29 3b 0a 20 20 73 77 69 74 63 68 28  _DB );.  switch(
1f780 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a   serial_type ){.
1f790 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a      case 1: { /*
1f7a0 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   1-byte signed i
1f7b0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1f7c0 6c 68 73 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49  lhs = ONE_BYTE_I
1f7d0 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1f7e0 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
1f7f0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1f800 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32      }.    case 2
1f810 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69  : { /* 2-byte si
1f820 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1f830 20 20 20 20 20 20 6c 68 73 20 3d 20 54 57 4f 5f        lhs = TWO_
1f840 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1f850 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f860 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
1f870 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1f880 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62  case 3: { /* 3-b
1f890 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1f8a0 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20  er */.      lhs 
1f8b0 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54  = THREE_BYTE_INT
1f8c0 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65  (aKey);.      te
1f8d0 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
1f8e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1f8f0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20    }.    case 4: 
1f900 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e  { /* 4-byte sign
1f910 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1f920 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54      y = FOUR_BYT
1f930 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  E_UINT(aKey);.  
1f940 20 20 20 20 6c 68 73 20 3d 20 28 69 36 34 29 2a      lhs = (i64)*
1f950 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20 20  (int*)&y;.      
1f960 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
1f970 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1f980 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35      }.    case 5
1f990 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69  : { /* 6-byte si
1f9a0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1f9b0 20 20 20 20 20 20 6c 68 73 20 3d 20 46 4f 55 52        lhs = FOUR
1f9c0 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b  _BYTE_UINT(aKey+
1f9d0 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c  2) + (((i64)1)<<
1f9e0 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54  32)*TWO_BYTE_INT
1f9f0 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65  (aKey);.      te
1fa00 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
1fa10 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1fa20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20    }.    case 6: 
1fa30 7b 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e  { /* 8-byte sign
1fa40 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1fa50 20 20 20 20 78 20 3d 20 46 4f 55 52 5f 42 59 54      x = FOUR_BYT
1fa60 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  E_UINT(aKey);.  
1fa70 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20      x = (x<<32) 
1fa80 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  | FOUR_BYTE_UINT
1fa90 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20  (aKey+4);.      
1faa0 6c 68 73 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b  lhs = *(i64*)&x;
1fab0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1fac0 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20   lhs<0 );.      
1fad0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1fae0 20 63 61 73 65 20 38 3a 20 0a 20 20 20 20 20 20   case 8: .      
1faf0 6c 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  lhs = 0;.      b
1fb00 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 39  reak;.    case 9
1fb10 3a 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 31 3b  :.      lhs = 1;
1fb20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
1fb30 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20     /* This case 
1fb40 63 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76 65 64  could be removed
1fb50 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e   without changin
1fb60 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  g the results of
1fb70 20 72 75 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20   running.    ** 
1fb80 74 68 69 73 20 63 6f 64 65 2e 20 49 6e 63 6c 75  this code. Inclu
1fb90 64 69 6e 67 20 69 74 20 63 61 75 73 65 73 20 67  ding it causes g
1fba0 63 63 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  cc to generate a
1fbb0 20 66 61 73 74 65 72 20 73 77 69 74 63 68 20 0a   faster switch .
1fbc0 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
1fbd0 20 28 73 69 6e 63 65 20 74 68 65 20 72 61 6e 67   (since the rang
1fbe0 65 20 6f 66 20 73 77 69 74 63 68 20 74 61 72 67  e of switch targ
1fbf0 65 74 73 20 6e 6f 77 20 73 74 61 72 74 73 20 61  ets now starts a
1fc00 74 20 7a 65 72 6f 20 61 6e 64 0a 20 20 20 20 2a  t zero and.    *
1fc10 2a 20 69 73 20 63 6f 6e 74 69 67 75 6f 75 73 29  * is contiguous)
1fc20 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63 61   but does not ca
1fc30 75 73 65 20 61 6e 79 20 64 75 70 6c 69 63 61 74  use any duplicat
1fc40 65 20 63 6f 64 65 20 74 6f 20 62 65 20 67 65 6e  e code to be gen
1fc50 65 72 61 74 65 64 0a 20 20 20 20 2a 2a 20 28 61  erated.    ** (a
1fc60 73 20 67 63 63 20 69 73 20 63 6c 65 76 65 72 20  s gcc is clever 
1fc70 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6d 62 69 6e  enough to combin
1fc80 65 20 74 68 65 20 74 77 6f 20 6c 69 6b 65 20 63  e the two like c
1fc90 61 73 65 73 29 2e 20 4f 74 68 65 72 20 0a 20 20  ases). Other .  
1fca0 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 73 20 6d    ** compilers m
1fcb0 69 67 68 74 20 62 65 20 73 69 6d 69 6c 61 72 2e  ight be similar.
1fcc0 20 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 30    */ .    case 0
1fcd0 3a 20 63 61 73 65 20 37 3a 0a 20 20 20 20 20 20  : case 7:.      
1fce0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
1fcf0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1fd00 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1fd10 4b 65 79 32 29 3b 0a 0a 20 20 20 20 64 65 66 61  Key2);..    defa
1fd20 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ult:.      retur
1fd30 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  n sqlite3VdbeRec
1fd40 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31  ordCompare(nKey1
1fd50 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29  , pKey1, pPKey2)
1fd60 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 76 3e 6c  ;.  }..  if( v>l
1fd70 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  hs ){.    res = 
1fd80 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 7d 65  pPKey2->r1;.  }e
1fd90 6c 73 65 20 69 66 28 20 76 3c 6c 68 73 20 29 7b  lse if( v<lhs ){
1fda0 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79  .    res = pPKey
1fdb0 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 65 20 69  2->r2;.  }else i
1fdc0 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c  f( pPKey2->nFiel
1fdd0 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  d>1 ){.    /* Th
1fde0 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f  e first fields o
1fdf0 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61  f the two keys a
1fe00 72 65 20 65 71 75 61 6c 2e 20 43 6f 6d 70 61 72  re equal. Compar
1fe10 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 0a  e the trailing .
1fe20 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 20      ** fields.  
1fe30 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c  */.    res = sql
1fe40 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1fe50 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b  mpareWithSkip(nK
1fe60 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1fe70 79 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  y2, 1);.  }else{
1fe80 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  .    /* The firs
1fe90 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
1fea0 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75  two keys are equ
1feb0 61 6c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  al and there are
1fec0 20 6e 6f 20 74 72 61 69 6c 69 6e 67 0a 20 20 20   no trailing.   
1fed0 20 2a 2a 20 66 69 65 6c 64 73 2e 20 52 65 74 75   ** fields. Retu
1fee0 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75  rn pPKey2->defau
1fef0 6c 74 5f 72 63 20 69 6e 20 74 68 69 73 20 63 61  lt_rc in this ca
1ff00 73 65 2e 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d  se. */.    res =
1ff10 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
1ff20 5f 72 63 3b 0a 20 20 20 20 70 50 4b 65 79 32 2d  _rc;.    pPKey2-
1ff30 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 7d  >eqSeen = 1;.  }
1ff40 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64 62 65  ..  assert( vdbe
1ff50 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62  RecordCompareDeb
1ff60 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ug(nKey1, pKey1,
1ff70 20 70 50 4b 65 79 32 2c 20 72 65 73 29 20 29 3b   pPKey2, res) );
1ff80 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
1ff90 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1ffa0 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69  ction is an opti
1ffb0 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  mized version of
1ffc0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1ffd0 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20  rdCompare() .** 
1ffe0 74 68 61 74 20 28 61 29 20 74 68 65 20 66 69 72  that (a) the fir
1fff0 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65  st field of pPKe
20000 79 32 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20  y2 is a string, 
20010 74 68 61 74 20 28 62 29 20 74 68 65 20 66 69 72  that (b) the fir
20020 73 74 20 66 69 65 6c 64 0a 2a 2a 20 75 73 65 73  st field.** uses
20030 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
20040 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59 20 61  equence BINARY a
20050 6e 64 20 28 63 29 20 74 68 61 74 20 74 68 65 20  nd (c) that the 
20060 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76  size-of-header v
20070 61 72 69 6e 74 20 0a 2a 2a 20 61 74 20 74 68 65  arint .** at the
20080 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31   start of (pKey1
20090 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20  /nKey1) fits in 
200a0 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a  a single byte..*
200b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
200c0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74  eRecordCompareSt
200d0 72 69 6e 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79  ring(.  int nKey
200e0 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
200f0 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65  Key1, /* Left ke
20100 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
20110 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20  ecord *pPKey2   
20120 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
20130 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  y */.){.  const 
20140 75 38 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  u8 *aKey1 = (con
20150 73 74 20 75 38 2a 29 70 4b 65 79 31 3b 0a 20 20  st u8*)pKey1;.  
20160 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65 3b  int serial_type;
20170 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61  .  int res;..  a
20180 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 61  ssert( pPKey2->a
20190 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 20 26 20 4d  Mem[0].flags & M
201a0 45 4d 5f 53 74 72 20 29 3b 0a 20 20 76 64 62 65  EM_Str );.  vdbe
201b0 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74  AssertFieldCount
201c0 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65  WithinLimits(nKe
201d0 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
201e0 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  2->pKeyInfo);.  
201f0 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
20200 79 31 5b 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  y1[1], serial_ty
20210 70 65 29 3b 0a 20 20 69 66 28 20 73 65 72 69 61  pe);.  if( seria
20220 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20  l_type<12 ){.   
20230 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
20240 31 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79  1;      /* (pKey
20250 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 6e 75  1/nKey1) is a nu
20260 6d 62 65 72 20 6f 72 20 61 20 6e 75 6c 6c 20 2a  mber or a null *
20270 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28  /.  }else if( !(
20280 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78  serial_type & 0x
20290 30 31 29 20 29 7b 20 0a 20 20 20 20 72 65 73 20  01) ){ .    res 
202a0 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 20 20 20  = pPKey2->r2;   
202b0 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65     /* (pKey1/nKe
202c0 79 31 29 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f  y1) is a blob */
202d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
202e0 74 20 6e 43 6d 70 3b 0a 20 20 20 20 69 6e 74 20  t nCmp;.    int 
202f0 6e 53 74 72 3b 0a 20 20 20 20 69 6e 74 20 73 7a  nStr;.    int sz
20300 48 64 72 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a  Hdr = aKey1[0];.
20310 0a 20 20 20 20 6e 53 74 72 20 3d 20 28 73 65 72  .    nStr = (ser
20320 69 61 6c 5f 74 79 70 65 2d 31 32 29 20 2f 20 32  ial_type-12) / 2
20330 3b 0a 20 20 20 20 69 66 28 20 28 73 7a 48 64 72  ;.    if( (szHdr
20340 20 2b 20 6e 53 74 72 29 20 3e 20 6e 4b 65 79 31   + nStr) > nKey1
20350 20 29 7b 0a 20 20 20 20 20 20 70 50 4b 65 79 32   ){.      pPKey2
20360 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29  ->errCode = (u8)
20370 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
20380 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72  KPT;.      retur
20390 6e 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72 72 75  n 0;    /* Corru
203a0 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20  ption */.    }. 
203b0 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 20 70     nCmp = MIN( p
203c0 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e  PKey2->aMem[0].n
203d0 2c 20 6e 53 74 72 20 29 3b 0a 20 20 20 20 72 65  , nStr );.    re
203e0 73 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79  s = memcmp(&aKey
203f0 31 5b 73 7a 48 64 72 5d 2c 20 70 50 4b 65 79 32  1[szHdr], pPKey2
20400 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d  ->aMem[0].z, nCm
20410 70 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 65 73  p);..    if( res
20420 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73  ==0 ){.      res
20430 20 3d 20 6e 53 74 72 20 2d 20 70 50 4b 65 79 32   = nStr - pPKey2
20440 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20  ->aMem[0].n;.   
20450 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b     if( res==0 ){
20460 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 4b  .        if( pPK
20470 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b  ey2->nField>1 ){
20480 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 20 3d  .          res =
20490 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
204a0 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69  rdCompareWithSki
204b0 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  p(nKey1, pKey1, 
204c0 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20 20  pPKey2, 1);.    
204d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
204e0 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
204f0 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20  2->default_rc;. 
20500 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d           pPKey2-
20510 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20  >eqSeen = 1;.   
20520 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
20530 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a  se if( res>0 ){.
20540 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50          res = pP
20550 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 20 20  Key2->r2;.      
20560 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
20570 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b  es = pPKey2->r1;
20580 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
20590 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a  se if( res>0 ){.
205a0 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
205b0 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73  y2->r2;.    }els
205c0 65 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70  e{.      res = p
205d0 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 7d  PKey2->r1;.    }
205e0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
205f0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
20600 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
20610 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73  ey1, pPKey2, res
20620 29 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52  ).       || CORR
20630 55 50 54 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c  UPT_DB.       ||
20640 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
20650 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  o->db->mallocFai
20660 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65 74 75 72  led.  );.  retur
20670 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
20680 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
20690 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 56 64   to an sqlite3Vd
206a0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
206b0 29 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 75 6e  ) compatible fun
206c0 63 74 69 6f 6e 0a 2a 2a 20 73 75 69 74 61 62 6c  ction.** suitabl
206d0 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20  e for comparing 
206e0 73 65 72 69 61 6c 69 7a 65 64 20 72 65 63 6f 72  serialized recor
206f0 64 73 20 74 6f 20 74 68 65 20 75 6e 70 61 63 6b  ds to the unpack
20700 65 64 20 72 65 63 6f 72 64 20 70 61 73 73 65 64  ed record passed
20710 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  .** as the only 
20720 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63  argument..*/.Rec
20730 6f 72 64 43 6f 6d 70 61 72 65 20 73 71 6c 69 74  ordCompare sqlit
20740 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72  e3VdbeFindCompar
20750 65 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  e(UnpackedRecord
20760 20 2a 70 29 7b 0a 20 20 2f 2a 20 76 61 72 69 6e   *p){.  /* varin
20770 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  tRecordCompareIn
20780 74 28 29 20 61 6e 64 20 76 61 72 69 6e 74 52 65  t() and varintRe
20790 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e  cordCompareStrin
207a0 67 28 29 20 62 6f 74 68 20 61 73 73 75 6d 65 0a  g() both assume.
207b0 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73 69    ** that the si
207c0 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72  ze-of-header var
207d0 69 6e 74 20 74 68 61 74 20 6f 63 63 75 72 73 20  int that occurs 
207e0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
207f0 65 61 63 68 20 72 65 63 6f 72 64 0a 20 20 2a 2a  each record.  **
20800 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c   fits in a singl
20810 65 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20  e byte (i.e. is 
20820 31 32 37 20 6f 72 20 6c 65 73 73 29 2e 20 76 61  127 or less). va
20830 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72  rintRecordCompar
20840 65 49 6e 74 28 29 0a 20 20 2a 2a 20 61 6c 73 6f  eInt().  ** also
20850 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 69 74   assumes that it
20860 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72   is safe to over
20870 72 65 61 64 20 61 20 62 75 66 66 65 72 20 62 79  read a buffer by
20880 20 61 74 20 6c 65 61 73 74 20 74 68 65 20 0a 20   at least the . 
20890 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73   ** maximum poss
208a0 69 62 6c 65 20 6c 65 67 61 6c 20 68 65 61 64 65  ible legal heade
208b0 72 20 73 69 7a 65 20 70 6c 75 73 20 38 20 62 79  r size plus 8 by
208c0 74 65 73 2e 20 42 65 63 61 75 73 65 20 74 68 65  tes. Because the
208d0 72 65 20 69 73 0a 20 20 2a 2a 20 67 75 61 72 61  re is.  ** guara
208e0 6e 74 65 65 64 20 74 6f 20 62 65 20 61 74 20 6c  nteed to be at l
208f0 65 61 73 74 20 37 34 20 28 62 75 74 20 6e 6f 74  east 74 (but not
20900 20 31 33 36 29 20 62 79 74 65 73 20 6f 66 20 70   136) bytes of p
20910 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67  adding following
20920 20 65 61 63 68 0a 20 20 2a 2a 20 62 75 66 66 65   each.  ** buffe
20930 72 20 70 61 73 73 65 64 20 74 6f 20 76 61 72 69  r passed to vari
20940 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  ntRecordCompareI
20950 6e 74 28 29 20 74 68 69 73 20 6d 61 6b 65 73 20  nt() this makes 
20960 69 74 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f  it convenient to
20970 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 74 68 65 20  .  ** limit the 
20980 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  size of the head
20990 65 72 20 74 6f 20 36 34 20 62 79 74 65 73 20 69  er to 64 bytes i
209a0 6e 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68  n cases where th
209b0 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a 20 20  e first field.  
209c0 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ** is an integer
209d0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
209e0 65 61 73 69 65 73 74 20 77 61 79 20 74 6f 20 65  easiest way to e
209f0 6e 66 6f 72 63 65 20 74 68 69 73 20 6c 69 6d 69  nforce this limi
20a00 74 20 69 73 20 74 6f 20 63 6f 6e 73 69 64 65 72  t is to consider
20a10 20 6f 6e 6c 79 20 72 65 63 6f 72 64 73 20 77 69   only records wi
20a20 74 68 0a 20 20 2a 2a 20 31 33 20 66 69 65 6c 64  th.  ** 13 field
20a30 73 20 6f 72 20 6c 65 73 73 2e 20 49 66 20 74 68  s or less. If th
20a40 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 69 73  e first field is
20a50 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74 68 65   an integer, the
20a60 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 0a 20   maximum legal. 
20a70 20 2a 2a 20 68 65 61 64 65 72 20 73 69 7a 65 20   ** header size 
20a80 69 73 20 28 31 32 2a 35 20 2b 20 31 20 2b 20 31  is (12*5 + 1 + 1
20a90 29 20 62 79 74 65 73 2e 20 20 2a 2f 0a 20 20 69  ) bytes.  */.  i
20aa0 66 28 20 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d  f( (p->pKeyInfo-
20ab0 3e 6e 46 69 65 6c 64 20 2b 20 70 2d 3e 70 4b 65  >nField + p->pKe
20ac0 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 29 3c  yInfo->nXField)<
20ad0 3d 31 33 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  =13 ){.    int f
20ae0 6c 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30  lags = p->aMem[0
20af0 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69 66 28  ].flags;.    if(
20b00 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53   p->pKeyInfo->aS
20b10 6f 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b 0a 20  ortOrder[0] ){. 
20b20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 31 3b 0a       p->r1 = 1;.
20b30 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 2d 31        p->r2 = -1
20b40 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20b50 20 20 20 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20     p->r1 = -1;. 
20b60 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 31 3b 0a       p->r2 = 1;.
20b70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66      }.    if( (f
20b80 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20  lags & MEM_Int) 
20b90 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
20ba0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
20bb0 65 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  eInt;.    }.    
20bc0 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20  testcase( flags 
20bd0 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20  & MEM_Real );.  
20be0 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67    testcase( flag
20bf0 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a  s & MEM_Null );.
20c00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c      testcase( fl
20c10 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
20c20 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  ;.    if( (flags
20c30 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d   & (MEM_Real|MEM
20c40 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29  _Null|MEM_Blob))
20c50 3d 3d 30 20 26 26 20 70 2d 3e 70 4b 65 79 49 6e  ==0 && p->pKeyIn
20c60 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20  fo->aColl[0]==0 
20c70 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
20c80 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72   flags & MEM_Str
20c90 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
20ca0 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
20cb0 72 65 53 74 72 69 6e 67 3b 0a 20 20 20 20 7d 0a  reString;.    }.
20cc0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71    }..  return sq
20cd0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
20ce0 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ompare;.}../*.**
20cf0 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20   pCur points at 
20d00 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63  an index entry c
20d10 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65  reated using the
20d20 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
20d30 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74  pcode..** Read t
20d40 68 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61  he rowid (the la
20d50 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20  st field in the 
20d60 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72  record) and stor
20d70 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a  e it in *rowid..
20d80 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
20d90 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
20da0 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65  g works, or an e
20db0 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77  rror code otherw
20dc0 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20  ise..**.** pCur 
20dd0 6d 69 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e  might be pointin
20de0 67 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e  g to text obtain
20df0 65 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70  ed from a corrup
20e00 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  t database file.
20e10 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65  .** So the conte
20e20 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75  nt cannot be tru
20e30 73 74 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70  sted.  Do approp
20e40 72 69 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20  riate checks on 
20e50 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a  the content..*/.
20e60 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49  int sqlite3VdbeI
20e70 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20  dxRowid(sqlite3 
20e80 2a 64 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70  *db, BtCursor *p
20e90 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29  Cur, i64 *rowid)
20ea0 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79  {.  i64 nCellKey
20eb0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
20ec0 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20    u32 szHdr;    
20ed0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
20ee0 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  he header */.  u
20ef0 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20  32 typeRowid;   
20f00 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
20f10 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a  of the rowid */.
20f20 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20    u32 lenRowid; 
20f30 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
20f40 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65  he rowid */.  Me
20f50 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47 65  m m, v;..  /* Ge
20f60 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
20f70 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20  e index entry.  
20f80 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74  Only indices ent
20f90 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a  ries of less.  *
20fa0 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72 65 20  * than 2GiB are 
20fb0 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69  support - anythi
20fc0 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65  ng large must be
20fd0 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
20fe0 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63  tion..  ** Any c
20ff0 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74  orruption is det
21000 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33  ected in sqlite3
21010 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
21020 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a  r(), though, so.
21030 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63    ** this code c
21040 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65  an safely assume
21050 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69   that nCellKey i
21060 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f  s 32-bits  .  */
21070 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
21080 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
21090 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20  alid(pCur) );.  
210a0 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73  VVA_ONLY(rc =) s
210b0 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
210c0 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b  ze(pCur, &nCellK
210d0 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  ey);.  assert( r
210e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20  c==SQLITE_OK ); 
210f0 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61      /* pCur is a
21100 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b  lways valid so K
21110 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61  eySize cannot fa
21120 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  il */.  assert( 
21130 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49  (nCellKey & SQLI
21140 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36  TE_MAX_U32)==(u6
21150 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20  4)nCellKey );.. 
21160 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20   /* Read in the 
21170 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74  complete content
21180 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
21190 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  try */.  sqlite3
211a0 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20  VdbeMemInit(&m, 
211b0 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73  db, 0);.  rc = s
211c0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
211d0 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20  mBtree(pCur, 0, 
211e0 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31  (u32)nCellKey, 1
211f0 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20  , &m);.  if( rc 
21200 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
21210 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
21220 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74  index entry must
21230 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 68 65   begin with a he
21240 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28  ader size */.  (
21250 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32  void)getVarint32
21260 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72  ((u8*)m.z, szHdr
21270 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
21280 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73  zHdr==3 );.  tes
21290 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e  tcase( szHdr==m.
212a0 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b  n );.  if( unlik
212b0 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28  ely(szHdr<3 || (
212c0 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29  int)szHdr>m.n) )
212d0 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72  {.    goto idx_r
212e0 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b  owid_corruption;
212f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c  .  }..  /* The l
21300 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ast field of the
21310 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65   index should be
21320 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 74 68   an integer - th
21330 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65  e ROWID..  ** Ve
21340 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6c 61  rify that the la
21350 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c 79 20  st entry really 
21360 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a  is an integer. *
21370 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72  /.  (void)getVar
21380 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b  int32((u8*)&m.z[
21390 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f  szHdr-1], typeRo
213a0 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65  wid);.  testcase
213b0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31 20 29  ( typeRowid==1 )
213c0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
213d0 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20  peRowid==2 );.  
213e0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
213f0 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74  wid==3 );.  test
21400 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
21410 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =4 );.  testcase
21420 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35 20 29  ( typeRowid==5 )
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 36 20 29 3b 0a 20 20  peRowid==6 );.  
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 38 20 29 3b 0a 20 20 74 65 73 74  wid==8 );.  test
21470 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
21480 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  =9 );.  if( unli
21490 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64 3c 31  kely(typeRowid<1
214a0 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e 39 20   || typeRowid>9 
214b0 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d 37 29  || typeRowid==7)
214c0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
214d0 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
214e0 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69  n;.  }.  lenRowi
214f0 64 20 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c  d = sqlite3Small
21500 54 79 70 65 53 69 7a 65 73 5b 74 79 70 65 52 6f  TypeSizes[typeRo
21510 77 69 64 5d 3b 0a 20 20 74 65 73 74 63 61 73 65  wid];.  testcase
21520 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64  ( (u32)m.n==szHd
21530 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20  r+lenRowid );.  
21540 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33  if( unlikely((u3
21550 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52  2)m.n<szHdr+lenR
21560 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67 6f 74  owid) ){.    got
21570 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  o idx_rowid_corr
21580 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  uption;.  }..  /
21590 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e 74 65  * Fetch the inte
215a0 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e 64 20  ger off the end 
215b0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72 65 63  of the index rec
215c0 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ord */.  sqlite3
215d0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 75  VdbeSerialGet((u
215e0 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52  8*)&m.z[m.n-lenR
215f0 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64  owid], typeRowid
21600 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20  , &v);.  *rowid 
21610 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74  = v.u.i;.  sqlit
21620 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
21630 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
21640 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
21650 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64 61 74  Jump here if dat
21660 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
21670 20 69 73 20 64 65 74 65 63 74 65 64 20 61 66 74   is detected aft
21680 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a 20 20  er m has been.  
21690 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46  ** allocated.  F
216a0 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65 63 74  ree the m object
216b0 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
216c0 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69  TE_CORRUPT. */.i
216d0 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
216e0 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73 65 28  ion:.  testcase(
216f0 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29   m.szMalloc!=0 )
21700 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
21710 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
21720 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
21730 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a  ORRUPT_BKPT;.}..
21740 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
21750 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64  e key of the ind
21760 65 78 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  ex entry that cu
21770 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74  rsor pC is point
21780 69 6e 67 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a  ing to against.*
21790 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67  * the key string
217a0 20 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20   in pUnpacked.  
217b0 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73  Write into *pRes
217c0 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61   a number.** tha
217d0 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a  t is negative, z
217e0 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
217f0 20 69 66 20 70 43 20 69 73 20 6c 65 73 73 20 74   if pC is less t
21800 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a  han, equal to,.*
21810 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  * or greater tha
21820 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 52 65  n pUnpacked.  Re
21830 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
21840 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  n success..**.**
21850 20 70 55 6e 70 61 63 6b 65 64 20 69 73 20 65 69   pUnpacked is ei
21860 74 68 65 72 20 63 72 65 61 74 65 64 20 77 69 74  ther created wit
21870 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20  hout a rowid or 
21880 69 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20  is truncated so 
21890 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73  that it.** omits
218a0 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   the rowid at th
218b0 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69  e end.  The rowi
218c0 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
218d0 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a  the index entry.
218e0 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73  ** is ignored as
218f0 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74   well.  Hence, t
21900 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79  his routine only
21910 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72   compares the pr
21920 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68  efixes .** of th
21930 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20  e keys prior to 
21940 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c  the final rowid,
21950 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20   not the entire 
21960 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  key..*/.int sqli
21970 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d  te3VdbeIdxKeyCom
21980 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20  pare(.  sqlite3 
21990 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
219a0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
219b0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
219c0 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
219d0 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pC,            
219e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
219f0 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61  sor to compare a
21a00 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61  gainst */.  Unpa
21a10 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70  ckedRecord *pUnp
21a20 61 63 6b 65 64 2c 20 20 20 20 20 20 20 2f 2a 20  acked,       /* 
21a30 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e  Unpacked version
21a40 20 6f 66 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74   of key */.  int
21a50 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20 20   *res           
21a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21a70 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61   Write the compa
21a80 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72  rison result her
21a90 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43  e */.){.  i64 nC
21aa0 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  ellKey = 0;.  in
21ab0 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72  t rc;.  BtCursor
21ac0 20 2a 70 43 75 72 3b 0a 20 20 4d 65 6d 20 6d 3b   *pCur;.  Mem m;
21ad0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ..  assert( pC->
21ae0 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
21af0 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 70 43 75  E_BTREE );.  pCu
21b00 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73  r = pC->uc.pCurs
21b10 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  or;.  assert( sq
21b20 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
21b30 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b  IsValid(pCur) );
21b40 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d  .  VVA_ONLY(rc =
21b50 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  ) sqlite3BtreeKe
21b60 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65  ySize(pCur, &nCe
21b70 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74  llKey);.  assert
21b80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21b90 29 3b 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73  );    /* pCur is
21ba0 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f   always valid so
21bb0 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20   KeySize cannot 
21bc0 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65  fail */.  /* nCe
21bd0 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79  llKey will alway
21be0 73 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61  s be between 0 a
21bf0 6e 64 20 30 78 66 66 66 66 66 66 66 66 20 62 65  nd 0xffffffff be
21c00 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79  cause of the way
21c10 0a 20 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65  .  ** that btree
21c20 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61  ParseCellPtr() a
21c30 6e 64 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  nd sqlite3GetVar
21c40 69 6e 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c  int32() are impl
21c50 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28  emented */.  if(
21c60 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20   nCellKey<=0 || 
21c70 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66  nCellKey>0x7ffff
21c80 66 66 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20  fff ){.    *res 
21c90 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
21ca0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
21cb0 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  KPT;.  }.  sqlit
21cc0 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d  e3VdbeMemInit(&m
21cd0 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d  , db, 0);.  rc =
21ce0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
21cf0 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30  romBtree(pCur, 0
21d00 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c  , (u32)nCellKey,
21d10 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
21d20 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
21d30 72 63 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d  rc;.  }.  *res =
21d40 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
21d50 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d  rdCompare(m.n, m
21d60 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a  .z, pUnpacked);.
21d70 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
21d80 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
21d90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21da0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
21db0 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
21dc0 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75  value to be retu
21dd0 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65  rned by subseque
21de0 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73  nt calls to.** s
21df0 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29  qlite3_changes()
21e00 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
21e10 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a   handle 'db'. .*
21e20 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
21e30 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c  beSetChanges(sql
21e40 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43  ite3 *db, int nC
21e50 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74  hange){.  assert
21e60 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
21e70 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
21e80 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65  );.  db->nChange
21e90 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62   = nChange;.  db
21ea0 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b  ->nTotalChange +
21eb0 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  = nChange;.}../*
21ec0 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69  .** Set a flag i
21ed0 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70  n the vdbe to up
21ee0 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20  date the change 
21ef0 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20  counter when it 
21f00 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20  is finalised.** 
21f10 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69  or reset..*/.voi
21f20 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75  d sqlite3VdbeCou
21f30 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a  ntChanges(Vdbe *
21f40 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43  v){.  v->changeC
21f50 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ntOn = 1;.}../*.
21f60 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72  ** Mark every pr
21f70 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
21f80 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
21f90 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
21fa0 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70  ection.** as exp
21fb0 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  ired..**.** An e
21fc0 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74  xpired statement
21fd0 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f   means that reco
21fe0 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65  mpilation of the
21ff0 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a   statement is.**
22000 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61   recommend.  Sta
22010 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77  tements expire w
22020 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65  hen things happe
22030 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69  n that make thei
22040 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62  r.** programs ob
22050 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e  solete.  Removin
22060 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  g user-defined f
22070 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c  unctions or coll
22080 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
22090 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20  es, or changing 
220a0 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  an authorization
220b0 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68   function are th
220c0 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68  e types of.** th
220d0 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70  ings that make p
220e0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
220f0 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a  ts obsolete..*/.
22100 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69  void sqlite3Expi
22110 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
22120 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ents(sqlite3 *db
22130 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
22140 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62  for(p = db->pVdb
22150 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  e; p; p=p->pNext
22160 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65  ){.    p->expire
22170 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 1;.  }.}../*
22180 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
22190 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74  atabase associat
221a0 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
221b0 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71  ..*/.sqlite3 *sq
221c0 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65  lite3VdbeDb(Vdbe
221d0 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76   *v){.  return v
221e0 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ->db;.}../*.** R
221f0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
22200 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61  to an sqlite3_va
22210 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  lue structure co
22220 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c  ntaining the val
22230 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61  ue bound.** para
22240 6d 65 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d  meter iVar of VM
22250 20 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74   v. Except, if t
22260 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53  he value is an S
22270 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20  QL NULL, return 
22280 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55  .** 0 instead. U
22290 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c  nless it is NULL
222a0 2c 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79  , apply affinity
222b0 20 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65   aff (one of the
222c0 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a   SQLITE_AFF_*.**
222d0 20 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74   constants) to t
222e0 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  he value before 
222f0 72 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a  returning it..**
22300 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
22310 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66   value must be f
22320 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
22330 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
22340 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a  ValueFree()..*/.
22350 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73  sqlite3_value *s
22360 71 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75  qlite3VdbeGetBou
22370 6e 64 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c  ndValue(Vdbe *v,
22380 20 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66   int iVar, u8 af
22390 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56  f){.  assert( iV
223a0 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20  ar>0 );.  if( v 
223b0 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  ){.    Mem *pMem
223c0 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72   = &v->aVar[iVar
223d0 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  -1];.    if( 0==
223e0 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
223f0 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20  EM_Null) ){.    
22400 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
22410 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56  *pRet = sqlite3V
22420 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a  alueNew(v->db);.
22430 20 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29        if( pRet )
22440 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
22450 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65  3VdbeMemCopy((Me
22460 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b  m *)pRet, pMem);
22470 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22480 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69  ValueApplyAffini
22490 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51  ty(pRet, aff, SQ
224a0 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
224b0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
224c0 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d   pRet;.    }.  }
224d0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
224e0 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
224f0 53 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61  SQL variable iVa
22500 72 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e  r so that bindin
22510 67 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f  g a new value to
22520 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74   it signals.** t
22530 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69  o sqlite3_reopti
22540 6d 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70  mize() that re-p
22550 72 65 70 61 72 69 6e 67 20 74 68 65 20 73 74 61  reparing the sta
22560 74 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c  tement may resul
22570 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72  t.** in a better
22580 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a   query plan..*/.
22590 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
225a0 53 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20  SetVarmask(Vdbe 
225b0 2a 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20  *v, int iVar){. 
225c0 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20   assert( iVar>0 
225d0 29 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32  );.  if( iVar>32
225e0 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61   ){.    v->expma
225f0 73 6b 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b  sk = 0xffffffff;
22600 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d  .  }else{.    v-
22610 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33  >expmask |= ((u3
22620 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29  2)1 << (iVar-1))
22630 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
22640 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
22650 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
22660 54 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d  Transfer error m
22670 65 73 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d  essage text from
22680 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62   an sqlite3_vtab
22690 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73  .zErrMsg (text s
226a0 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  tored.** in memo
226b0 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
226c0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29   sqlite3_malloc)
226d0 20 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72   into a Vdbe.zEr
226e0 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65  rMsg (text store
226f0 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  d.** in memory o
22700 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
22710 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a  ite3DbMalloc)..*
22720 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74  /.void sqlite3Vt
22730 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56  abImportErrmsg(V
22740 64 62 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  dbe *p, sqlite3_
22750 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20  vtab *pVtab){.  
22760 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
22770 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  >db;.  sqlite3Db
22780 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
22790 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d  Msg);.  p->zErrM
227a0 73 67 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  sg = sqlite3DbSt
227b0 72 44 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e  rDup(db, pVtab->
227c0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69  zErrMsg);.  sqli
227d0 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e  te3_free(pVtab->
227e0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61  zErrMsg);.  pVta
227f0 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  b->zErrMsg = 0;.
22800 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
22810 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
22820 41 42 4c 45 20 2a 2f 0a                          ABLE */.