/ Hex Artifact Content
Login

Artifact f0e7cfa04f7ac44d69866868531dbaf20659d0a2:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e  #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72  e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
02d0: 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20 29  , sizeof(Vdbe) )
02e0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
02f0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62  eturn 0;.  p->db
0300: 20 3d 20 64 62 3b 0a 20 20 69 66 28 20 64 62 2d   = db;.  if( db-
0310: 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 64 62  >pVdbe ){.    db
0320: 2d 3e 70 56 64 62 65 2d 3e 70 50 72 65 76 20 3d  ->pVdbe->pPrev =
0330: 20 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65   p;.  }.  p->pNe
0340: 78 74 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a  xt = db->pVdbe;.
0350: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
0360: 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b    db->pVdbe = p;
0370: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
0380: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20  BE_MAGIC_INIT;. 
0390: 20 70 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61   p->pParse = pPa
03a0: 72 73 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rse;.  assert( p
03b0: 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30  Parse->aLabel==0
03c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
03d0: 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20  arse->nLabel==0 
03e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
03f0: 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30  rse->nOpAlloc==0
0400: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
0410: 61 72 73 65 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 3d  arse->szOpAlloc=
0420: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  =0 );.  return p
0430: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
0440: 65 20 74 68 65 20 65 72 72 6f 72 20 73 74 72 69  e the error stri
0450: 6e 67 20 73 74 6f 72 65 64 20 69 6e 20 56 64 62  ng stored in Vdb
0460: 65 2e 7a 45 72 72 4d 73 67 0a 2a 2f 0a 76 6f 69  e.zErrMsg.*/.voi
0470: 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72  d sqlite3VdbeErr
0480: 6f 72 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  or(Vdbe *p, cons
0490: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
04a0: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
04b0: 20 61 70 3b 0a 20 20 73 71 6c 69 74 65 33 44 62   ap;.  sqlite3Db
04c0: 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 7a  Free(p->db, p->z
04d0: 45 72 72 4d 73 67 29 3b 0a 20 20 76 61 5f 73 74  ErrMsg);.  va_st
04e0: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
04f0: 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d  ;.  p->zErrMsg =
0500: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
0510: 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c  (p->db, zFormat,
0520: 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
0530: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  p);.}../*.** Rem
0540: 65 6d 62 65 72 20 74 68 65 20 53 51 4c 20 73 74  ember the SQL st
0550: 72 69 6e 67 20 66 6f 72 20 61 20 70 72 65 70 61  ring for a prepa
0560: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  red statement..*
0570: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
0580: 62 65 53 65 74 53 71 6c 28 56 64 62 65 20 2a 70  beSetSql(Vdbe *p
0590: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  , const char *z,
05a0: 20 69 6e 74 20 6e 2c 20 69 6e 74 20 69 73 50 72   int n, int isPr
05b0: 65 70 61 72 65 56 32 29 7b 0a 20 20 61 73 73 65  epareV2){.  asse
05c0: 72 74 28 20 69 73 50 72 65 70 61 72 65 56 32 3d  rt( isPrepareV2=
05d0: 3d 31 20 7c 7c 20 69 73 50 72 65 70 61 72 65 56  =1 || isPrepareV
05e0: 32 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  2==0 );.  if( p=
05f0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66  =0 ) return;.#if
0600: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
0610: 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 21  OMIT_TRACE) && !
0620: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
0630: 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 29 0a 20 20  NABLE_SQLLOG).  
0640: 69 66 28 20 21 69 73 50 72 65 70 61 72 65 56 32  if( !isPrepareV2
0650: 20 29 20 72 65 74 75 72 6e 3b 0a 23 65 6e 64 69   ) return;.#endi
0660: 66 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a  f.  assert( p->z
0670: 53 71 6c 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a  Sql==0 );.  p->z
0680: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53  Sql = sqlite3DbS
0690: 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 2c  trNDup(p->db, z,
06a0: 20 6e 29 3b 0a 20 20 70 2d 3e 69 73 50 72 65 70   n);.  p->isPrep
06b0: 61 72 65 56 32 20 3d 20 28 75 38 29 69 73 50 72  areV2 = (u8)isPr
06c0: 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a  epareV2;.}../*.*
06d0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 53 51 4c  * Return the SQL
06e0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
06f0: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
0700: 65 6d 65 6e 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63  ement.*/.const c
0710: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 71 6c  har *sqlite3_sql
0720: 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70  (sqlite3_stmt *p
0730: 53 74 6d 74 29 7b 0a 20 20 56 64 62 65 20 2a 70  Stmt){.  Vdbe *p
0740: 20 3d 20 28 56 64 62 65 20 2a 29 70 53 74 6d 74   = (Vdbe *)pStmt
0750: 3b 0a 20 20 72 65 74 75 72 6e 20 70 20 3f 20 70  ;.  return p ? p
0760: 2d 3e 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->zSql : 0;.}../
0770: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
0780: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
0790: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
07a0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
07b0: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
07c0: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
07d0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
07e0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
07f0: 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b 0a 20 20  .  tmp = *pA;.  
0800: 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70 42  *pA = *pB;.  *pB
0810: 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20 3d   = tmp;.  pTmp =
0820: 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 41   pA->pNext;.  pA
0830: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70 4e  ->pNext = pB->pN
0840: 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78 74  ext;.  pB->pNext
0850: 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70 20   = pTmp;.  pTmp 
0860: 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20 70  = pA->pPrev;.  p
0870: 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e 70  A->pPrev = pB->p
0880: 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72 65  Prev;.  pB->pPre
0890: 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d 70  v = pTmp;.  zTmp
08a0: 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70   = pA->zSql;.  p
08b0: 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a 53  A->zSql = pB->zS
08c0: 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20 3d  ql;.  pB->zSql =
08d0: 20 7a 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73 50   zTmp;.  pB->isP
08e0: 72 65 70 61 72 65 56 32 20 3d 20 70 41 2d 3e 69  repareV2 = pA->i
08f0: 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f  sPrepareV2;.}../
0900: 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20  *.** Resize the 
0910: 56 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73  Vdbe.aOp array s
0920: 6f 20 74 68 61 74 20 69 74 20 69 73 20 61 74 20  o that it is at 
0930: 6c 65 61 73 74 20 6e 4f 70 20 65 6c 65 6d 65 6e  least nOp elemen
0940: 74 73 20 6c 61 72 67 65 72 20 0a 2a 2a 20 74 68  ts larger .** th
0950: 61 6e 20 69 74 73 20 63 75 72 72 65 6e 74 20 73  an its current s
0960: 69 7a 65 2e 20 6e 4f 70 20 69 73 20 67 75 61 72  ize. nOp is guar
0970: 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 65 73  anteed to be les
0980: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a  s than or equal.
0990: 2a 2a 20 74 6f 20 31 30 32 34 2f 73 69 7a 65 6f  ** to 1024/sizeo
09a0: 66 28 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f(Op)..**.** If 
09b0: 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79  an out-of-memory
09c0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
09d0: 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74 68 65  ile resizing the
09e0: 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a   array, return.*
09f0: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20  * SQLITE_NOMEM. 
0a00: 49 6e 20 74 68 69 73 20 63 61 73 65 20 56 64 62  In this case Vdb
0a10: 65 2e 61 4f 70 20 61 6e 64 20 50 61 72 73 65 2e  e.aOp and Parse.
0a20: 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20  nOpAlloc remain 
0a30: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 28 74  .** unchanged (t
0a40: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 61  his is so that a
0a50: 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61  ny opcodes alrea
0a60: 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e  dy allocated can
0a70: 20 62 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74 6c   be .** correctl
0a80: 79 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 61 6c  y deallocated al
0a90: 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72 65 73  ong with the res
0aa0: 74 20 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a  t of the Vdbe)..
0ab0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 72  */.static int gr
0ac0: 6f 77 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a  owOpArray(Vdbe *
0ad0: 76 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 56  v, int nOp){.  V
0ae0: 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 50  dbeOp *pNew;.  P
0af0: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
0b00: 72 73 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53  rse;..  /* The S
0b10: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
0b20: 4f 43 5f 53 54 52 45 53 53 20 63 6f 6d 70 69 6c  OC_STRESS compil
0b30: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
0b40: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 66 6f 72   designed to for
0b50: 63 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 66 72 65  ce.  ** more fre
0b60: 71 75 65 6e 74 20 72 65 61 6c 6c 6f 63 73 20 61  quent reallocs a
0b70: 6e 64 20 68 65 6e 63 65 20 70 72 6f 76 69 64 65  nd hence provide
0b80: 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74   more opportunit
0b90: 69 65 73 20 66 6f 72 20 0a 20 20 2a 2a 20 73 69  ies for .  ** si
0ba0: 6d 75 6c 61 74 65 64 20 4f 4f 4d 20 66 61 75 6c  mulated OOM faul
0bb0: 74 73 2e 20 20 53 51 4c 49 54 45 5f 54 45 53 54  ts.  SQLITE_TEST
0bc0: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20  _REALLOC_STRESS 
0bd0: 69 73 20 67 65 6e 65 72 61 6c 6c 79 20 75 73 65  is generally use
0be0: 64 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 65  d.  ** during te
0bf0: 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 57 69 74  sting only.  Wit
0c00: 68 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  h SQLITE_TEST_RE
0c10: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 67 72 6f  ALLOC_STRESS gro
0c20: 77 20 74 68 65 20 6f 70 20 61 72 72 61 79 0a 20  w the op array. 
0c30: 20 2a 2a 20 62 79 20 74 68 65 20 6d 69 6e 69 6d   ** by the minim
0c40: 75 6d 2a 20 61 6d 6f 75 6e 74 20 72 65 71 75 69  um* amount requi
0c50: 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 73 69  red until the si
0c60: 7a 65 20 72 65 61 63 68 65 73 20 35 31 32 2e 20  ze reaches 512. 
0c70: 20 4e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65   Normal.  ** ope
0c80: 72 61 74 69 6f 6e 20 28 77 69 74 68 6f 75 74 20  ration (without 
0c90: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
0ca0: 4c 4f 43 5f 53 54 52 45 53 53 29 20 69 73 20 74  LOC_STRESS) is t
0cb0: 6f 20 64 6f 75 62 6c 65 20 74 68 65 20 63 75 72  o double the cur
0cc0: 72 65 6e 74 0a 20 20 2a 2a 20 73 69 7a 65 20 6f  rent.  ** size o
0cd0: 66 20 74 68 65 20 6f 70 20 61 72 72 61 79 20 6f  f the op array o
0ce0: 72 20 61 64 64 20 31 4b 42 20 6f 66 20 73 70 61  r add 1KB of spa
0cf0: 63 65 2c 20 77 68 69 63 68 65 76 65 72 20 69 73  ce, whichever is
0d00: 20 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66   smaller. */.#if
0d10: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 5f  def SQLITE_TEST_
0d20: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 0a 20  REALLOC_STRESS. 
0d30: 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d 3e   int nNew = (p->
0d40: 6e 4f 70 41 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20  nOpAlloc>=512 ? 
0d50: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20  p->nOpAlloc*2 : 
0d60: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29  p->nOpAlloc+nOp)
0d70: 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 6e 4e  ;.#else.  int nN
0d80: 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f  ew = (p->nOpAllo
0d90: 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a  c ? p->nOpAlloc*
0da0: 32 20 3a 20 28 69 6e 74 29 28 31 30 32 34 2f 73  2 : (int)(1024/s
0db0: 69 7a 65 6f 66 28 4f 70 29 29 29 3b 0a 20 20 55  izeof(Op)));.  U
0dc0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
0dd0: 6e 4f 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nOp);.#endif..  
0de0: 61 73 73 65 72 74 28 20 6e 4f 70 3c 3d 28 31 30  assert( nOp<=(10
0df0: 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29 20 29  24/sizeof(Op)) )
0e00: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77  ;.  assert( nNew
0e10: 3e 3d 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e  >=(p->nOpAlloc+n
0e20: 4f 70 29 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20  Op) );.  pNew = 
0e30: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
0e40: 28 70 2d 3e 64 62 2c 20 76 2d 3e 61 4f 70 2c 20  (p->db, v->aOp, 
0e50: 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29  nNew*sizeof(Op))
0e60: 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ;.  if( pNew ){.
0e70: 20 20 20 20 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63      p->szOpAlloc
0e80: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
0e90: 6f 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e  ocSize(p->db, pN
0ea0: 65 77 29 3b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41  ew);.    p->nOpA
0eb0: 6c 6c 6f 63 20 3d 20 70 2d 3e 73 7a 4f 70 41 6c  lloc = p->szOpAl
0ec0: 6c 6f 63 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a  loc/sizeof(Op);.
0ed0: 20 20 20 20 76 2d 3e 61 4f 70 20 3d 20 70 4e 65      v->aOp = pNe
0ee0: 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  w;.  }.  return 
0ef0: 28 70 4e 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f  (pNew ? SQLITE_O
0f00: 4b 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  K : SQLITE_NOMEM
0f10: 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  );.}..#ifdef SQL
0f20: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69  ITE_DEBUG./* Thi
0f30: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73  s routine is jus
0f40: 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70  t a convenient p
0f50: 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 62 72  lace to set a br
0f60: 65 61 6b 70 6f 69 6e 74 20 74 68 61 74 20 77 69  eakpoint that wi
0f70: 6c 6c 0a 2a 2a 20 66 69 72 65 20 61 66 74 65 72  ll.** fire after
0f80: 20 65 61 63 68 20 6f 70 63 6f 64 65 20 69 73 20   each opcode is 
0f90: 69 6e 73 65 72 74 65 64 20 61 6e 64 20 64 69 73  inserted and dis
0fa0: 70 6c 61 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20  played using.** 
0fb0: 22 50 52 41 47 4d 41 20 76 64 62 65 5f 61 64 64  "PRAGMA vdbe_add
0fc0: 6f 70 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a  optrace=on"..*/.
0fd0: 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74  static void test
0fe0: 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e  _addop_breakpoin
0ff0: 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  t(void){.  stati
1000: 63 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e  c int n = 0;.  n
1010: 2b 2b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ++;.}.#endif../*
1020: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 69 6e  .** Add a new in
1030: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65  struction to the
1040: 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72 75 63   list of instruc
1050: 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20 69 6e  tions current in
1060: 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52   the.** VDBE.  R
1070: 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73  eturn the addres
1080: 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73  s of the new ins
1090: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  truction..**.** 
10a0: 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a  Parameters:.**.*
10b0: 2a 20 20 20 20 70 20 20 20 20 20 20 20 20 20 20  *    p          
10c0: 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20       Pointer to 
10d0: 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20  the VDBE.**.**  
10e0: 20 20 6f 70 20 20 20 20 20 20 20 20 20 20 20 20    op            
10f0: 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66 6f 72    The opcode for
1100: 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   this instructio
1110: 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70  n.**.**    p1, p
1120: 32 2c 20 70 33 20 20 20 20 20 20 4f 70 65 72 61  2, p3      Opera
1130: 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  nds.**.** Use th
1140: 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  e sqlite3VdbeRes
1150: 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 6e 63  olveLabel() func
1160: 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20 61  tion to fix an a
1170: 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68  ddress and.** th
1180: 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  e sqlite3VdbeCha
1190: 6e 67 65 50 34 28 29 20 66 75 6e 63 74 69 6f 6e  ngeP4() function
11a0: 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76   to change the v
11b0: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 0a 2a  alue of the P4.*
11c0: 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 73 74  * operand..*/.st
11d0: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
11e0: 4c 49 4e 45 20 69 6e 74 20 67 72 6f 77 4f 70 33  LINE int growOp3
11f0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
1200: 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32  , int p1, int p2
1210: 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20 61 73 73  , int p3){.  ass
1220: 65 72 74 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e  ert( p->pParse->
1230: 6e 4f 70 41 6c 6c 6f 63 3c 3d 70 2d 3e 6e 4f 70  nOpAlloc<=p->nOp
1240: 20 29 3b 0a 20 20 69 66 28 20 67 72 6f 77 4f 70   );.  if( growOp
1250: 41 72 72 61 79 28 70 2c 20 31 29 20 29 20 72 65  Array(p, 1) ) re
1260: 74 75 72 6e 20 31 3b 0a 20 20 61 73 73 65 72 74  turn 1;.  assert
1270: 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70  ( p->pParse->nOp
1280: 41 6c 6c 6f 63 3e 70 2d 3e 6e 4f 70 20 29 3b 0a  Alloc>p->nOp );.
1290: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
12a0: 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70  VdbeAddOp3(p, op
12b0: 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 7d  , p1, p2, p3);.}
12c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
12d0: 41 64 64 4f 70 33 28 56 64 62 65 20 2a 70 2c 20  AddOp3(Vdbe *p, 
12e0: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20  int op, int p1, 
12f0: 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b  int p2, int p3){
1300: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65  .  int i;.  Vdbe
1310: 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20  Op *pOp;..  i = 
1320: 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74  p->nOp;.  assert
1330: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
1340: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
1350: 20 61 73 73 65 72 74 28 20 6f 70 3e 3d 30 20 26   assert( op>=0 &
1360: 26 20 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20 69  & op<0xff );.  i
1370: 66 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f  f( p->pParse->nO
1380: 70 41 6c 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20 20  pAlloc<=i ){.   
1390: 20 72 65 74 75 72 6e 20 67 72 6f 77 4f 70 33 28   return growOp3(
13a0: 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70  p, op, p1, p2, p
13b0: 33 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70  3);.  }.  p->nOp
13c0: 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e  ++;.  pOp = &p->
13d0: 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f  aOp[i];.  pOp->o
13e0: 70 63 6f 64 65 20 3d 20 28 75 38 29 6f 70 3b 0a  pcode = (u8)op;.
13f0: 20 20 70 4f 70 2d 3e 70 35 20 3d 20 30 3b 0a 20    pOp->p5 = 0;. 
1400: 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20   pOp->p1 = p1;. 
1410: 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20   pOp->p2 = p2;. 
1420: 20 70 4f 70 2d 3e 70 33 20 3d 20 70 33 3b 0a 20   pOp->p3 = p3;. 
1430: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a   pOp->p4.p = 0;.
1440: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
1450: 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66 64  P4_NOTUSED;.#ifd
1460: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1470: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
1480: 53 0a 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  S.  pOp->zCommen
1490: 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69  t = 0;.#endif.#i
14a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
14b0: 47 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66  G.  if( p->db->f
14c0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
14d0: 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
14e0: 20 20 20 20 69 6e 74 20 6a 6a 2c 20 6b 6b 3b 0a      int jj, kk;.
14f0: 20 20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73      Parse *pPars
1500: 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20  e = p->pParse;. 
1510: 20 20 20 66 6f 72 28 6a 6a 3d 6b 6b 3d 30 3b 20     for(jj=kk=0; 
1520: 6a 6a 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43  jj<SQLITE_N_COLC
1530: 41 43 48 45 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20  ACHE; jj++){.   
1540: 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61     struct yColCa
1550: 63 68 65 20 2a 78 20 3d 20 70 50 61 72 73 65 2d  che *x = pParse-
1560: 3e 61 43 6f 6c 43 61 63 68 65 20 2b 20 6a 6a 3b  >aColCache + jj;
1570: 0a 20 20 20 20 20 20 69 66 28 20 78 2d 3e 69 4c  .      if( x->iL
1580: 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43 61  evel>pParse->iCa
1590: 63 68 65 4c 65 76 65 6c 20 7c 7c 20 78 2d 3e 69  cheLevel || x->i
15a0: 52 65 67 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Reg==0 ) continu
15b0: 65 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  e;.      printf(
15c0: 22 20 72 5b 25 64 5d 3d 7b 25 64 3a 25 64 7d 22  " r[%d]={%d:%d}"
15d0: 2c 20 78 2d 3e 69 52 65 67 2c 20 78 2d 3e 69 54  , x->iReg, x->iT
15e0: 61 62 6c 65 2c 20 78 2d 3e 69 43 6f 6c 75 6d 6e  able, x->iColumn
15f0: 29 3b 0a 20 20 20 20 20 20 6b 6b 2b 2b 3b 0a 20  );.      kk++;. 
1600: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6b 6b 20     }.    if( kk 
1610: 29 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ) printf("\n");.
1620: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
1630: 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d  rintOp(0, i, &p-
1640: 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 74 65  >aOp[i]);.    te
1650: 73 74 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f  st_addop_breakpo
1660: 69 6e 74 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  int();.  }.#endi
1670: 66 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  f.#ifdef VDBE_PR
1680: 4f 46 49 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63  OFILE.  pOp->cyc
1690: 6c 65 73 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e  les = 0;.  pOp->
16a0: 63 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  cnt = 0;.#endif.
16b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44  #ifdef SQLITE_VD
16c0: 42 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 70 4f  BE_COVERAGE.  pO
16d0: 70 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 30 3b  p->iSrcLine = 0;
16e0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
16f0: 20 69 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65   i;.}.int sqlite
1700: 33 56 64 62 65 41 64 64 4f 70 30 28 56 64 62 65  3VdbeAddOp0(Vdbe
1710: 20 2a 70 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20   *p, int op){.  
1720: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
1730: 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20  beAddOp3(p, op, 
1740: 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20  0, 0, 0);.}.int 
1750: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1760: 31 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f  1(Vdbe *p, int o
1770: 70 2c 20 69 6e 74 20 70 31 29 7b 0a 20 20 72 65  p, int p1){.  re
1780: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
1790: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31  AddOp3(p, op, p1
17a0: 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73  , 0, 0);.}.int s
17b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17c0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
17d0: 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32  , int p1, int p2
17e0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
17f0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1800: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 30 29 3b   op, p1, p2, 0);
1810: 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20  .}../* Generate 
1820: 63 6f 64 65 20 66 6f 72 20 61 6e 20 75 6e 63 6f  code for an unco
1830: 6e 64 69 74 69 6f 6e 61 6c 20 6a 75 6d 70 20 74  nditional jump t
1840: 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 44  o instruction iD
1850: 65 73 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  est.*/.int sqlit
1860: 65 33 56 64 62 65 47 6f 74 6f 28 56 64 62 65 20  e3VdbeGoto(Vdbe 
1870: 2a 70 2c 20 69 6e 74 20 69 44 65 73 74 29 7b 0a  *p, int iDest){.
1880: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1890: 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 4f 50  VdbeAddOp3(p, OP
18a0: 5f 47 6f 74 6f 2c 20 30 2c 20 69 44 65 73 74 2c  _Goto, 0, iDest,
18b0: 20 30 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72   0);.}../* Gener
18c0: 61 74 65 20 63 6f 64 65 20 74 6f 20 63 61 75 73  ate code to caus
18d0: 65 20 74 68 65 20 73 74 72 69 6e 67 20 7a 53 74  e the string zSt
18e0: 72 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 69  r to be loaded i
18f0: 6e 74 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72 20  nto.** register 
1900: 69 44 65 73 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c  iDest.*/.int sql
1910: 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
1920: 6e 67 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ng(Vdbe *p, int 
1930: 69 44 65 73 74 2c 20 63 6f 6e 73 74 20 63 68 61  iDest, const cha
1940: 72 20 2a 7a 53 74 72 29 7b 0a 20 20 72 65 74 75  r *zStr){.  retu
1950: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
1960: 64 4f 70 34 28 70 2c 20 4f 50 5f 53 74 72 69 6e  dOp4(p, OP_Strin
1970: 67 38 2c 20 30 2c 20 69 44 65 73 74 2c 20 30 2c  g8, 0, iDest, 0,
1980: 20 7a 53 74 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a   zStr, 0);.}../*
1990: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
19a0: 65 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a  e that initializ
19b0: 65 73 20 6d 75 6c 74 69 70 6c 65 20 72 65 67 69  es multiple regi
19c0: 73 74 65 72 73 20 74 6f 20 73 74 72 69 6e 67 20  sters to string 
19d0: 6f 72 20 69 6e 74 65 67 65 72 0a 2a 2a 20 63 6f  or integer.** co
19e0: 6e 73 74 61 6e 74 73 2e 20 20 54 68 65 20 72 65  nstants.  The re
19f0: 67 69 73 74 65 72 73 20 62 65 67 69 6e 20 77 69  gisters begin wi
1a00: 74 68 20 69 44 65 73 74 20 61 6e 64 20 69 6e 63  th iDest and inc
1a10: 72 65 61 73 65 20 63 6f 6e 73 65 63 75 74 69 76  rease consecutiv
1a20: 65 6c 79 2e 0a 2a 2a 20 4f 6e 65 20 72 65 67 69  ely..** One regi
1a30: 73 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69  ster is initiali
1a40: 7a 65 64 20 66 6f 72 20 65 61 63 68 20 63 68 61  zed for each cha
1a50: 72 61 63 67 74 65 72 20 69 6e 20 7a 54 79 70 65  racgter in zType
1a60: 73 5b 5d 2e 20 20 46 6f 72 20 65 61 63 68 0a 2a  s[].  For each.*
1a70: 2a 20 22 73 22 20 63 68 61 72 61 63 74 65 72 20  * "s" character 
1a80: 69 6e 20 7a 54 79 70 65 73 5b 5d 2c 20 74 68 65  in zTypes[], the
1a90: 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20 73   register is a s
1aa0: 74 72 69 6e 67 20 69 66 20 74 68 65 20 61 72 67  tring if the arg
1ab0: 75 6d 65 6e 74 20 69 73 0a 2a 2a 20 6e 6f 74 20  ument is.** not 
1ac0: 4e 55 4c 4c 2c 20 6f 72 20 4f 50 5f 4e 75 6c 6c  NULL, or OP_Null
1ad0: 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73   if the value is
1ae0: 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2e   a null pointer.
1af0: 20 20 46 6f 72 20 65 61 63 68 20 22 69 22 20 63    For each "i" c
1b00: 68 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 7a  haracter.** in z
1b10: 54 79 70 65 73 5b 5d 2c 20 74 68 65 20 72 65 67  Types[], the reg
1b20: 69 73 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c  ister is initial
1b30: 69 7a 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 67  ized to an integ
1b40: 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  er..*/.void sqli
1b50: 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64  te3VdbeMultiLoad
1b60: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44  (Vdbe *p, int iD
1b70: 65 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  est, const char 
1b80: 2a 7a 54 79 70 65 73 2c 20 2e 2e 2e 29 7b 0a 20  *zTypes, ...){. 
1b90: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
1ba0: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a  nt i;.  char c;.
1bb0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
1bc0: 54 79 70 65 73 29 3b 0a 20 20 66 6f 72 28 69 3d  Types);.  for(i=
1bd0: 30 3b 20 28 63 20 3d 20 7a 54 79 70 65 73 5b 69  0; (c = zTypes[i
1be0: 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  ])!=0; i++){.   
1bf0: 20 69 66 28 20 63 3d 3d 27 73 27 20 29 7b 0a 20   if( c=='s' ){. 
1c00: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1c10: 2a 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  *z = va_arg(ap, 
1c20: 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20  const char*);.  
1c30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c40: 64 64 4f 70 34 28 70 2c 20 7a 3d 3d 30 20 3f 20  ddOp4(p, z==0 ? 
1c50: 4f 50 5f 4e 75 6c 6c 20 3a 20 4f 50 5f 53 74 72  OP_Null : OP_Str
1c60: 69 6e 67 38 2c 20 30 2c 20 69 44 65 73 74 2b 2b  ing8, 0, iDest++
1c70: 2c 20 30 2c 20 7a 2c 20 30 29 3b 0a 20 20 20 20  , 0, z, 0);.    
1c80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1c90: 65 72 74 28 20 63 3d 3d 27 69 27 20 29 3b 0a 20  ert( c=='i' );. 
1ca0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1cb0: 41 64 64 4f 70 32 28 70 2c 20 4f 50 5f 49 6e 74  AddOp2(p, OP_Int
1cc0: 65 67 65 72 2c 20 76 61 5f 61 72 67 28 61 70 2c  eger, va_arg(ap,
1cd0: 20 69 6e 74 29 2c 20 69 44 65 73 74 2b 2b 29 3b   int), iDest++);
1ce0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f  .    }.  }.  va_
1cf0: 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  end(ap);.}../*.*
1d00: 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20  * Add an opcode 
1d10: 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68  that includes th
1d20: 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 20  e p4 value as a 
1d30: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  pointer..*/.int 
1d40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d50: 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  4(.  Vdbe *p,   
1d60: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
1d70: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  the opcode to th
1d80: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f  is VM */.  int o
1d90: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
1da0: 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65  * The new opcode
1db0: 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20   */.  int p1,   
1dc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1dd0: 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P1 operand */. 
1de0: 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20   int p2,        
1df0: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f       /* The P2 o
1e00: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
1e10: 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p3,             
1e20: 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e  /* The P3 operan
1e30: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
1e40: 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68  r *zP4,    /* Th
1e50: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P4 operand */.
1e60: 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20    int p4type    
1e70: 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72        /* P4 oper
1e80: 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20  and type */.){. 
1e90: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
1ea0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1eb0: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
1ec0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
1ed0: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
1ee0: 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20   zP4, p4type);. 
1ef0: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
1f00: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70  ./*.** Add an op
1f10: 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64  code that includ
1f20: 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20  es the p4 value 
1f30: 77 69 74 68 20 61 20 50 34 5f 49 4e 54 36 34 20  with a P4_INT64 
1f40: 6f 72 0a 2a 2a 20 50 34 5f 52 45 41 4c 20 74 79  or.** P4_REAL ty
1f50: 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  pe..*/.int sqlit
1f60: 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
1f70: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
1f80: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
1f90: 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69  he opcode to thi
1fa0: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  s VM */.  int op
1fb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1fc0: 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20   The new opcode 
1fd0: 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20  */.  int p1,    
1fe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1ff0: 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P1 operand */.  
2000: 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20  int p2,         
2010: 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70      /* The P2 op
2020: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
2030: 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  3,             /
2040: 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64  * The P3 operand
2050: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
2060: 7a 50 34 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  zP4,      /* The
2070: 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P4 operand */. 
2080: 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20 20   int p4type     
2090: 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61       /* P4 opera
20a0: 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20  nd type */.){.  
20b0: 63 68 61 72 20 2a 70 34 63 6f 70 79 20 3d 20 73  char *p4copy = s
20c0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
20d0: 77 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  w(sqlite3VdbeDb(
20e0: 70 29 2c 20 38 29 3b 0a 20 20 69 66 28 20 70 34  p), 8);.  if( p4
20f0: 63 6f 70 79 20 29 20 6d 65 6d 63 70 79 28 70 34  copy ) memcpy(p4
2100: 63 6f 70 79 2c 20 7a 50 34 2c 20 38 29 3b 0a 20  copy, zP4, 8);. 
2110: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
2120: 64 62 65 41 64 64 4f 70 34 28 70 2c 20 6f 70 2c  dbeAddOp4(p, op,
2130: 20 70 31 2c 20 70 32 2c 20 70 33 2c 20 70 34 63   p1, p2, p3, p4c
2140: 6f 70 79 2c 20 70 34 74 79 70 65 29 3b 0a 7d 0a  opy, p4type);.}.
2150: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 4f 50  ./*.** Add an OP
2160: 5f 50 61 72 73 65 53 63 68 65 6d 61 20 6f 70 63  _ParseSchema opc
2170: 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ode.  This routi
2180: 6e 65 20 69 73 20 62 72 6f 6b 65 6e 20 6f 75 74  ne is broken out
2190: 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
21a0: 56 64 62 65 41 64 64 4f 70 34 28 29 20 73 69 6e  VdbeAddOp4() sin
21b0: 63 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20 61  ce it needs to a
21c0: 6c 73 6f 20 6e 65 65 64 73 20 74 6f 20 6d 61 72  lso needs to mar
21d0: 6b 20 61 6c 6c 20 62 74 72 65 65 73 0a 2a 2a 20  k all btrees.** 
21e0: 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20 75  as having been u
21f0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  sed..**.** The z
2200: 57 68 65 72 65 20 73 74 72 69 6e 67 20 6d 75 73  Where string mus
2210: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61  t have been obta
2220: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
2230: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54  3_malloc()..** T
2240: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
2250: 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20   take ownership 
2260: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  of the allocated
2270: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64   memory..*/.void
2280: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50   sqlite3VdbeAddP
2290: 61 72 73 65 53 63 68 65 6d 61 4f 70 28 56 64 62  arseSchemaOp(Vdb
22a0: 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 2c 20 63  e *p, int iDb, c
22b0: 68 61 72 20 2a 7a 57 68 65 72 65 29 7b 0a 20 20  har *zWhere){.  
22c0: 69 6e 74 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33  int j;.  sqlite3
22d0: 56 64 62 65 41 64 64 4f 70 34 28 70 2c 20 4f 50  VdbeAddOp4(p, OP
22e0: 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44  _ParseSchema, iD
22f0: 62 2c 20 30 2c 20 30 2c 20 7a 57 68 65 72 65 2c  b, 0, 0, zWhere,
2300: 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
2310: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62  for(j=0; j<p->db
2320: 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 20 73 71 6c 69  ->nDb; j++) sqli
2330: 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
2340: 28 70 2c 20 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (p, j);.}../*.**
2350: 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74   Add an opcode t
2360: 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65  hat includes the
2370: 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 6e 20   p4 value as an 
2380: 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20  integer..*/.int 
2390: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23a0: 34 49 6e 74 28 0a 20 20 56 64 62 65 20 2a 70 2c  4Int(.  Vdbe *p,
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
23c0: 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f  dd the opcode to
23d0: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
23e0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
23f0: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63    /* The new opc
2400: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c  ode */.  int p1,
2410: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2420: 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a  The P1 operand *
2430: 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20  /.  int p2,     
2440: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
2450: 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  2 operand */.  i
2460: 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20  nt p3,          
2470: 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65     /* The P3 ope
2480: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34  rand */.  int p4
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24a0: 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   The P4 operand 
24b0: 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f  as an integer */
24c0: 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d  .){.  int addr =
24d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24e0: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
24f0: 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33  , p3);.  sqlite3
2500: 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20  VdbeChangeP4(p, 
2510: 61 64 64 72 2c 20 53 51 4c 49 54 45 5f 49 4e 54  addr, SQLITE_INT
2520: 5f 54 4f 5f 50 54 52 28 70 34 29 2c 20 50 34 5f  _TO_PTR(p4), P4_
2530: 49 4e 54 33 32 29 3b 0a 20 20 72 65 74 75 72 6e  INT32);.  return
2540: 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
2550: 43 72 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d  Create a new sym
2560: 62 6f 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20  bolic label for 
2570: 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
2580: 68 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62  hat has yet to b
2590: 65 0a 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65  e.** coded.  The
25a0: 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20   symbolic label 
25b0: 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61  is really just a
25c0: 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
25d0: 2e 20 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20  .  The.** label 
25e0: 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 74  can be used as t
25f0: 68 65 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61  he P2 value of a
2600: 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61  n operation.  La
2610: 74 65 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65  ter, when.** the
2620: 20 6c 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76   label is resolv
2630: 65 64 20 74 6f 20 61 20 73 70 65 63 69 66 69 63  ed to a specific
2640: 20 61 64 64 72 65 73 73 2c 20 74 68 65 20 56 44   address, the VD
2650: 42 45 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20  BE will scan.** 
2660: 74 68 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72  through its oper
2670: 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63  ation list and c
2680: 68 61 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73  hange all values
2690: 20 6f 66 20 50 32 20 77 68 69 63 68 20 6d 61 74   of P2 which mat
26a0: 63 68 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20  ch.** the label 
26b0: 69 6e 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65  into the resolve
26c0: 64 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a  d address..**.**
26d0: 20 54 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20   The VDBE knows 
26e0: 74 68 61 74 20 61 20 50 32 20 76 61 6c 75 65 20  that a P2 value 
26f0: 69 73 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75  is a label becau
2700: 73 65 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a  se labels are.**
2710: 20 61 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65   always negative
2720: 20 61 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61   and P2 values a
2730: 72 65 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65  re suppose to be
2740: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a   non-negative..*
2750: 2a 20 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74  * Hence, a negat
2760: 69 76 65 20 50 32 20 76 61 6c 75 65 20 69 73 20  ive P2 value is 
2770: 61 20 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73  a label that has
2780: 20 79 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c   yet to be resol
2790: 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20  ved..**.** Zero 
27a0: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61  is returned if a
27b0: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e   malloc() fails.
27c0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
27d0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62  dbeMakeLabel(Vdb
27e0: 65 20 2a 76 29 7b 0a 20 20 50 61 72 73 65 20 2a  e *v){.  Parse *
27f0: 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20  p = v->pParse;. 
2800: 20 69 6e 74 20 69 20 3d 20 70 2d 3e 6e 4c 61 62   int i = p->nLab
2810: 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20  el++;.  assert( 
2820: 76 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  v->magic==VDBE_M
2830: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
2840: 66 28 20 28 69 20 26 20 28 69 2d 31 29 29 3d 3d  f( (i & (i-1))==
2850: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62  0 ){.    p->aLab
2860: 65 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  el = sqlite3DbRe
2870: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64  allocOrFree(p->d
2880: 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 20 0a 20  b, p->aLabel, . 
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b0: 20 20 20 20 20 20 28 69 2a 32 2b 31 29 2a 73 69        (i*2+1)*si
28c0: 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30  zeof(p->aLabel[0
28d0: 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ]));.  }.  if( p
28e0: 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20  ->aLabel ){.    
28f0: 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d  p->aLabel[i] = -
2900: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
2910: 41 44 44 52 28 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ADDR(i);.}../*.*
2920: 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20  * Resolve label 
2930: 22 78 22 20 74 6f 20 62 65 20 74 68 65 20 61 64  "x" to be the ad
2940: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
2950: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
2960: 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e  .** be inserted.
2970: 20 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20    The parameter 
2980: 22 78 22 20 6d 75 73 74 20 68 61 76 65 20 62 65  "x" must have be
2990: 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  en obtained from
29a0: 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c  .** a prior call
29b0: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d   to sqlite3VdbeM
29c0: 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76  akeLabel()..*/.v
29d0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
29e0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65  esolveLabel(Vdbe
29f0: 20 2a 76 2c 20 69 6e 74 20 78 29 7b 0a 20 20 50   *v, int x){.  P
2a00: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
2a10: 72 73 65 3b 0a 20 20 69 6e 74 20 6a 20 3d 20 41  rse;.  int j = A
2a20: 44 44 52 28 78 29 3b 0a 20 20 61 73 73 65 72 74  DDR(x);.  assert
2a30: 28 20 76 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( v->magic==VDBE
2a40: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
2a50: 20 61 73 73 65 72 74 28 20 6a 3c 70 2d 3e 6e 4c   assert( j<p->nL
2a60: 61 62 65 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  abel );.  assert
2a70: 28 20 6a 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  ( j>=0 );.  if( 
2a80: 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20  p->aLabel ){.   
2a90: 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20   p->aLabel[j] = 
2aa0: 76 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 20 20 70 2d  v->nOp;.  }.  p-
2ab0: 3e 69 46 69 78 65 64 4f 70 20 3d 20 76 2d 3e 6e  >iFixedOp = v->n
2ac0: 4f 70 20 2d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Op - 1;.}../*.**
2ad0: 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20 61   Mark the VDBE a
2ae0: 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 6f  s one that can o
2af0: 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65 20 74  nly be run one t
2b00: 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ime..*/.void sql
2b10: 69 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f  ite3VdbeRunOnlyO
2b20: 6e 63 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  nce(Vdbe *p){.  
2b30: 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d  p->runOnlyOnce =
2b40: 20 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51   1;.}..#ifdef SQ
2b50: 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73 71  LITE_DEBUG /* sq
2b60: 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62  lite3AssertMayAb
2b70: 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a  ort() logic */..
2b80: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
2b90: 69 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75 6e  ing type and fun
2ba0: 63 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74  ction are used t
2bb0: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
2bc0: 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a  h all opcodes.**
2bd0: 20 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e 20   in a Vdbe main 
2be0: 70 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63 68  program and each
2bf0: 20 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67   of the sub-prog
2c00: 72 61 6d 73 20 28 74 72 69 67 67 65 72 73 29 20  rams (triggers) 
2c10: 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b  it may .** invok
2c20: 65 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e  e directly or in
2c30: 64 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68 6f  directly. It sho
2c40: 75 6c 64 20 62 65 20 75 73 65 64 20 61 73 20 66  uld be used as f
2c50: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
2c60: 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64  Op *pOp;.**   Vd
2c70: 62 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a  beOpIter sIter;.
2c80: 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26  **.**   memset(&
2c90: 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  sIter, 0, sizeof
2ca0: 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73  (sIter));.**   s
2cb0: 49 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20 20  Iter.v = v;     
2cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd0: 20 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20 6f         // v is o
2ce0: 66 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a  f type Vdbe* .**
2cf0: 20 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d     while( (pOp =
2d00: 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74   opIterNext(&sIt
2d10: 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f  er)) ){.**     /
2d20: 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77  / Do something w
2d30: 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a  ith pOp.**   }.*
2d40: 2a 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  *   sqlite3DbFre
2d50: 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61  e(v->db, sIter.a
2d60: 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79  pSub);.** .*/.ty
2d70: 70 65 64 65 66 20 73 74 72 75 63 74 20 56 64 62  pedef struct Vdb
2d80: 65 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49 74  eOpIter VdbeOpIt
2d90: 65 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65 4f  er;.struct VdbeO
2da0: 70 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20 2a  pIter {.  Vdbe *
2db0: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
2dc0: 20 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20       /* Vdbe to 
2dd0: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
2de0: 74 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a  the opcodes of *
2df0: 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a  /.  SubProgram *
2e00: 2a 61 70 53 75 62 3b 20 20 20 20 20 20 20 20 2f  *apSub;        /
2e10: 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 70 72  * Array of subpr
2e20: 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20  ograms */.  int 
2e30: 6e 53 75 62 3b 20 20 20 20 20 20 20 20 20 20 20  nSub;           
2e40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2e50: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
2e60: 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41  pSub */.  int iA
2e70: 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ddr;            
2e80: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
2e90: 6f 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  of next instruct
2ea0: 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ion to return */
2eb0: 0a 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20 20  .  int iSub;    
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ed0: 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61   0 = main progra
2ee0: 6d 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75 62  m, 1 = first sub
2ef0: 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f  -program etc. */
2f00: 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f  .};.static Op *o
2f10: 70 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f 70  pIterNext(VdbeOp
2f20: 49 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62 65  Iter *p){.  Vdbe
2f30: 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70   *v = p->v;.  Op
2f40: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70   *pRet = 0;.  Op
2f50: 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70   *aOp;.  int nOp
2f60: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75 62  ;..  if( p->iSub
2f70: 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20  <=p->nSub ){..  
2f80: 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30    if( p->iSub==0
2f90: 20 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20   ){.      aOp = 
2fa0: 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f  v->aOp;.      nO
2fb0: 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20  p = v->nOp;.    
2fc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f 70  }else{.      aOp
2fd0: 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69   = p->apSub[p->i
2fe0: 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20  Sub-1]->aOp;.   
2ff0: 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75     nOp = p->apSu
3000: 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f  b[p->iSub-1]->nO
3010: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  p;.    }.    ass
3020: 65 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f  ert( p->iAddr<nO
3030: 70 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d  p );..    pRet =
3040: 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b   &aOp[p->iAddr];
3050: 0a 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b  .    p->iAddr++;
3060: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64 64  .    if( p->iAdd
3070: 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20  r==nOp ){.      
3080: 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20  p->iSub++;.     
3090: 20 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20   p->iAddr = 0;. 
30a0: 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
30b0: 70 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34  pRet->p4type==P4
30c0: 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20  _SUBPROGRAM ){. 
30d0: 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d       int nByte =
30e0: 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 7a   (p->nSub+1)*siz
30f0: 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29  eof(SubProgram*)
3100: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
3110: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
3120: 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20  p->nSub; j++){. 
3130: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 70         if( p->ap
3140: 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34  Sub[j]==pRet->p4
3150: 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61  .pProgram ) brea
3160: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
3170: 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20   if( j==p->nSub 
3180: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70  ){.        p->ap
3190: 53 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62 52  Sub = sqlite3DbR
31a0: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d 3e  eallocOrFree(v->
31b0: 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e 42  db, p->apSub, nB
31c0: 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  yte);.        if
31d0: 28 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a 20  ( !p->apSub ){. 
31e0: 20 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20           pRet = 
31f0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
3200: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  {.          p->a
3210: 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20  pSub[p->nSub++] 
3220: 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67  = pRet->p4.pProg
3230: 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ram;.        }. 
3240: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
3250: 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ..  return pRet;
3260: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
3270: 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 73  if the program s
3280: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d 20  tored in the VM 
3290: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
32a0: 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74 68  pParse may.** th
32b0: 72 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63  row an ABORT exc
32c0: 65 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67 20  eption (causing 
32d0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 62  the statement, b
32e0: 75 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74 72  ut not entire tr
32f0: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20  ansaction.** to 
3300: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2e  be rolled back).
3310: 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20   This condition 
3320: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6d  is true if the m
3330: 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20 61  ain program or a
3340: 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72 61  ny.** sub-progra
3350: 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20  ms contains any 
3360: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
3370: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  :.**.**   *  OP_
3380: 48 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c  Halt with P1=SQL
3390: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61  ITE_CONSTRAINT a
33a0: 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a  nd P2=OE_Abort..
33b0: 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 49  **   *  OP_HaltI
33c0: 66 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53 51  fNull with P1=SQ
33d0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
33e0: 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e  and P2=OE_Abort.
33f0: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74  .**   *  OP_Dest
3400: 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56  roy.**   *  OP_V
3410: 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f  Update.**   *  O
3420: 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a  P_VRename.**   *
3430: 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 77    OP_FkCounter w
3440: 69 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65 64  ith P2==0 (immed
3450: 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  iate foreign key
3460: 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a 20   constraint).** 
3470: 20 20 2a 20 20 4f 50 5f 43 72 65 61 74 65 54 61    *  OP_CreateTa
3480: 62 6c 65 20 61 6e 64 20 4f 50 5f 49 6e 69 74 43  ble and OP_InitC
3490: 6f 72 6f 75 74 69 6e 65 20 28 66 6f 72 20 43 52  oroutine (for CR
34a0: 45 41 54 45 20 54 41 42 4c 45 20 41 53 20 53 45  EATE TABLE AS SE
34b0: 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  LECT ...).**.** 
34c0: 54 68 65 6e 20 63 68 65 63 6b 20 74 68 61 74 20  Then check that 
34d0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 72  the value of Par
34e0: 73 65 2e 6d 61 79 41 62 6f 72 74 20 69 73 20 74  se.mayAbort is t
34f0: 72 75 65 20 69 66 20 61 6e 0a 2a 2a 20 41 42 4f  rue if an.** ABO
3500: 52 54 20 6d 61 79 20 62 65 20 74 68 72 6f 77 6e  RT may be thrown
3510: 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
3520: 77 69 73 65 2e 20 52 65 74 75 72 6e 20 74 72 75  wise. Return tru
3530: 65 20 69 66 20 69 74 20 64 6f 65 73 0a 2a 2a 20  e if it does.** 
3540: 6d 61 74 63 68 2c 20 6f 72 20 66 61 6c 73 65 20  match, or false 
3550: 6f 74 68 65 72 77 69 73 65 2e 20 54 68 69 73 20  otherwise. This 
3560: 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 74 65  function is inte
3570: 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  nded to be used 
3580: 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 61 6e  as.** part of an
3590: 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e   assert statemen
35a0: 74 20 69 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65  t in the compile
35b0: 72 2e 20 53 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a  r. Similar to:.*
35c0: 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 73  *.**   assert( s
35d0: 71 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74  qlite3VdbeAssert
35e0: 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 2d  MayAbort(pParse-
35f0: 3e 70 56 64 62 65 2c 20 70 50 61 72 73 65 2d 3e  >pVdbe, pParse->
3600: 6d 61 79 41 62 6f 72 74 29 20 29 3b 0a 2a 2f 0a  mayAbort) );.*/.
3610: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
3620: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 56 64  ssertMayAbort(Vd
3630: 62 65 20 2a 76 2c 20 69 6e 74 20 6d 61 79 41 62  be *v, int mayAb
3640: 6f 72 74 29 7b 0a 20 20 69 6e 74 20 68 61 73 41  ort){.  int hasA
3650: 62 6f 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  bort = 0;.  int 
3660: 68 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 30  hasFkCounter = 0
3670: 3b 0a 20 20 69 6e 74 20 68 61 73 43 72 65 61 74  ;.  int hasCreat
3680: 65 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 69 6e  eTable = 0;.  in
3690: 74 20 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69  t hasInitCorouti
36a0: 6e 65 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 70 4f  ne = 0;.  Op *pO
36b0: 70 3b 0a 20 20 56 64 62 65 4f 70 49 74 65 72 20  p;.  VdbeOpIter 
36c0: 73 49 74 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28  sIter;.  memset(
36d0: 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  &sIter, 0, sizeo
36e0: 66 28 73 49 74 65 72 29 29 3b 0a 20 20 73 49 74  f(sIter));.  sIt
36f0: 65 72 2e 76 20 3d 20 76 3b 0a 0a 20 20 77 68 69  er.v = v;..  whi
3700: 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74 65  le( (pOp = opIte
3710: 72 4e 65 78 74 28 26 73 49 74 65 72 29 29 21 3d  rNext(&sIter))!=
3720: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 63  0 ){.    int opc
3730: 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64  ode = pOp->opcod
3740: 65 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64  e;.    if( opcod
3750: 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20 7c 7c  e==OP_Destroy ||
3760: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64   opcode==OP_VUpd
3770: 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  ate || opcode==O
3780: 50 5f 56 52 65 6e 61 6d 65 20 0a 20 20 20 20 20  P_VRename .     
3790: 7c 7c 20 28 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f  || ((opcode==OP_
37a0: 48 61 6c 74 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d  Halt || opcode==
37b0: 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 29 20 0a  OP_HaltIfNull) .
37c0: 20 20 20 20 20 20 26 26 20 28 28 70 4f 70 2d 3e        && ((pOp->
37d0: 70 31 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  p1&0xff)==SQLITE
37e0: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70  _CONSTRAINT && p
37f0: 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74  Op->p2==OE_Abort
3800: 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
3810: 68 61 73 41 62 6f 72 74 20 3d 20 31 3b 0a 20 20  hasAbort = 1;.  
3820: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3830: 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d  .    if( opcode=
3840: 3d 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20  =OP_CreateTable 
3850: 29 20 68 61 73 43 72 65 61 74 65 54 61 62 6c 65  ) hasCreateTable
3860: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 6f 70   = 1;.    if( op
3870: 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 43 6f 72  code==OP_InitCor
3880: 6f 75 74 69 6e 65 20 29 20 68 61 73 49 6e 69 74  outine ) hasInit
3890: 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 23  Coroutine = 1;.#
38a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
38b0: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
38c0: 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f     if( opcode==O
38d0: 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26 26 20 70  P_FkCounter && p
38e0: 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20 70 4f 70  Op->p1==0 && pOp
38f0: 2d 3e 70 32 3d 3d 31 20 29 7b 0a 20 20 20 20 20  ->p2==1 ){.     
3900: 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20   hasFkCounter = 
3910: 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  1;.    }.#endif.
3920: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
3930: 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72  ree(v->db, sIter
3940: 2e 61 70 53 75 62 29 3b 0a 0a 20 20 2f 2a 20 52  .apSub);..  /* R
3950: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 68 61  eturn true if ha
3960: 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74  sAbort==mayAbort
3970: 2e 20 4f 72 20 69 66 20 61 20 6d 61 6c 6c 6f 63  . Or if a malloc
3980: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
3990: 64 2e 0a 20 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f  d..  ** If mallo
39a0: 63 20 66 61 69 6c 65 64 2c 20 74 68 65 6e 20 74  c failed, then t
39b0: 68 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f 70 20  he while() loop 
39c0: 61 62 6f 76 65 20 6d 61 79 20 6e 6f 74 20 68 61  above may not ha
39d0: 76 65 20 69 74 65 72 61 74 65 64 0a 20 20 2a 2a  ve iterated.  **
39e0: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63   through all opc
39f0: 6f 64 65 73 20 61 6e 64 20 68 61 73 41 62 6f 72  odes and hasAbor
3a00: 74 20 6d 61 79 20 62 65 20 73 65 74 20 69 6e 63  t may be set inc
3a10: 6f 72 72 65 63 74 6c 79 2e 20 52 65 74 75 72 6e  orrectly. Return
3a20: 0a 20 20 2a 2a 20 74 72 75 65 20 66 6f 72 20 74  .  ** true for t
3a30: 68 69 73 20 63 61 73 65 20 74 6f 20 70 72 65 76  his case to prev
3a40: 65 6e 74 20 74 68 65 20 61 73 73 65 72 74 28 29  ent the assert()
3a50: 20 69 6e 20 74 68 65 20 63 61 6c 6c 65 72 73 20   in the callers 
3a60: 66 72 61 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d 20  frame.  ** from 
3a70: 66 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 72  failing.  */.  r
3a80: 65 74 75 72 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d  eturn ( v->db->m
3a90: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 68  allocFailed || h
3aa0: 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72  asAbort==mayAbor
3ab0: 74 20 7c 7c 20 68 61 73 46 6b 43 6f 75 6e 74 65  t || hasFkCounte
3ac0: 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r.              
3ad0: 7c 7c 20 28 68 61 73 43 72 65 61 74 65 54 61 62  || (hasCreateTab
3ae0: 6c 65 20 26 26 20 68 61 73 49 6e 69 74 43 6f 72  le && hasInitCor
3af0: 6f 75 74 69 6e 65 29 20 29 3b 0a 7d 0a 23 65 6e  outine) );.}.#en
3b00: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
3b10: 42 55 47 20 2d 20 74 68 65 20 73 71 6c 69 74 65  BUG - the sqlite
3b20: 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  3AssertMayAbort(
3b30: 29 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f  ) function */../
3b40: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3b50: 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  e is called afte
3b60: 72 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61  r all opcodes ha
3b70: 76 65 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64  ve been inserted
3b80: 2e 20 20 49 74 20 6c 6f 6f 70 73 0a 2a 2a 20 74  .  It loops.** t
3b90: 68 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 6f  hrough all the o
3ba0: 70 63 6f 64 65 73 20 61 6e 64 20 66 69 78 65 73  pcodes and fixes
3bb0: 20 75 70 20 73 6f 6d 65 20 64 65 74 61 69 6c 73   up some details
3bc0: 2e 0a 2a 2a 0a 2a 2a 20 28 31 29 20 46 6f 72 20  ..**.** (1) For 
3bd0: 65 61 63 68 20 6a 75 6d 70 20 69 6e 73 74 72 75  each jump instru
3be0: 63 74 69 6f 6e 20 77 69 74 68 20 61 20 6e 65 67  ction with a neg
3bf0: 61 74 69 76 65 20 50 32 20 76 61 6c 75 65 20 28  ative P2 value (
3c00: 61 20 6c 61 62 65 6c 29 0a 2a 2a 20 20 20 20 20  a label).**     
3c10: 72 65 73 6f 6c 76 65 20 74 68 65 20 50 32 20 76  resolve the P2 v
3c20: 61 6c 75 65 20 74 6f 20 61 6e 20 61 63 74 75 61  alue to an actua
3c30: 6c 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a  l address..**.**
3c40: 20 28 32 29 20 43 6f 6d 70 75 74 65 20 74 68 65   (2) Compute the
3c50: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
3c60: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 75 73 65  of arguments use
3c70: 64 20 62 79 20 61 6e 79 20 53 51 4c 20 66 75 6e  d by any SQL fun
3c80: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 61 6e 64  ction.**     and
3c90: 20 73 74 6f 72 65 20 74 68 61 74 20 76 61 6c 75   store that valu
3ca0: 65 20 69 6e 20 2a 70 4d 61 78 46 75 6e 63 41 72  e in *pMaxFuncAr
3cb0: 67 73 2e 0a 2a 2a 0a 2a 2a 20 28 33 29 20 55 70  gs..**.** (3) Up
3cc0: 64 61 74 65 20 74 68 65 20 56 64 62 65 2e 72 65  date the Vdbe.re
3cd0: 61 64 4f 6e 6c 79 20 61 6e 64 20 56 64 62 65 2e  adOnly and Vdbe.
3ce0: 62 49 73 52 65 61 64 65 72 20 66 6c 61 67 73 20  bIsReader flags 
3cf0: 74 6f 20 61 63 63 75 72 61 74 65 6c 79 0a 2a 2a  to accurately.**
3d00: 20 20 20 20 20 69 6e 64 69 63 61 74 65 20 77 68       indicate wh
3d10: 61 74 20 74 68 65 20 70 72 65 70 61 72 65 64 20  at the prepared 
3d20: 73 74 61 74 65 6d 65 6e 74 20 61 63 74 75 61 6c  statement actual
3d30: 6c 79 20 64 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 28  ly does..**.** (
3d40: 34 29 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  4) Initialize th
3d50: 65 20 70 34 2e 78 41 64 76 61 6e 63 65 20 70 6f  e p4.xAdvance po
3d60: 69 6e 74 65 72 20 6f 6e 20 6f 70 63 6f 64 65 73  inter on opcodes
3d70: 20 74 68 61 74 20 75 73 65 20 69 74 2e 0a 2a 2a   that use it..**
3d80: 0a 2a 2a 20 28 35 29 20 52 65 63 6c 61 69 6d 20  .** (5) Reclaim 
3d90: 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
3da0: 61 74 65 64 20 66 6f 72 20 73 74 6f 72 69 6e 67  ated for storing
3db0: 20 6c 61 62 65 6c 73 2e 0a 2a 2f 0a 73 74 61 74   labels..*/.stat
3dc0: 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50  ic void resolveP
3dd0: 32 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c  2Values(Vdbe *p,
3de0: 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72   int *pMaxFuncAr
3df0: 67 73 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  gs){.  int i;.  
3e00: 69 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a  int nMaxArgs = *
3e10: 70 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20 20  pMaxFuncArgs;.  
3e20: 4f 70 20 2a 70 4f 70 3b 0a 20 20 50 61 72 73 65  Op *pOp;.  Parse
3e30: 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50   *pParse = p->pP
3e40: 61 72 73 65 3b 0a 20 20 69 6e 74 20 2a 61 4c 61  arse;.  int *aLa
3e50: 62 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 61 4c  bel = pParse->aL
3e60: 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f  abel;.  p->readO
3e70: 6e 6c 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 62 49  nly = 1;.  p->bI
3e80: 73 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 66  sReader = 0;.  f
3e90: 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69  or(pOp=p->aOp, i
3ea0: 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b  =p->nOp-1; i>=0;
3eb0: 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20   i--, pOp++){.  
3ec0: 20 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f    u8 opcode = pO
3ed0: 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20  p->opcode;..    
3ee0: 2f 2a 20 4e 4f 54 45 3a 20 42 65 20 73 75 72 65  /* NOTE: Be sure
3ef0: 20 74 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70 63   to update mkopc
3f00: 6f 64 65 68 2e 74 63 6c 20 77 68 65 6e 20 61 64  odeh.tcl when ad
3f10: 64 69 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e 67  ding or removing
3f20: 0a 20 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72  .    ** cases fr
3f30: 6f 6d 20 74 68 69 73 20 73 77 69 74 63 68 21 20  om this switch! 
3f40: 2a 2f 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f  */.    switch( o
3f50: 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63  pcode ){.      c
3f60: 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  ase OP_Transacti
3f70: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  on: {.        if
3f80: 28 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29 20 70  ( pOp->p2!=0 ) p
3f90: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a  ->readOnly = 0;.
3fa0: 20 20 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20          /* fall 
3fb0: 74 68 72 75 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  thru */.      }.
3fc0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41 75        case OP_Au
3fd0: 74 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20 20  toCommit:.      
3fe0: 63 61 73 65 20 4f 50 5f 53 61 76 65 70 6f 69 6e  case OP_Savepoin
3ff0: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  t: {.        p->
4000: 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20  bIsReader = 1;. 
4010: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4020: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
4030: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
4040: 20 20 20 20 63 61 73 65 20 4f 50 5f 43 68 65 63      case OP_Chec
4050: 6b 70 6f 69 6e 74 3a 0a 23 65 6e 64 69 66 0a 20  kpoint:.#endif. 
4060: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 61 63       case OP_Vac
4070: 75 75 6d 3a 0a 20 20 20 20 20 20 63 61 73 65 20  uum:.      case 
4080: 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20  OP_JournalMode: 
4090: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 65 61  {.        p->rea
40a0: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20  dOnly = 0;.     
40b0: 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20     p->bIsReader 
40c0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 1;.        bre
40d0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e  ak;.      }.#ifn
40e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
40f0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
4100: 20 20 20 63 61 73 65 20 4f 50 5f 56 55 70 64 61     case OP_VUpda
4110: 74 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  te: {.        if
4120: 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72  ( pOp->p2>nMaxAr
4130: 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20  gs ) nMaxArgs = 
4140: 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20  pOp->p2;.       
4150: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4160: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 46        case OP_VF
4170: 69 6c 74 65 72 3a 20 7b 0a 20 20 20 20 20 20 20  ilter: {.       
4180: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20   int n;.        
4190: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d  assert( p->nOp -
41a0: 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20   i >= 3 );.     
41b0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d     assert( pOp[-
41c0: 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  1].opcode==OP_In
41d0: 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20 20 20  teger );.       
41e0: 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b   n = pOp[-1].p1;
41f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 3e 6e  .        if( n>n
4200: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
4210: 67 73 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20  gs = n;.        
4220: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  break;.      }.#
4230: 65 6e 64 69 66 0a 20 20 20 20 20 20 63 61 73 65  endif.      case
4240: 20 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20 20 20   OP_Next:.      
4250: 63 61 73 65 20 4f 50 5f 4e 65 78 74 49 66 4f 70  case OP_NextIfOp
4260: 65 6e 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  en:.      case O
4270: 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a 20 7b 0a  P_SorterNext: {.
4280: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e          pOp->p4.
4290: 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74  xAdvance = sqlit
42a0: 65 33 42 74 72 65 65 4e 65 78 74 3b 0a 20 20 20  e3BtreeNext;.   
42b0: 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65       pOp->p4type
42c0: 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20   = P4_ADVANCE;. 
42d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
42e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
42f0: 20 4f 50 5f 50 72 65 76 3a 0a 20 20 20 20 20 20   OP_Prev:.      
4300: 63 61 73 65 20 4f 50 5f 50 72 65 76 49 66 4f 70  case OP_PrevIfOp
4310: 65 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 4f  en: {.        pO
4320: 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d  p->p4.xAdvance =
4330: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
4340: 76 69 6f 75 73 3b 0a 20 20 20 20 20 20 20 20 70  vious;.        p
4350: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
4360: 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20  ADVANCE;.       
4370: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4380: 20 20 20 20 7d 0a 0a 20 20 20 20 70 4f 70 2d 3e      }..    pOp->
4390: 6f 70 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65  opflags = sqlite
43a0: 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b  3OpcodeProperty[
43b0: 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 20 69 66 28  opcode];.    if(
43c0: 20 28 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26   (pOp->opflags &
43d0: 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20   OPFLG_JUMP)!=0 
43e0: 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a  && pOp->p2<0 ){.
43f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 41 44        assert( AD
4400: 44 52 28 70 4f 70 2d 3e 70 32 29 3c 70 50 61 72  DR(pOp->p2)<pPar
4410: 73 65 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20  se->nLabel );.  
4420: 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c      pOp->p2 = aL
4430: 61 62 65 6c 5b 41 44 44 52 28 70 4f 70 2d 3e 70  abel[ADDR(pOp->p
4440: 32 29 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  2)];.    }.  }. 
4450: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
4460: 2d 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 4c  ->db, pParse->aL
4470: 61 62 65 6c 29 3b 0a 20 20 70 50 61 72 73 65 2d  abel);.  pParse-
4480: 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 70  >aLabel = 0;.  p
4490: 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 3d 20  Parse->nLabel = 
44a0: 30 3b 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72  0;.  *pMaxFuncAr
44b0: 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 20  gs = nMaxArgs;. 
44c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52   assert( p->bIsR
44d0: 65 61 64 65 72 21 3d 30 20 7c 7c 20 44 62 4d 61  eader!=0 || DbMa
44e0: 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72  skAllZero(p->btr
44f0: 65 65 4d 61 73 6b 29 20 29 3b 0a 7d 0a 0a 2f 2a  eeMask) );.}../*
4500: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
4510: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
4520: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
4530: 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a  o be inserted..*
4540: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
4550: 65 43 75 72 72 65 6e 74 41 64 64 72 28 56 64 62  eCurrentAddr(Vdb
4560: 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
4570: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
4580: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
4590: 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d  return p->nOp;.}
45a0: 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74  ../*.** Verify t
45b0: 68 61 74 20 61 74 20 6c 65 61 73 74 20 4e 20 6f  hat at least N o
45c0: 70 63 6f 64 65 20 73 6c 6f 74 73 20 61 72 65 20  pcode slots are 
45d0: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 20 77  available in p w
45e0: 69 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69 6e 67  ithout.** having
45f0: 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 6f 72 20 6d   to malloc for m
4600: 6f 72 65 20 73 70 61 63 65 20 28 65 78 63 65 70  ore space (excep
4610: 74 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20  t when compiled 
4620: 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 5f  using.** SQLITE_
4630: 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52  TEST_REALLOC_STR
4640: 45 53 53 29 2e 20 20 54 68 69 73 20 69 6e 74 65  ESS).  This inte
4650: 72 66 61 63 65 20 69 73 20 75 73 65 64 20 64 75  rface is used du
4660: 72 69 6e 67 20 74 65 73 74 69 6e 67 0a 2a 2a 20  ring testing.** 
4670: 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 63  to verify that c
4680: 65 72 74 61 69 6e 20 63 61 6c 6c 73 20 74 6f 20  ertain calls to 
4690: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
46a0: 4c 69 73 74 28 29 20 63 61 6e 20 6e 65 76 65 72  List() can never
46b0: 0a 2a 2a 20 66 61 69 6c 20 64 75 65 20 74 6f 20  .** fail due to 
46c0: 61 20 4f 4f 4d 20 66 61 75 6c 74 20 61 6e 64 20  a OOM fault and 
46d0: 68 65 6e 63 65 20 74 68 61 74 20 74 68 65 20 72  hence that the r
46e0: 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d  eturn value from
46f0: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41  .** sqlite3VdbeA
4700: 64 64 4f 70 4c 69 73 74 28 29 20 77 69 6c 6c 20  ddOpList() will 
4710: 61 6c 77 61 79 73 20 62 65 20 6e 6f 6e 2d 4e 55  always be non-NU
4720: 4c 4c 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  LL..*/.#if defin
4730: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
4740: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
4750: 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43  ITE_TEST_REALLOC
4760: 5f 53 54 52 45 53 53 29 0a 76 6f 69 64 20 73 71  _STRESS).void sq
4770: 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79 4e  lite3VdbeVerifyN
4780: 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65 64 28  oMallocRequired(
4790: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 4e 29 7b  Vdbe *p, int N){
47a0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
47b0: 70 20 2b 20 4e 20 3c 3d 20 70 2d 3e 70 50 61 72  p + N <= p->pPar
47c0: 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29 3b 0a  se->nOpAlloc );.
47d0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
47e0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
47f0: 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
4800: 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  to the array of 
4810: 6f 70 63 6f 64 65 73 20 61 73 73 6f 63 69 61 74  opcodes associat
4820: 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 56  ed with.** the V
4830: 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dbe passed as th
4840: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
4850: 2e 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c  . It is the call
4860: 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  ers responsibili
4870: 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65  ty.** to arrange
4880: 20 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e 65   for the returne
4890: 64 20 61 72 72 61 79 20 74 6f 20 62 65 20 65 76  d array to be ev
48a0: 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75  entually freed u
48b0: 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76 64 62  sing the .** vdb
48c0: 65 46 72 65 65 4f 70 41 72 72 61 79 28 29 20 66  eFreeOpArray() f
48d0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42  unction..**.** B
48e0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
48f0: 20 2a 70 6e 4f 70 20 69 73 20 73 65 74 20 74 6f   *pnOp is set to
4900: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
4910: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 72 65  ntries in the re
4920: 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e  turned.** array.
4930: 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67   Also, *pnMaxArg
4940: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6c   is set to the l
4950: 61 72 67 65 72 20 6f 66 20 69 74 73 20 63 75 72  arger of its cur
4960: 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20 0a  rent value and .
4970: 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
4980: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
4990: 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72  Vdbe.apArg[] arr
49a0: 61 79 20 72 65 71 75 69 72 65 64 20 74 6f 20 65  ay required to e
49b0: 78 65 63 75 74 65 20 74 68 65 20 0a 2a 2a 20 72  xecute the .** r
49c0: 65 74 75 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e  eturned program.
49d0: 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69  .*/.VdbeOp *sqli
49e0: 74 65 33 56 64 62 65 54 61 6b 65 4f 70 41 72 72  te3VdbeTakeOpArr
49f0: 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ay(Vdbe *p, int 
4a00: 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61  *pnOp, int *pnMa
4a10: 78 41 72 67 29 7b 0a 20 20 56 64 62 65 4f 70 20  xArg){.  VdbeOp 
4a20: 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20  *aOp = p->aOp;. 
4a30: 20 61 73 73 65 72 74 28 20 61 4f 70 20 26 26 20   assert( aOp && 
4a40: 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  !p->db->mallocFa
4a50: 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  iled );..  /* Ch
4a60: 65 63 6b 20 74 68 61 74 20 73 71 6c 69 74 65 33  eck that sqlite3
4a70: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 29 20  VdbeUsesBtree() 
4a80: 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f  was not called o
4a90: 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61  n this VM */.  a
4aa0: 73 73 65 72 74 28 20 44 62 4d 61 73 6b 41 6c 6c  ssert( DbMaskAll
4ab0: 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73  Zero(p->btreeMas
4ac0: 6b 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65  k) );..  resolve
4ad0: 50 32 56 61 6c 75 65 73 28 70 2c 20 70 6e 4d 61  P2Values(p, pnMa
4ae0: 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d  xArg);.  *pnOp =
4af0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f   p->nOp;.  p->aO
4b00: 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  p = 0;.  return 
4b10: 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  aOp;.}../*.** Ad
4b20: 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f  d a whole list o
4b30: 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20  f operations to 
4b40: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74  the operation st
4b50: 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 61 0a 2a  ack.  Return a.*
4b60: 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * pointer to the
4b70: 20 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e   first operation
4b80: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 56 64   inserted..*/.Vd
4b90: 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62  beOp *sqlite3Vdb
4ba0: 65 41 64 64 4f 70 4c 69 73 74 28 0a 20 20 56 64  eAddOpList(.  Vd
4bb0: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
4bc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
4bd0: 64 20 6f 70 63 6f 64 65 73 20 74 6f 20 74 68 65  d opcodes to the
4be0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
4bf0: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 70  ent */.  int nOp
4c00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4c10: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4c20: 6f 66 20 6f 70 63 6f 64 65 73 20 74 6f 20 61 64  of opcodes to ad
4c30: 64 20 2a 2f 0a 20 20 56 64 62 65 4f 70 4c 69 73  d */.  VdbeOpLis
4c40: 74 20 63 6f 6e 73 74 20 2a 61 4f 70 2c 20 20 20  t const *aOp,   
4c50: 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64      /* The opcod
4c60: 65 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a  es to be added *
4c70: 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 6e 6f 20  /.  int iLineno 
4c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c90: 20 2f 2a 20 53 6f 75 72 63 65 2d 66 69 6c 65 20   /* Source-file 
4ca0: 6c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  line number of f
4cb0: 69 72 73 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 29  irst opcode */.)
4cc0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
4cd0: 65 4f 70 20 2a 70 4f 75 74 2c 20 2a 70 46 69 72  eOp *pOut, *pFir
4ce0: 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f  st;.  assert( nO
4cf0: 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  p>0 );.  assert(
4d00: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
4d10: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
4d20: 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70  if( p->nOp + nOp
4d30: 20 3e 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f   > p->pParse->nO
4d40: 70 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70  pAlloc && growOp
4d50: 41 72 72 61 79 28 70 2c 20 6e 4f 70 29 20 29 7b  Array(p, nOp) ){
4d60: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
4d70: 20 7d 0a 20 20 70 46 69 72 73 74 20 3d 20 70 4f   }.  pFirst = pO
4d80: 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e  ut = &p->aOp[p->
4d90: 6e 4f 70 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nOp];.  for(i=0;
4da0: 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 61 4f 70   i<nOp; i++, aOp
4db0: 2b 2b 2c 20 70 4f 75 74 2b 2b 29 7b 0a 20 20 20  ++, pOut++){.   
4dc0: 20 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20   pOut->opcode = 
4dd0: 61 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20  aOp->opcode;.   
4de0: 20 70 4f 75 74 2d 3e 70 31 20 3d 20 61 4f 70 2d   pOut->p1 = aOp-
4df0: 3e 70 31 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70  >p1;.    pOut->p
4e00: 32 20 3d 20 61 4f 70 2d 3e 70 32 3b 0a 20 20 20  2 = aOp->p2;.   
4e10: 20 61 73 73 65 72 74 28 20 61 4f 70 2d 3e 70 32   assert( aOp->p2
4e20: 3e 3d 30 20 29 3b 0a 20 20 20 20 70 4f 75 74 2d  >=0 );.    pOut-
4e30: 3e 70 33 20 3d 20 61 4f 70 2d 3e 70 33 3b 0a 20  >p3 = aOp->p3;. 
4e40: 20 20 20 70 4f 75 74 2d 3e 70 34 74 79 70 65 20     pOut->p4type 
4e50: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20  = P4_NOTUSED;.  
4e60: 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30    pOut->p4.p = 0
4e70: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d  ;.    pOut->p5 =
4e80: 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
4e90: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
4ea0: 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 70 4f  _COMMENTS.    pO
4eb0: 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30  ut->zComment = 0
4ec0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
4ed0: 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45  SQLITE_VDBE_COVE
4ee0: 52 41 47 45 0a 20 20 20 20 70 4f 75 74 2d 3e 69  RAGE.    pOut->i
4ef0: 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 6e  SrcLine = iLinen
4f00: 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20 20 20 20 28  o+i;.#else.    (
4f10: 76 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b 0a 23 65  void)iLineno;.#e
4f20: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
4f30: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 69 66 28  TE_DEBUG.    if(
4f40: 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20   p->db->flags & 
4f50: 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70  SQLITE_VdbeAddop
4f60: 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73  Trace ){.      s
4f70: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
4f80: 70 28 30 2c 20 69 2b 70 2d 3e 6e 4f 70 2c 20 26  p(0, i+p->nOp, &
4f90: 70 2d 3e 61 4f 70 5b 69 2b 70 2d 3e 6e 4f 70 5d  p->aOp[i+p->nOp]
4fa0: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
4fb0: 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20    }.  p->nOp += 
4fc0: 6e 4f 70 3b 0a 20 20 72 65 74 75 72 6e 20 70 46  nOp;.  return pF
4fd0: 69 72 73 74 3b 0a 7d 0a 0a 23 69 66 20 64 65 66  irst;.}..#if def
4fe0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
4ff0: 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54  LE_STMT_SCANSTAT
5000: 55 53 29 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  US)./*.** Add an
5010: 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 61 72   entry to the ar
5020: 72 61 79 20 6f 66 20 63 6f 75 6e 74 65 72 73 20  ray of counters 
5030: 6d 61 6e 61 67 65 64 20 62 79 20 73 71 6c 69 74  managed by sqlit
5040: 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74  e3_stmt_scanstat
5050: 75 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  us()..*/.void sq
5060: 6c 69 74 65 33 56 64 62 65 53 63 61 6e 53 74 61  lite3VdbeScanSta
5070: 74 75 73 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  tus(.  Vdbe *p, 
5080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5090: 20 20 20 20 20 20 20 2f 2a 20 56 4d 20 74 6f 20         /* VM to 
50a0: 61 64 64 20 73 63 61 6e 73 74 61 74 75 73 28 29  add scanstatus()
50b0: 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64   to */.  int add
50c0: 72 45 78 70 6c 61 69 6e 2c 20 20 20 20 20 20 20  rExplain,       
50d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
50e0: 65 73 73 20 6f 66 20 4f 50 5f 45 78 70 6c 61 69  ess of OP_Explai
50f0: 6e 20 28 6f 72 20 30 29 20 2a 2f 0a 20 20 69 6e  n (or 0) */.  in
5100: 74 20 61 64 64 72 4c 6f 6f 70 2c 20 20 20 20 20  t addrLoop,     
5110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5120: 20 41 64 64 72 65 73 73 20 6f 66 20 6c 6f 6f 70   Address of loop
5130: 20 63 6f 75 6e 74 65 72 20 2a 2f 20 0a 20 20 69   counter */ .  i
5140: 6e 74 20 61 64 64 72 56 69 73 69 74 2c 20 20 20  nt addrVisit,   
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5160: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 72 6f 77  * Address of row
5170: 73 20 76 69 73 69 74 65 64 20 63 6f 75 6e 74 65  s visited counte
5180: 72 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 45  r */.  LogEst nE
5190: 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
51a0: 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61         /* Estima
51b0: 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  ted number of ou
51c0: 74 70 75 74 20 72 6f 77 73 20 2a 2f 0a 20 20 63  tput rows */.  c
51d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
51e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51f0: 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20  * Name of table 
5200: 6f 72 20 69 6e 64 65 78 20 62 65 69 6e 67 20 73  or index being s
5210: 63 61 6e 6e 65 64 20 2a 2f 0a 29 7b 0a 20 20 69  canned */.){.  i
5220: 6e 74 20 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e  nt nByte = (p->n
5230: 53 63 61 6e 2b 31 29 20 2a 20 73 69 7a 65 6f 66  Scan+1) * sizeof
5240: 28 53 63 61 6e 53 74 61 74 75 73 29 3b 0a 20 20  (ScanStatus);.  
5250: 53 63 61 6e 53 74 61 74 75 73 20 2a 61 4e 65 77  ScanStatus *aNew
5260: 3b 0a 20 20 61 4e 65 77 20 3d 20 28 53 63 61 6e  ;.  aNew = (Scan
5270: 53 74 61 74 75 73 2a 29 73 71 6c 69 74 65 33 44  Status*)sqlite3D
5280: 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20  bRealloc(p->db, 
5290: 70 2d 3e 61 53 63 61 6e 2c 20 6e 42 79 74 65 29  p->aScan, nByte)
52a0: 3b 0a 20 20 69 66 28 20 61 4e 65 77 20 29 7b 0a  ;.  if( aNew ){.
52b0: 20 20 20 20 53 63 61 6e 53 74 61 74 75 73 20 2a      ScanStatus *
52c0: 70 4e 65 77 20 3d 20 26 61 4e 65 77 5b 70 2d 3e  pNew = &aNew[p->
52d0: 6e 53 63 61 6e 2b 2b 5d 3b 0a 20 20 20 20 70 4e  nScan++];.    pN
52e0: 65 77 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 20  ew->addrExplain 
52f0: 3d 20 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a 20  = addrExplain;. 
5300: 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4c 6f 6f     pNew->addrLoo
5310: 70 20 3d 20 61 64 64 72 4c 6f 6f 70 3b 0a 20 20  p = addrLoop;.  
5320: 20 20 70 4e 65 77 2d 3e 61 64 64 72 56 69 73 69    pNew->addrVisi
5330: 74 20 3d 20 61 64 64 72 56 69 73 69 74 3b 0a 20  t = addrVisit;. 
5340: 20 20 20 70 4e 65 77 2d 3e 6e 45 73 74 20 3d 20     pNew->nEst = 
5350: 6e 45 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  nEst;.    pNew->
5360: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
5370: 62 53 74 72 44 75 70 28 70 2d 3e 64 62 2c 20 7a  bStrDup(p->db, z
5380: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 61 53  Name);.    p->aS
5390: 63 61 6e 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a  can = aNew;.  }.
53a0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
53b0: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
53c0: 65 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 2c  e of the opcode,
53d0: 20 6f 72 20 50 31 2c 20 50 32 2c 20 50 33 2c 20   or P1, P2, P3, 
53e0: 6f 72 20 50 35 20 6f 70 65 72 61 6e 64 73 0a 2a  or P5 operands.*
53f0: 2a 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63  * for a specific
5400: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
5410: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
5420: 65 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 56 64  eChangeOpcode(Vd
5430: 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c  be *p, u32 addr,
5440: 20 75 38 20 69 4e 65 77 4f 70 63 6f 64 65 29 7b   u8 iNewOpcode){
5450: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65  .  sqlite3VdbeGe
5460: 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 6f 70 63  tOp(p,addr)->opc
5470: 6f 64 65 20 3d 20 69 4e 65 77 4f 70 63 6f 64 65  ode = iNewOpcode
5480: 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
5490: 56 64 62 65 43 68 61 6e 67 65 50 31 28 56 64 62  VdbeChangeP1(Vdb
54a0: 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20  e *p, u32 addr, 
54b0: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69  int val){.  sqli
54c0: 74 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61  te3VdbeGetOp(p,a
54d0: 64 64 72 29 2d 3e 70 31 20 3d 20 76 61 6c 3b 0a  ddr)->p1 = val;.
54e0: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
54f0: 62 65 43 68 61 6e 67 65 50 32 28 56 64 62 65 20  beChangeP2(Vdbe 
5500: 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e  *p, u32 addr, in
5510: 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65  t val){.  sqlite
5520: 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64  3VdbeGetOp(p,add
5530: 72 29 2d 3e 70 32 20 3d 20 76 61 6c 3b 0a 7d 0a  r)->p2 = val;.}.
5540: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
5550: 43 68 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70  ChangeP3(Vdbe *p
5560: 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20  , u32 addr, int 
5570: 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  val){.  sqlite3V
5580: 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29  dbeGetOp(p,addr)
5590: 2d 3e 70 33 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f  ->p3 = val;.}.vo
55a0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
55b0: 61 6e 67 65 50 35 28 56 64 62 65 20 2a 70 2c 20  angeP5(Vdbe *p, 
55c0: 75 38 20 70 35 29 7b 0a 20 20 69 66 28 20 21 70  u8 p5){.  if( !p
55d0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
55e0: 65 64 20 29 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  ed ) p->aOp[p->n
55f0: 4f 70 2d 31 5d 2e 70 35 20 3d 20 70 35 3b 0a 7d  Op-1].p5 = p5;.}
5600: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
5610: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66  he P2 operand of
5620: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64   instruction add
5630: 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
5640: 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64  nts to.** the ad
5650: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
5660: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
5670: 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f   be coded..*/.vo
5680: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  id sqlite3VdbeJu
5690: 6d 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20  mpHere(Vdbe *p, 
56a0: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 70 2d 3e  int addr){.  p->
56b0: 70 50 61 72 73 65 2d 3e 69 46 69 78 65 64 4f 70  pParse->iFixedOp
56c0: 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20   = p->nOp - 1;. 
56d0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
56e0: 67 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70 2d  geP2(p, addr, p-
56f0: 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  >nOp);.}.../*.**
5700: 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 46 75   If the input Fu
5710: 6e 63 44 65 66 20 73 74 72 75 63 74 75 72 65 20  ncDef structure 
5720: 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 68  is ephemeral, th
5730: 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66 0a  en free it.  If.
5740: 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20 69  ** the FuncDef i
5750: 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20  s not ephermal, 
5760: 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e  then do nothing.
5770: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5780: 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e  freeEphemeralFun
5790: 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64  ction(sqlite3 *d
57a0: 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66  b, FuncDef *pDef
57b0: 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ){.  if( ALWAYS(
57c0: 70 44 65 66 29 20 26 26 20 28 70 44 65 66 2d 3e  pDef) && (pDef->
57d0: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
57e0: 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d  TE_FUNC_EPHEM)!=
57f0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
5800: 44 62 46 72 65 65 28 64 62 2c 20 70 44 65 66 29  DbFree(db, pDef)
5810: 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
5820: 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41  void vdbeFreeOpA
5830: 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 2c 20  rray(sqlite3 *, 
5840: 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a  Op *, int);../*.
5850: 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20 76  ** Delete a P4 v
5860: 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61 72  alue if necessar
5870: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
5880: 64 20 66 72 65 65 50 34 28 73 71 6c 69 74 65 33  d freeP4(sqlite3
5890: 20 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70 65   *db, int p4type
58a0: 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20 69  , void *p4){.  i
58b0: 66 28 20 70 34 20 29 7b 0a 20 20 20 20 61 73 73  f( p4 ){.    ass
58c0: 65 72 74 28 20 64 62 20 29 3b 0a 20 20 20 20 73  ert( db );.    s
58d0: 77 69 74 63 68 28 20 70 34 74 79 70 65 20 29 7b  witch( p4type ){
58e0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 46  .      case P4_F
58f0: 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20 20 20  UNCCTX: {.      
5900: 20 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46    freeEphemeralF
5910: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28 28 73 71  unction(db, ((sq
5920: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 70  lite3_context*)p
5930: 34 29 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 20 20  4)->pFunc);.    
5940: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f      /* Fall thro
5950: 75 67 68 20 69 6e 74 6f 20 74 68 65 20 6e 65 78  ugh into the nex
5960: 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  t case */.      
5970: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  }.      case P4_
5980: 52 45 41 4c 3a 0a 20 20 20 20 20 20 63 61 73 65  REAL:.      case
5990: 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20   P4_INT64:.     
59a0: 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43   case P4_DYNAMIC
59b0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
59c0: 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20  INTARRAY: {.    
59d0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
59e0: 65 28 64 62 2c 20 70 34 29 3b 0a 20 20 20 20 20  e(db, p4);.     
59f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5a00: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  }.      case P4_
5a10: 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20  KEYINFO: {.     
5a20: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
5a30: 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c  esFreed==0 ) sql
5a40: 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
5a50: 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a  ((KeyInfo*)p4);.
5a60: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5a70: 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
5a80: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
5a90: 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20 20 20 63  OR_HINTS.      c
5aa0: 61 73 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a 20  ase P4_EXPR: {. 
5ab0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
5ac0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 28 45 78  prDelete(db, (Ex
5ad0: 70 72 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20  pr*)p4);.       
5ae0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
5af0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63 61 73  #endif.      cas
5b00: 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a 20 7b 0a  e P4_MPRINTF: {.
5b10: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
5b20: 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20  pnBytesFreed==0 
5b30: 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70  ) sqlite3_free(p
5b40: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  4);.        brea
5b50: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
5b60: 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46   case P4_FUNCDEF
5b70: 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65  : {.        free
5b80: 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f  EphemeralFunctio
5b90: 6e 28 64 62 2c 20 28 46 75 6e 63 44 65 66 2a 29  n(db, (FuncDef*)
5ba0: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
5bb0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
5bc0: 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b    case P4_MEM: {
5bd0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
5be0: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
5bf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
5c00: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 28  lite3ValueFree((
5c10: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70  sqlite3_value*)p
5c20: 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  4);.        }els
5c30: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d  e{.          Mem
5c40: 20 2a 70 20 3d 20 28 4d 65 6d 2a 29 70 34 3b 0a   *p = (Mem*)p4;.
5c50: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
5c60: 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69  >szMalloc ) sqli
5c70: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
5c80: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  >zMalloc);.     
5c90: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
5ca0: 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20  ee(db, p);.     
5cb0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
5cc0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
5cd0: 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a    case P4_VTAB :
5ce0: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64   {.        if( d
5cf0: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
5d00: 3d 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62  =0 ) sqlite3Vtab
5d10: 55 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a  Unlock((VTable *
5d20: 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72  )p4);.        br
5d30: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
5d40: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
5d50: 46 72 65 65 20 74 68 65 20 73 70 61 63 65 20 61  Free the space a
5d60: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70  llocated for aOp
5d70: 20 61 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75   and any p4 valu
5d80: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  es allocated for
5d90: 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20   the.** opcodes 
5da0: 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
5db0: 2e 20 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20  . If aOp is not 
5dc0: 4e 55 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d  NULL it is assum
5dd0: 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a  ed to contain .*
5de0: 2a 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a  * nOp entries. .
5df0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
5e00: 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73  dbeFreeOpArray(s
5e10: 71 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a  qlite3 *db, Op *
5e20: 61 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20  aOp, int nOp){. 
5e30: 20 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20   if( aOp ){.    
5e40: 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72  Op *pOp;.    for
5e50: 28 70 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61  (pOp=aOp; pOp<&a
5e60: 4f 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b  Op[nOp]; pOp++){
5e70: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
5e80: 70 34 74 79 70 65 20 29 20 66 72 65 65 50 34 28  p4type ) freeP4(
5e90: 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c  db, pOp->p4type,
5ea0: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66   pOp->p4.p);.#if
5eb0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
5ec0: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
5ed0: 54 53 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  TS.      sqlite3
5ee0: 44 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e  DbFree(db, pOp->
5ef0: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69  zComment);.#endi
5f00: 66 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d  f     .    }.  }
5f10: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
5f20: 28 64 62 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a  (db, aOp);.}../*
5f30: 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65 20 53 75 62  .** Link the Sub
5f40: 50 72 6f 67 72 61 6d 20 6f 62 6a 65 63 74 20 70  Program object p
5f50: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
5f60: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 6e 74  ond argument int
5f70: 6f 20 74 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20  o the linked.** 
5f80: 6c 69 73 74 20 61 74 20 56 64 62 65 2e 70 53 75  list at Vdbe.pSu
5f90: 62 50 72 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c  bProgram. This l
5fa0: 69 73 74 20 69 73 20 75 73 65 64 20 74 6f 20 64  ist is used to d
5fb0: 65 6c 65 74 65 20 61 6c 6c 20 73 75 62 2d 70 72  elete all sub-pr
5fc0: 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73  ogram.** objects
5fd0: 20 77 68 65 6e 20 74 68 65 20 56 4d 20 69 73 20   when the VM is 
5fe0: 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72  no longer requir
5ff0: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
6000: 74 65 33 56 64 62 65 4c 69 6e 6b 53 75 62 50 72  te3VdbeLinkSubPr
6010: 6f 67 72 61 6d 28 56 64 62 65 20 2a 70 56 64 62  ogram(Vdbe *pVdb
6020: 65 2c 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70  e, SubProgram *p
6030: 29 7b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20  ){.  p->pNext = 
6040: 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b  pVdbe->pProgram;
6050: 0a 20 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72  .  pVdbe->pProgr
6060: 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  am = p;.}../*.**
6070: 20 43 68 61 6e 67 65 20 74 68 65 20 6f 70 63 6f   Change the opco
6080: 64 65 20 61 74 20 61 64 64 72 20 69 6e 74 6f 20  de at addr into 
6090: 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a 69 6e 74 20 73  OP_Noop.*/.int s
60a0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
60b0: 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20  ToNoop(Vdbe *p, 
60c0: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 56 64 62  int addr){.  Vdb
60d0: 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20  eOp *pOp;.  if( 
60e0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
60f0: 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  led ) return 0;.
6100: 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d    assert( addr>=
6110: 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70  0 && addr<p->nOp
6120: 20 29 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e   );.  pOp = &p->
6130: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65  aOp[addr];.  fre
6140: 65 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e  eP4(p->db, pOp->
6150: 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e  p4type, pOp->p4.
6160: 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70  p);.  pOp->p4typ
6170: 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a  e = P4_NOTUSED;.
6180: 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 30 3b    pOp->p4.z = 0;
6190: 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d  .  pOp->opcode =
61a0: 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 72 65 74 75   OP_Noop;.  retu
61b0: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 1;.}../*.** I
61c0: 66 20 74 68 65 20 6c 61 73 74 20 6f 70 63 6f 64  f the last opcod
61d0: 65 20 69 73 20 22 6f 70 22 20 61 6e 64 20 69 74  e is "op" and it
61e0: 20 69 73 20 6e 6f 74 20 61 20 6a 75 6d 70 20 64   is not a jump d
61f0: 65 73 74 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20 74  estination,.** t
6200: 68 65 6e 20 72 65 6d 6f 76 65 20 69 74 2e 20 20  hen remove it.  
6210: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61  Return true if a
6220: 6e 64 20 6f 6e 6c 79 20 69 66 20 61 6e 20 6f 70  nd only if an op
6230: 63 6f 64 65 20 77 61 73 20 72 65 6d 6f 76 65 64  code was removed
6240: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6250: 56 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f  VdbeDeletePriorO
6260: 70 63 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75  pcode(Vdbe *p, u
6270: 38 20 6f 70 29 7b 0a 20 20 69 66 28 20 28 70 2d  8 op){.  if( (p-
6280: 3e 6e 4f 70 2d 31 29 3e 28 70 2d 3e 70 50 61 72  >nOp-1)>(p->pPar
6290: 73 65 2d 3e 69 46 69 78 65 64 4f 70 29 20 26 26  se->iFixedOp) &&
62a0: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
62b0: 5d 2e 6f 70 63 6f 64 65 3d 3d 6f 70 20 29 7b 0a  ].opcode==op ){.
62c0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
62d0: 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
62e0: 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70 2d 31 29 3b  op(p, p->nOp-1);
62f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
6300: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  turn 0;.  }.}../
6310: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
6320: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 20  value of the P4 
6330: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
6340: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
6350: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  on..** This rout
6360: 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68  ine is useful wh
6370: 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72  en a large progr
6380: 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f  am is loaded fro
6390: 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72  m a.** static ar
63a0: 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ray using sqlite
63b0: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62  3VdbeAddOpList b
63c0: 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61  ut we want to ma
63d0: 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f  ke a.** few mino
63e0: 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  r changes to the
63f0: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20   program..**.** 
6400: 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65  If n>=0 then the
6410: 20 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20 64   P4 operand is d
6420: 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20  ynamic, meaning 
6430: 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a  that a copy of.*
6440: 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20  * the string is 
6450: 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  made into memory
6460: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
6470: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
6480: 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e  .** A value of n
6490: 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62  ==0 means copy b
64a0: 79 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20 74  ytes of zP4 up t
64b0: 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20  o and including 
64c0: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c  the.** first nul
64d0: 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20  l byte.  If n>0 
64e0: 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79  then copy n+1 by
64f0: 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 20 0a  tes of zP4..** .
6500: 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20  ** Other values 
6510: 6f 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c  of n (P4_STATIC,
6520: 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e   P4_COLLSEQ etc.
6530: 29 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  ) indicate that 
6540: 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f  zP4 points.** to
6550: 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72   a string or str
6560: 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20 67  ucture that is g
6570: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69  uaranteed to exi
6580: 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74  st for the lifet
6590: 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64  ime of.** the Vd
65a0: 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73  be. In these cas
65b0: 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63  es we can just c
65c0: 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e  opy the pointer.
65d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30  .**.** If addr<0
65e0: 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20   then change P4 
65f0: 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
6600: 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e  ntly inserted in
6610: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  struction..*/.st
6620: 61 74 69 63 20 76 6f 69 64 20 53 51 4c 49 54 45  atic void SQLITE
6630: 5f 4e 4f 49 4e 4c 49 4e 45 20 76 64 62 65 43 68  _NOINLINE vdbeCh
6640: 61 6e 67 65 50 34 46 75 6c 6c 28 0a 20 20 56 64  angeP4Full(.  Vd
6650: 62 65 20 2a 70 2c 0a 20 20 4f 70 20 2a 70 4f 70  be *p,.  Op *pOp
6660: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
6670: 7a 50 34 2c 0a 20 20 69 6e 74 20 6e 0a 29 7b 0a  zP4,.  int n.){.
6680: 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70    if( pOp->p4typ
6690: 65 20 29 7b 0a 20 20 20 20 66 72 65 65 50 34 28  e ){.    freeP4(
66a0: 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79  p->db, pOp->p4ty
66b0: 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a  pe, pOp->p4.p);.
66c0: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
66d0: 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  = 0;.    pOp->p4
66e0: 2e 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  .p = 0;.  }.  if
66f0: 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  ( n<0 ){.    sql
6700: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
6710: 28 70 2c 20 28 69 6e 74 29 28 70 4f 70 20 2d 20  (p, (int)(pOp - 
6720: 70 2d 3e 61 4f 70 29 2c 20 7a 50 34 2c 20 6e 29  p->aOp), zP4, n)
6730: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
6740: 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71  f( n==0 ) n = sq
6750: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50  lite3Strlen30(zP
6760: 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e  4);.    pOp->p4.
6770: 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  z = sqlite3DbStr
6780: 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c  NDup(p->db, zP4,
6790: 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34   n);.    pOp->p4
67a0: 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49  type = P4_DYNAMI
67b0: 43 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71  C;.  }.}.void sq
67c0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
67d0: 34 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  4(Vdbe *p, int a
67e0: 64 64 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ddr, const char 
67f0: 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  *zP4, int n){.  
6800: 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 71 6c 69 74  Op *pOp;.  sqlit
6810: 65 33 20 2a 64 62 3b 0a 20 20 61 73 73 65 72 74  e3 *db;.  assert
6820: 28 20 70 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d  ( p!=0 );.  db =
6830: 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
6840: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
6850: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
6860: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 21   assert( p->aOp!
6870: 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
6880: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
6890: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
68a0: 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 21 3d 50   ){.    if( n!=P
68b0: 34 5f 56 54 41 42 20 29 20 66 72 65 65 50 34 28  4_VTAB ) freeP4(
68c0: 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28  db, n, (void*)*(
68d0: 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20  char**)&zP4);.  
68e0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
68f0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
6900: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64   );.  assert( ad
6910: 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69  dr<p->nOp );.  i
6920: 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20  f( addr<0 ){.   
6930: 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d   addr = p->nOp -
6940: 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20   1;.  }.  pOp = 
6950: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
6960: 20 69 66 28 20 6e 3e 3d 30 20 7c 7c 20 70 4f 70   if( n>=0 || pOp
6970: 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20  ->p4type ){.    
6980: 76 64 62 65 43 68 61 6e 67 65 50 34 46 75 6c 6c  vdbeChangeP4Full
6990: 28 70 2c 20 70 4f 70 2c 20 7a 50 34 2c 20 6e 29  (p, pOp, zP4, n)
69a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
69b0: 7d 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e  }.  if( n==P4_IN
69c0: 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  T32 ){.    /* No
69d0: 74 65 3a 20 74 68 69 73 20 63 61 73 74 20 69 73  te: this cast is
69e0: 20 73 61 66 65 2c 20 62 65 63 61 75 73 65 20 74   safe, because t
69f0: 68 65 20 6f 72 69 67 69 6e 20 64 61 74 61 20 70  he origin data p
6a00: 6f 69 6e 74 20 77 61 73 20 61 6e 20 69 6e 74 0a  oint was an int.
6a10: 20 20 20 20 2a 2a 20 74 68 61 74 20 77 61 73 20      ** that was 
6a20: 63 61 73 74 20 74 6f 20 61 20 28 63 6f 6e 73 74  cast to a (const
6a30: 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20   char *). */.   
6a40: 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c   pOp->p4.i = SQL
6a50: 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a  ITE_PTR_TO_INT(z
6a60: 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  P4);.    pOp->p4
6a70: 74 79 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b  type = P4_INT32;
6a80: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 34  .  }else if( zP4
6a90: 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  !=0 ){.    asser
6aa0: 74 28 20 6e 3c 30 20 29 3b 0a 20 20 20 20 70 4f  t( n<0 );.    pO
6ab0: 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a  p->p4.p = (void*
6ac0: 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  )zP4;.    pOp->p
6ad0: 34 74 79 70 65 20 3d 20 28 73 69 67 6e 65 64 20  4type = (signed 
6ae0: 63 68 61 72 29 6e 3b 0a 20 20 20 20 69 66 28 20  char)n;.    if( 
6af0: 6e 3d 3d 50 34 5f 56 54 41 42 20 29 20 73 71 6c  n==P4_VTAB ) sql
6b00: 69 74 65 33 56 74 61 62 4c 6f 63 6b 28 28 56 54  ite3VtabLock((VT
6b10: 61 62 6c 65 2a 29 7a 50 34 29 3b 0a 20 20 7d 0a  able*)zP4);.  }.
6b20: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
6b30: 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20   P4 on the most 
6b40: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 6f  recently added o
6b50: 70 63 6f 64 65 20 74 6f 20 74 68 65 20 4b 65 79  pcode to the Key
6b60: 49 6e 66 6f 20 66 6f 72 20 74 68 65 0a 2a 2a 20  Info for the.** 
6b70: 69 6e 64 65 78 20 67 69 76 65 6e 2e 0a 2a 2f 0a  index given..*/.
6b80: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
6b90: 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 50 61 72  SetP4KeyInfo(Par
6ba0: 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65  se *pParse, Inde
6bb0: 78 20 2a 70 49 64 78 29 7b 0a 20 20 56 64 62 65  x *pIdx){.  Vdbe
6bc0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
6bd0: 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76  dbe;.  assert( v
6be0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
6bf0: 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 73 71   pIdx!=0 );.  sq
6c00: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
6c10: 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29  4(v, -1, (char*)
6c20: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66  sqlite3KeyInfoOf
6c30: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
6c40: 64 78 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  dx),.           
6c50: 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45             P4_KE
6c60: 59 49 4e 46 4f 29 3b 0a 7d 0a 0a 23 69 66 64 65  YINFO);.}..#ifde
6c70: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
6c80: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
6c90: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
6ca0: 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65  e comment on the
6cb0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
6cc0: 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  oded instruction
6cd0: 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20  .  Or.** insert 
6ce0: 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20  a No-op and add 
6cf0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74  the comment to t
6d00: 68 61 74 20 6e 65 77 20 69 6e 73 74 72 75 63 74  hat new instruct
6d10: 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61  ion.  This.** ma
6d20: 6b 65 73 20 74 68 65 20 63 6f 64 65 20 65 61 73  kes the code eas
6d30: 69 65 72 20 74 6f 20 72 65 61 64 20 64 75 72 69  ier to read duri
6d40: 6e 67 20 64 65 62 75 67 67 69 6e 67 2e 20 20 4e  ng debugging.  N
6d50: 6f 6e 65 20 6f 66 20 74 68 69 73 20 68 61 70 70  one of this happ
6d60: 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64  ens.** in a prod
6d70: 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f  uction build..*/
6d80: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
6d90: 65 56 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a  eVComment(Vdbe *
6da0: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
6db0: 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20  Format, va_list 
6dc0: 61 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ap){.  assert( p
6dd0: 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f  ->nOp>0 || p->aO
6de0: 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p==0 );.  assert
6df0: 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70  ( p->aOp==0 || p
6e00: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
6e10: 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70  zComment==0 || p
6e20: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
6e30: 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  ed );.  if( p->n
6e40: 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  Op ){.    assert
6e50: 28 20 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20 20  ( p->aOp );.    
6e60: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
6e70: 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  >db, p->aOp[p->n
6e80: 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 29 3b  Op-1].zComment);
6e90: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  .    p->aOp[p->n
6ea0: 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 20 3d  Op-1].zComment =
6eb0: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
6ec0: 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c  (p->db, zFormat,
6ed0: 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64   ap);.  }.}.void
6ee0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d   sqlite3VdbeComm
6ef0: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
6f00: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
6f10: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
6f20: 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b  t ap;.  if( p ){
6f30: 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70  .    va_start(ap
6f40: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  , zFormat);.    
6f50: 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20  vdbeVComment(p, 
6f60: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
6f70: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
6f80: 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
6f90: 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
6fa0: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
6fb0: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
6fc0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
6fd0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
6fe0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6ff0: 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a  p0(p, OP_Noop);.
7000: 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c      va_start(ap,
7010: 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76   zFormat);.    v
7020: 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a  dbeVComment(p, z
7030: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20  Format, ap);.   
7040: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d   va_end(ap);.  }
7050: 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44  .}.#endif  /* ND
7060: 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20  EBUG */..#ifdef 
7070: 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45  SQLITE_VDBE_COVE
7080: 52 41 47 45 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  RAGE./*.** Set t
7090: 68 65 20 76 61 6c 75 65 20 69 66 20 74 68 65 20  he value if the 
70a0: 69 53 72 63 4c 69 6e 65 20 66 69 65 6c 64 20 66  iSrcLine field f
70b0: 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c  or the previousl
70c0: 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74  y coded instruct
70d0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
70e0: 69 74 65 33 56 64 62 65 53 65 74 4c 69 6e 65 4e  ite3VdbeSetLineN
70f0: 75 6d 62 65 72 28 56 64 62 65 20 2a 76 2c 20 69  umber(Vdbe *v, i
7100: 6e 74 20 69 4c 69 6e 65 29 7b 0a 20 20 73 71 6c  nt iLine){.  sql
7110: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
7120: 2d 31 29 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20  -1)->iSrcLine = 
7130: 69 4c 69 6e 65 3b 0a 7d 0a 23 65 6e 64 69 66 20  iLine;.}.#endif 
7140: 2f 2a 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  /* SQLITE_VDBE_C
7150: 4f 56 45 52 41 47 45 20 2a 2f 0a 0a 2f 2a 0a 2a  OVERAGE */../*.*
7160: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70 63  * Return the opc
7170: 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e 20  ode for a given 
7180: 61 64 64 72 65 73 73 2e 20 20 49 66 20 74 68 65  address.  If the
7190: 20 61 64 64 72 65 73 73 20 69 73 20 2d 31 2c 20   address is -1, 
71a0: 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20 74  then.** return t
71b0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
71c0: 20 69 6e 73 65 72 74 65 64 20 6f 70 63 6f 64 65   inserted opcode
71d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
71e0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
71f0: 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
7200: 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 63  d prior to the c
7210: 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73 0a 2a  alling of this.*
7220: 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20  * routine, then 
7230: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 64  a pointer to a d
7240: 75 6d 6d 79 20 56 64 62 65 4f 70 20 77 69 6c 6c  ummy VdbeOp will
7250: 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 54   be returned.  T
7260: 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73  hat opcode.** is
7270: 20 72 65 61 64 61 62 6c 65 20 62 75 74 20 6e 6f   readable but no
7280: 74 20 77 72 69 74 61 62 6c 65 2c 20 74 68 6f 75  t writable, thou
7290: 67 68 20 69 74 20 69 73 20 63 61 73 74 20 74 6f  gh it is cast to
72a0: 20 61 20 77 72 69 74 61 62 6c 65 20 76 61 6c 75   a writable valu
72b0: 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  e..** The return
72c0: 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f 70 63 6f   of a dummy opco
72d0: 64 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 61  de allows the ca
72e0: 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 66  ll to continue f
72f0: 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61 66  unctioning.** af
7300: 74 65 72 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74  ter an OOM fault
7310: 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
7320: 74 6f 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  to check to see 
7330: 69 66 20 74 68 65 20 72 65 74 75 72 6e 20 66 72  if the return fr
7340: 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  om .** this rout
7350: 69 6e 65 20 69 73 20 61 20 76 61 6c 69 64 20 70  ine is a valid p
7360: 6f 69 6e 74 65 72 2e 20 20 42 75 74 20 62 65 63  ointer.  But bec
7370: 61 75 73 65 20 74 68 65 20 64 75 6d 6d 79 2e 6f  ause the dummy.o
7380: 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20 64  pcode is 0,.** d
7390: 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72 20  ummy will never 
73a0: 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 20  be written to.  
73b0: 54 68 69 73 20 69 73 20 76 65 72 69 66 69 65 64  This is verified
73c0: 20 62 79 20 63 6f 64 65 20 69 6e 73 70 65 63 74   by code inspect
73d0: 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72 75  ion and.** by ru
73e0: 6e 6e 69 6e 67 20 77 69 74 68 20 56 61 6c 67 72  nning with Valgr
73f0: 69 6e 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a  ind..*/.VdbeOp *
7400: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
7410: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
7420: 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73 70  dr){.  /* C89 sp
7430: 65 63 69 66 69 65 73 20 74 68 61 74 20 74 68 65  ecifies that the
7440: 20 63 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d 79   constant "dummy
7450: 22 20 77 69 6c 6c 20 62 65 20 69 6e 69 74 69 61  " will be initia
7460: 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20 2a  lized to all.  *
7470: 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63 68 20 69  * zeros, which i
7480: 73 20 63 6f 72 72 65 63 74 2e 20 20 4d 53 56 43  s correct.  MSVC
7490: 20 67 65 6e 65 72 61 74 65 73 20 61 20 77 61 72   generates a war
74a0: 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c 65  ning, neverthele
74b0: 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  ss. */.  static 
74c0: 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20 2f  VdbeOp dummy;  /
74d0: 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 4d 53 56  * Ignore the MSV
74e0: 43 20 77 61 72 6e 69 6e 67 20 61 62 6f 75 74 20  C warning about 
74f0: 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 2a  no initializer *
7500: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  /.  assert( p->m
7510: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
7520: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 61  _INIT );.  if( a
7530: 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64  ddr<0 ){.    add
7540: 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a  r = p->nOp - 1;.
7550: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 61    }.  assert( (a
7560: 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70  ddr>=0 && addr<p
7570: 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d  ->nOp) || p->db-
7580: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
7590: 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
75a0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
75b0: 20 20 72 65 74 75 72 6e 20 28 56 64 62 65 4f 70    return (VdbeOp
75c0: 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73  *)&dummy;.  }els
75d0: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70  e{.    return &p
75e0: 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 7d  ->aOp[addr];.  }
75f0: 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
7600: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
7610: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 29 0a  PLAIN_COMMENTS).
7620: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  /*.** Return an 
7630: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66 6f  integer value fo
7640: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 70 61 72  r one of the par
7650: 61 6d 65 74 65 72 73 20 74 6f 20 74 68 65 20 6f  ameters to the o
7660: 70 63 6f 64 65 20 70 4f 70 0a 2a 2a 20 64 65 74  pcode pOp.** det
7670: 65 72 6d 69 6e 65 64 20 62 79 20 63 68 61 72 61  ermined by chara
7680: 63 74 65 72 20 63 2e 0a 2a 2f 0a 73 74 61 74 69  cter c..*/.stati
7690: 63 20 69 6e 74 20 74 72 61 6e 73 6c 61 74 65 50  c int translateP
76a0: 28 63 68 61 72 20 63 2c 20 63 6f 6e 73 74 20 4f  (char c, const O
76b0: 70 20 2a 70 4f 70 29 7b 0a 20 20 69 66 28 20 63  p *pOp){.  if( c
76c0: 3d 3d 27 31 27 20 29 20 72 65 74 75 72 6e 20 70  =='1' ) return p
76d0: 4f 70 2d 3e 70 31 3b 0a 20 20 69 66 28 20 63 3d  Op->p1;.  if( c=
76e0: 3d 27 32 27 20 29 20 72 65 74 75 72 6e 20 70 4f  ='2' ) return pO
76f0: 70 2d 3e 70 32 3b 0a 20 20 69 66 28 20 63 3d 3d  p->p2;.  if( c==
7700: 27 33 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70  '3' ) return pOp
7710: 2d 3e 70 33 3b 0a 20 20 69 66 28 20 63 3d 3d 27  ->p3;.  if( c=='
7720: 34 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d  4' ) return pOp-
7730: 3e 70 34 2e 69 3b 0a 20 20 72 65 74 75 72 6e 20  >p4.i;.  return 
7740: 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a  pOp->p5;.}../*.*
7750: 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69  * Compute a stri
7760: 6e 67 20 66 6f 72 20 74 68 65 20 22 63 6f 6d 6d  ng for the "comm
7770: 65 6e 74 22 20 66 69 65 6c 64 20 6f 66 20 61 20  ent" field of a 
7780: 56 44 42 45 20 6f 70 63 6f 64 65 20 6c 69 73 74  VDBE opcode list
7790: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  ing..**.** The S
77a0: 79 6e 6f 70 73 69 73 3a 20 66 69 65 6c 64 20 69  ynopsis: field i
77b0: 6e 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68  n comments in th
77c0: 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20  e vdbe.c source 
77d0: 66 69 6c 65 20 67 65 74 73 20 63 6f 6e 76 65 72  file gets conver
77e0: 74 65 64 0a 2a 2a 20 74 6f 20 61 6e 20 65 78 74  ted.** to an ext
77f0: 72 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 69  ra string that i
7800: 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
7810: 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e  e sqlite3OpcodeN
7820: 61 6d 65 28 29 2e 20 20 49 6e 20 74 68 65 0a 2a  ame().  In the.*
7830: 2a 20 61 62 73 65 6e 63 65 20 6f 66 20 6f 74 68  * absence of oth
7840: 65 72 20 63 6f 6d 6d 65 6e 74 73 2c 20 74 68 69  er comments, thi
7850: 73 20 73 79 6e 6f 70 73 69 73 20 62 65 63 6f 6d  s synopsis becom
7860: 65 73 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f  es the comment o
7870: 6e 20 74 68 65 20 6f 70 63 6f 64 65 2e 0a 2a 2a  n the opcode..**
7880: 20 53 6f 6d 65 20 74 72 61 6e 73 6c 61 74 69 6f   Some translatio
7890: 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a 0a 2a 2a 20  n occurs:.**.** 
78a0: 20 20 20 20 20 20 22 50 58 22 20 20 20 20 20 20        "PX"      
78b0: 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a 2a 20 20 20  ->  "r[X]".**   
78c0: 20 20 20 20 22 50 58 40 50 59 22 20 20 20 2d 3e      "PX@PY"   ->
78d0: 20 20 22 72 5b 58 2e 2e 58 2b 59 2d 31 5d 22 20    "r[X..X+Y-1]" 
78e0: 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 20   or "r[x]" if y 
78f0: 69 73 20 30 20 6f 72 20 31 0a 2a 2a 20 20 20 20  is 0 or 1.**    
7900: 20 20 20 22 50 58 40 50 59 2b 31 22 20 2d 3e 20     "PX@PY+1" -> 
7910: 20 22 72 5b 58 2e 2e 58 2b 59 5d 22 20 20 20 20   "r[X..X+Y]"    
7920: 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 20 69  or "r[x]" if y i
7930: 73 20 30 0a 2a 2a 20 20 20 20 20 20 20 22 50 59  s 0.**       "PY
7940: 2e 2e 50 59 22 20 20 2d 3e 20 20 22 72 5b 58 2e  ..PY"  ->  "r[X.
7950: 2e 59 5d 22 20 20 20 20 20 20 6f 72 20 22 72 5b  .Y]"      or "r[
7960: 78 5d 22 20 69 66 20 79 3c 3d 78 0a 2a 2f 0a 73  x]" if y<=x.*/.s
7970: 74 61 74 69 63 20 69 6e 74 20 64 69 73 70 6c 61  tatic int displa
7980: 79 43 6f 6d 6d 65 6e 74 28 0a 20 20 63 6f 6e 73  yComment(.  cons
7990: 74 20 4f 70 20 2a 70 4f 70 2c 20 20 20 20 20 2f  t Op *pOp,     /
79a0: 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 74 6f 20  * The opcode to 
79b0: 62 65 20 63 6f 6d 6d 65 6e 74 65 64 20 2a 2f 0a  be commented */.
79c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
79d0: 34 2c 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73  4,   /* Previous
79e0: 6c 79 20 6f 62 74 61 69 6e 65 64 20 76 61 6c 75  ly obtained valu
79f0: 65 20 66 6f 72 20 50 34 20 2a 2f 0a 20 20 63 68  e for P4 */.  ch
7a00: 61 72 20 2a 7a 54 65 6d 70 2c 20 20 20 20 20 20  ar *zTemp,      
7a10: 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74   /* Write result
7a20: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   here */.  int n
7a30: 54 65 6d 70 20 20 20 20 20 20 20 20 20 20 2f 2a  Temp          /*
7a40: 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   Space available
7a50: 20 69 6e 20 7a 54 65 6d 70 5b 5d 20 2a 2f 0a 29   in zTemp[] */.)
7a60: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
7a70: 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74  zOpName;.  const
7a80: 20 63 68 61 72 20 2a 7a 53 79 6e 6f 70 73 69 73   char *zSynopsis
7a90: 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e 61 6d 65 3b  ;.  int nOpName;
7aa0: 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20  .  int ii, jj;. 
7ab0: 20 7a 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74   zOpName = sqlit
7ac0: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70  e3OpcodeName(pOp
7ad0: 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20 20 6e 4f 70  ->opcode);.  nOp
7ae0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
7af0: 72 6c 65 6e 33 30 28 7a 4f 70 4e 61 6d 65 29 3b  rlen30(zOpName);
7b00: 0a 20 20 69 66 28 20 7a 4f 70 4e 61 6d 65 5b 6e  .  if( zOpName[n
7b10: 4f 70 4e 61 6d 65 2b 31 5d 20 29 7b 0a 20 20 20  OpName+1] ){.   
7b20: 20 69 6e 74 20 73 65 65 6e 43 6f 6d 20 3d 20 30   int seenCom = 0
7b30: 3b 0a 20 20 20 20 63 68 61 72 20 63 3b 0a 20 20  ;.    char c;.  
7b40: 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a 4f    zSynopsis = zO
7b50: 70 4e 61 6d 65 20 2b 3d 20 6e 4f 70 4e 61 6d 65  pName += nOpName
7b60: 20 2b 20 31 3b 0a 20 20 20 20 66 6f 72 28 69 69   + 1;.    for(ii
7b70: 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65 6d 70 2d  =jj=0; jj<nTemp-
7b80: 31 20 26 26 20 28 63 20 3d 20 7a 53 79 6e 6f 70  1 && (c = zSynop
7b90: 73 69 73 5b 69 69 5d 29 21 3d 30 3b 20 69 69 2b  sis[ii])!=0; ii+
7ba0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 3d  +){.      if( c=
7bb0: 3d 27 50 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='P' ){.        
7bc0: 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 2b 2b  c = zSynopsis[++
7bd0: 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ii];.        if(
7be0: 20 63 3d 3d 27 34 27 20 29 7b 0a 20 20 20 20 20   c=='4' ){.     
7bf0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
7c00: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20  rintf(nTemp-jj, 
7c10: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20  zTemp+jj, "%s", 
7c20: 7a 50 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  zP4);.        }e
7c30: 6c 73 65 20 69 66 28 20 63 3d 3d 27 58 27 20 29  lse if( c=='X' )
7c40: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
7c50: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
7c60: 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c  mp-jj, zTemp+jj,
7c70: 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d   "%s", pOp->zCom
7c80: 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ment);.         
7c90: 20 73 65 65 6e 43 6f 6d 20 3d 20 31 3b 0a 20 20   seenCom = 1;.  
7ca0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7cb0: 20 20 20 20 20 20 20 69 6e 74 20 76 31 20 3d 20         int v1 = 
7cc0: 74 72 61 6e 73 6c 61 74 65 50 28 63 2c 20 70 4f  translateP(c, pO
7cd0: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  p);.          in
7ce0: 74 20 76 32 3b 0a 20 20 20 20 20 20 20 20 20 20  t v2;.          
7cf0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
7d00: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70  (nTemp-jj, zTemp
7d10: 2b 6a 6a 2c 20 22 25 64 22 2c 20 76 31 29 3b 0a  +jj, "%d", v1);.
7d20: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 74            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 40 50 22 2c 20 32 29 3d 3d  ii+1, "@P", 2)==
7d50: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
7d60: 20 69 69 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20   ii += 3;.      
7d70: 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69        jj += sqli
7d80: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d  te3Strlen30(zTem
7d90: 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 20 20 20  p+jj);.         
7da0: 20 20 20 76 32 20 3d 20 74 72 61 6e 73 6c 61 74     v2 = translat
7db0: 65 50 28 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d  eP(zSynopsis[ii]
7dc0: 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20  , pOp);.        
7dd0: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
7de0: 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 22  zSynopsis+ii+1,"
7df0: 2b 31 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20  +1",2)==0 ){.   
7e00: 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d             ii +=
7e10: 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   2;.            
7e20: 20 20 76 32 2b 2b 3b 0a 20 20 20 20 20 20 20 20    v2++;.        
7e30: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
7e40: 20 20 69 66 28 20 76 32 3e 31 20 29 7b 0a 20 20    if( v2>1 ){.  
7e50: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
7e60: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
7e70: 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c  mp-jj, zTemp+jj,
7e80: 20 22 2e 2e 25 64 22 2c 20 76 31 2b 76 32 2d 31   "..%d", v1+v2-1
7e90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
7ea0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
7eb0: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79   if( strncmp(zSy
7ec0: 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 2e 2e  nopsis+ii+1, "..
7ed0: 50 33 22 2c 20 34 29 3d 3d 30 20 26 26 20 70 4f  P3", 4)==0 && pO
7ee0: 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20 20 20 20  p->p3==0 ){.    
7ef0: 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 34 3b          ii += 4;
7f00: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
7f10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6a       }.        j
7f20: 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  j += sqlite3Strl
7f30: 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a  en30(zTemp+jj);.
7f40: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7f50: 20 20 20 20 20 7a 54 65 6d 70 5b 6a 6a 2b 2b 5d       zTemp[jj++]
7f60: 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = c;.      }.  
7f70: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65 65    }.    if( !see
7f80: 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54 65 6d 70  nCom && jj<nTemp
7f90: 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  -5 && pOp->zComm
7fa0: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ent ){.      sql
7fb0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7fc0: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
7fd0: 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70 2d 3e 7a  , "; %s", pOp->z
7fe0: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20  Comment);.      
7ff0: 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  jj += sqlite3Str
8000: 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b  len30(zTemp+jj);
8010: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
8020: 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65 6d 70 5b  j<nTemp ) zTemp[
8030: 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  jj] = 0;.  }else
8040: 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65   if( pOp->zComme
8050: 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  nt ){.    sqlite
8060: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
8070: 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22 2c 20 70  , zTemp, "%s", p
8080: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20  Op->zComment);. 
8090: 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74 65 33 53     jj = sqlite3S
80a0: 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a  trlen30(zTemp);.
80b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 54 65    }else{.    zTe
80c0: 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 6a  mp[0] = 0;.    j
80d0: 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  j = 0;.  }.  ret
80e0: 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e 64 69 66  urn jj;.}.#endif
80f0: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
8100: 20 2a 2f 0a 0a 23 69 66 20 56 44 42 45 5f 44 49   */..#if VDBE_DI
8110: 53 50 4c 41 59 5f 50 34 20 26 26 20 64 65 66 69  SPLAY_P4 && defi
8120: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
8130: 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 29 0a  E_CURSOR_HINTS).
8140: 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20  /*.** Translate 
8150: 74 68 65 20 50 34 2e 70 45 78 70 72 20 76 61 6c  the P4.pExpr val
8160: 75 65 20 66 6f 72 20 61 6e 20 4f 50 5f 43 75 72  ue for an OP_Cur
8170: 73 6f 72 48 69 6e 74 20 6f 70 63 6f 64 65 20 69  sorHint opcode i
8180: 6e 74 6f 20 74 65 78 74 0a 2a 2a 20 74 68 61 74  nto text.** that
8190: 20 63 61 6e 20 62 65 20 64 69 73 70 6c 61 79 65   can be displaye
81a0: 64 20 69 6e 20 74 68 65 20 50 34 20 63 6f 6c 75  d in the P4 colu
81b0: 6d 6e 20 6f 66 20 45 58 50 4c 41 49 4e 20 6f 75  mn of EXPLAIN ou
81c0: 74 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tput..*/.static 
81d0: 76 6f 69 64 20 64 69 73 70 6c 61 79 50 34 45 78  void displayP4Ex
81e0: 70 72 28 53 74 72 41 63 63 75 6d 20 2a 70 2c 20  pr(StrAccum *p, 
81f0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
8200: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20  const char *zOp 
8210: 3d 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70  = 0;.  switch( p
8220: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
8230: 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a  case TK_STRING:.
8240: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
8250: 69 6e 74 66 28 70 2c 20 22 25 51 22 2c 20 70 45  intf(p, "%Q", pE
8260: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
8270: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8280: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
8290: 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58  :.      sqlite3X
82a0: 50 72 69 6e 74 66 28 70 2c 20 22 25 64 22 2c 20  Printf(p, "%d", 
82b0: 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 29  pExpr->u.iValue)
82c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
82d0: 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a     case TK_NULL:
82e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50  .      sqlite3XP
82f0: 72 69 6e 74 66 28 70 2c 20 22 4e 55 4c 4c 22 29  rintf(p, "NULL")
8300: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
8310: 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53     case TK_REGIS
8320: 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TER: {.      sql
8330: 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22  ite3XPrintf(p, "
8340: 72 5b 25 64 5d 22 2c 20 70 45 78 70 72 2d 3e 69  r[%d]", pExpr->i
8350: 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72  Table);.      br
8360: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
8370: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
8380: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
8390: 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
83a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50         sqlite3XP
83b0: 72 69 6e 74 66 28 70 2c 20 22 72 6f 77 69 64 22  rintf(p, "rowid"
83c0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
83d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58          sqlite3X
83e0: 50 72 69 6e 74 66 28 70 2c 20 22 63 25 64 22 2c  Printf(p, "c%d",
83f0: 20 28 69 6e 74 29 70 45 78 70 72 2d 3e 69 43 6f   (int)pExpr->iCo
8400: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lumn);.      }. 
8410: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8420: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  }.    case TK_LT
8430: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c 54  :      zOp = "LT
8440: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
8450: 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20     case TK_LE:  
8460: 20 20 20 20 7a 4f 70 20 3d 20 22 4c 45 22 3b 20      zOp = "LE"; 
8470: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8480: 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20  case TK_GT:     
8490: 20 7a 4f 70 20 3d 20 22 47 54 22 3b 20 20 20 20   zOp = "GT";    
84a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
84b0: 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 7a 4f  e TK_GE:      zO
84c0: 70 20 3d 20 22 47 45 22 3b 20 20 20 20 20 20 62  p = "GE";      b
84d0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
84e0: 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_NE:      zOp =
84f0: 20 22 4e 45 22 3b 20 20 20 20 20 20 62 72 65 61   "NE";      brea
8500: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  k;.    case TK_E
8510: 51 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 45  Q:      zOp = "E
8520: 51 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  Q";      break;.
8530: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 20      case TK_IS: 
8540: 20 20 20 20 20 7a 4f 70 20 3d 20 22 49 53 22 3b       zOp = "IS";
8550: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8560: 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20   case TK_ISNOT: 
8570: 20 20 7a 4f 70 20 3d 20 22 49 53 4e 4f 54 22 3b    zOp = "ISNOT";
8580: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8590: 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20 7a  se TK_AND:     z
85a0: 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20 20 20 20  Op = "AND";     
85b0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
85c0: 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a 4f 70 20  TK_OR:      zOp 
85d0: 3d 20 22 4f 52 22 3b 20 20 20 20 20 20 62 72 65  = "OR";      bre
85e0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
85f0: 50 4c 55 53 3a 20 20 20 20 7a 4f 70 20 3d 20 22  PLUS:    zOp = "
8600: 41 44 44 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  ADD";     break;
8610: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41  .    case TK_STA
8620: 52 3a 20 20 20 20 7a 4f 70 20 3d 20 22 4d 55 4c  R:    zOp = "MUL
8630: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
8640: 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a    case TK_MINUS:
8650: 20 20 20 7a 4f 70 20 3d 20 22 53 55 42 22 3b 20     zOp = "SUB"; 
8660: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
8670: 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20 20  ase TK_REM:     
8680: 7a 4f 70 20 3d 20 22 52 45 4d 22 3b 20 20 20 20  zOp = "REM";    
8690: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
86a0: 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20 7a 4f 70   TK_BITAND:  zOp
86b0: 20 3d 20 22 42 49 54 41 4e 44 22 3b 20 20 62 72   = "BITAND";  br
86c0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
86d0: 5f 42 49 54 4f 52 3a 20 20 20 7a 4f 70 20 3d 20  _BITOR:   zOp = 
86e0: 22 42 49 54 4f 52 22 3b 20 20 20 62 72 65 61 6b  "BITOR";   break
86f0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c  ;.    case TK_SL
8700: 41 53 48 3a 20 20 20 7a 4f 70 20 3d 20 22 44 49  ASH:   zOp = "DI
8710: 56 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  V";     break;. 
8720: 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46     case TK_LSHIF
8730: 54 3a 20 20 7a 4f 70 20 3d 20 22 4c 53 48 49 46  T:  zOp = "LSHIF
8740: 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  T";  break;.    
8750: 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20  case TK_RSHIFT: 
8760: 20 7a 4f 70 20 3d 20 22 52 53 48 49 46 54 22 3b   zOp = "RSHIFT";
8770: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8780: 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a 4f  e TK_CONCAT:  zO
8790: 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b 20 20 62  p = "CONCAT";  b
87a0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
87b0: 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 4f 70 20 3d  K_UMINUS:  zOp =
87c0: 20 22 4d 49 4e 55 53 22 3b 20 20 20 62 72 65 61   "MINUS";   brea
87d0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  k;.    case TK_U
87e0: 50 4c 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22 50  PLUS:   zOp = "P
87f0: 4c 55 53 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  LUS";    break;.
8800: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e      case TK_BITN
8810: 4f 54 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54 4e  OT:  zOp = "BITN
8820: 4f 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  OT";  break;.   
8830: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20   case TK_NOT:   
8840: 20 20 7a 4f 70 20 3d 20 22 4e 4f 54 22 3b 20 20    zOp = "NOT";  
8850: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8860: 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 7a  se TK_ISNULL:  z
8870: 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22 3b 20 20  Op = "ISNULL";  
8880: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8890: 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4f 70 20  TK_NOTNULL: zOp 
88a0: 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20 62 72 65  = "NOTNULL"; bre
88b0: 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74  ak;..    default
88c0: 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58  :.      sqlite3X
88d0: 50 72 69 6e 74 66 28 70 2c 20 22 25 73 22 2c 20  Printf(p, "%s", 
88e0: 22 65 78 70 72 22 29 3b 0a 20 20 20 20 20 20 62  "expr");.      b
88f0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  reak;.  }..  if(
8900: 20 7a 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69   zOp ){.    sqli
8910: 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22 25  te3XPrintf(p, "%
8920: 73 28 22 2c 20 7a 4f 70 29 3b 0a 20 20 20 20 64  s(", zOp);.    d
8930: 69 73 70 6c 61 79 50 34 45 78 70 72 28 70 2c 20  isplayP4Expr(p, 
8940: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
8950: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52     if( pExpr->pR
8960: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ight ){.      sq
8970: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
8980: 65 6e 64 28 70 2c 20 22 2c 22 2c 20 31 29 3b 0a  end(p, ",", 1);.
8990: 20 20 20 20 20 20 64 69 73 70 6c 61 79 50 34 45        displayP4E
89a0: 78 70 72 28 70 2c 20 70 45 78 70 72 2d 3e 70 52  xpr(p, pExpr->pR
89b0: 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ight);.    }.   
89c0: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
89d0: 41 70 70 65 6e 64 28 70 2c 20 22 29 22 2c 20 31  Append(p, ")", 1
89e0: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
89f0: 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f  /* VDBE_DISPLAY_
8a00: 50 34 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  P4 && defined(SQ
8a10: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
8a20: 4f 52 5f 48 49 4e 54 53 29 20 2a 2f 0a 0a 0a 23  OR_HINTS) */...#
8a30: 69 66 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f  if VDBE_DISPLAY_
8a40: 50 34 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  P4./*.** Compute
8a50: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64   a string that d
8a60: 65 73 63 72 69 62 65 73 20 74 68 65 20 50 34 20  escribes the P4 
8a70: 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e  parameter for an
8a80: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20   opcode..** Use 
8a90: 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65  zTemp for any re
8aa0: 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79  quired temporary
8ab0: 20 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a   buffer space..*
8ac0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 64  /.static char *d
8ad0: 69 73 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70  isplayP4(Op *pOp
8ae0: 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69  , char *zTemp, i
8af0: 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61  nt nTemp){.  cha
8b00: 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a  r *zP4 = zTemp;.
8b10: 20 20 53 74 72 41 63 63 75 6d 20 78 3b 0a 20 20    StrAccum x;.  
8b20: 61 73 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32  assert( nTemp>=2
8b30: 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74  0 );.  sqlite3St
8b40: 72 41 63 63 75 6d 49 6e 69 74 28 26 78 2c 20 30  rAccumInit(&x, 0
8b50: 2c 20 7a 54 65 6d 70 2c 20 6e 54 65 6d 70 2c 20  , zTemp, nTemp, 
8b60: 30 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f  0);.  switch( pO
8b70: 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20  p->p4type ){.   
8b80: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
8b90: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  : {.      int j;
8ba0: 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
8bb0: 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e  pKeyInfo = pOp->
8bc0: 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  p4.pKeyInfo;.   
8bd0: 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49     assert( pKeyI
8be0: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21  nfo->aSortOrder!
8bf0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
8c00: 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22  te3XPrintf(&x, "
8c10: 6b 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d  k(%d", pKeyInfo-
8c20: 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20  >nField);.      
8c30: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49  for(j=0; j<pKeyI
8c40: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b  nfo->nField; j++
8c50: 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  ){.        CollS
8c60: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79  eq *pColl = pKey
8c70: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a  Info->aColl[j];.
8c80: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
8c90: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c  ar *zColl = pCol
8ca0: 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  l ? pColl->zName
8cb0: 20 3a 20 22 22 3b 0a 20 20 20 20 20 20 20 20 69   : "";.        i
8cc0: 66 28 20 73 74 72 63 6d 70 28 7a 43 6f 6c 6c 2c  f( strcmp(zColl,
8cd0: 20 22 42 49 4e 41 52 59 22 29 3d 3d 30 20 29 20   "BINARY")==0 ) 
8ce0: 7a 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20  zColl = "B";.   
8cf0: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
8d00: 6e 74 66 28 26 78 2c 20 22 2c 25 73 25 73 22 2c  ntf(&x, ",%s%s",
8d10: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
8d20: 4f 72 64 65 72 5b 6a 5d 20 3f 20 22 2d 22 20 3a  Order[j] ? "-" :
8d30: 20 22 22 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20   "", zColl);.   
8d40: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
8d50: 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
8d60: 28 26 78 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20  (&x, ")", 1);.  
8d70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8d80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
8d90: 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e  NABLE_CURSOR_HIN
8da0: 54 53 0a 20 20 20 20 63 61 73 65 20 50 34 5f 45  TS.    case P4_E
8db0: 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 64 69 73  XPR: {.      dis
8dc0: 70 6c 61 79 50 34 45 78 70 72 28 26 78 2c 20 70  playP4Expr(&x, p
8dd0: 4f 70 2d 3e 70 34 2e 70 45 78 70 72 29 3b 0a 20  Op->p4.pExpr);. 
8de0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8df0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
8e00: 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a  e P4_COLLSEQ: {.
8e10: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
8e20: 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Coll = pOp->p4.p
8e30: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69  Coll;.      sqli
8e40: 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22  te3XPrintf(&x, "
8e50: 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d  (%.20s)", pColl-
8e60: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62  >zName);.      b
8e70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
8e80: 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a  case P4_FUNCDEF:
8e90: 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66   {.      FuncDef
8ea0: 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34   *pDef = pOp->p4
8eb0: 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71  .pFunc;.      sq
8ec0: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c  lite3XPrintf(&x,
8ed0: 20 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d   "%s(%d)", pDef-
8ee0: 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41  >zName, pDef->nA
8ef0: 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rg);.      break
8f00: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
8f10: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
8f20: 63 61 73 65 20 50 34 5f 46 55 4e 43 43 54 58 3a  case P4_FUNCCTX:
8f30: 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66   {.      FuncDef
8f40: 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34   *pDef = pOp->p4
8f50: 2e 70 43 74 78 2d 3e 70 46 75 6e 63 3b 0a 20 20  .pCtx->pFunc;.  
8f60: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
8f70: 74 66 28 26 78 2c 20 22 25 73 28 25 64 29 22 2c  tf(&x, "%s(%d)",
8f80: 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44   pDef->zName, pD
8f90: 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20  ef->nArg);.     
8fa0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
8fb0: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34  ndif.    case P4
8fc0: 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20  _INT64: {.      
8fd0: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
8fe0: 78 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d  x, "%lld", *pOp-
8ff0: 3e 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20  >p4.pI64);.     
9000: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9010: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a    case P4_INT32:
9020: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
9030: 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25 64 22  XPrintf(&x, "%d"
9040: 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20 20  , pOp->p4.i);.  
9050: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9060: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52 45 41  .    case P4_REA
9070: 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
9080: 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25  e3XPrintf(&x, "%
9090: 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e  .16g", *pOp->p4.
90a0: 70 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72  pReal);.      br
90b0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
90c0: 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20  ase P4_MEM: {.  
90d0: 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20      Mem *pMem = 
90e0: 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20  pOp->p4.pMem;.  
90f0: 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c      if( pMem->fl
9100: 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b  ags & MEM_Str ){
9110: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70  .        zP4 = p
9120: 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65  Mem->z;.      }e
9130: 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c  lse if( pMem->fl
9140: 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b  ags & MEM_Int ){
9150: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9160: 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25 6c 6c  XPrintf(&x, "%ll
9170: 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a  d", pMem->u.i);.
9180: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
9190: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
91a0: 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20  M_Real ){.      
91b0: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
91c0: 28 26 78 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d  (&x, "%.16g", pM
91d0: 65 6d 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20  em->u.r);.      
91e0: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
91f0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
9200: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20   ){.        zP4 
9210: 3d 20 22 4e 55 4c 4c 22 3b 0a 20 20 20 20 20 20  = "NULL";.      
9220: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
9230: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61  ssert( pMem->fla
9240: 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b  gs & MEM_Blob );
9250: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 22  .        zP4 = "
9260: 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20 7d  (blob)";.      }
9270: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9280: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
9290: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
92a0: 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50 34  ABLE.    case P4
92b0: 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73  _VTAB: {.      s
92c0: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
92d0: 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74  ab = pOp->p4.pVt
92e0: 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 20  ab->pVtab;.     
92f0: 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
9300: 26 78 2c 20 22 76 74 61 62 3a 25 70 22 2c 20 70  &x, "vtab:%p", p
9310: 56 74 61 62 29 3b 0a 20 20 20 20 20 20 62 72 65  Vtab);.      bre
9320: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
9330: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
9340: 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 69  ARRAY: {.      i
9350: 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt i;.      int 
9360: 2a 61 69 20 3d 20 70 4f 70 2d 3e 70 34 2e 61 69  *ai = pOp->p4.ai
9370: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  ;.      int n = 
9380: 61 69 5b 30 5d 3b 20 20 20 2f 2a 20 54 68 65 20  ai[0];   /* The 
9390: 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66  first element of
93a0: 20 61 6e 20 49 4e 54 41 52 52 41 59 20 69 73 20   an INTARRAY is 
93b0: 61 6c 77 61 79 73 20 74 68 65 0a 20 20 20 20 20  always the.     
93c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93d0: 20 20 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68    ** count of th
93e0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
93f0: 65 6e 74 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a  ents to follow *
9400: 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b  /.      for(i=1;
9410: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
9420: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
9430: 74 66 28 26 78 2c 20 22 2c 25 64 22 2c 20 61 69  tf(&x, ",%d", ai
9440: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
9450: 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 27      zTemp[0] = '
9460: 5b 27 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  [';.      sqlite
9470: 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
9480: 26 78 2c 20 22 5d 22 2c 20 31 29 3b 0a 20 20 20  &x, "]", 1);.   
9490: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
94a0: 20 20 20 20 63 61 73 65 20 50 34 5f 53 55 42 50      case P4_SUBP
94b0: 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20  ROGRAM: {.      
94c0: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
94d0: 78 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20  x, "program");. 
94e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
94f0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 41 44  }.    case P4_AD
9500: 56 41 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a  VANCE: {.      z
9510: 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  Temp[0] = 0;.   
9520: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9530: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
9540: 20 20 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e       zP4 = pOp->
9550: 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 20  p4.z;.      if( 
9560: 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  zP4==0 ){.      
9570: 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20    zP4 = zTemp;. 
9580: 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20         zTemp[0] 
9590: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
95a0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
95b0: 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26  StrAccumFinish(&
95c0: 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 50  x);.  assert( zP
95d0: 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  4!=0 );.  return
95e0: 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f   zP4;.}.#endif /
95f0: 2a 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50  * VDBE_DISPLAY_P
9600: 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c  4 */../*.** Decl
9610: 61 72 65 20 74 6f 20 74 68 65 20 56 64 62 65 20  are to the Vdbe 
9620: 74 68 61 74 20 74 68 65 20 42 54 72 65 65 20 6f  that the BTree o
9630: 62 6a 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62  bject at db->aDb
9640: 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a  [i] is used..**.
9650: 2a 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20  ** The prepared 
9660: 73 74 61 74 65 6d 65 6e 74 73 20 6e 65 65 64 20  statements need 
9670: 74 6f 20 6b 6e 6f 77 20 69 6e 20 61 64 76 61 6e  to know in advan
9680: 63 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  ce the complete 
9690: 73 65 74 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68  set of.** attach
96a0: 65 64 20 64 61 74 61 62 61 73 65 73 20 74 68 61  ed databases tha
96b0: 74 20 77 69 6c 6c 20 62 65 20 75 73 65 2e 20 20  t will be use.  
96c0: 41 20 6d 61 73 6b 20 6f 66 20 74 68 65 73 65 20  A mask of these 
96d0: 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 69 73 20  databases.** is 
96e0: 6d 61 69 6e 74 61 69 6e 65 64 20 69 6e 20 70 2d  maintained in p-
96f0: 3e 62 74 72 65 65 4d 61 73 6b 2e 20 20 54 68 65  >btreeMask.  The
9700: 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 76 61 6c   p->lockMask val
9710: 75 65 20 69 73 20 74 68 65 20 73 75 62 73 65 74  ue is the subset
9720: 20 6f 66 0a 2a 2a 20 70 2d 3e 62 74 72 65 65 4d   of.** p->btreeM
9730: 61 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65 73  ask of databases
9740: 20 74 68 61 74 20 77 69 6c 6c 20 72 65 71 75 69   that will requi
9750: 72 65 20 61 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f  re a lock..*/.vo
9760: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 55 73  id sqlite3VdbeUs
9770: 65 73 42 74 72 65 65 28 56 64 62 65 20 2a 70 2c  esBtree(Vdbe *p,
9780: 20 69 6e 74 20 69 29 7b 0a 20 20 61 73 73 65 72   int i){.  asser
9790: 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e  t( i>=0 && i<p->
97a0: 64 62 2d 3e 6e 44 62 20 26 26 20 69 3c 28 69 6e  db->nDb && i<(in
97b0: 74 29 73 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b  t)sizeof(yDbMask
97c0: 29 2a 38 20 29 3b 0a 20 20 61 73 73 65 72 74 28  )*8 );.  assert(
97d0: 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 70   i<(int)sizeof(p
97e0: 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29  ->btreeMask)*8 )
97f0: 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d  ;.  DbMaskSet(p-
9800: 3e 62 74 72 65 65 4d 61 73 6b 2c 20 69 29 3b 0a  >btreeMask, i);.
9810: 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 73 71    if( i!=1 && sq
9820: 6c 69 74 65 33 42 74 72 65 65 53 68 61 72 61 62  lite3BtreeSharab
9830: 6c 65 28 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d  le(p->db->aDb[i]
9840: 2e 70 42 74 29 20 29 7b 0a 20 20 20 20 44 62 4d  .pBt) ){.    DbM
9850: 61 73 6b 53 65 74 28 70 2d 3e 6c 6f 63 6b 4d 61  askSet(p->lockMa
9860: 73 6b 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  sk, i);.  }.}..#
9870: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
9880: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
9890: 41 43 48 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 53  ACHE)./*.** If S
98a0: 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65  QLite is compile
98b0: 64 20 74 6f 20 73 75 70 70 6f 72 74 20 73 68 61  d to support sha
98c0: 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 61  red-cache mode a
98d0: 6e 64 20 74 6f 20 62 65 20 74 68 72 65 61 64 73  nd to be threads
98e0: 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75  afe,.** this rou
98f0: 74 69 6e 65 20 6f 62 74 61 69 6e 73 20 74 68 65  tine obtains the
9900: 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74 65   mutex associate
9910: 64 20 77 69 74 68 20 65 61 63 68 20 42 74 53 68  d with each BtSh
9920: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 0a 2a  ared structure.*
9930: 2a 20 74 68 61 74 20 6d 61 79 20 62 65 20 61 63  * that may be ac
9940: 63 65 73 73 65 64 20 62 79 20 74 68 65 20 56 4d  cessed by the VM
9950: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
9960: 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67  gument. In doing
9970: 20 73 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73   so it also.** s
9980: 65 74 73 20 74 68 65 20 42 74 53 68 61 72 65 64  ets the BtShared
9990: 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66 20 65 61  .db member of ea
99a0: 63 68 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  ch of the BtShar
99b0: 65 64 20 73 74 72 75 63 74 75 72 65 73 2c 20 65  ed structures, e
99c0: 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20  nsuring.** that 
99d0: 74 68 65 20 63 6f 72 72 65 63 74 20 62 75 73 79  the correct busy
99e0: 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
99f0: 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 66 20  k is invoked if 
9a00: 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  required..**.** 
9a10: 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74  If SQLite is not
9a20: 20 74 68 72 65 61 64 73 61 66 65 20 62 75 74 20   threadsafe but 
9a30: 64 6f 65 73 20 73 75 70 70 6f 72 74 20 73 68 61  does support sha
9a40: 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20  red-cache mode, 
9a50: 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42  then.** sqlite3B
9a60: 74 72 65 65 45 6e 74 65 72 28 29 20 69 73 20 69  treeEnter() is i
9a70: 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 74 68  nvoked to set th
9a80: 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 76 61  e BtShared.db va
9a90: 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c  riables.** of al
9aa0: 6c 20 6f 66 20 42 74 53 68 61 72 65 64 20 73 74  l of BtShared st
9ab0: 72 75 63 74 75 72 65 73 20 61 63 63 65 73 73 69  ructures accessi
9ac0: 62 6c 65 20 76 69 61 20 74 68 65 20 64 61 74 61  ble via the data
9ad0: 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20  base handle .** 
9ae0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
9af0: 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66  the VM..**.** If
9b00: 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74   SQLite is not t
9b10: 68 72 65 61 64 73 61 66 65 20 61 6e 64 20 64 6f  hreadsafe and do
9b20: 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 73  es not support s
9b30: 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65  hared-cache mode
9b40: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
9b50: 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
9b60: 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e 62 74 72 65  *.** The p->btre
9b70: 65 4d 61 73 6b 20 66 69 65 6c 64 20 69 73 20 61  eMask field is a
9b80: 20 62 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20   bitmask of all 
9b90: 62 74 72 65 65 73 20 74 68 61 74 20 74 68 65 20  btrees that the 
9ba0: 70 72 65 70 61 72 65 64 20 0a 2a 2a 20 73 74 61  prepared .** sta
9bb0: 74 65 6d 65 6e 74 20 70 20 77 69 6c 6c 20 65 76  tement p will ev
9bc0: 65 72 20 75 73 65 2e 20 20 4c 65 74 20 4e 20 62  er use.  Let N b
9bd0: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
9be0: 62 69 74 73 20 69 6e 20 70 2d 3e 62 74 72 65 65  bits in p->btree
9bf0: 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  Mask.** correspo
9c00: 6e 64 69 6e 67 20 74 6f 20 62 74 72 65 65 73 20  nding to btrees 
9c10: 74 68 61 74 20 75 73 65 20 73 68 61 72 65 64 20  that use shared 
9c20: 63 61 63 68 65 2e 20 20 54 68 65 6e 20 74 68 65  cache.  Then the
9c30: 20 72 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74   runtime of.** t
9c40: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 4e  his routine is N
9c50: 2a 4e 2e 20 20 42 75 74 20 61 73 20 4e 20 69 73  *N.  But as N is
9c60: 20 72 61 72 65 6c 79 20 6d 6f 72 65 20 74 68 61   rarely more tha
9c70: 6e 20 31 2c 20 74 68 69 73 20 73 68 6f 75 6c 64  n 1, this should
9c80: 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f   not.** be a pro
9c90: 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  blem..*/.void sq
9ca0: 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 56  lite3VdbeEnter(V
9cb0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
9cc0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
9cd0: 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e  .  Db *aDb;.  in
9ce0: 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 44 62 4d  t nDb;.  if( DbM
9cf0: 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f  askAllZero(p->lo
9d00: 63 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72 6e  ckMask) ) return
9d10: 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e  ;  /* The common
9d20: 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20   case */.  db = 
9d30: 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64  p->db;.  aDb = d
9d40: 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20  b->aDb;.  nDb = 
9d50: 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69  db->nDb;.  for(i
9d60: 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b  =0; i<nDb; i++){
9d70: 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20 26 26  .    if( i!=1 &&
9d80: 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c   DbMaskTest(p->l
9d90: 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c  ockMask,i) && AL
9da0: 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21  WAYS(aDb[i].pBt!
9db0: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  =0) ){.      sql
9dc0: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 61  ite3BtreeEnter(a
9dd0: 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[i].pBt);.    
9de0: 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
9df0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
9e00: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
9e10: 43 41 43 48 45 29 20 26 26 20 53 51 4c 49 54 45  CACHE) && SQLITE
9e20: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a  _THREADSAFE>0./*
9e30: 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f  .** Unlock all o
9e40: 66 20 74 68 65 20 62 74 72 65 65 73 20 70 72 65  f the btrees pre
9e50: 76 69 6f 75 73 6c 79 20 6c 6f 63 6b 65 64 20 62  viously locked b
9e60: 79 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  y a call to sqli
9e70: 74 65 33 56 64 62 65 45 6e 74 65 72 28 29 2e 0a  te3VdbeEnter()..
9e80: 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
9e90: 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 76  _NOINLINE void v
9ea0: 64 62 65 4c 65 61 76 65 28 56 64 62 65 20 2a 70  dbeLeave(Vdbe *p
9eb0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
9ec0: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20  lite3 *db;.  Db 
9ed0: 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b  *aDb;.  int nDb;
9ee0: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
9ef0: 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a   aDb = db->aDb;.
9f00: 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b    nDb = db->nDb;
9f10: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44  .  for(i=0; i<nD
9f20: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  b; i++){.    if(
9f30: 20 69 21 3d 31 20 26 26 20 44 62 4d 61 73 6b 54   i!=1 && DbMaskT
9f40: 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c  est(p->lockMask,
9f50: 69 29 20 26 26 20 41 4c 57 41 59 53 28 61 44 62  i) && ALWAYS(aDb
9f60: 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20  [i].pBt!=0) ){. 
9f70: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
9f80: 65 4c 65 61 76 65 28 61 44 62 5b 69 5d 2e 70 42  eLeave(aDb[i].pB
9f90: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
9fa0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
9fb0: 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a  Leave(Vdbe *p){.
9fc0: 20 20 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a    if( DbMaskAllZ
9fd0: 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29  ero(p->lockMask)
9fe0: 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54   ) return;  /* T
9ff0: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a  he common case *
a000: 2f 0a 20 20 76 64 62 65 4c 65 61 76 65 28 70 29  /.  vdbeLeave(p)
a010: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
a020: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
a030: 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64  FILE) || defined
a040: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
a050: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e  *.** Print a sin
a060: 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69  gle opcode.  Thi
a070: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
a080: 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  d for debugging 
a090: 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  only..*/.void sq
a0a0: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
a0b0: 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74  (FILE *pOut, int
a0c0: 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20   pc, Op *pOp){. 
a0d0: 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68   char *zP4;.  ch
a0e0: 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 63  ar zPtr[50];.  c
a0f0: 68 61 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a 20  har zCom[100];. 
a100: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
a110: 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22  ar *zFormat1 = "
a120: 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25 34  %4d %-13s %4d %4
a130: 64 20 25 34 64 20 25 2d 31 33 73 20 25 2e 32 58  d %4d %-13s %.2X
a140: 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f   %s\n";.  if( pO
a150: 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73  ut==0 ) pOut = s
a160: 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64  tdout;.  zP4 = d
a170: 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50  isplayP4(pOp, zP
a180: 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29  tr, sizeof(zPtr)
a190: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
a1a0: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
a1b0: 43 4f 4d 4d 45 4e 54 53 0a 20 20 64 69 73 70 6c  COMMENTS.  displ
a1c0: 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a  ayComment(pOp, z
a1d0: 50 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f 66  P4, zCom, sizeof
a1e0: 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a 20  (zCom));.#else. 
a1f0: 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23 65   zCom[0] = 0;.#e
a200: 6e 64 69 66 0a 20 20 2f 2a 20 4e 42 3a 20 20 54  ndif.  /* NB:  T
a210: 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  he sqlite3Opcode
a220: 4e 61 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  Name() function 
a230: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
a240: 79 20 63 6f 64 65 20 63 72 65 61 74 65 64 0a 20  y code created. 
a250: 20 2a 2a 20 62 79 20 74 68 65 20 6d 6b 6f 70 63   ** by the mkopc
a260: 6f 64 65 68 2e 61 77 6b 20 61 6e 64 20 6d 6b 6f  odeh.awk and mko
a270: 70 63 6f 64 65 63 2e 61 77 6b 20 73 63 72 69 70  pcodec.awk scrip
a280: 74 73 20 77 68 69 63 68 20 65 78 74 72 61 63 74  ts which extract
a290: 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d   the.  ** inform
a2a0: 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 76  ation from the v
a2b0: 64 62 65 2e 63 20 73 6f 75 72 63 65 20 74 65 78  dbe.c source tex
a2c0: 74 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 70  t */.  fprintf(p
a2d0: 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70  Out, zFormat1, p
a2e0: 63 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65  c, .      sqlite
a2f0: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d  3OpcodeName(pOp-
a300: 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70  >opcode), pOp->p
a310: 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d  1, pOp->p2, pOp-
a320: 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70  >p3, zP4, pOp->p
a330: 35 2c 0a 20 20 20 20 20 20 7a 43 6f 6d 0a 20 20  5,.      zCom.  
a340: 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74  );.  fflush(pOut
a350: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
a360: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72  ** Release an ar
a370: 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65  ray of N Mem ele
a380: 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20  ments.*/.static 
a390: 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41  void releaseMemA
a3a0: 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74  rray(Mem *p, int
a3b0: 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20   N){.  if( p && 
a3c0: 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45  N ){.    Mem *pE
a3d0: 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a 20 20 20 20  nd = &p[N];.    
a3e0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
a3f0: 3e 64 62 3b 0a 20 20 20 20 75 38 20 6d 61 6c 6c  >db;.    u8 mall
a400: 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64 62 2d 3e  oc_failed = db->
a410: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20  mallocFailed;.  
a420: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
a430: 73 46 72 65 65 64 20 29 7b 0a 20 20 20 20 20 20  sFreed ){.      
a440: 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  do{.        if( 
a450: 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71  p->szMalloc ) sq
a460: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
a470: 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20  p->zMalloc);.   
a480: 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29     }while( (++p)
a490: 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 72  <pEnd );.      r
a4a0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
a4b0: 20 64 6f 7b 0a 20 20 20 20 20 20 61 73 73 65 72   do{.      asser
a4c0: 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64  t( (&p[1])==pEnd
a4d0: 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31   || p[0].db==p[1
a4e0: 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 61 73  ].db );.      as
a4f0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62  sert( sqlite3Vdb
a500: 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61  eCheckMemInvaria
a510: 6e 74 73 28 70 29 20 29 3b 0a 0a 20 20 20 20 20  nts(p) );..     
a520: 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69   /* This block i
a530: 73 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69  s really an inli
a540: 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73  ned version of s
a550: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
a560: 65 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a 20  ease().      ** 
a570: 74 68 61 74 20 74 61 6b 65 73 20 61 64 76 61 6e  that takes advan
a580: 74 61 67 65 20 6f 66 20 74 68 65 20 66 61 63 74  tage of the fact
a590: 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79   that the memory
a5a0: 20 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a   cell value is .
a5b0: 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 73        ** being s
a5c0: 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72  et to NULL after
a5d0: 20 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20 64   releasing any d
a5e0: 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73  ynamic resources
a5f0: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
a600: 20 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69 63   ** The justific
a610: 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63  ation for duplic
a620: 61 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74 68  ating code is th
a630: 61 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  at according to 
a640: 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72  .      ** callgr
a650: 69 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65 73  ind, this causes
a660: 20 61 20 63 65 72 74 61 69 6e 20 74 65 73 74 20   a certain test 
a670: 63 61 73 65 20 74 6f 20 68 69 74 20 74 68 65 20  case to hit the 
a680: 43 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20 2a  CPU 4.7 .      *
a690: 2a 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20 28  * percent less (
a6a0: 78 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20 76  x86 linux, gcc v
a6b0: 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f  ersion 4.1.2, -O
a6c0: 36 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20 20  6) than if .    
a6d0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52    ** sqlite3MemR
a6e0: 65 6c 65 61 73 65 28 29 20 77 65 72 65 20 63 61  elease() were ca
a6f0: 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e 20  lled from here. 
a700: 57 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a  With -O2, this j
a710: 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f  umps.      ** to
a720: 20 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54 68   6.6 percent. Th
a730: 65 20 74 65 73 74 20 63 61 73 65 20 69 73 20 69  e test case is i
a740: 6e 73 65 72 74 69 6e 67 20 31 30 30 30 20 72 6f  nserting 1000 ro
a750: 77 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20  ws into a table 
a760: 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 6e  .      ** with n
a770: 6f 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20  o indexes using 
a780: 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65  a single prepare
a790: 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65  d INSERT stateme
a7a0: 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20 20  nt, bind() .    
a7b0: 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28 29    ** and reset()
a7c0: 2e 20 49 6e 73 65 72 74 73 20 61 72 65 20 67 72  . Inserts are gr
a7d0: 6f 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72 61  ouped into a tra
a7e0: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
a7f0: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
a800: 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45  e( p->flags & ME
a810: 4d 5f 41 67 67 20 29 3b 0a 20 20 20 20 20 20 74  M_Agg );.      t
a820: 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67  estcase( p->flag
a830: 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20  s & MEM_Dyn );. 
a840: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
a850: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 46 72  ->flags & MEM_Fr
a860: 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ame );.      tes
a870: 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20  tcase( p->flags 
a880: 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29 3b 0a  & MEM_RowSet );.
a890: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61        if( p->fla
a8a0: 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f  gs&(MEM_Agg|MEM_
a8b0: 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45  Dyn|MEM_Frame|ME
a8c0: 4d 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20 20 20  M_RowSet) ){.   
a8d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a8e0: 4d 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20  MemRelease(p);. 
a8f0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
a900: 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20  ->szMalloc ){.  
a910: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
a920: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c  ree(db, p->zMall
a930: 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  oc);.        p->
a940: 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  szMalloc = 0;.  
a950: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e      }..      p->
a960: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65  flags = MEM_Unde
a970: 66 69 6e 65 64 3b 0a 20 20 20 20 7d 77 68 69 6c  fined;.    }whil
a980: 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b  e( (++p)<pEnd );
a990: 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
a9a0: 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66  ailed = malloc_f
a9b0: 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ailed;.  }.}../*
a9c0: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 56 64 62  .** Delete a Vdb
a9d0: 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e  eFrame object an
a9e0: 64 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20  d its contents. 
a9f0: 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74  VdbeFrame object
aa00: 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  s are.** allocat
aa10: 65 64 20 62 79 20 74 68 65 20 4f 50 5f 50 72 6f  ed by the OP_Pro
aa20: 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73  gram opcode in s
aa30: 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29  qlite3VdbeExec()
aa40: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
aa50: 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65  3VdbeFrameDelete
aa60: 28 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a  (VdbeFrame *p){.
aa70: 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a    int i;.  Mem *
aa80: 61 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d 65  aMem = VdbeFrame
aa90: 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62 65 43 75  Mem(p);.  VdbeCu
aaa0: 72 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20 28  rsor **apCsr = (
aab0: 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 61  VdbeCursor **)&a
aac0: 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d  Mem[p->nChildMem
aad0: 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ];.  for(i=0; i<
aae0: 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b  p->nChildCsr; i+
aaf0: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
ab00: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2d  dbeFreeCursor(p-
ab10: 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20  >v, apCsr[i]);. 
ab20: 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41   }.  releaseMemA
ab30: 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43  rray(aMem, p->nC
ab40: 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69  hildMem);.  sqli
ab50: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e  te3DbFree(p->v->
ab60: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64  db, p);.}..#ifnd
ab70: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
ab80: 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76  XPLAIN./*.** Giv
ab90: 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74  e a listing of t
aba0: 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68  he program in th
abb0: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
abc0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74  e..**.** The int
abd0: 65 72 66 61 63 65 20 69 73 20 74 68 65 20 73 61  erface is the sa
abe0: 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56 64 62  me as sqlite3Vdb
abf0: 65 45 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e  eExec().  But in
ac00: 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e  stead of.** runn
ac10: 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74  ing the code, it
ac20: 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c   invokes the cal
ac30: 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65  lback once for e
ac40: 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ach instruction.
ac50: 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72 65  .** This feature
ac60: 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   is used to impl
ac70: 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e  ement "EXPLAIN".
ac80: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65  .**.** When p->e
ac90: 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20  xplain==1, each 
aca0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c  instruction is l
acb0: 69 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20  isted.  When.** 
acc0: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f  p->explain==2, o
acd0: 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69  nly OP_Explain i
ace0: 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20  nstructions are 
acf0: 6c 69 73 74 65 64 20 61 6e 64 20 74 68 65 73 65  listed and these
ad00: 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e  .** are shown in
ad10: 20 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72   a different for
ad20: 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e  mat.  p->explain
ad30: 3d 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20 69  ==2 is used to i
ad40: 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c  mplement.** EXPL
ad50: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a  AIN QUERY PLAN..
ad60: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78  **.** When p->ex
ad70: 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20  plain==1, first 
ad80: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
ad90: 20 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e   is listed, then
ada0: 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20   each of.** the 
adb0: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
adc0: 61 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f  ams are listed o
add0: 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e  ne by one..*/.in
ade0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73  t sqlite3VdbeLis
adf0: 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20  t(.  Vdbe *p    
ae00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ae10: 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b  * The VDBE */.){
ae20: 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20  .  int nRow;    
ae30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae40: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20          /* Stop 
ae50: 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72  when row count r
ae60: 65 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20  eaches this */. 
ae70: 20 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20   int nSub = 0;  
ae80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae90: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
aea0: 6f 66 20 73 75 62 2d 76 64 62 65 73 20 73 65 65  of sub-vdbes see
aeb0: 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75  n so far */.  Su
aec0: 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62  bProgram **apSub
aed0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
aee0: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73     /* Array of s
aef0: 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65  ub-vdbes */.  Me
af00: 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20  m *pSub = 0;    
af10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af20: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
af30: 6c 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20  l hold array of 
af40: 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71  subprogs */.  sq
af50: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
af60: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
af70: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
af80: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
af90: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
afa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afb0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
afc0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
afd0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
afe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aff0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
b000: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20   */.  Mem *pMem 
b010: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20  = &p->aMem[1];  
b020: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
b030: 72 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c  rst Mem of resul
b040: 74 20 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65  t set */..  asse
b050: 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29  rt( p->explain )
b060: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
b070: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
b080: 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  _RUN );.  assert
b090: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
b0a0: 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  OK || p->rc==SQL
b0b0: 49 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72  ITE_BUSY || p->r
b0c0: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
b0d0: 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68  );..  /* Even th
b0e0: 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65  ough this opcode
b0f0: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 79   does not use dy
b100: 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66 6f  namic strings fo
b110: 72 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c  r.  ** the resul
b120: 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  t, result column
b130: 73 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e  s may become dyn
b140: 61 6d 69 63 20 69 66 20 74 68 65 20 75 73 65 72  amic if the user
b150: 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69   calls.  ** sqli
b160: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31  te3_column_text1
b170: 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74  6(), causing a t
b180: 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54  ranslation to UT
b190: 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20  F-16 encoding.. 
b1a0: 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d   */.  releaseMem
b1b0: 41 72 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a  Array(pMem, 8);.
b1c0: 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20    p->pResultSet 
b1d0: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72  = 0;..  if( p->r
b1e0: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
b1f0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68  ){.    /* This h
b200: 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c  appens if a mall
b210: 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20 63 61  oc() inside a ca
b220: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f  ll to sqlite3_co
b230: 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20  lumn_text() or. 
b240: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f     ** sqlite3_co
b250: 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61  lumn_text16() fa
b260: 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64 62  iled.  */.    db
b270: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
b280: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
b290: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
b2a0: 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20  ..  /* When the 
b2b0: 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
b2c0: 20 72 6f 77 73 20 72 65 61 63 68 65 73 20 6e 52   rows reaches nR
b2d0: 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ow, that means t
b2e0: 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20  he.  ** listing 
b2f0: 68 61 73 20 66 69 6e 69 73 68 65 64 20 61 6e 64  has finished and
b300: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
b310: 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 53 51  should return SQ
b320: 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20  LITE_DONE..  ** 
b330: 6e 52 6f 77 20 69 73 20 74 68 65 20 73 75 6d 20  nRow is the sum 
b340: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
b350: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69   rows in the mai
b360: 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a  n program, plus.
b370: 20 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66 20    ** the sum of 
b380: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
b390: 77 73 20 69 6e 20 61 6c 6c 20 74 72 69 67 67 65  ws in all trigge
b3a0: 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 65 6e  r subprograms en
b3b0: 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73  countered.  ** s
b3c0: 6f 20 66 61 72 2e 20 20 54 68 65 20 6e 52 6f 77  o far.  The nRow
b3d0: 20 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72   value will incr
b3e0: 65 61 73 65 20 61 73 20 6e 65 77 20 74 72 69 67  ease as new trig
b3f0: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20  ger subprograms 
b400: 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74  are.  ** encount
b410: 65 72 65 64 2c 20 62 75 74 20 70 2d 3e 70 63 20  ered, but p->pc 
b420: 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20  will eventually 
b430: 63 61 74 63 68 20 75 70 20 74 6f 20 6e 52 6f 77  catch up to nRow
b440: 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20  ..  */.  nRow = 
b450: 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d  p->nOp;.  if( p-
b460: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20  >explain==1 ){. 
b470: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
b480: 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61  8 memory cells a
b490: 72 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  re used for the 
b4a0: 72 65 73 75 6c 74 20 73 65 74 2e 20 20 53 6f 20  result set.  So 
b4b0: 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63  we will.    ** c
b4c0: 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65 20 39 74  ommandeer the 9t
b4d0: 68 20 63 65 6c 6c 20 74 6f 20 75 73 65 20 61 73  h cell to use as
b4e0: 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 6e 20   storage for an 
b4f0: 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72  array of pointer
b500: 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72 69 67  s.    ** to trig
b510: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 2e  ger subprograms.
b520: 20 20 54 68 65 20 56 44 42 45 20 69 73 20 67 75    The VDBE is gu
b530: 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76 65  aranteed to have
b540: 20 61 74 20 6c 65 61 73 74 20 39 0a 20 20 20 20   at least 9.    
b550: 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20  ** cells.  */.  
b560: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65    assert( p->nMe
b570: 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53 75 62 20  m>9 );.    pSub 
b580: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20  = &p->aMem[9];. 
b590: 20 20 20 69 66 28 20 70 53 75 62 2d 3e 66 6c 61     if( pSub->fla
b5a0: 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20  gs&MEM_Blob ){. 
b5b0: 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66       /* On the f
b5c0: 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  irst call to sql
b5d0: 69 74 65 33 5f 73 74 65 70 28 29 2c 20 70 53 75  ite3_step(), pSu
b5e0: 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55  b will hold a NU
b5f0: 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20 20 20 20  LL.  It is.     
b600: 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   ** initialized 
b610: 74 6f 20 61 20 42 4c 4f 42 20 62 79 20 74 68 65  to a BLOB by the
b620: 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 70   P4_SUBPROGRAM p
b630: 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20  rocessing logic 
b640: 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e  below */.      n
b650: 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69  Sub = pSub->n/si
b660: 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20 20  zeof(Vdbe*);.   
b670: 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50     apSub = (SubP
b680: 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e  rogram **)pSub->
b690: 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  z;.    }.    for
b6a0: 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b  (i=0; i<nSub; i+
b6b0: 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b  +){.      nRow +
b6c0: 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b  = apSub[i]->nOp;
b6d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f  .    }.  }..  do
b6e0: 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b  {.    i = p->pc+
b6f0: 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e  +;.  }while( i<n
b700: 52 6f 77 20 26 26 20 70 2d 3e 65 78 70 6c 61 69  Row && p->explai
b710: 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69  n==2 && p->aOp[i
b720: 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70  ].opcode!=OP_Exp
b730: 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e  lain );.  if( i>
b740: 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e  =nRow ){.    p->
b750: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
b760: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
b770: 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  DONE;.  }else if
b780: 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72  ( db->u1.isInter
b790: 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d  rupted ){.    p-
b7a0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  >rc = SQLITE_INT
b7b0: 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d  ERRUPT;.    rc =
b7c0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
b7d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 72     sqlite3VdbeEr
b7e0: 72 6f 72 28 70 2c 20 73 71 6c 69 74 65 33 45 72  ror(p, sqlite3Er
b7f0: 72 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20  rStr(p->rc));.  
b800: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
b810: 2a 7a 50 34 3b 0a 20 20 20 20 4f 70 20 2a 70 4f  *zP4;.    Op *pO
b820: 70 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 2d 3e  p;.    if( i<p->
b830: 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  nOp ){.      /* 
b840: 54 68 65 20 6f 75 74 70 75 74 20 6c 69 6e 65 20  The output line 
b850: 6e 75 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c 20  number is small 
b860: 65 6e 6f 75 67 68 20 74 68 61 74 20 77 65 20 61  enough that we a
b870: 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a  re still in the.
b880: 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72        ** main pr
b890: 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20  ogram. */.      
b8a0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d  pOp = &p->aOp[i]
b8b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
b8c0: 20 20 20 2f 2a 20 57 65 20 61 72 65 20 63 75 72     /* We are cur
b8d0: 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20 73  rently listing s
b8e0: 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 46 69 67  ubprograms.  Fig
b8f0: 75 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e  ure out which on
b900: 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70  e and.      ** p
b910: 69 63 6b 20 75 70 20 74 68 65 20 61 70 70 72 6f  ick up the appro
b920: 70 72 69 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a  priate opcode. *
b930: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  /.      int j;. 
b940: 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70       i -= p->nOp
b950: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
b960: 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f   i>=apSub[j]->nO
b970: 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; j++){.       
b980: 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e   i -= apSub[j]->
b990: 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nOp;.      }.   
b9a0: 20 20 20 70 4f 70 20 3d 20 26 61 70 53 75 62 5b     pOp = &apSub[
b9b0: 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20  j]->aOp[i];.    
b9c0: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70  }.    if( p->exp
b9d0: 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20  lain==1 ){.     
b9e0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
b9f0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d  EM_Int;.      pM
ba00: 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20  em->u.i = i;    
ba10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
ba30: 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a  rogram counter *
ba40: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  /.      pMem++;.
ba50: 20 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66    .      pMem->f
ba60: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69  lags = MEM_Stati
ba70: 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  c|MEM_Str|MEM_Te
ba80: 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  rm;.      pMem->
ba90: 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74  z = (char*)sqlit
baa0: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70  e3OpcodeName(pOp
bab0: 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70  ->opcode); /* Op
bac0: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  code */.      as
bad0: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30  sert( pMem->z!=0
bae0: 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   );.      pMem->
baf0: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
bb00: 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20  n30(pMem->z);.  
bb10: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
bb20: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
bb30: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
bb40: 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f    /* When an OP_
bb50: 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69  Program opcode i
bb60: 73 20 65 6e 63 6f 75 6e 74 65 72 20 28 74 68 65  s encounter (the
bb70: 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68 61   only opcode tha
bb80: 74 20 68 61 73 0a 20 20 20 20 20 20 2a 2a 20 61  t has.      ** a
bb90: 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 61   P4_SUBPROGRAM a
bba0: 72 67 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64  rgument), expand
bbb0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
bbc0: 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f   array of subpro
bbd0: 67 72 61 6d 73 0a 20 20 20 20 20 20 2a 2a 20 6b  grams.      ** k
bbe0: 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39  ept in p->aMem[9
bbf0: 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ].z to hold the 
bc00: 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d 20 61 73  new program - as
bc10: 73 75 6d 69 6e 67 20 74 68 69 73 20 73 75 62 70  suming this subp
bc20: 72 6f 67 72 61 6d 0a 20 20 20 20 20 20 2a 2a 20  rogram.      ** 
bc30: 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  has not already 
bc40: 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20 20  been seen..     
bc50: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f   */.      if( pO
bc60: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55  p->p4type==P4_SU
bc70: 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20  BPROGRAM ){.    
bc80: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
bc90: 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28  (nSub+1)*sizeof(
bca0: 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20  SubProgram*);.  
bcb0: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
bcc0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
bcd0: 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nSub; j++){.    
bce0: 20 20 20 20 20 20 69 66 28 20 61 70 53 75 62 5b        if( apSub[
bcf0: 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f  j]==pOp->p4.pPro
bd00: 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  gram ) break;.  
bd10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
bd20: 69 66 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20 53  if( j==nSub && S
bd30: 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65  QLITE_OK==sqlite
bd40: 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 53 75  3VdbeMemGrow(pSu
bd50: 62 2c 20 6e 42 79 74 65 2c 20 6e 53 75 62 21 3d  b, nByte, nSub!=
bd60: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
bd70: 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67  apSub = (SubProg
bd80: 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a  ram **)pSub->z;.
bd90: 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62 5b            apSub[
bda0: 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70  nSub++] = pOp->p
bdb0: 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20  4.pProgram;.    
bdc0: 20 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61 67        pSub->flag
bdd0: 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20  s |= MEM_Blob;. 
bde0: 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e           pSub->n
bdf0: 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53   = nSub*sizeof(S
be00: 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20  ubProgram*);.   
be10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
be20: 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e     }..    pMem->
be30: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
be40: 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  .    pMem->u.i =
be50: 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20   pOp->p1;       
be60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be70: 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20     /* P1 */.    
be80: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65  pMem++;..    pMe
be90: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
bea0: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  nt;.    pMem->u.
beb0: 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20  i = pOp->p2;    
bec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bed0: 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20        /* P2 */. 
bee0: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
bef0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
bf00: 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d  M_Int;.    pMem-
bf10: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20  >u.i = pOp->p3; 
bf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf30: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a           /* P3 *
bf40: 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  /.    pMem++;.. 
bf50: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
bf60: 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73  beMemClearAndRes
bf70: 69 7a 65 28 70 4d 65 6d 2c 20 31 30 30 29 20 29  ize(pMem, 100) )
bf80: 7b 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20  { /* P4 */.     
bf90: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e   assert( p->db->
bfa0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
bfb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
bfc0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
bfd0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
bfe0: 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54   = MEM_Str|MEM_T
bff0: 65 72 6d 3b 0a 20 20 20 20 7a 50 34 20 3d 20 64  erm;.    zP4 = d
c000: 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d  isplayP4(pOp, pM
c010: 65 6d 2d 3e 7a 2c 20 70 4d 65 6d 2d 3e 73 7a 4d  em->z, pMem->szM
c020: 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20  alloc);.    if( 
c030: 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a  zP4!=pMem->z ){.
c040: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c050: 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c  eMemSetStr(pMem,
c060: 20 7a 50 34 2c 20 2d 31 2c 20 53 51 4c 49 54 45   zP4, -1, SQLITE
c070: 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d  _UTF8, 0);.    }
c080: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
c090: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
c0a0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
c0b0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
c0c0: 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  0(pMem->z);.    
c0d0: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
c0e0: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d  LITE_UTF8;.    }
c0f0: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
c100: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
c110: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==1 ){.      if(
c120: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
c130: 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d  learAndResize(pM
c140: 65 6d 2c 20 34 29 20 29 7b 0a 20 20 20 20 20 20  em, 4) ){.      
c150: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d    assert( p->db-
c160: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
c170: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
c180: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
c190: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d      }.      pMem
c1a0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
c1b0: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
c1c0: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20    pMem->n = 2;. 
c1d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
c1e0: 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a  rintf(3, pMem->z
c1f0: 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70  , "%.2x", pOp->p
c200: 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20  5);   /* P5 */. 
c210: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
c220: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
c230: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23      pMem++;.  .#
c240: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
c250: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
c260: 45 4e 54 53 0a 20 20 20 20 20 20 69 66 28 20 73  ENTS.      if( s
c270: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65  qlite3VdbeMemCle
c280: 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d  arAndResize(pMem
c290: 2c 20 35 30 30 29 20 29 7b 0a 20 20 20 20 20 20  , 500) ){.      
c2a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d    assert( p->db-
c2b0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
c2c0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
c2d0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
c2e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d      }.      pMem
c2f0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
c300: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
c310: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69 73 70    pMem->n = disp
c320: 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20  layComment(pOp, 
c330: 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 35 30  zP4, pMem->z, 50
c340: 30 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  0);.      pMem->
c350: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
c360: 38 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70  8;.#else.      p
c370: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
c380: 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  _Null;          
c390: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c3a0: 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64 69  Comment */.#endi
c3b0: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e  f.    }..    p->
c3c0: 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d  nResColumn = 8 -
c3d0: 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31   4*(p->explain-1
c3e0: 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 73 75 6c  );.    p->pResul
c3f0: 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  tSet = &p->aMem[
c400: 31 5d 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  1];.    p->rc = 
c410: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
c420: 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a  c = SQLITE_ROW;.
c430: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
c440: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
c450: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
c460: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
c470: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  TE_DEBUG./*.** P
c480: 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61  rint the SQL tha
c490: 74 20 77 61 73 20 75 73 65 64 20 74 6f 20 67 65  t was used to ge
c4a0: 6e 65 72 61 74 65 20 61 20 56 44 42 45 20 70 72  nerate a VDBE pr
c4b0: 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ogram..*/.void s
c4c0: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 53  qlite3VdbePrintS
c4d0: 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 63  ql(Vdbe *p){.  c
c4e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30  onst char *z = 0
c4f0: 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20  ;.  if( p->zSql 
c500: 29 7b 0a 20 20 20 20 7a 20 3d 20 70 2d 3e 7a 53  ){.    z = p->zS
c510: 71 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ql;.  }else if( 
c520: 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20 20  p->nOp>=1 ){.   
c530: 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 20 2a 70   const VdbeOp *p
c540: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b  Op = &p->aOp[0];
c550: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  .    if( pOp->op
c560: 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26  code==OP_Init &&
c570: 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b   pOp->p4.z!=0 ){
c580: 0a 20 20 20 20 20 20 7a 20 3d 20 70 4f 70 2d 3e  .      z = pOp->
c590: 70 34 2e 7a 3b 0a 20 20 20 20 20 20 77 68 69 6c  p4.z;.      whil
c5a0: 65 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63  e( sqlite3Isspac
c5b0: 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20  e(*z) ) z++;.   
c5c0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29   }.  }.  if( z )
c5d0: 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25   printf("SQL: [%
c5e0: 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e  s]\n", z);.}.#en
c5f0: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
c600: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
c610: 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  ACE) && defined(
c620: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
c630: 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69  TRACE)./*.** Pri
c640: 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65  nt an IOTRACE me
c650: 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51  ssage showing SQ
c660: 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f  L content..*/.vo
c670: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f  id sqlite3VdbeIO
c680: 54 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70  TraceSql(Vdbe *p
c690: 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70  ){.  int nOp = p
c6a0: 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20  ->nOp;.  VdbeOp 
c6b0: 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69  *pOp;.  if( sqli
c6c0: 74 65 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20  te3IoTrace==0 ) 
c6d0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f  return;.  if( nO
c6e0: 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  p<1 ) return;.  
c6f0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d  pOp = &p->aOp[0]
c700: 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  ;.  if( pOp->opc
c710: 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20  ode==OP_Init && 
c720: 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a  pOp->p4.z!=0 ){.
c730: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
c740: 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a    char z[1000];.
c750: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
c760: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20  intf(sizeof(z), 
c770: 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34  z, "%s", pOp->p4
c780: 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  .z);.    for(i=0
c790: 3b 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ; sqlite3Isspace
c7a0: 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20  (z[i]); i++){}. 
c7b0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d     for(j=0; z[i]
c7c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
c7d0: 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ( sqlite3Isspace
c7e0: 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  (z[i]) ){.      
c7f0: 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20    if( z[i-1]!=' 
c800: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ' ){.          z
c810: 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  [j++] = ' ';.   
c820: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
c830: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b  se{.        z[j+
c840: 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20  +] = z[i];.     
c850: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a   }.    }.    z[j
c860: 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
c870: 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25  e3IoTrace("SQL %
c880: 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a  s\n", z);.  }.}.
c890: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
c8a0: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20  E_OMIT_TRACE && 
c8b0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
c8c0: 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 20 41 6e 20  TRACE */../* An 
c8d0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
c8e0: 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69 62 65   object describe
c8f0: 73 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 61 76  s bulk memory av
c900: 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 0a  ailable for use.
c910: 2a 2a 20 62 79 20 73 75 62 63 6f 6d 70 6f 6e 65  ** by subcompone
c920: 6e 74 73 20 6f 66 20 61 20 70 72 65 70 61 72 65  nts of a prepare
c930: 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 70  d statement.  Sp
c940: 61 63 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ace is allocated
c950: 20 6f 75 74 0a 2a 2a 20 6f 66 20 61 20 52 65 75   out.** of a Reu
c960: 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63  sableSpace objec
c970: 74 20 62 79 20 74 68 65 20 61 6c 6c 6f 63 53 70  t by the allocSp
c980: 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20 62 65  ace() routine be
c990: 6c 6f 77 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52  low..*/.struct R
c9a0: 65 75 73 61 62 6c 65 53 70 61 63 65 20 7b 0a 20  eusableSpace {. 
c9b0: 20 75 38 20 2a 70 53 70 61 63 65 3b 20 20 20 20   u8 *pSpace;    
c9c0: 20 20 20 20 20 20 2f 2a 20 41 76 61 69 6c 61 62        /* Availab
c9d0: 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69  le memory */.  i
c9e0: 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  nt nFree;       
c9f0: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
ca00: 61 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79  available memory
ca10: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 65 64 65   */.  int nNeede
ca20: 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  d;         /* To
ca30: 74 61 6c 20 62 79 74 65 73 20 74 68 61 74 20 63  tal bytes that c
ca40: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 6c 6c 6f  ould not be allo
ca50: 63 61 74 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  cated */.};../* 
ca60: 54 72 79 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  Try to allocate 
ca70: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 38  nByte bytes of 8
ca80: 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 62 75  -byte aligned bu
ca90: 6c 6b 20 6d 65 6d 6f 72 79 20 66 6f 72 20 70 42  lk memory for pB
caa0: 75 66 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 52  uf.** from the R
cab0: 65 75 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a  eusableSpace obj
cac0: 65 63 74 2e 20 20 52 65 74 75 72 6e 20 61 20 70  ect.  Return a p
cad0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c  ointer to the al
cae0: 6c 6f 63 61 74 65 64 0a 2a 2a 20 6d 65 6d 6f 72  located.** memor
caf0: 79 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  y on success.  I
cb00: 66 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 6d  f insufficient m
cb10: 65 6d 6f 72 79 20 69 73 20 61 76 61 69 6c 61 62  emory is availab
cb20: 6c 65 20 69 6e 20 74 68 65 0a 2a 2a 20 52 65 75  le in the.** Reu
cb30: 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63  sableSpace objec
cb40: 74 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  t, increase the 
cb50: 52 65 75 73 61 62 6c 65 53 70 61 63 65 2e 6e 4e  ReusableSpace.nN
cb60: 65 65 64 65 64 0a 2a 2a 20 76 61 6c 75 65 20 62  eeded.** value b
cb70: 79 20 74 68 65 20 61 6d 6f 75 6e 74 20 6e 65 65  y the amount nee
cb80: 64 65 64 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  ded and return N
cb90: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42  ULL..**.** If pB
cba0: 75 66 20 69 73 20 6e 6f 74 20 69 6e 69 74 69 61  uf is not initia
cbb0: 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 61 74 20 6d  lly NULL, that m
cbc0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6d 65  eans that the me
cbd0: 6d 6f 72 79 20 68 61 73 20 61 6c 72 65 61 64 79  mory has already
cbe0: 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  .** been allocat
cbf0: 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 63 61  ed by a prior ca
cc00: 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
cc10: 6e 65 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75  ne, so just retu
cc20: 72 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20  rn a copy.** of 
cc30: 70 42 75 66 20 61 6e 64 20 6c 65 61 76 65 20 52  pBuf and leave R
cc40: 65 75 73 61 62 6c 65 53 70 61 63 65 20 75 6e 63  eusableSpace unc
cc50: 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  hanged..**.** Th
cc60: 69 73 20 61 6c 6c 6f 63 61 74 6f 72 20 69 73 20  is allocator is 
cc70: 65 6d 70 6c 6f 79 65 64 20 74 6f 20 72 65 70 75  employed to repu
cc80: 72 70 6f 73 65 20 75 6e 75 73 65 64 20 73 6c 6f  rpose unused slo
cc90: 74 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ts at the end of
cca0: 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 20 61   the.** opcode a
ccb0: 72 72 61 79 20 6f 66 20 70 72 65 70 61 72 65 64  rray of prepared
ccc0: 20 73 74 61 74 65 20 66 6f 72 20 6f 74 68 65 72   state for other
ccd0: 20 6d 65 6d 6f 72 79 20 6e 65 65 64 73 20 6f 66   memory needs of
cce0: 20 74 68 65 20 70 72 65 70 61 72 65 64 0a 2a 2a   the prepared.**
ccf0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73   statement..*/.s
cd00: 74 61 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f  tatic void *allo
cd10: 63 53 70 61 63 65 28 0a 20 20 73 74 72 75 63 74  cSpace(.  struct
cd20: 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 2a   ReusableSpace *
cd30: 70 2c 20 20 2f 2a 20 42 75 6c 6b 20 6d 65 6d 6f  p,  /* Bulk memo
cd40: 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ry available for
cd50: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20   allocation */. 
cd60: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
cd70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
cd80: 69 6e 74 65 72 20 74 6f 20 61 20 70 72 69 6f 72  inter to a prior
cd90: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20   allocation */. 
cda0: 20 69 6e 74 20 6e 42 79 74 65 20 20 20 20 20 20   int nByte      
cdb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
cdc0: 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65  tes of memory ne
cdd0: 65 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  eded */.){.  ass
cde0: 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
cdf0: 41 4c 49 47 4e 4d 45 4e 54 28 70 2d 3e 70 53 70  ALIGNMENT(p->pSp
ce00: 61 63 65 29 20 29 3b 0a 20 20 69 66 28 20 70 42  ace) );.  if( pB
ce10: 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 42 79  uf==0 ){.    nBy
ce20: 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74  te = ROUND8(nByt
ce30: 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74  e);.    if( nByt
ce40: 65 20 3c 3d 20 70 2d 3e 6e 46 72 65 65 20 29 7b  e <= p->nFree ){
ce50: 0a 20 20 20 20 20 20 70 2d 3e 6e 46 72 65 65 20  .      p->nFree 
ce60: 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20  -= nByte;.      
ce70: 70 42 75 66 20 3d 20 26 70 2d 3e 70 53 70 61 63  pBuf = &p->pSpac
ce80: 65 5b 70 2d 3e 6e 46 72 65 65 5d 3b 0a 20 20 20  e[p->nFree];.   
ce90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
cea0: 3e 6e 4e 65 65 64 65 64 20 2b 3d 20 6e 42 79 74  >nNeeded += nByt
ceb0: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  e;.    }.  }.  a
cec0: 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
ced0: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 42 75 66  E_ALIGNMENT(pBuf
cee0: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42  ) );.  return pB
cef0: 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77  uf;.}../*.** Rew
cf00: 69 6e 64 20 74 68 65 20 56 44 42 45 20 62 61 63  ind the VDBE bac
cf10: 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  k to the beginni
cf20: 6e 67 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f  ng in preparatio
cf30: 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67  n for.** running
cf40: 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c   it..*/.void sql
cf50: 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 56  ite3VdbeRewind(V
cf60: 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66  dbe *p){.#if def
cf70: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
cf80: 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44  G) || defined(VD
cf90: 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e  BE_PROFILE).  in
cfa0: 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  t i;.#endif.  as
cfb0: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
cfc0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
cfd0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
cfe0: 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65  T );..  /* There
cff0: 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65   should be at le
d000: 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a  ast one opcode..
d010: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
d020: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a  ->nOp>0 );..  /*
d030: 20 53 65 74 20 74 68 65 20 6d 61 67 69 63 20 74   Set the magic t
d040: 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  o VDBE_MAGIC_RUN
d050: 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74   sooner rather t
d060: 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20  han later. */.  
d070: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
d080: 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 23 69 66 64  MAGIC_RUN;..#ifd
d090: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
d0a0: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e    for(i=1; i<p->
d0b0: 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nMem; i++){.    
d0c0: 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b  assert( p->aMem[
d0d0: 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a  i].db==p->db );.
d0e0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e    }.#endif.  p->
d0f0: 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63  pc = -1;.  p->rc
d100: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
d110: 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d  p->errorAction =
d120: 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e   OE_Abort;.  p->
d130: 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70  nChange = 0;.  p
d140: 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a  ->cacheCtr = 1;.
d150: 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c    p->minWriteFil
d160: 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20  eFormat = 255;. 
d170: 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d   p->iStatement =
d180: 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73   0;.  p->nFkCons
d190: 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64  traint = 0;.#ifd
d1a0: 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
d1b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
d1c0: 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  nOp; i++){.    p
d1d0: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30  ->aOp[i].cnt = 0
d1e0: 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e  ;.    p->aOp[i].
d1f0: 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 7d 0a  cycles = 0;.  }.
d200: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
d210: 50 72 65 70 61 72 65 20 61 20 76 69 72 74 75 61  Prepare a virtua
d220: 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78  l machine for ex
d230: 65 63 75 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  ecution for the 
d240: 66 69 72 73 74 20 74 69 6d 65 20 61 66 74 65 72  first time after
d250: 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 74 68 65  .** creating the
d260: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
d270: 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73  .  This involves
d280: 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20   things such.** 
d290: 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 72 65  as allocating re
d2a0: 67 69 73 74 65 72 73 20 61 6e 64 20 69 6e 69 74  gisters and init
d2b0: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f  ializing the pro
d2c0: 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a  gram counter..**
d2d0: 20 41 66 74 65 72 20 74 68 65 20 56 44 42 45 20   After the VDBE 
d2e0: 68 61 73 20 62 65 20 70 72 65 70 70 65 64 2c 20  has be prepped, 
d2f0: 69 74 20 63 61 6e 20 62 65 20 65 78 65 63 75 74  it can be execut
d300: 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72  ed by one or mor
d310: 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71  e.** calls to sq
d320: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
d330: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75    .**.** This fu
d340: 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
d350: 6c 6c 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63  lled exactly onc
d360: 65 20 6f 6e 20 65 61 63 68 20 76 69 72 74 75 61  e on each virtua
d370: 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66  l machine..** Af
d380: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
d390: 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 56   is called the V
d3a0: 4d 20 68 61 73 20 62 65 65 6e 20 22 70 61 63 6b  M has been "pack
d3b0: 61 67 65 64 22 20 61 6e 64 20 69 73 20 72 65 61  aged" and is rea
d3c0: 64 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41  dy.** to run.  A
d3d0: 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
d3e0: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 66 75 72  e is called, fur
d3f0: 74 68 65 72 20 63 61 6c 6c 73 20 74 6f 20 0a 2a  ther calls to .*
d400: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  * sqlite3VdbeAdd
d410: 4f 70 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61  Op() functions a
d420: 72 65 20 70 72 6f 68 69 62 69 74 65 64 2e 20 20  re prohibited.  
d430: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 69 73  This routine dis
d440: 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74 68 65 20  connects.** the 
d450: 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20 50 61  Vdbe from the Pa
d460: 72 73 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20  rse object that 
d470: 68 65 6c 70 65 64 20 67 65 6e 65 72 61 74 65 20  helped generate 
d480: 69 74 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a  it so that the.*
d490: 2a 20 74 68 65 20 56 64 62 65 20 62 65 63 6f 6d  * the Vdbe becom
d4a0: 65 73 20 61 6e 20 69 6e 64 65 70 65 6e 64 65 6e  es an independen
d4b0: 74 20 65 6e 74 69 74 79 20 61 6e 64 20 74 68 65  t entity and the
d4c0: 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 63 61   Parse object ca
d4d0: 6e 20 62 65 0a 2a 2a 20 64 65 73 74 72 6f 79 65  n be.** destroye
d4e0: 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  d..**.** Use the
d4f0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69   sqlite3VdbeRewi
d500: 6e 64 28 29 20 70 72 6f 63 65 64 75 72 65 20 74  nd() procedure t
d510: 6f 20 72 65 73 74 6f 72 65 20 61 20 76 69 72 74  o restore a virt
d520: 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 61 63 6b  ual machine back
d530: 0a 2a 2a 20 74 6f 20 69 74 73 20 69 6e 69 74 69  .** to its initi
d540: 61 6c 20 73 74 61 74 65 20 61 66 74 65 72 20 69  al state after i
d550: 74 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2e 0a  t has been run..
d560: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
d570: 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20  dbeMakeReady(.  
d580: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
d590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d5a0: 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20  * The VDBE */.  
d5b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 20 20  Parse *pParse   
d5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d5d0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
d5e0: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
d5f0: 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
d600: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
d610: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
d620: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61  ion */.  int nVa
d630: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
d640: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
d650: 72 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73 20  r of parameters 
d660: 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20  */.  int nMem;  
d670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d680: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d690: 20 56 4d 20 6d 65 6d 6f 72 79 20 72 65 67 69 73   VM memory regis
d6a0: 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  ters */.  int nC
d6b0: 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20 20  ursor;          
d6c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
d6d0: 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 72 65  er of cursors re
d6e0: 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  quired */.  int 
d6f0: 6e 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  nArg;           
d700: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
d710: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
d720: 73 20 69 6e 20 73 75 62 70 72 6f 67 72 61 6d 73  s in subprograms
d730: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6e 63 65 3b   */.  int nOnce;
d740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d750: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
d760: 66 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75  f OP_Once instru
d770: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ctions */.  int 
d780: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
d790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
d7a0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
d7b0: 73 74 72 75 63 74 20 52 65 75 73 61 62 6c 65 53  struct ReusableS
d7c0: 70 61 63 65 20 78 3b 20 20 20 20 20 20 20 20 2f  pace x;        /
d7d0: 2a 20 52 65 75 73 61 62 6c 65 20 62 75 6c 6b 20  * Reusable bulk 
d7e0: 6d 65 6d 6f 72 79 20 2a 2f 0a 0a 20 20 61 73 73  memory */..  ass
d7f0: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
d800: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
d810: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
d820: 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rse!=0 );.  asse
d830: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
d840: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
d850: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
d860: 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20 29 3b 0a  e==p->pParse );.
d870: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
d880: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
d890: 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20  ocFailed==0 );. 
d8a0: 20 6e 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e   nVar = pParse->
d8b0: 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70  nVar;.  nMem = p
d8c0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e  Parse->nMem;.  n
d8d0: 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
d8e0: 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20  >nTab;.  nArg = 
d8f0: 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b  pParse->nMaxArg;
d900: 0a 20 20 6e 4f 6e 63 65 20 3d 20 70 50 61 72 73  .  nOnce = pPars
d910: 65 2d 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20  e->nOnce;.  if( 
d920: 6e 4f 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e 63 65  nOnce==0 ) nOnce
d930: 20 3d 20 31 3b 20 2f 2a 20 45 6e 73 75 72 65 20   = 1; /* Ensure 
d940: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 79 74  at least one byt
d950: 65 20 69 6e 20 70 2d 3e 61 4f 6e 63 65 46 6c 61  e in p->aOnceFla
d960: 67 5b 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 46  g[] */.  .  /* F
d970: 6f 72 20 65 61 63 68 20 63 75 72 73 6f 72 20 72  or each cursor r
d980: 65 71 75 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c  equired, also al
d990: 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f 72 79 20  locate a memory 
d9a0: 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a  cell. Memory.  *
d9b0: 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d  * cells (nMem+1-
d9c0: 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20  nCursor)..nMem, 
d9d0: 69 6e 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20  inclusive, will 
d9e0: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 62 79  never be used by
d9f0: 0a 20 20 2a 2a 20 74 68 65 20 76 64 62 65 20 70  .  ** the vdbe p
da00: 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65 61 64 20  rogram. Instead 
da10: 74 68 65 79 20 61 72 65 20 75 73 65 64 20 74 6f  they are used to
da20: 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
da30: 20 66 6f 72 0a 20 20 2a 2a 20 56 64 62 65 43 75   for.  ** VdbeCu
da40: 72 73 6f 72 2f 42 74 43 75 72 73 6f 72 20 73 74  rsor/BtCursor st
da50: 72 75 63 74 75 72 65 73 2e 20 54 68 65 20 62 6c  ructures. The bl
da60: 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73  ob of memory ass
da70: 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 20 20  ociated with .  
da80: 2a 2a 20 63 75 72 73 6f 72 20 30 20 69 73 20 73  ** cursor 0 is s
da90: 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  tored in memory 
daa0: 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72  cell nMem. Memor
dab0: 79 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a  y cell (nMem-1).
dac0: 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20    ** stores the 
dad0: 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61  blob of memory a
dae0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
daf0: 75 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20  ursor 1, etc..  
db00: 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f  **.  ** See also
db10: 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72  : allocateCursor
db20: 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20  ()..  */.  nMem 
db30: 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f  += nCursor;..  /
db40: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
db50: 20 6d 75 63 68 20 72 65 75 73 61 62 6c 65 20 6d   much reusable m
db60: 65 6d 6f 72 79 20 69 73 20 61 76 61 69 6c 61 62  emory is availab
db70: 6c 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  le at the end of
db80: 20 74 68 65 0a 20 20 2a 2a 20 6f 70 63 6f 64 65   the.  ** opcode
db90: 20 61 72 72 61 79 2e 20 20 54 68 69 73 20 65 78   array.  This ex
dba0: 74 72 61 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  tra memory will 
dbb0: 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20 66  be reallocated f
dbc0: 6f 72 20 6f 74 68 65 72 20 65 6c 65 6d 65 6e 74  or other element
dbd0: 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 72  s.  ** of the pr
dbe0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
dbf0: 2e 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 52 4f 55  ..  */.  n = ROU
dc00: 4e 44 38 28 73 69 7a 65 6f 66 28 4f 70 29 2a 70  ND8(sizeof(Op)*p
dc10: 2d 3e 6e 4f 70 29 3b 20 20 20 20 20 20 20 20 20  ->nOp);         
dc20: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
dc30: 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20 75   opcode memory u
dc40: 73 65 64 20 2a 2f 0a 20 20 78 2e 70 53 70 61 63  sed */.  x.pSpac
dc50: 65 20 3d 20 26 28 28 75 38 2a 29 70 2d 3e 61 4f  e = &((u8*)p->aO
dc60: 70 29 5b 6e 5d 3b 20 20 20 20 20 20 20 20 20 20  p)[n];          
dc70: 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 6f       /* Unused o
dc80: 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a  pcode memory */.
dc90: 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
dca0: 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 78  BYTE_ALIGNMENT(x
dcb0: 2e 70 53 70 61 63 65 29 20 29 3b 0a 20 20 78 2e  .pSpace) );.  x.
dcc0: 6e 46 72 65 65 20 3d 20 52 4f 55 4e 44 44 4f 57  nFree = ROUNDDOW
dcd0: 4e 38 28 70 50 61 72 73 65 2d 3e 73 7a 4f 70 41  N8(pParse->szOpA
dce0: 6c 6c 6f 63 20 2d 20 6e 29 3b 20 20 2f 2a 20 42  lloc - n);  /* B
dcf0: 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 6d  ytes of unused m
dd00: 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 73 73 65 72  emory */.  asser
dd10: 74 28 20 78 2e 6e 46 72 65 65 3e 3d 30 20 29 3b  t( x.nFree>=0 );
dd20: 0a 20 20 69 66 28 20 78 2e 6e 46 72 65 65 3e 30  .  if( x.nFree>0
dd30: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 78   ){.    memset(x
dd40: 2e 70 53 70 61 63 65 2c 20 30 2c 20 78 2e 6e 46  .pSpace, 0, x.nF
dd50: 72 65 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ree);.    assert
dd60: 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
dd70: 47 4e 4d 45 4e 54 28 26 78 2e 70 53 70 61 63 65  GNMENT(&x.pSpace
dd80: 5b 78 2e 6e 46 72 65 65 5d 29 20 29 3b 0a 20 20  [x.nFree]) );.  
dd90: 7d 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61  }..  resolveP2Va
dda0: 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a  lues(p, &nArg);.
ddb0: 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75    p->usesStmtJou
ddc0: 72 6e 61 6c 20 3d 20 28 75 38 29 28 70 50 61 72  rnal = (u8)(pPar
ddd0: 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65  se->isMultiWrite
dde0: 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61 79 41   && pParse->mayA
ddf0: 62 6f 72 74 29 3b 0a 20 20 69 66 28 20 70 50 61  bort);.  if( pPa
de00: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20  rse->explain && 
de10: 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 6e  nMem<10 ){.    n
de20: 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20  Mem = 10;.  }.  
de30: 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a  p->expired = 0;.
de40: 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72  .  /* Memory for
de50: 20 72 65 67 69 73 74 65 72 73 2c 20 70 61 72 61   registers, para
de60: 6d 65 74 65 72 73 2c 20 63 75 72 73 6f 72 2c 20  meters, cursor, 
de70: 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65  etc, is allocate
de80: 64 20 69 6e 20 6f 6e 65 20 6f 72 20 74 77 6f 0a  d in one or two.
de90: 20 20 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f 6e    ** passes.  On
dea0: 20 74 68 65 20 66 69 72 73 74 20 70 61 73 73 2c   the first pass,
deb0: 20 77 65 20 74 72 79 20 74 6f 20 72 65 75 73 65   we try to reuse
dec0: 20 75 6e 75 73 65 64 20 6d 65 6d 6f 72 79 20 61   unused memory a
ded0: 74 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 64 20  t the .  ** end 
dee0: 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72  of the opcode ar
def0: 72 61 79 2e 20 20 49 66 20 77 65 20 61 72 65 20  ray.  If we are 
df00: 75 6e 61 62 6c 65 20 74 6f 20 73 61 74 69 73 66  unable to satisf
df10: 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a  y all memory.  *
df20: 2a 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 62  * requirements b
df30: 79 20 72 65 75 73 69 6e 67 20 74 68 65 20 6f 70  y reusing the op
df40: 63 6f 64 65 20 61 72 72 61 79 20 74 61 69 6c 2c  code array tail,
df50: 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64   then the second
df60: 0a 20 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20  .  ** pass will 
df70: 66 69 6c 6c 20 69 6e 20 74 68 65 20 72 65 6d 61  fill in the rema
df80: 69 6e 64 65 72 20 75 73 69 6e 67 20 61 20 66 72  inder using a fr
df90: 65 73 68 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  esh memory alloc
dfa0: 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20  ation.  .  **.  
dfb0: 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70 61 73 73  ** This two-pass
dfc0: 20 61 70 70 72 6f 61 63 68 20 74 68 61 74 20 72   approach that r
dfd0: 65 75 73 65 73 20 61 73 20 6d 75 63 68 20 6d 65  euses as much me
dfe0: 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65  mory as possible
dff0: 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 6c   from.  ** the l
e000: 65 66 74 6f 76 65 72 20 6d 65 6d 6f 72 79 20 61  eftover memory a
e010: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
e020: 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20   opcode array.  
e030: 54 68 69 73 20 63 61 6e 20 73 69 67 6e 69 66 69  This can signifi
e040: 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64 75  cantly.  ** redu
e050: 63 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ce the amount of
e060: 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20   memory held by 
e070: 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
e080: 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20  ment..  */.  do 
e090: 7b 0a 20 20 20 20 78 2e 6e 4e 65 65 64 65 64 20  {.    x.nNeeded 
e0a0: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d  = 0;.    p->aMem
e0b0: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78   = allocSpace(&x
e0c0: 2c 20 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a  , p->aMem, nMem*
e0d0: 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20  sizeof(Mem));.  
e0e0: 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f    p->aVar = allo
e0f0: 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 56  cSpace(&x, p->aV
e100: 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28  ar, nVar*sizeof(
e110: 4d 65 6d 29 29 3b 0a 20 20 20 20 70 2d 3e 61 70  Mem));.    p->ap
e120: 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Arg = allocSpace
e130: 28 26 78 2c 20 70 2d 3e 61 70 41 72 67 2c 20 6e  (&x, p->apArg, n
e140: 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29  Arg*sizeof(Mem*)
e150: 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73 72 20  );.    p->apCsr 
e160: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c  = allocSpace(&x,
e170: 20 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72 73   p->apCsr, nCurs
e180: 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75  or*sizeof(VdbeCu
e190: 72 73 6f 72 2a 29 29 3b 0a 20 20 20 20 70 2d 3e  rsor*));.    p->
e1a0: 61 4f 6e 63 65 46 6c 61 67 20 3d 20 61 6c 6c 6f  aOnceFlag = allo
e1b0: 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 4f  cSpace(&x, p->aO
e1c0: 6e 63 65 46 6c 61 67 2c 20 6e 4f 6e 63 65 29 3b  nceFlag, nOnce);
e1d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
e1e0: 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
e1f0: 54 41 54 55 53 0a 20 20 20 20 70 2d 3e 61 6e 45  TATUS.    p->anE
e200: 78 65 63 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  xec = allocSpace
e210: 28 26 78 2c 20 70 2d 3e 61 6e 45 78 65 63 2c 20  (&x, p->anExec, 
e220: 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36  p->nOp*sizeof(i6
e230: 34 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  4));.#endif.    
e240: 69 66 28 20 78 2e 6e 4e 65 65 64 65 64 3d 3d 30  if( x.nNeeded==0
e250: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 78 2e   ) break;.    x.
e260: 70 53 70 61 63 65 20 3d 20 70 2d 3e 70 46 72 65  pSpace = p->pFre
e270: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
e280: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 78 2e 6e 4e  locZero(db, x.nN
e290: 65 65 64 65 64 29 3b 0a 20 20 20 20 78 2e 6e 46  eeded);.    x.nF
e2a0: 72 65 65 20 3d 20 78 2e 6e 4e 65 65 64 65 64 3b  ree = x.nNeeded;
e2b0: 0a 20 20 7d 77 68 69 6c 65 28 20 21 64 62 2d 3e  .  }while( !db->
e2c0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
e2d0: 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20  .  p->nCursor = 
e2e0: 6e 43 75 72 73 6f 72 3b 0a 20 20 70 2d 3e 6e 4f  nCursor;.  p->nO
e2f0: 6e 63 65 46 6c 61 67 20 3d 20 6e 4f 6e 63 65 3b  nceFlag = nOnce;
e300: 0a 20 20 69 66 28 20 70 2d 3e 61 56 61 72 20 29  .  if( p->aVar )
e310: 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20  {.    p->nVar = 
e320: 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20 20  (ynVar)nVar;.   
e330: 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72   for(n=0; n<nVar
e340: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d  ; n++){.      p-
e350: 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d  >aVar[n].flags =
e360: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20   MEM_Null;.     
e370: 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d   p->aVar[n].db =
e380: 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   db;.    }.  }. 
e390: 20 70 2d 3e 6e 7a 56 61 72 20 3d 20 70 50 61 72   p->nzVar = pPar
e3a0: 73 65 2d 3e 6e 7a 56 61 72 3b 0a 20 20 70 2d 3e  se->nzVar;.  p->
e3b0: 61 7a 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e  azVar = pParse->
e3c0: 61 7a 56 61 72 3b 0a 20 20 70 50 61 72 73 65 2d  azVar;.  pParse-
e3d0: 3e 6e 7a 56 61 72 20 3d 20 20 30 3b 0a 20 20 70  >nzVar =  0;.  p
e3e0: 50 61 72 73 65 2d 3e 61 7a 56 61 72 20 3d 20 30  Parse->azVar = 0
e3f0: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20  ;.  if( p->aMem 
e400: 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d  ){.    p->aMem--
e410: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e420: 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d         /* aMem[]
e430: 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d   goes from 1..nM
e440: 65 6d 20 2a 2f 0a 20 20 20 20 70 2d 3e 6e 4d 65  em */.    p->nMe
e450: 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20  m = nMem;       
e460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20            /*    
e470: 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e     not from 0..n
e480: 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 66 6f 72  Mem-1 */.    for
e490: 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e  (n=1; n<=nMem; n
e4a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d  ++){.      p->aM
e4b0: 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45  em[n].flags = ME
e4c0: 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20  M_Undefined;.   
e4d0: 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62     p->aMem[n].db
e4e0: 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d   = db;.    }.  }
e4f0: 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20  .  p->explain = 
e500: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b  pParse->explain;
e510: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
e520: 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  wind(p);.}../*.*
e530: 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63  * Close a VDBE c
e540: 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73  ursor and releas
e550: 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72  e all the resour
e560: 63 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20  ces that cursor 
e570: 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68  .** happens to h
e580: 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  old..*/.void sql
e590: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
e5a0: 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65  or(Vdbe *p, Vdbe
e5b0: 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20  Cursor *pCx){.  
e5c0: 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20  if( pCx==0 ){.  
e5d0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
e5e0: 61 73 73 65 72 74 28 20 70 43 78 2d 3e 70 42 74  assert( pCx->pBt
e5f0: 3d 3d 30 20 7c 7c 20 70 43 78 2d 3e 65 43 75 72  ==0 || pCx->eCur
e600: 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
e610: 52 45 45 20 29 3b 0a 20 20 73 77 69 74 63 68 28  REE );.  switch(
e620: 20 70 43 78 2d 3e 65 43 75 72 54 79 70 65 20 29   pCx->eCurType )
e630: 7b 0a 20 20 20 20 63 61 73 65 20 43 55 52 54 59  {.    case CURTY
e640: 50 45 5f 53 4f 52 54 45 52 3a 20 7b 0a 20 20 20  PE_SORTER: {.   
e650: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f     sqlite3VdbeSo
e660: 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c  rterClose(p->db,
e670: 20 70 43 78 29 3b 0a 20 20 20 20 20 20 62 72 65   pCx);.      bre
e680: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
e690: 73 65 20 43 55 52 54 59 50 45 5f 42 54 52 45 45  se CURTYPE_BTREE
e6a0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43  : {.      if( pC
e6b0: 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  x->pBt ){.      
e6c0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
e6d0: 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20  ose(pCx->pBt);. 
e6e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 43         /* The pC
e6f0: 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c 20  x->pCursor will 
e700: 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74  be close automat
e710: 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65 78  ically, if it ex
e720: 69 73 74 73 2c 20 62 79 0a 20 20 20 20 20 20 20  ists, by.       
e730: 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f   ** the call abo
e740: 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  ve. */.      }el
e750: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
e760: 72 74 28 20 70 43 78 2d 3e 75 63 2e 70 43 75 72  rt( pCx->uc.pCur
e770: 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  sor!=0 );.      
e780: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
e790: 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 75  oseCursor(pCx->u
e7a0: 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  c.pCursor);.    
e7b0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
e7c0: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
e7d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
e7e0: 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65  ALTABLE.    case
e7f0: 20 43 55 52 54 59 50 45 5f 56 54 41 42 3a 20 7b   CURTYPE_VTAB: {
e800: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
e810: 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 43 75  tab_cursor *pVCu
e820: 72 20 3d 20 70 43 78 2d 3e 75 63 2e 70 56 43 75  r = pCx->uc.pVCu
e830: 72 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 73  r;.      const s
e840: 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70  qlite3_module *p
e850: 4d 6f 64 75 6c 65 20 3d 20 70 56 43 75 72 2d 3e  Module = pVCur->
e860: 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a  pVtab->pModule;.
e870: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 56        assert( pV
e880: 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66  Cur->pVtab->nRef
e890: 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 56 43 75  >0 );.      pVCu
e8a0: 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 2d 2d  r->pVtab->nRef--
e8b0: 3b 0a 20 20 20 20 20 20 70 4d 6f 64 75 6c 65 2d  ;.      pModule-
e8c0: 3e 78 43 6c 6f 73 65 28 70 56 43 75 72 29 3b 0a  >xClose(pVCur);.
e8d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e8e0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a   }.#endif.  }.}.
e8f0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
e900: 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20   cursors in the 
e910: 63 75 72 72 65 6e 74 20 66 72 61 6d 65 2e 0a 2a  current frame..*
e920: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
e930: 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d  oseCursorsInFram
e940: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66  e(Vdbe *p){.  if
e950: 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20  ( p->apCsr ){.  
e960: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
e970: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73  (i=0; i<p->nCurs
e980: 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  or; i++){.      
e990: 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 20 3d  VdbeCursor *pC =
e9a0: 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20   p->apCsr[i];.  
e9b0: 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a 20 20      if( pC ){.  
e9c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e9d0: 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70  eFreeCursor(p, p
e9e0: 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  C);.        p->a
e9f0: 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pCsr[i] = 0;.   
ea00: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
ea10: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65  ../*.** Copy the
ea20: 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69   values stored i
ea30: 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d 65 20  n the VdbeFrame 
ea40: 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73  structure to its
ea50: 20 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69   Vdbe. This.** i
ea60: 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d  s used, for exam
ea70: 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 72 69 67  ple, when a trig
ea80: 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20  ger sub-program 
ea90: 69 73 20 68 61 6c 74 65 64 20 74 6f 20 72 65 73  is halted to res
eaa0: 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20  tore.** control 
eab0: 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  to the main prog
eac0: 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ram..*/.int sqli
ead0: 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74  te3VdbeFrameRest
eae0: 6f 72 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70  ore(VdbeFrame *p
eaf0: 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a  Frame){.  Vdbe *
eb00: 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20  v = pFrame->v;. 
eb10: 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46   closeCursorsInF
eb20: 72 61 6d 65 28 76 29 3b 0a 23 69 66 64 65 66 20  rame(v);.#ifdef 
eb30: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
eb40: 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20  MT_SCANSTATUS.  
eb50: 76 2d 3e 61 6e 45 78 65 63 20 3d 20 70 46 72 61  v->anExec = pFra
eb60: 6d 65 2d 3e 61 6e 45 78 65 63 3b 0a 23 65 6e 64  me->anExec;.#end
eb70: 69 66 0a 20 20 76 2d 3e 61 4f 6e 63 65 46 6c 61  if.  v->aOnceFla
eb80: 67 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 6e 63  g = pFrame->aOnc
eb90: 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 6e 4f 6e 63  eFlag;.  v->nOnc
eba0: 65 46 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e  eFlag = pFrame->
ebb0: 6e 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e  nOnceFlag;.  v->
ebc0: 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f  aOp = pFrame->aO
ebd0: 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46  p;.  v->nOp = pF
ebe0: 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e  rame->nOp;.  v->
ebf0: 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61  aMem = pFrame->a
ec00: 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d  Mem;.  v->nMem =
ec10: 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20   pFrame->nMem;. 
ec20: 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61   v->apCsr = pFra
ec30: 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e  me->apCsr;.  v->
ec40: 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65  nCursor = pFrame
ec50: 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e  ->nCursor;.  v->
ec60: 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20  db->lastRowid = 
ec70: 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69  pFrame->lastRowi
ec80: 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20  d;.  v->nChange 
ec90: 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67  = pFrame->nChang
eca0: 65 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6e 43 68 61  e;.  v->db->nCha
ecb0: 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 44  nge = pFrame->nD
ecc0: 62 43 68 61 6e 67 65 3b 0a 20 20 72 65 74 75 72  bChange;.  retur
ecd0: 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a  n pFrame->pc;.}.
ece0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
ecf0: 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20   cursors..**.** 
ed00: 41 6c 73 6f 20 72 65 6c 65 61 73 65 20 61 6e 79  Also release any
ed10: 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20   dynamic memory 
ed20: 68 65 6c 64 20 62 79 20 74 68 65 20 56 4d 20 69  held by the VM i
ed30: 6e 20 74 68 65 20 56 64 62 65 2e 61 4d 65 6d 20  n the Vdbe.aMem 
ed40: 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20  memory .** cell 
ed50: 61 72 72 61 79 2e 20 54 68 69 73 20 69 73 20 6e  array. This is n
ed60: 65 63 65 73 73 61 72 79 20 61 73 20 74 68 65 20  ecessary as the 
ed70: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 61  memory cell arra
ed80: 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a  y may contain.**
ed90: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 62   pointers to Vdb
eda0: 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20  eFrame objects, 
edb0: 77 68 69 63 68 20 6d 61 79 20 69 6e 20 74 75 72  which may in tur
edc0: 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65  n contain pointe
edd0: 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75  rs to.** open cu
ede0: 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  rsors..*/.static
edf0: 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75   void closeAllCu
ee00: 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a  rsors(Vdbe *p){.
ee10: 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20    if( p->pFrame 
ee20: 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65  ){.    VdbeFrame
ee30: 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f   *pFrame;.    fo
ee40: 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61  r(pFrame=p->pFra
ee50: 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72  me; pFrame->pPar
ee60: 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61  ent; pFrame=pFra
ee70: 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20  me->pParent);.  
ee80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61    sqlite3VdbeFra
ee90: 6d 65 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65  meRestore(pFrame
eea0: 29 3b 0a 20 20 20 20 70 2d 3e 70 46 72 61 6d 65  );.    p->pFrame
eeb0: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 46 72   = 0;.    p->nFr
eec0: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  ame = 0;.  }.  a
eed0: 73 73 65 72 74 28 20 70 2d 3e 6e 46 72 61 6d 65  ssert( p->nFrame
eee0: 3d 3d 30 20 29 3b 0a 20 20 63 6c 6f 73 65 43 75  ==0 );.  closeCu
eef0: 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 70 29 3b  rsorsInFrame(p);
ef00: 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29  .  if( p->aMem )
ef10: 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d  {.    releaseMem
ef20: 41 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31  Array(&p->aMem[1
ef30: 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d  ], p->nMem);.  }
ef40: 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65  .  while( p->pDe
ef50: 6c 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64  lFrame ){.    Vd
ef60: 62 65 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20  beFrame *pDel = 
ef70: 70 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20  p->pDelFrame;.  
ef80: 20 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d    p->pDelFrame =
ef90: 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a   pDel->pParent;.
efa0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
efb0: 72 61 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29  rameDelete(pDel)
efc0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65  ;.  }..  /* Dele
efd0: 74 65 20 61 6e 79 20 61 75 78 64 61 74 61 20 61  te any auxdata a
efe0: 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20  llocations made 
eff0: 62 79 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20 69  by the VM */.  i
f000: 66 28 20 70 2d 3e 70 41 75 78 44 61 74 61 20 29  f( p->pAuxData )
f010: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
f020: 74 65 41 75 78 44 61 74 61 28 70 2c 20 2d 31 2c  teAuxData(p, -1,
f030: 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70   0);.  assert( p
f040: 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30 20 29 3b  ->pAuxData==0 );
f050: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  .}../*.** Clean 
f060: 75 70 20 74 68 65 20 56 4d 20 61 66 74 65 72 20  up the VM after 
f070: 61 20 73 69 6e 67 6c 65 20 72 75 6e 2e 0a 2a 2f  a single run..*/
f080: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65  .static void Cle
f090: 61 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20  anup(Vdbe *p){. 
f0a0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
f0b0: 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66 20 53 51  ->db;..#ifdef SQ
f0c0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
f0d0: 45 78 65 63 75 74 65 20 61 73 73 65 72 74 28 29  Execute assert()
f0e0: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65   statements to e
f0f0: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 56  nsure that the V
f100: 64 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20  dbe.apCsr[] and 
f110: 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b  .  ** Vdbe.aMem[
f120: 5d 20 61 72 72 61 79 73 20 68 61 76 65 20 61 6c  ] arrays have al
f130: 72 65 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e  ready been clean
f140: 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74  ed up.  */.  int
f150: 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43   i;.  if( p->apC
f160: 73 72 20 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c  sr ) for(i=0; i<
f170: 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29  p->nCursor; i++)
f180: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73   assert( p->apCs
f190: 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28  r[i]==0 );.  if(
f1a0: 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20   p->aMem ){.    
f1b0: 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e  for(i=1; i<=p->n
f1c0: 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72 74  Mem; i++) assert
f1d0: 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61  ( p->aMem[i].fla
f1e0: 67 73 3d 3d 4d 45 4d 5f 55 6e 64 65 66 69 6e 65  gs==MEM_Undefine
f1f0: 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  d );.  }.#endif.
f200: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
f210: 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
f220: 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d  ;.  p->zErrMsg =
f230: 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74   0;.  p->pResult
f240: 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Set = 0;.}../*.*
f250: 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72  * Set the number
f260: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
f270: 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ns that will be 
f280: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
f290: 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   SQL.** statemen
f2a0: 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73  t. This is now s
f2b0: 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  et at compile ti
f2c0: 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20  me, rather than 
f2d0: 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74  during.** execut
f2e0: 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20  ion of the vdbe 
f2f0: 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20  program so that 
f300: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
f310: 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65  ount() can.** be
f320: 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51   called on an SQ
f330: 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f  L statement befo
f340: 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  re sqlite3_step(
f350: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
f360: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
f370: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52  (Vdbe *p, int nR
f380: 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d  esColumn){.  Mem
f390: 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e   *pColName;.  in
f3a0: 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  t n;.  sqlite3 *
f3b0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72  db = p->db;..  r
f3c0: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
f3d0: 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e  ->aColName, p->n
f3e0: 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
f3f0: 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  E_N);.  sqlite3D
f400: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f  bFree(db, p->aCo
f410: 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52  lName);.  n = nR
f420: 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
f430: 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c  _N;.  p->nResCol
f440: 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73 43  umn = (u16)nResC
f450: 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c  olumn;.  p->aCol
f460: 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20  Name = pColName 
f470: 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44  = (Mem*)sqlite3D
f480: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
f490: 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b  sizeof(Mem)*n );
f4a0: 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61  .  if( p->aColNa
f4b0: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
f4c0: 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30    while( n-- > 0
f4d0: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65   ){.    pColName
f4e0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
f4f0: 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65  ll;.    pColName
f500: 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
f510: 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20    pColName++;.  
f520: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
f530: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
f540: 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20  dx'th column to 
f550: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
f560: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
f570: 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20  ..** zName must 
f580: 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  be a pointer to 
f590: 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64  a nul terminated
f5a0: 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54   string..**.** T
f5b0: 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65  his call must be
f5c0: 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63 61   made after a ca
f5d0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
f5e0: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a  eSetNumCols()..*
f5f0: 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70  *.** The final p
f600: 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20  arameter, xDel, 
f610: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53  must be one of S
f620: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53  QLITE_DYNAMIC, S
f630: 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20  QLITE_STATIC.** 
f640: 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  or SQLITE_TRANSI
f650: 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53 51  ENT. If it is SQ
f660: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68  LITE_DYNAMIC, th
f670: 65 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  en the buffer po
f680: 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a  inted.** to by z
f690: 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65  Name will be fre
f6a0: 65 64 20 62 79 20 73 71 6c 69 74 65 33 44 62 46  ed by sqlite3DbF
f6b0: 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20 76  ree() when the v
f6c0: 64 62 65 20 69 73 20 64 65 73 74 72 6f 79 65 64  dbe is destroyed
f6d0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f6e0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a  VdbeSetColName(.
f6f0: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
f700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f710: 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67     /* Vdbe being
f720: 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20   configured */. 
f730: 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20   int idx,       
f740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f750: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
f760: 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69  lumn zName appli
f770: 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76  es to */.  int v
f780: 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ar,             
f790: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
f7a0: 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d  ne of the COLNAM
f7b0: 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f  E_* constants */
f7c0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
f7d0: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Name,           
f7e0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
f7f0: 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  o buffer contain
f800: 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f  ing name */.  vo
f810: 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a  id (*xDel)(void*
f820: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  )              /
f830: 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d  * Memory managem
f840: 65 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f 72  ent strategy for
f850: 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69   zName */.){.  i
f860: 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43  nt rc;.  Mem *pC
f870: 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74  olName;.  assert
f880: 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c  ( idx<p->nResCol
f890: 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  umn );.  assert(
f8a0: 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29   var<COLNAME_N )
f8b0: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
f8c0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
f8d0: 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d     assert( !zNam
f8e0: 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54  e || xDel!=SQLIT
f8f0: 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20  E_DYNAMIC );.   
f900: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
f910: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65  OMEM;.  }.  asse
f920: 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21  rt( p->aColName!
f930: 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65  =0 );.  pColName
f940: 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65   = &(p->aColName
f950: 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73  [idx+var*p->nRes
f960: 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d  Column]);.  rc =
f970: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
f980: 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20  etStr(pColName, 
f990: 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54  zName, -1, SQLIT
f9a0: 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20  E_UTF8, xDel);. 
f9b0: 20 61 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c   assert( rc!=0 |
f9c0: 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f  | !zName || (pCo
f9d0: 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d  lName->flags&MEM
f9e0: 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72  _Term)!=0 );.  r
f9f0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
fa00: 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72 69  ** A read or wri
fa10: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te transaction m
fa20: 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
fa30: 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62   active on datab
fa40: 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
fa50: 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
fa60: 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f  on is active, co
fa70: 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65 72  mmit it. If ther
fa80: 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d  e is a.** write-
fa90: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e  transaction span
faa0: 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ning more than o
fab0: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
fac0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  , this routine.*
fad0: 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20  * takes care of 
fae0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
faf0: 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a  al trickery..*/.
fb00: 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43  static int vdbeC
fb10: 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  ommit(sqlite3 *d
fb20: 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  b, Vdbe *p){.  i
fb30: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61  nt i;.  int nTra
fb40: 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62  ns = 0;  /* Numb
fb50: 65 72 20 6f 66 20 64 61 74 61 62 61 73 65 73 20  er of databases 
fb60: 77 69 74 68 20 61 6e 20 61 63 74 69 76 65 20 77  with an active w
fb70: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
fb80: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
fb90: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
fba0: 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b  needXcommit = 0;
fbb0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
fbc0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
fbd0: 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 68 69 73  E.  /* With this
fbe0: 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33   option, sqlite3
fbf0: 56 74 61 62 53 79 6e 63 28 29 20 69 73 20 64 65  VtabSync() is de
fc00: 66 69 6e 65 64 20 74 6f 20 62 65 20 73 69 6d 70  fined to be simp
fc10: 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  ly .  ** SQLITE_
fc20: 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74 20 75  OK so p is not u
fc30: 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55  sed. .  */.  UNU
fc40: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
fc50: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42  ;.#endif..  /* B
fc60: 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74  efore doing anyt
fc70: 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20  hing else, call 
fc80: 74 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c  the xSync() call
fc90: 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a  back for any.  *
fca0: 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65  * virtual module
fcb0: 20 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20   tables written 
fcc0: 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
fcd0: 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f  ion. This has to
fce0: 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65  .  ** be done be
fcf0: 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67  fore determining
fd00: 20 77 68 65 74 68 65 72 20 61 20 6d 61 73 74 65   whether a maste
fd10: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
fd20: 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64  s .  ** required
fd30: 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20  , as an xSync() 
fd40: 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64  callback may add
fd50: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61 74   an attached dat
fd60: 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68  abase.  ** to th
fd70: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
fd80: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
fd90: 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20 70  e3VtabSync(db, p
fda0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  );..  /* This lo
fdb0: 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28 61  op determines (a
fdc0: 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20  ) if the commit 
fdd0: 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20 69  hook should be i
fde0: 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20  nvoked and.  ** 
fdf0: 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61 74  (b) how many dat
fe00: 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 76 65  abase files have
fe10: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
fe20: 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20  sactions, not . 
fe30: 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68   ** including th
fe40: 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e  e temp database.
fe50: 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61 6e   (b) is importan
fe60: 74 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f 72  t because if mor
fe70: 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65  e than .  ** one
fe80: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
fe90: 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  as an open write
fea0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20   transaction, a 
feb0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20  master journal. 
fec0: 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71 75   ** file is requ
fed0: 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d  ired for an atom
fee0: 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20  ic commit..  */ 
fef0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
ff00: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
ff10: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
ff20: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
ff30: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
ff40: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
ff50: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
ff60: 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64  t) ){.      need
ff70: 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  Xcommit = 1;.   
ff80: 20 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54     if( i!=1 ) nT
ff90: 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 73 71  rans++;.      sq
ffa0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
ffb0: 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  pBt);.      rc =
ffc0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63   sqlite3PagerExc
ffd0: 6c 75 73 69 76 65 4c 6f 63 6b 28 73 71 6c 69 74  lusiveLock(sqlit
ffe0: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
fff0: 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
10000 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 29  3BtreeLeave(pBt)
10010 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
10020 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10030 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
10040 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
10050 68 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69  here are any wri
10060 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te-transactions 
10070 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74  at all, invoke t
10080 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a  he commit hook *
10090 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d  /.  if( needXcom
100a0 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d  mit && db->xComm
100b0 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  itCallback ){.  
100c0 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d    rc = db->xComm
100d0 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  itCallback(db->p
100e0 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20  CommitArg);.    
100f0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
10100 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
10110 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48  NSTRAINT_COMMITH
10120 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  OOK;.    }.  }..
10130 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20    /* The simple 
10140 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74  case - no more t
10150 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65  han one database
10160 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74   file (not count
10170 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d  ing the.  ** TEM
10180 50 20 64 61 74 61 62 61 73 65 29 20 68 61 73 20  P database) has 
10190 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63  a transaction ac
101a0 74 69 76 65 2e 20 20 20 54 68 65 72 65 20 69 73  tive.   There is
101b0 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65   no need for the
101c0 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75  .  ** master-jou
101d0 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rnal..  **.  ** 
101e0 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  If the return va
101f0 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74  lue of sqlite3Bt
10200 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29  reeGetFilename()
10210 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74   is a zero lengt
10220 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69  h.  ** string, i
10230 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e  t means the main
10240 20 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65   database is :me
10250 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20  mory: or a temp 
10260 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20  file.  In .  ** 
10270 74 68 61 74 20 63 61 73 65 20 77 65 20 64 6f 20  that case we do 
10280 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d  not support atom
10290 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f  ic multi-file co
102a0 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68  mmits, so use th
102b0 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63  e .  ** simple c
102c0 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20  ase then too..  
102d0 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69  */.  if( 0==sqli
102e0 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69  te3Strlen30(sqli
102f0 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
10300 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
10310 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e  Bt)).   || nTran
10320 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f  s<=1.  ){.    fo
10330 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
10340 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
10350 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
10360 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
10370 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
10380 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
10390 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
103a0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
103b0 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20  eOne(pBt, 0);.  
103c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
103d0 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69   /* Do the commi
103e0 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61  t only if all da
103f0 74 61 62 61 73 65 73 20 73 75 63 63 65 73 73 66  tabases successf
10400 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68  ully complete ph
10410 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49  ase 1. .    ** I
10420 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72  f one of the Btr
10430 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
10440 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20  () calls fails, 
10450 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 61  this indicates a
10460 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f  n.    ** IO erro
10470 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67  r while deleting
10480 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61   or truncating a
10490 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
104a0 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20  t is unlikely,. 
104b0 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20     ** but could 
104c0 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20  happen. In this 
104d0 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f  case abandon pro
104e0 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75  cessing and retu
104f0 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20  rn the error..  
10500 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
10510 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
10520 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
10530 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
10540 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
10550 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
10560 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
10570 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
10580 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
10590 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  pBt, 0);.      }
105a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
105b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
105c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61        sqlite3Vta
105d0 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20  bCommit(db);.   
105e0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
105f0 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20   complex case - 
10600 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69  There is a multi
10610 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e  -file write-tran
10620 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a  saction active..
10630 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72    ** This requir
10640 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  es a master jour
10650 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75  nal file to ensu
10660 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
10670 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69  on is.  ** commi
10680 74 74 65 64 20 61 74 6f 6d 69 63 61 6c 6c 79 2e  tted atomically.
10690 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
106a0 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
106b0 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c  .  else{.    sql
106c0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
106d0 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69   db->pVfs;.    i
106e0 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  nt needSync = 0;
106f0 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  .    char *zMast
10700 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c  er = 0;   /* Fil
10710 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d  e-name for the m
10720 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f  aster journal */
10730 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20  .    char const 
10740 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c  *zMainFile = sql
10750 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
10760 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
10770 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
10780 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20  3_file *pMaster 
10790 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66  = 0;.    i64 off
107a0 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  set = 0;.    int
107b0 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 72 65   res;.    int re
107c0 74 72 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  tryCount = 0;.  
107d0 20 20 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b    int nMainFile;
107e0 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20  ..    /* Select 
107f0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
10800 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   file name */.  
10810 20 20 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71    nMainFile = sq
10820 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d  lite3Strlen30(zM
10830 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d  ainFile);.    zM
10840 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  aster = sqlite3M
10850 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d  Printf(db, "%s-m
10860 6a 58 58 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d  jXXXXXX9XXz", zM
10870 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66  ainFile);.    if
10880 28 20 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20 72  ( zMaster==0 ) r
10890 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
108a0 45 4d 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20  EM;.    do {.   
108b0 20 20 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a     u32 iRandom;.
108c0 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79 43        if( retryC
108d0 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ount ){.        
108e0 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3e 31  if( retryCount>1
108f0 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  00 ){.          
10900 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
10910 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c  TE_FULL, "MJ del
10920 65 74 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65  ete: %s", zMaste
10930 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  r);.          sq
10940 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
10950 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
10960 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
10970 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
10980 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d  if( retryCount==
10990 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  1 ){.          s
109a0 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
109b0 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c  E_FULL, "MJ coll
109c0 69 64 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65  ide: %s", zMaste
109d0 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
109e0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 72      }.      retr
109f0 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  yCount++;.      
10a00 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
10a10 73 73 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f  ss(sizeof(iRando
10a20 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20  m), &iRandom);. 
10a30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
10a40 72 69 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73 74  rintf(13, &zMast
10a50 65 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22  er[nMainFile], "
10a60 2d 6d 6a 25 30 36 58 39 25 30 32 58 22 2c 0a 20  -mj%06X9%02X",. 
10a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
10a90 52 61 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66  Random>>8)&0xfff
10aa0 66 66 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66  fff, iRandom&0xf
10ab0 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  f);.      /* The
10ac0 20 61 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74 65   antipenultimate
10ad0 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68   character of th
10ae0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
10af0 20 6e 61 6d 65 20 6d 75 73 74 0a 20 20 20 20 20   name must.     
10b00 20 2a 2a 20 62 65 20 22 39 22 20 74 6f 20 61 76   ** be "9" to av
10b10 6f 69 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69  oid name collisi
10b20 6f 6e 73 20 77 68 65 6e 20 75 73 69 6e 67 20 38  ons when using 8
10b30 2b 33 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f  +3 filenames. */
10b40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a  .      assert( z
10b50 4d 61 73 74 65 72 5b 73 71 6c 69 74 65 33 53 74  Master[sqlite3St
10b60 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d  rlen30(zMaster)-
10b70 33 5d 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20 20  3]=='9' );.     
10b80 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
10b90 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a  ix3(zMainFile, z
10ba0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
10bb0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
10bc0 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ess(pVfs, zMaste
10bd0 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  r, SQLITE_ACCESS
10be0 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a  _EXISTS, &res);.
10bf0 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d      }while( rc==
10c00 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73  SQLITE_OK && res
10c10 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
10c20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10c30 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d     /* Open the m
10c40 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a  aster journal. *
10c50 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
10c60 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63  ite3OsOpenMalloc
10c70 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
10c80 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20  &pMaster, .     
10c90 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
10ca0 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
10cb0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20  E_OPEN_CREATE|. 
10cc0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
10cd0 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53  OPEN_EXCLUSIVE|S
10ce0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
10cf0 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20  R_JOURNAL, 0.   
10d00 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
10d10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10d20 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
10d30 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
10d40 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
10d50 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a  urn rc;.    }. .
10d60 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
10d70 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61   name of each da
10d80 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74  tabase file in t
10d90 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
10da0 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20  nto the new.    
10db0 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
10dc0 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72  l file. If an er
10dd0 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74 68  ror occurs at th
10de0 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20  is point close. 
10df0 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65     ** and delete
10e00 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
10e10 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68  nal file. All th
10e20 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  e individual jou
10e30 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a  rnal files.    *
10e40 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75  * still have 'nu
10e50 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74 65  ll' as the maste
10e60 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
10e70 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20  r, so they will 
10e80 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b  roll.    ** back
10e90 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69   independently i
10ea0 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75  f a failure occu
10eb0 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  rs..    */.    f
10ec0 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
10ed0 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
10ee0 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
10ef0 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
10f00 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
10f10 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
10f20 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
10f30 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20   const *zFile = 
10f40 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a  sqlite3BtreeGetJ
10f50 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b  ournalname(pBt);
10f60 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69  .        if( zFi
10f70 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  le==0 ){.       
10f80 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a     continue;  /*
10f90 20 49 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64   Ignore TEMP and
10fa0 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61   :memory: databa
10fb0 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ses */.        }
10fc0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
10fd0 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a   zFile[0]!=0 );.
10fe0 20 20 20 20 20 20 20 20 69 66 28 20 21 6e 65 65          if( !nee
10ff0 64 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65  dSync && !sqlite
11000 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c  3BtreeSyncDisabl
11010 65 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ed(pBt) ){.     
11020 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20       needSync = 
11030 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
11040 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11050 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65 72  3OsWrite(pMaster
11060 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33  , zFile, sqlite3
11070 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b  Strlen30(zFile)+
11080 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  1, offset);.    
11090 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71      offset += sq
110a0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
110b0 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20  ile)+1;.        
110c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
110d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
110e0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
110f0 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
11100 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
11110 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
11120 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ter, 0);.       
11130 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
11140 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
11150 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
11160 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
11170 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
11180 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73   /* Sync the mas
11190 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
111a0 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53  . If the IOCAP_S
111b0 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65  EQUENTIAL device
111c0 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20  .    ** flag is 
111d0 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  set this is not 
111e0 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
111f0 0a 20 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e  .    if( needSyn
11200 63 20 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 73  c .     && 0==(s
11210 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
11220 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 4d  aracteristics(pM
11230 61 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f  aster)&SQLITE_IO
11240 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a  CAP_SEQUENTIAL).
11250 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f       && SQLITE_O
11260 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
11270 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20  OsSync(pMaster, 
11280 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
11290 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  AL)).    ){.    
112a0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
112b0 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  Free(pMaster);. 
112c0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
112d0 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
112e0 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  er, 0);.      sq
112f0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
11300 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
11310 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
11320 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c  ..    /* Sync al
11330 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73 20 69  l the db files i
11340 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74  nvolved in the t
11350 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
11360 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  same call.    **
11370 20 73 65 74 73 20 74 68 65 20 6d 61 73 74 65 72   sets the master
11380 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
11390 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64   in each individ
113a0 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ual journal. If.
113b0 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20      ** an error 
113c0 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20  occurs here, do 
113d0 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d  not delete the m
113e0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
113f0 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
11400 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f  * If the error o
11410 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
11420 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20   first call to. 
11430 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72     ** sqlite3Btr
11440 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
11450 28 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69  (), then there i
11460 73 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20  s a chance that 
11470 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  the.    ** maste
11480 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  r journal file w
11490 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e  ill be orphaned.
114a0 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64   But we cannot d
114b0 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a  elete it,.    **
114c0 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73   in case the mas
114d0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
114e0 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74 65   name was writte
114f0 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
11500 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62  al.    ** file b
11510 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72  efore the failur
11520 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20  e occurred..    
11530 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
11540 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
11550 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
11560 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
11570 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
11580 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
11590 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
115a0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
115b0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
115c0 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  Bt, zMaster);.  
115d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
115e0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
115f0 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
11600 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
11610 49 54 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20  ITE_BUSY );.    
11620 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11630 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
11640 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
11650 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
11660 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
11670 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65     /* Delete the
11680 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11690 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69  file. This commi
116a0 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ts the transacti
116b0 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a  on. After.    **
116c0 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20   doing this the 
116d0 64 69 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e  directory is syn
116e0 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65  ced again before
116f0 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a   any individual.
11700 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
11710 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c  on files are del
11720 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
11730 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
11740 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
11750 74 65 72 2c 20 6e 65 65 64 53 79 6e 63 29 3b 0a  ter, needSync);.
11760 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
11770 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
11780 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b      zMaster = 0;
11790 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
117a0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
117b0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c      }..    /* Al
117c0 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65  l files and dire
117d0 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72  ctories have alr
117e0 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
117f0 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  , so the followi
11800 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20  ng.    ** calls 
11810 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  to sqlite3BtreeC
11820 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
11830 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67  are only closing
11840 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a   files and.    *
11850 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72  * deleting or tr
11860 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c  uncating journal
11870 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20  s. If something 
11880 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65  goes wrong while
11890 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20  .    ** this is 
118a0 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e  happening we don
118b0 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20  't really care. 
118c0 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  The integrity of
118d0 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
118e0 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  saction is alrea
118f0 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62  dy guaranteed, b
11900 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63  ut some stray 'c
11910 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20  old' journals.  
11920 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e    ** may be lyin
11930 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e  g around. Return
11940 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ing an error cod
11950 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74  e won't help mat
11960 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ters..    */.   
11970 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
11980 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
11990 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
119a0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
119b0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
119c0 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
119d0 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
119e0 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
119f0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
11a00 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
11a10 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
11a20 73 65 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20  seTwo(pBt, 1);. 
11a30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
11a40 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
11a50 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65  nMalloc();.    e
11a60 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
11a70 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20  io_errors();..  
11a80 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d    sqlite3VtabCom
11a90 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  mit(db);.  }.#en
11aa0 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
11ab0 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  ;.}../* .** This
11ac0 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
11ad0 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
11ae0 2e 6e 56 64 62 65 41 63 74 69 76 65 20 63 6f 75  .nVdbeActive cou
11af0 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d  nt variable.** m
11b00 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65  atches the numbe
11b10 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74  r of vdbe's in t
11b20 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e  he list sqlite3.
11b30 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a  pVdbe that are.*
11b40 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  * currently acti
11b50 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e  ve. An assertion
11b60 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74 77   fails if the tw
11b70 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20  o counts do not 
11b80 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69  match..** This i
11b90 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65  s an internal se
11ba0 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20  lf-check only - 
11bb0 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73  it is not an ess
11bc0 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e  ential processin
11bd0 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a  g.** step..**.**
11be0 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
11bf0 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64 65   if NDEBUG is de
11c00 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65  fined..*/.#ifnde
11c10 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
11c20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76 65  void checkActive
11c30 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20  VdbeCnt(sqlite3 
11c40 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
11c50 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
11c60 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30    int nWrite = 0
11c70 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64 20 3d 20  ;.  int nRead = 
11c80 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64  0;.  p = db->pVd
11c90 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  be;.  while( p )
11ca0 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
11cb0 33 5f 73 74 6d 74 5f 62 75 73 79 28 28 73 71 6c  3_stmt_busy((sql
11cc0 69 74 65 33 5f 73 74 6d 74 2a 29 70 29 20 29 7b  ite3_stmt*)p) ){
11cd0 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  .      cnt++;.  
11ce0 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f      if( p->readO
11cf0 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b  nly==0 ) nWrite+
11d00 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  +;.      if( p->
11d10 62 49 73 52 65 61 64 65 72 20 29 20 6e 52 65 61  bIsReader ) nRea
11d20 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  d++;.    }.    p
11d30 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
11d40 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d  .  assert( cnt==
11d50 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20  db->nVdbeActive 
11d60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72  );.  assert( nWr
11d70 69 74 65 3d 3d 64 62 2d 3e 6e 56 64 62 65 57 72  ite==db->nVdbeWr
11d80 69 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ite );.  assert(
11d90 20 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e 56 64 62   nRead==db->nVdb
11da0 65 52 65 61 64 20 29 3b 0a 7d 0a 23 65 6c 73 65  eRead );.}.#else
11db0 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63  .#define checkAc
11dc0 74 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23  tiveVdbeCnt(x).#
11dd0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
11de0 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20  the Vdbe passed 
11df0 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
11e00 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61 20 73  ument opened a s
11e10 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63  tatement-transac
11e20 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69  tion,.** close i
11e30 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20  t now. Argument 
11e40 65 4f 70 20 6d 75 73 74 20 62 65 20 65 69 74 68  eOp must be eith
11e50 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  er SAVEPOINT_ROL
11e60 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45  LBACK or.** SAVE
11e70 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49  POINT_RELEASE. I
11e80 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e  f it is SAVEPOIN
11e90 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e  T_ROLLBACK, then
11ea0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   the statement.*
11eb0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
11ec0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66   rolled back. If
11ed0 20 65 4f 70 20 69 73 20 53 41 56 45 50 4f 49 4e   eOp is SAVEPOIN
11ee0 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20  T_RELEASE, then 
11ef0 74 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  the .** statemen
11f00 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
11f10 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a   committed..**.*
11f20 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
11f30 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 49   occurs, an SQLI
11f40 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72  TE_IOERR_XXX err
11f50 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
11f60 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  ned. .** Otherwi
11f70 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
11f80 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
11f90 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56  CloseStatement(V
11fa0 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29  dbe *p, int eOp)
11fb0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e  {.  sqlite3 *con
11fc0 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  st db = p->db;. 
11fd0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
11fe0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 2d  _OK;..  /* If p-
11ff0 3e 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 67  >iStatement is g
12000 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
12010 2c 20 74 68 65 6e 20 74 68 69 73 20 56 64 62 65  , then this Vdbe
12020 20 6f 70 65 6e 65 64 20 61 20 0a 20 20 2a 2a 20   opened a .  ** 
12030 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
12040 63 74 69 6f 6e 20 74 68 61 74 20 73 68 6f 75 6c  ction that shoul
12050 64 20 62 65 20 63 6c 6f 73 65 64 20 68 65 72 65  d be closed here
12060 2e 20 54 68 65 20 6f 6e 6c 79 20 65 78 63 65 70  . The only excep
12070 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 68 61  tion.  ** is tha
12080 74 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6d 61  t an IO error ma
12090 79 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 2c  y have occurred,
120a0 20 63 61 75 73 69 6e 67 20 61 6e 20 65 6d 65 72   causing an emer
120b0 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a  gency rollback..
120c0 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
120d0 65 20 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  e (db->nStatemen
120e0 74 3d 3d 30 29 2c 20 61 6e 64 20 74 68 65 72 65  t==0), and there
120f0 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64   is nothing to d
12100 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  o..  */.  if( db
12110 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26 26 20  ->nStatement && 
12120 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 29 7b  p->iStatement ){
12130 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
12140 63 6f 6e 73 74 20 69 6e 74 20 69 53 61 76 65 70  const int iSavep
12150 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74 65  oint = p->iState
12160 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20 20 61 73 73  ment-1;..    ass
12170 65 72 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f  ert( eOp==SAVEPO
12180 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20  INT_ROLLBACK || 
12190 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
121a0 45 4c 45 41 53 45 29 3b 0a 20 20 20 20 61 73 73  ELEASE);.    ass
121b0 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d  ert( db->nStatem
121c0 65 6e 74 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ent>0 );.    ass
121d0 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d 65  ert( p->iStateme
121e0 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65 6d  nt==(db->nStatem
121f0 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69  ent+db->nSavepoi
12200 6e 74 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28  nt) );..    for(
12210 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
12220 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74  i++){ .      int
12230 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc2 = SQLITE_OK
12240 3b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  ;.      Btree *p
12250 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
12260 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
12270 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  Bt ){.        if
12280 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  ( eOp==SAVEPOINT
12290 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
122a0 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c         rc2 = sql
122b0 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
122c0 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e  nt(pBt, SAVEPOIN
122d0 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76  T_ROLLBACK, iSav
122e0 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  epoint);.       
122f0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
12300 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  c2==SQLITE_OK ){
12310 0a 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d  .          rc2 =
12320 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
12330 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45  epoint(pBt, SAVE
12340 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69  POINT_RELEASE, i
12350 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
12360 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
12370 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
12380 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
12390 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 20 20 7d  = rc2;.        }
123a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
123b0 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e     db->nStatemen
123c0 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69 53 74 61  t--;.    p->iSta
123d0 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 20  tement = 0;..   
123e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
123f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
12400 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
12410 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
12420 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
12430 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c  tabSavepoint(db,
12440 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
12450 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ACK, iSavepoint)
12460 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12470 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
12480 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
12490 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76  = sqlite3VtabSav
124a0 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50  epoint(db, SAVEP
124b0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53  OINT_RELEASE, iS
124c0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
124d0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
124e0 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
124f0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
12500 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
12510 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72 65  ck, also restore
12520 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74   the .    ** dat
12530 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64 65  abase handles de
12540 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e  ferred constrain
12550 74 20 63 6f 75 6e 74 65 72 20 74 6f 20 74 68 65  t counter to the
12560 20 76 61 6c 75 65 20 69 74 20 68 61 64 20 77 68   value it had wh
12570 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  en .    ** the s
12580 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
12590 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e  tion was opened.
125a0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70    */.    if( eOp
125b0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
125c0 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 64 62  BACK ){.      db
125d0 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20  ->nDeferredCons 
125e0 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e  = p->nStmtDefCon
125f0 73 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65  s;.      db->nDe
12600 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20  ferredImmCons = 
12610 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d 6d 43 6f  p->nStmtDefImmCo
12620 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ns;.    }.  }.  
12630 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12640 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
12650 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
12660 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
12670 70 65 6e 65 64 20 62 79 20 74 68 65 20 64 61 74  pened by the dat
12680 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65  abase .** handle
12690 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
126a0 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61   the VM passed a
126b0 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 69 73  s an argument is
126c0 20 61 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a   about to be .**
126d0 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20 74   committed. If t
126e0 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
126f0 64 69 6e 67 20 64 65 66 65 72 72 65 64 20 66 6f  ding deferred fo
12700 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
12710 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f  aint.** violatio
12720 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ns, return SQLIT
12730 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72 77 69  E_ERROR. Otherwi
12740 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  se, SQLITE_OK..*
12750 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
12760 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 46 4b  e outstanding FK
12770 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20   violations and 
12780 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
12790 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
127a0 5f 45 52 52 4f 52 2c 20 73 65 74 20 74 68 65 20  _ERROR, set the 
127b0 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 56 4d  result of the VM
127c0 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   to SQLITE_CONST
127d0 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59  RAINT_FOREIGNKEY
127e0 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 61 6e  .** and write an
127f0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
12800 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 74 75 72  o it. Then retur
12810 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a  n SQLITE_ERROR..
12820 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
12830 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
12840 45 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  EY.int sqlite3Vd
12850 62 65 43 68 65 63 6b 46 6b 28 56 64 62 65 20 2a  beCheckFk(Vdbe *
12860 70 2c 20 69 6e 74 20 64 65 66 65 72 72 65 64 29  p, int deferred)
12870 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
12880 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28  = p->db;.  if( (
12890 64 65 66 65 72 72 65 64 20 26 26 20 28 64 62 2d  deferred && (db-
128a0 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 2b 64  >nDeferredCons+d
128b0 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
128c0 6f 6e 73 29 3e 30 29 20 0a 20 20 20 7c 7c 20 28  ons)>0) .   || (
128d0 21 64 65 66 65 72 72 65 64 20 26 26 20 70 2d 3e  !deferred && p->
128e0 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30 29  nFkConstraint>0)
128f0 20 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63   .  ){.    p->rc
12900 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   = SQLITE_CONSTR
12910 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b  AINT_FOREIGNKEY;
12920 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74  .    p->errorAct
12930 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ion = OE_Abort;.
12940 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
12950 72 72 6f 72 28 70 2c 20 22 46 4f 52 45 49 47 4e  rror(p, "FOREIGN
12960 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
12970 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 72 65  failed");.    re
12980 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
12990 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
129a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
129b0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
129c0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
129d0 64 20 74 68 65 20 77 68 65 6e 20 61 20 56 44 42  d the when a VDB
129e0 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74 2e  E tries to halt.
129f0 20 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a 2a    If the VDBE.**
12a00 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67 65   has made change
12a10 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74 6f  s and is in auto
12a20 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65  commit mode, the
12a30 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a  n commit those.*
12a40 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20 61  * changes.  If a
12a50 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65   rollback is nee
12a60 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65  ded, then do the
12a70 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
12a80 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
12a90 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f   the only way to
12aa0 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65 20   move the state 
12ab0 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20  of a VM from.** 
12ac0 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e  SQLITE_MAGIC_RUN
12ad0 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43   to SQLITE_MAGIC
12ae0 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68 61  _HALT.  It is ha
12af0 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c  rmless to.** cal
12b00 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20 74  l this on a VM t
12b10 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 53 51  hat is in the SQ
12b20 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  LITE_MAGIC_HALT 
12b30 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  state..**.** Ret
12b40 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
12b50 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69  e.  If the commi
12b60 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70  t could not comp
12b70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f 66 0a  lete because of.
12b80 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  ** lock contenti
12b90 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  on, return SQLIT
12ba0 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c 49  E_BUSY.  If SQLI
12bb0 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
12bc0 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73  ned, it.** means
12bd0 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20 6e   the close did n
12be0 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e 65  ot happen and ne
12bf0 65 64 73 20 74 6f 20 62 65 20 72 65 70 65 61 74  eds to be repeat
12c00 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
12c10 65 33 56 64 62 65 48 61 6c 74 28 56 64 62 65 20  e3VdbeHalt(Vdbe 
12c20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  *p){.  int rc;  
12c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c40 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
12c50 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69 65 6e  o store transien
12c60 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20 2a  t return codes *
12c70 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
12c80 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54  = p->db;..  /* T
12c90 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e  his function con
12ca0 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20  tains the logic 
12cb0 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20  that determines 
12cc0 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  if a statement o
12cd0 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  r.  ** transacti
12ce0 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69  on will be commi
12cf0 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
12d00 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20  ack as a result 
12d10 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63  of the.  ** exec
12d20 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69  ution of this vi
12d30 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a  rtual machine. .
12d40 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79    **.  ** If any
12d50 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
12d60 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a  g errors occur:.
12d70 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51    **.  **     SQ
12d80 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20  LITE_NOMEM.  ** 
12d90 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52      SQLITE_IOERR
12da0 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
12db0 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  _FULL.  **     S
12dc0 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 0a  QLITE_INTERRUPT.
12dd0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74    **.  ** Then t
12de0 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68  he internal cach
12df0 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65  e might have bee
12e00 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  n left in an inc
12e10 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73  onsistent.  ** s
12e20 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20 74  tate.  We need t
12e30 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73  o rollback the s
12e40 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
12e50 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 69  tion, if there i
12e60 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74  s.  ** one, or t
12e70 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e  he complete tran
12e80 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65  saction if there
12e90 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74   is no statement
12ea0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
12eb0 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d  */..  if( p->db-
12ec0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
12ed0 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
12ee0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
12ef0 20 69 66 28 20 70 2d 3e 61 4f 6e 63 65 46 6c 61   if( p->aOnceFla
12f00 67 20 29 20 6d 65 6d 73 65 74 28 70 2d 3e 61 4f  g ) memset(p->aO
12f10 6e 63 65 46 6c 61 67 2c 20 30 2c 20 70 2d 3e 6e  nceFlag, 0, p->n
12f20 4f 6e 63 65 46 6c 61 67 29 3b 0a 20 20 63 6c 6f  OnceFlag);.  clo
12f30 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b  seAllCursors(p);
12f40 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  .  if( p->magic!
12f50 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
12f60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
12f70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63  LITE_OK;.  }.  c
12f80 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
12f90 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  t(db);..  /* No 
12fa0 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
12fb0 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68 65  ck needed if the
12fc0 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73   program never s
12fd0 74 61 72 74 65 64 20 6f 72 20 69 66 20 74 68 65  tarted or if the
12fe0 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d  .  ** SQL statem
12ff0 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 61  ent does not rea
13000 64 20 6f 72 20 77 72 69 74 65 20 61 20 64 61 74  d or write a dat
13010 61 62 61 73 65 20 66 69 6c 65 2e 20 20 2a 2f 0a  abase file.  */.
13020 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 26    if( p->pc>=0 &
13030 26 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29  & p->bIsReader )
13040 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20 20  {.    int mrc;  
13050 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72 6f   /* Primary erro
13060 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72  r code from p->r
13070 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53 74  c */.    int eSt
13080 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a 20  atementOp = 0;. 
13090 20 20 20 69 6e 74 20 69 73 53 70 65 63 69 61 6c     int isSpecial
130a0 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20  Error;          
130b0 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65    /* Set to true
130c0 20 69 66 20 61 20 27 73 70 65 63 69 61 6c 27 20   if a 'special' 
130d0 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a  error */..    /*
130e0 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65 73   Lock all btrees
130f0 20 75 73 65 64 20 62 79 20 74 68 65 20 73 74 61   used by the sta
13100 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71  tement */.    sq
13110 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 70  lite3VdbeEnter(p
13120 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  );..    /* Check
13130 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20   for one of the 
13140 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 2a  special errors *
13150 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72  /.    mrc = p->r
13160 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20 69 73  c & 0xff;.    is
13170 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d  SpecialError = m
13180 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
13190 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
131a0 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20  IOERR.          
131b0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72             || mr
131c0 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  c==SQLITE_INTERR
131d0 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  UPT || mrc==SQLI
131e0 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28  TE_FULL;.    if(
131f0 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20   isSpecialError 
13200 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
13210 68 65 20 71 75 65 72 79 20 77 61 73 20 72 65 61  he query was rea
13220 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65 20 65  d-only and the e
13230 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c  rror code is SQL
13240 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2c 20 0a  ITE_INTERRUPT, .
13250 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c        ** no roll
13260 62 61 63 6b 20 69 73 20 6e 65 63 65 73 73 61 72  back is necessar
13270 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74  y. Otherwise, at
13280 20 6c 65 61 73 74 20 61 20 73 61 76 65 70 6f 69   least a savepoi
13290 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61  nt .      ** tra
132a0 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
132b0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20   rolled back to 
132c0 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
132d0 62 61 73 65 20 74 6f 20 61 20 0a 20 20 20 20 20  base to a .     
132e0 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20 73   ** consistent s
132f0 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  tate..      **. 
13300 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69 66 20       ** Even if 
13310 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
13320 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74 20 69   read-only, it i
13330 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70  s important to p
13340 65 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20  erform.      ** 
13350 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 74  a statement or t
13360 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62  ransaction rollb
13370 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49  ack operation. I
13380 66 20 74 68 65 20 65 72 72 6f 72 20 0a 20 20 20  f the error .   
13390 20 20 20 2a 2a 20 6f 63 63 75 72 72 65 64 20 77     ** occurred w
133a0 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20  hile writing to 
133b0 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 75 62  the journal, sub
133c0 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61 74 61  -journal or data
133d0 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69  base.      ** fi
133e0 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e  le as part of an
133f0 20 65 66 66 6f 72 74 20 74 6f 20 66 72 65 65 20   effort to free 
13400 75 70 20 63 61 63 68 65 20 73 70 61 63 65 20 28  up cache space (
13410 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20  see function.   
13420 20 20 20 2a 2a 20 70 61 67 65 72 53 74 72 65 73     ** pagerStres
13430 73 28 29 20 69 6e 20 70 61 67 65 72 2e 63 29 2c  s() in pager.c),
13440 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69 73   the rollback is
13450 20 72 65 71 75 69 72 65 64 20 74 6f 20 72 65 73   required to res
13460 74 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74  tore .      ** t
13470 68 65 20 70 61 67 65 72 20 74 6f 20 61 20 63 6f  he pager to a co
13480 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a  nsistent state..
13490 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
134a0 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20  f( !p->readOnly 
134b0 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49  || mrc!=SQLITE_I
134c0 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20 20  NTERRUPT ){.    
134d0 20 20 20 20 69 66 28 20 28 6d 72 63 3d 3d 53 51      if( (mrc==SQ
134e0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72  LITE_NOMEM || mr
134f0 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20  c==SQLITE_FULL) 
13500 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f  && p->usesStmtJo
13510 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  urnal ){.       
13520 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20     eStatementOp 
13530 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  = SAVEPOINT_ROLL
13540 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65  BACK;.        }e
13550 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
13560 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65 64 20  * We are forced 
13570 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65  to roll back the
13580 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
13590 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e  ion. Before doin
135a0 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  g.          ** s
135b0 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74 68  o, abort any oth
135c0 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  er statements th
135d0 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65 6e  is handle curren
135e0 74 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e 0a  tly has active..
135f0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
13600 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
13610 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
13620 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
13630 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ACK);.          
13640 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
13650 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  points(db);.    
13660 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
13670 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
13680 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
13690 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
136a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
136b0 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 69 6d   /* Check for im
136c0 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
136d0 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 20  key violations. 
136e0 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  */.    if( p->rc
136f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13700 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13710 43 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b 0a 20  CheckFk(p, 0);. 
13720 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
13730 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  f the auto-commi
13740 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e  t flag is set an
13750 64 20 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e  d this is the on
13760 6c 79 20 61 63 74 69 76 65 20 77 72 69 74 65 72  ly active writer
13770 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65   .    ** VM, the
13780 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72 20 61  n we do either a
13790 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62   commit or rollb
137a0 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72 65  ack of the curre
137b0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  nt transaction. 
137c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
137d0 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20  ote: This block 
137e0 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65  also runs if one
137f0 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
13800 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a  errors handled .
13810 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73      ** above has
13820 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20 20 20   occurred. .    
13830 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69  */.    if( !sqli
13840 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28 64 62  te3VtabInSync(db
13850 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 61  ) .     && db->a
13860 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20  utoCommit .     
13870 26 26 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74  && db->nVdbeWrit
13880 65 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d  e==(p->readOnly=
13890 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  =0) .    ){.    
138a0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
138b0 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72  ITE_OK || (p->er
138c0 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61  rorAction==OE_Fa
138d0 69 6c 20 26 26 20 21 69 73 53 70 65 63 69 61 6c  il && !isSpecial
138e0 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20  Error) ){.      
138f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
13900 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 3b  beCheckFk(p, 1);
13910 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
13920 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13930 20 20 20 20 20 20 20 20 69 66 28 20 4e 45 56 45          if( NEVE
13940 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29  R(p->readOnly) )
13950 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
13960 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70  lite3VdbeLeave(p
13970 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
13980 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
13990 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  OR;.          }.
139a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
139b0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
139c0 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20  _FOREIGNKEY;.   
139d0 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20       }else{ .   
139e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 75         /* The au
139f0 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
13a00 73 20 74 72 75 65 2c 20 74 68 65 20 76 64 62 65  s true, the vdbe
13a10 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73 75 63   program was suc
13a20 63 65 73 73 66 75 6c 20 0a 20 20 20 20 20 20 20  cessful .       
13a30 20 20 20 2a 2a 20 6f 72 20 68 69 74 20 61 6e 20     ** or hit an 
13a40 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72  'OR FAIL' constr
13a50 61 69 6e 74 20 61 6e 64 20 74 68 65 72 65 20 61  aint and there a
13a60 72 65 20 6e 6f 20 64 65 66 65 72 72 65 64 20 66  re no deferred f
13a70 6f 72 65 69 67 6e 0a 20 20 20 20 20 20 20 20 20  oreign.         
13a80 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72 61 69   ** key constrai
13a90 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75 70 20 74  nts to hold up t
13aa0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
13ab0 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d  This means a com
13ac0 6d 69 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a  mit .          *
13ad0 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a  * is required. *
13ae0 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
13af0 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c 20   vdbeCommit(db, 
13b00 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  p);.        }.  
13b10 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
13b20 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 2d 3e  LITE_BUSY && p->
13b30 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
13b40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13b50 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
13b60 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
13b70 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
13b80 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53   }else if( rc!=S
13b90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13ba0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
13bb0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
13bc0 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
13bd0 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  b, SQLITE_OK);. 
13be0 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61           p->nCha
13bf0 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nge = 0;.       
13c00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13c10 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43    db->nDeferredC
13c20 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ons = 0;.       
13c30 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
13c40 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20  ImmCons = 0;.   
13c50 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73         db->flags
13c60 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66 65   &= ~SQLITE_Defe
13c70 72 46 4b 73 3b 0a 20 20 20 20 20 20 20 20 20 20  rFKs;.          
13c80 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74  sqlite3CommitInt
13c90 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29  ernalChanges(db)
13ca0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13cb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13cc0 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
13cd0 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  All(db, SQLITE_O
13ce0 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e  K);.        p->n
13cf0 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
13d00 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6e 53    }.      db->nS
13d10 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20  tatement = 0;.  
13d20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74 61    }else if( eSta
13d30 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20  tementOp==0 ){. 
13d40 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
13d50 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
13d60 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
13d70 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Fail ){.        
13d80 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53  eStatementOp = S
13d90 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
13da0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
13db0 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  ( p->errorAction
13dc0 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20  ==OE_Abort ){.  
13dd0 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74        eStatement
13de0 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52  Op = SAVEPOINT_R
13df0 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 7d  OLLBACK;.      }
13e00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
13e10 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
13e20 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52  (db, SQLITE_ABOR
13e30 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20  T_ROLLBACK);.   
13e40 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73       sqlite3Clos
13e50 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
13e60 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74  .        db->aut
13e70 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
13e80 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
13e90 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
13ea0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
13eb0 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69 73 20  eStatementOp is 
13ec0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
13ed0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
13ee0 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a  action needs to.
13ef0 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74      ** be commit
13f00 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  ted or rolled ba
13f10 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  ck. Call sqlite3
13f20 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
13f30 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64  nt() to.    ** d
13f40 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20 6f 70  o so. If this op
13f50 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  eration returns 
13f60 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68  an error, and th
13f70 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  e current statem
13f80 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72  ent.    ** error
13f90 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f   code is SQLITE_
13fa0 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e  OK or SQLITE_CON
13fb0 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20 70 72  STRAINT, then pr
13fc0 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  omote the.    **
13fd0 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65   current stateme
13fe0 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20  nt error code.. 
13ff0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 53     */.    if( eS
14000 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20  tatementOp ){.  
14010 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14020 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
14030 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e 74  nt(p, eStatement
14040 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Op);.      if( r
14050 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  c ){.        if(
14060 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
14070 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66 66  K || (p->rc&0xff
14080 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  )==SQLITE_CONSTR
14090 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20  AINT ){.        
140a0 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
140b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
140c0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
140d0 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  rMsg);.         
140e0 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
140f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14100 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
14110 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
14120 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29  _ABORT_ROLLBACK)
14130 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
14140 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
14150 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62  (db);.        db
14160 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
14170 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68  ;.        p->nCh
14180 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  ange = 0;.      
14190 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
141a0 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61 6e  * If this was an
141b0 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20   INSERT, UPDATE 
141c0 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f  or DELETE and no
141d0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
141e0 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61  action.    ** ha
141f0 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  s been rolled ba
14200 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65 20 64  ck, update the d
14210 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
14220 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  on change-counte
14230 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  r. .    */.    i
14240 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f  f( p->changeCntO
14250 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  n ){.      if( e
14260 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56  StatementOp!=SAV
14270 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
14280 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
14290 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
142a0 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29  (db, p->nChange)
142b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
142c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
142d0 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c  beSetChanges(db,
142e0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
142f0 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
14300 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
14310 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
14320 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ks */.    sqlite
14330 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
14340 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65   }..  /* We have
14350 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61   successfully ha
14360 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20  lted and closed 
14370 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20  the VM.  Record 
14380 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20  this fact. */.  
14390 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a  if( p->pc>=0 ){.
143a0 20 20 20 20 64 62 2d 3e 6e 56 64 62 65 41 63 74      db->nVdbeAct
143b0 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 21  ive--;.    if( !
143c0 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 20 64 62  p->readOnly ) db
143d0 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d 2d 3b 0a  ->nVdbeWrite--;.
143e0 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65      if( p->bIsRe
143f0 61 64 65 72 20 29 20 64 62 2d 3e 6e 56 64 62 65  ader ) db->nVdbe
14400 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61 73 73 65  Read--;.    asse
14410 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74  rt( db->nVdbeAct
14420 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62 65 52 65  ive>=db->nVdbeRe
14430 61 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ad );.    assert
14440 28 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e  ( db->nVdbeRead>
14450 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20  =db->nVdbeWrite 
14460 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
14470 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e 3d 30  b->nVdbeWrite>=0
14480 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67   );.  }.  p->mag
14490 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
144a0 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74  HALT;.  checkAct
144b0 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a  iveVdbeCnt(db);.
144c0 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
144d0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
144e0 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
144f0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
14500 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d   If the auto-com
14510 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20  mit flag is set 
14520 74 6f 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  to true, then an
14530 79 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 65 72  y locks that wer
14540 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63  e held.  ** by c
14550 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 76  onnection db hav
14560 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65 61  e now been relea
14570 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65  sed. Call sqlite
14580 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63  3ConnectionUnloc
14590 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69  ked() .  ** to i
145a0 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71 75 69 72  nvoke any requir
145b0 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79  ed unlock-notify
145c0 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f   callbacks..  */
145d0 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43  .  if( db->autoC
145e0 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  ommit ){.    sql
145f0 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e  ite3ConnectionUn
14600 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a  locked(db);.  }.
14610 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e  .  assert( db->n
14620 56 64 62 65 41 63 74 69 76 65 3e 30 20 7c 7c 20  VdbeActive>0 || 
14630 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d  db->autoCommit==
14640 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d  0 || db->nStatem
14650 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ent==0 );.  retu
14660 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rn (p->rc==SQLIT
14670 45 5f 42 55 53 59 20 3f 20 53 51 4c 49 54 45 5f  E_BUSY ? SQLITE_
14680 42 55 53 59 20 3a 20 53 51 4c 49 54 45 5f 4f 4b  BUSY : SQLITE_OK
14690 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  );.}.../*.** Eac
146a0 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65  h VDBE holds the
146b0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d   result of the m
146c0 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74  ost recent sqlit
146d0 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a  e3_step() call.*
146e0 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69  * in p->rc.  Thi
146f0 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
14700 68 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20  hat result back 
14710 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  to SQLITE_OK..*/
14720 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
14730 65 52 65 73 65 74 53 74 65 70 52 65 73 75 6c 74  eResetStepResult
14740 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e  (Vdbe *p){.  p->
14750 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14760 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68  }../*.** Copy th
14770 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  e error code and
14780 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 62   error message b
14790 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20  elonging to the 
147a0 56 44 42 45 20 70 61 73 73 65 64 0a 2a 2a 20 61  VDBE passed.** a
147b0 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
147c0 6d 65 6e 74 20 74 6f 20 69 74 73 20 64 61 74 61  ment to its data
147d0 62 61 73 65 20 68 61 6e 64 6c 65 20 28 73 6f 20  base handle (so 
147e0 74 68 61 74 20 74 68 65 79 20 77 69 6c 6c 20 62  that they will b
147f0 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 62  e .** returned b
14800 79 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  y calls to sqlit
14810 65 33 5f 65 72 72 63 6f 64 65 28 29 20 61 6e 64  e3_errcode() and
14820 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
14830 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ))..**.** This f
14840 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
14850 20 63 6c 65 61 72 20 74 68 65 20 56 44 42 45 20   clear the VDBE 
14860 65 72 72 6f 72 20 63 6f 64 65 20 6f 72 20 6d 65  error code or me
14870 73 73 61 67 65 2c 20 6a 75 73 74 0a 2a 2a 20 63  ssage, just.** c
14880 6f 70 69 65 73 20 74 68 65 6d 20 74 6f 20 74 68  opies them to th
14890 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
148a0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
148b0 33 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72  3VdbeTransferErr
148c0 6f 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  or(Vdbe *p){.  s
148d0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
148e0 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  db;.  int rc = p
148f0 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a  ->rc;.  if( p->z
14900 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 75 38  ErrMsg ){.    u8
14910 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20   mallocFailed = 
14920 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
14930 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
14940 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
14950 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 45  ;.    if( db->pE
14960 72 72 3d 3d 30 20 29 20 64 62 2d 3e 70 45 72 72  rr==0 ) db->pErr
14970 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
14980 65 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69  ew(db);.    sqli
14990 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64  te3ValueSetStr(d
149a0 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e  b->pErr, -1, p->
149b0 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f  zErrMsg, SQLITE_
149c0 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41  UTF8, SQLITE_TRA
149d0 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
149e0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
149f0 6c 6f 63 28 29 3b 0a 20 20 20 20 64 62 2d 3e 6d  loc();.    db->m
14a00 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61  allocFailed = ma
14a10 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20  llocFailed;.    
14a20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  db->errCode = rc
14a30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
14a40 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
14a50 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rc);.  }.  retur
14a60 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
14a70 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
14a80 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e  LLOG./*.** If an
14a90 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
14aa0 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73 20 72 65  QLLOG hook is re
14ab0 67 69 73 74 65 72 65 64 20 61 6e 64 20 74 68 65  gistered and the
14ac0 20 56 4d 20 68 61 73 20 62 65 65 6e 20 72 75 6e   VM has been run
14ad0 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69 74 2e  , .** invoke it.
14ae0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14af0 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67  vdbeInvokeSqllog
14b00 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 69 66 28  (Vdbe *v){.  if(
14b10 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
14b20 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 26 26 20  nfig.xSqllog && 
14b30 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  v->rc==SQLITE_OK
14b40 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26 26 20 76   && v->zSql && v
14b50 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 63  ->pc>=0 ){.    c
14b60 68 61 72 20 2a 7a 45 78 70 61 6e 64 65 64 20 3d  har *zExpanded =
14b70 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 61   sqlite3VdbeExpa
14b80 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c  ndSql(v, v->zSql
14b90 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76  );.    assert( v
14ba0 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ->db->init.busy=
14bb0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 45  =0 );.    if( zE
14bc0 78 70 61 6e 64 65 64 20 29 7b 0a 20 20 20 20 20  xpanded ){.     
14bd0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
14be0 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 0a 20 20  nfig.xSqllog(.  
14bf0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
14c00 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c  lobalConfig.pSql
14c10 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62 2c 20 7a  logArg, v->db, z
14c20 45 78 70 61 6e 64 65 64 2c 20 31 0a 20 20 20 20  Expanded, 1.    
14c30 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
14c40 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20  e3DbFree(v->db, 
14c50 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20 20 20 20  zExpanded);.    
14c60 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  }.  }.}.#else.# 
14c70 64 65 66 69 6e 65 20 76 64 62 65 49 6e 76 6f 6b  define vdbeInvok
14c80 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65 6e 64 69  eSqllog(x).#endi
14c90 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  f../*.** Clean u
14ca0 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65  p a VDBE after e
14cb0 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20  xecution but do 
14cc0 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56  not delete the V
14cd0 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a  DBE just yet..**
14ce0 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72   Write any error
14cf0 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a   messages into *
14d00 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72  pzErrMsg.  Retur
14d10 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  n the result cod
14d20 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  e..**.** After t
14d30 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72  his routine is r
14d40 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f  un, the VDBE sho
14d50 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20  uld be ready to 
14d60 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61  be executed.** a
14d70 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c  gain..**.** To l
14d80 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65  ook at it anothe
14d90 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74  r way, this rout
14da0 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73  ine resets the s
14db0 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76  tate of the.** v
14dc0 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
14dd0 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  rom VDBE_MAGIC_R
14de0 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43  UN or VDBE_MAGIC
14df0 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a  _HALT back to.**
14e00 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
14e10 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
14e20 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a  VdbeReset(Vdbe *
14e30 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
14e40 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  b;.  db = p->db;
14e50 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d  ..  /* If the VM
14e60 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20   did not run to 
14e70 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66  completion or if
14e80 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   it encountered 
14e90 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74  an.  ** error, t
14ea0 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74  hen it might not
14eb0 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65   have been halte
14ec0 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20  d properly.  So 
14ed0 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77  halt.  ** it now
14ee0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
14ef0 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20  VdbeHalt(p);..  
14f00 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45 20 68  /* If the VDBE h
14f10 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20 70  as be run even p
14f20 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74  artially, then t
14f30 72 61 6e 73 66 65 72 20 74 68 65 20 65 72 72 6f  ransfer the erro
14f40 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20  r code.  ** and 
14f50 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72  error message fr
14f60 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74 6f  om the VDBE into
14f70 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
14f80 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 42  se structure.  B
14f90 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 56  ut.  ** if the V
14fa0 44 42 45 20 68 61 73 20 6a 75 73 74 20 62 65 65  DBE has just bee
14fb0 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75 74  n set to run but
14fc0 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c   has not actuall
14fd0 79 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a 20  y executed any. 
14fe0 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   ** instructions
14ff0 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65 20   yet, leave the 
15000 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 65 72  main database er
15010 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ror information 
15020 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a  unchanged..  */.
15030 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
15040 7b 0a 20 20 20 20 76 64 62 65 49 6e 76 6f 6b 65  {.    vdbeInvoke
15050 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20 20 20 73  Sqllog(p);.    s
15060 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 66  qlite3VdbeTransf
15070 65 72 45 72 72 6f 72 28 70 29 3b 0a 20 20 20 20  erError(p);.    
15080 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
15090 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
150a0 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
150b0 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 75  0;.    if( p->ru
150c0 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65  nOnlyOnce ) p->e
150d0 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65  xpired = 1;.  }e
150e0 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26  lse if( p->rc &&
150f0 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20   p->expired ){. 
15100 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65     /* The expire
15110 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f  d flag was set o
15120 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f 72  n the VDBE befor
15130 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  e the first call
15140 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  .    ** to sqlit
15150 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63  e3_step(). For c
15160 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63  onsistency (sinc
15170 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
15180 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c   was.    ** call
15190 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61 74  ed), set the dat
151a0 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74  abase error in t
151b0 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c  his case as well
151c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
151d0 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
151e0 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a  (db, p->rc, p->z
151f0 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a 20  ErrMsg ? "%s" : 
15200 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  0, p->zErrMsg);.
15210 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
15220 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
15230 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73  );.    p->zErrMs
15240 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  g = 0;.  }..  /*
15250 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d   Reclaim all mem
15260 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 65 20  ory used by the 
15270 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61  VDBE.  */.  Clea
15280 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61  nup(p);..  /* Sa
15290 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66  ve profiling inf
152a0 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
152b0 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a  is VDBE run..  *
152c0 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  /.#ifdef VDBE_PR
152d0 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49  OFILE.  {.    FI
152e0 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28  LE *out = fopen(
152f0 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75  "vdbe_profile.ou
15300 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66  t", "a");.    if
15310 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69  ( out ){.      i
15320 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69  nt i;.      fpri
15330 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22  ntf(out, "---- "
15340 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
15350 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
15360 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
15370 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70  f(out, "%02x", p
15380 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29  ->aOp[i].opcode)
15390 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
153a0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
153b0 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ");.      if( p-
153c0 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20  >zSql ){.       
153d0 20 63 68 61 72 20 63 2c 20 70 63 20 3d 20 30 3b   char c, pc = 0;
153e0 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
153f0 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20  (out, "-- ");.  
15400 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28        for(i=0; (
15410 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21  c = p->zSql[i])!
15420 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  =0; i++){.      
15430 20 20 20 20 69 66 28 20 70 63 3d 3d 27 5c 6e 27      if( pc=='\n'
15440 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20   ) fprintf(out, 
15450 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20  "-- ");.        
15460 20 20 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a    putc(c, out);.
15470 20 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 63            pc = c
15480 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15490 20 20 20 20 69 66 28 20 70 63 21 3d 27 5c 6e 27      if( pc!='\n'
154a0 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20   ) fprintf(out, 
154b0 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  "\n");.      }. 
154c0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
154d0 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
154e0 20 20 20 20 20 20 63 68 61 72 20 7a 48 64 72 5b        char zHdr[
154f0 31 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 71  100];.        sq
15500 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
15510 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20 7a 48 64  izeof(zHdr), zHd
15520 72 2c 20 22 25 36 75 20 25 31 32 6c 6c 75 20 25  r, "%6u %12llu %
15530 38 6c 6c 75 20 22 2c 0a 20 20 20 20 20 20 20 20  8llu ",.        
15540 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
15550 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
15560 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20  aOp[i].cycles,. 
15570 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
15580 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61  [i].cnt>0 ? p->a
15590 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e  Op[i].cycles/p->
155a0 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20  aOp[i].cnt : 0. 
155b0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
155c0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
155d0 25 73 22 2c 20 7a 48 64 72 29 3b 0a 20 20 20 20  %s", zHdr);.    
155e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
155f0 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26  rintOp(out, i, &
15600 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20  p->aOp[i]);.    
15610 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65    }.      fclose
15620 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (out);.    }.  }
15630 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 69 43 75  .#endif.  p->iCu
15640 72 72 65 6e 74 54 69 6d 65 20 3d 20 30 3b 0a 20  rrentTime = 0;. 
15650 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
15660 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72  _MAGIC_INIT;.  r
15670 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62  eturn p->rc & db
15680 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f  ->errMask;.}. ./
15690 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e  *.** Clean up an
156a0 64 20 64 65 6c 65 74 65 20 61 20 56 44 42 45 20  d delete a VDBE 
156b0 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e  after execution.
156c0 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65    Return an inte
156d0 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20  ger which is.** 
156e0 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e  the result code.
156f0 20 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f    Write any erro
15700 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 69  r message text i
15710 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a  nto *pzErrMsg..*
15720 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
15730 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a  eFinalize(Vdbe *
15740 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  p){.  int rc = S
15750 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
15760 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
15770 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d  AGIC_RUN || p->m
15780 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
15790 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20  _HALT ){.    rc 
157a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  = sqlite3VdbeRes
157b0 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72  et(p);.    asser
157c0 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e  t( (rc & p->db->
157d0 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a  errMask)==rc );.
157e0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
157f0 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65  eDelete(p);.  re
15800 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
15810 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69  * If parameter i
15820 4f 70 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  Op is less than 
15830 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e 76 6f 6b  zero, then invok
15840 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  e the destructor
15850 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75 78 69   for.** all auxi
15860 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74  liary data point
15870 65 72 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61  ers currently ca
15880 63 68 65 64 20 62 79 20 74 68 65 20 56 4d 20 70  ched by the VM p
15890 61 73 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20  assed as.** the 
158a0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
158b0 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 4f 70  **.** Or, if iOp
158c0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
158d0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
158e0 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 65 73 74  o, then the dest
158f0 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c  ructor is.** onl
15900 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20 74 68  y invoked for th
15910 6f 73 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  ose auxiliary da
15920 74 61 20 70 6f 69 6e 74 65 72 73 20 63 72 65 61  ta pointers crea
15930 74 65 64 20 62 79 20 74 68 65 20 75 73 65 72 20  ted by the user 
15940 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76  .** function inv
15950 6f 6b 65 64 20 62 79 20 74 68 65 20 4f 50 5f 46  oked by the OP_F
15960 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 61  unction opcode a
15970 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 4f  t instruction iO
15980 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70 56 64 62  p of .** VM pVdb
15990 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 6e  e, and only then
159a0 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20   if:.**.**    * 
159b0 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66  the associated f
159c0 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65  unction paramete
159d0 72 20 69 73 20 74 68 65 20 33 32 6e 64 20 6f 72  r is the 32nd or
159e0 20 6c 61 74 65 72 20 28 63 6f 75 6e 74 69 6e 67   later (counting
159f0 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 6c 65  .**      from le
15a00 66 74 20 74 6f 20 72 69 67 68 74 29 2c 20 6f 72  ft to right), or
15a10 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  .**.**    * the 
15a20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
15a30 74 20 69 6e 20 61 72 67 75 6d 65 6e 74 20 6d 61  t in argument ma
15a40 73 6b 20 69 73 20 63 6c 65 61 72 20 28 77 68 65  sk is clear (whe
15a50 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  re the first.** 
15a60 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 70 61       function pa
15a70 72 61 6d 65 74 65 72 20 63 6f 72 72 65 73 70 6f  rameter correspo
15a80 6e 64 73 20 74 6f 20 62 69 74 20 30 20 65 74 63  nds to bit 0 etc
15a90 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  .)..*/.void sqli
15aa0 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78  te3VdbeDeleteAux
15ab0 44 61 74 61 28 56 64 62 65 20 2a 70 56 64 62 65  Data(Vdbe *pVdbe
15ac0 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74 20 6d  , int iOp, int m
15ad0 61 73 6b 29 7b 0a 20 20 41 75 78 44 61 74 61 20  ask){.  AuxData 
15ae0 2a 2a 70 70 20 3d 20 26 70 56 64 62 65 2d 3e 70  **pp = &pVdbe->p
15af0 41 75 78 44 61 74 61 3b 0a 20 20 77 68 69 6c 65  AuxData;.  while
15b00 28 20 2a 70 70 20 29 7b 0a 20 20 20 20 41 75 78  ( *pp ){.    Aux
15b10 44 61 74 61 20 2a 70 41 75 78 20 3d 20 2a 70 70  Data *pAux = *pp
15b20 3b 0a 20 20 20 20 69 66 28 20 28 69 4f 70 3c 30  ;.    if( (iOp<0
15b30 29 0a 20 20 20 20 20 7c 7c 20 28 70 41 75 78 2d  ).     || (pAux-
15b40 3e 69 4f 70 3d 3d 69 4f 70 20 26 26 20 28 70 41  >iOp==iOp && (pA
15b50 75 78 2d 3e 69 41 72 67 3e 33 31 20 7c 7c 20 21  ux->iArg>31 || !
15b60 28 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49 54 33  (mask & MASKBIT3
15b70 32 28 70 41 75 78 2d 3e 69 41 72 67 29 29 29 29  2(pAux->iArg))))
15b80 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65  .    ){.      te
15b90 73 74 63 61 73 65 28 20 70 41 75 78 2d 3e 69 41  stcase( pAux->iA
15ba0 72 67 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20  rg==31 );.      
15bb0 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74  if( pAux->xDelet
15bc0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75  e ){.        pAu
15bd0 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d  x->xDelete(pAux-
15be0 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a  >pAux);.      }.
15bf0 20 20 20 20 20 20 2a 70 70 20 3d 20 70 41 75 78        *pp = pAux
15c00 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73  ->pNext;.      s
15c10 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 56 64  qlite3DbFree(pVd
15c20 62 65 2d 3e 64 62 2c 20 70 41 75 78 29 3b 0a 20  be->db, pAux);. 
15c30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15c40 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e 65 78 74  pp= &pAux->pNext
15c50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
15c60 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65  *.** Free all me
15c70 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
15c80 77 69 74 68 20 74 68 65 20 56 64 62 65 20 70 61  with the Vdbe pa
15c90 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
15ca0 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  nd argument,.** 
15cb0 65 78 63 65 70 74 20 66 6f 72 20 6f 62 6a 65 63  except for objec
15cc0 74 20 69 74 73 65 6c 66 2c 20 77 68 69 63 68 20  t itself, which 
15cd0 69 73 20 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a  is preserved..**
15ce0 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
15cf0 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
15d00 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c  function and sql
15d10 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 29  ite3VdbeDelete()
15d20 20 69 73 20 74 68 61 74 0a 2a 2a 20 56 64 62 65   is that.** Vdbe
15d30 44 65 6c 65 74 65 28 29 20 61 6c 73 6f 20 75 6e  Delete() also un
15d40 6c 69 6e 6b 73 20 74 68 65 20 56 64 62 65 20 66  links the Vdbe f
15d50 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20  rom the list of 
15d60 56 4d 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  VMs associated w
15d70 69 74 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ith.** the datab
15d80 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  ase connection a
15d90 6e 64 20 66 72 65 65 73 20 74 68 65 20 6f 62 6a  nd frees the obj
15da0 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76  ect itself..*/.v
15db0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
15dc0 6c 65 61 72 4f 62 6a 65 63 74 28 73 71 6c 69 74  learObject(sqlit
15dd0 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29  e3 *db, Vdbe *p)
15de0 7b 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a  {.  SubProgram *
15df0 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  pSub, *pNext;.  
15e00 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
15e10 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e   p->db==0 || p->
15e20 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65  db==db );.  rele
15e30 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
15e40 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20  Var, p->nVar);. 
15e50 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
15e60 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d  (p->aColName, p-
15e70 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e  >nResColumn*COLN
15e80 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53  AME_N);.  for(pS
15e90 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20  ub=p->pProgram; 
15ea0 70 53 75 62 3b 20 70 53 75 62 3d 70 4e 65 78 74  pSub; pSub=pNext
15eb0 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
15ec0 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sub->pNext;.    
15ed0 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
15ee0 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70  db, pSub->aOp, p
15ef0 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73  Sub->nOp);.    s
15f00 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
15f10 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20 66 6f   pSub);.  }.  fo
15f20 72 28 69 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20  r(i=p->nzVar-1; 
15f30 69 3e 3d 30 3b 20 69 2d 2d 29 20 73 71 6c 69 74  i>=0; i--) sqlit
15f40 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
15f50 61 7a 56 61 72 5b 69 5d 29 3b 0a 20 20 73 71 6c  azVar[i]);.  sql
15f60 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
15f70 2d 3e 61 7a 56 61 72 29 3b 0a 20 20 76 64 62 65  ->azVar);.  vdbe
15f80 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20  FreeOpArray(db, 
15f90 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b  p->aOp, p->nOp);
15fa0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
15fb0 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  (db, p->aColName
15fc0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
15fd0 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b  ee(db, p->zSql);
15fe0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
15ff0 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a  (db, p->pFree);.
16000 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
16010 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
16020 41 54 55 53 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ATUS.  for(i=0; 
16030 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20 69 2b 2b 29  i<p->nScan; i++)
16040 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
16050 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e  ree(db, p->aScan
16060 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  [i].zName);.  }.
16070 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
16080 64 62 2c 20 70 2d 3e 61 53 63 61 6e 29 3b 0a 23  db, p->aScan);.#
16090 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  endif.}../*.** D
160a0 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
160b0 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  VDBE..*/.void sq
160c0 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
160d0 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
160e0 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  te3 *db;..  if( 
160f0 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65  NEVER(p==0) ) re
16100 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  turn;.  db = p->
16110 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  db;.  assert( sq
16120 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
16130 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
16140 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61   sqlite3VdbeClea
16150 72 4f 62 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a  rObject(db, p);.
16160 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
16170 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e  {.    p->pPrev->
16180 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
16190 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
161a0 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62 65  ssert( db->pVdbe
161b0 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70  ==p );.    db->p
161c0 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Vdbe = p->pNext;
161d0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e  .  }.  if( p->pN
161e0 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e  ext ){.    p->pN
161f0 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e  ext->pPrev = p->
16200 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e  pPrev;.  }.  p->
16210 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
16220 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62  IC_DEAD;.  p->db
16230 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44   = 0;.  sqlite3D
16240 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a  bFree(db, p);.}.
16250 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f  ./*.** The curso
16260 72 20 22 70 22 20 68 61 73 20 61 20 70 65 6e 64  r "p" has a pend
16270 69 6e 67 20 73 65 65 6b 20 6f 70 65 72 61 74 69  ing seek operati
16280 6f 6e 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20  on that has not 
16290 79 65 74 20 62 65 65 6e 0a 2a 2a 20 63 61 72 72  yet been.** carr
162a0 69 65 64 20 6f 75 74 2e 20 20 53 65 65 6b 20 74  ied out.  Seek t
162b0 68 65 20 63 75 72 73 6f 72 20 6e 6f 77 2e 20 20  he cursor now.  
162c0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
162d0 72 73 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68  rs, return.** th
162e0 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  e appropriate er
162f0 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
16300 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e  tic int SQLITE_N
16310 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 44 65  OINLINE handleDe
16320 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 56 64 62  ferredMoveto(Vdb
16330 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69  eCursor *p){.  i
16340 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64  nt res, rc;.#ifd
16350 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
16360 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
16370 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
16380 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
16390 74 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f  t( p->deferredMo
163a0 76 65 74 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  veto );.  assert
163b0 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a  ( p->isTable );.
163c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75    assert( p->eCu
163d0 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
163e0 54 52 45 45 20 29 3b 0a 20 20 72 63 20 3d 20 73  TREE );.  rc = s
163f0 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
16400 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 75 63 2e  oUnpacked(p->uc.
16410 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d  pCursor, 0, p->m
16420 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20  ovetoTarget, 0, 
16430 26 72 65 73 29 3b 0a 20 20 69 66 28 20 72 63 20  &res);.  if( rc 
16440 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69  ) return rc;.  i
16450 66 28 20 72 65 73 21 3d 30 20 29 20 72 65 74 75  f( res!=0 ) retu
16460 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
16470 54 5f 42 4b 50 54 3b 0a 23 69 66 64 65 66 20 53  T_BKPT;.#ifdef S
16480 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
16490 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
164a0 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d  t++;.#endif.  p-
164b0 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
164c0 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53  = 0;.  p->cacheS
164d0 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
164e0 41 4c 45 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ALE;.  return SQ
164f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
16500 2a 20 53 6f 6d 65 74 68 69 6e 67 20 68 61 73 20  * Something has 
16510 6d 6f 76 65 64 20 63 75 72 73 6f 72 20 22 70 22  moved cursor "p"
16520 20 6f 75 74 20 6f 66 20 70 6c 61 63 65 2e 20 20   out of place.  
16530 4d 61 79 62 65 20 74 68 65 20 72 6f 77 20 69 74  Maybe the row it
16540 20 77 61 73 0a 2a 2a 20 70 6f 69 6e 74 65 64 20   was.** pointed 
16550 74 6f 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f  to was deleted o
16560 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 69 74  ut from under it
16570 2e 20 20 4f 72 20 6d 61 79 62 65 20 74 68 65 20  .  Or maybe the 
16580 62 74 72 65 65 20 77 61 73 0a 2a 2a 20 72 65 62  btree was.** reb
16590 61 6c 61 6e 63 65 64 2e 20 20 57 68 61 74 65 76  alanced.  Whatev
165a0 65 72 20 74 68 65 20 63 61 75 73 65 2c 20 74 72  er the cause, tr
165b0 79 20 74 6f 20 72 65 73 74 6f 72 65 20 22 70 22  y to restore "p"
165c0 20 74 6f 20 74 68 65 20 70 6c 61 63 65 20 69 74   to the place it
165d0 0a 2a 2a 20 69 73 20 73 75 70 70 6f 73 65 64 20  .** is supposed 
165e0 74 6f 20 62 65 20 70 6f 69 6e 74 69 6e 67 2e 20  to be pointing. 
165f0 20 49 66 20 74 68 65 20 72 6f 77 20 77 61 73 20   If the row was 
16600 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
16610 20 75 6e 64 65 72 20 74 68 65 0a 2a 2a 20 63 75   under the.** cu
16620 72 73 6f 72 2c 20 73 65 74 20 74 68 65 20 63 75  rsor, set the cu
16630 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  rsor to point to
16640 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a   a NULL row..*/.
16650 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
16660 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c  E_NOINLINE handl
16670 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 56 64 62  eMovedCursor(Vdb
16680 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69  eCursor *p){.  i
16690 6e 74 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f  nt isDifferentRo
166a0 77 2c 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  w, rc;.  assert(
166b0 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55   p->eCurType==CU
166c0 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
166d0 20 61 73 73 65 72 74 28 20 70 2d 3e 75 63 2e 70   assert( p->uc.p
166e0 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61  Cursor!=0 );.  a
166f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
16700 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
16710 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29  d(p->uc.pCursor)
16720 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
16730 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73  e3BtreeCursorRes
16740 74 6f 72 65 28 70 2d 3e 75 63 2e 70 43 75 72 73  tore(p->uc.pCurs
16750 6f 72 2c 20 26 69 73 44 69 66 66 65 72 65 6e 74  or, &isDifferent
16760 52 6f 77 29 3b 0a 20 20 70 2d 3e 63 61 63 68 65  Row);.  p->cache
16770 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
16780 54 41 4c 45 3b 0a 20 20 69 66 28 20 69 73 44 69  TALE;.  if( isDi
16790 66 66 65 72 65 6e 74 52 6f 77 20 29 20 70 2d 3e  fferentRow ) p->
167a0 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72  nullRow = 1;.  r
167b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
167c0 2a 2a 20 43 68 65 63 6b 20 74 6f 20 65 6e 73 75  ** Check to ensu
167d0 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73  re that the curs
167e0 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 52 65  or is valid.  Re
167f0 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72  store the cursor
16800 0a 2a 2a 20 69 66 20 6e 65 65 64 20 62 65 2e 20  .** if need be. 
16810 20 52 65 74 75 72 6e 20 61 6e 79 20 49 2f 4f 20   Return any I/O 
16820 65 72 72 6f 72 20 66 72 6f 6d 20 74 68 65 20 72  error from the r
16830 65 73 74 6f 72 65 20 6f 70 65 72 61 74 69 6f 6e  estore operation
16840 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16850 56 64 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72  VdbeCursorRestor
16860 65 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29  e(VdbeCursor *p)
16870 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  {.  assert( p->e
16880 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
16890 5f 42 54 52 45 45 20 29 3b 0a 20 20 69 66 28 20  _BTREE );.  if( 
168a0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
168b0 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63  orHasMoved(p->uc
168c0 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20  .pCursor) ){.   
168d0 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f   return handleMo
168e0 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20  vedCursor(p);.  
168f0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
16900 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
16910 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 75 72  ake sure the cur
16920 73 6f 72 20 70 20 69 73 20 72 65 61 64 79 20 74  sor p is ready t
16930 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
16940 74 68 65 20 72 6f 77 20 74 6f 20 77 68 69 63 68  the row to which
16950 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20   it.** was last 
16960 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52 65 74  positioned.  Ret
16970 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
16980 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c  e if an OOM faul
16990 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a  t or I/O error.*
169a0 2a 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72  * prevents us fr
169b0 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74  om positioning t
169c0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74 73  he cursor to its
169d0 20 63 6f 72 72 65 63 74 20 70 6f 73 69 74 69 6f   correct positio
169e0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f  n..**.** If a Mo
169f0 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69  veTo operation i
16a00 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  s pending on the
16a10 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74   given cursor, t
16a20 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d  hen do that.** M
16a30 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e  oveTo now.  If n
16a40 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e 64 69 6e  o move is pendin
16a50 67 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  g, check to see 
16a60 69 66 20 74 68 65 20 72 6f 77 20 68 61 73 20 62  if the row has b
16a70 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f  een.** deleted o
16a80 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ut from under th
16a90 65 20 63 75 72 73 6f 72 20 61 6e 64 20 69 66 20  e cursor and if 
16aa0 69 74 20 68 61 73 2c 20 6d 61 72 6b 20 74 68 65  it has, mark the
16ab0 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c   row as.** a NUL
16ac0 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  L row..**.** If 
16ad0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
16ae0 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
16af0 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 6f  o the correct ro
16b00 77 20 61 6e 64 20 74 68 61 74 20 72 6f 77 20 68  w and that row h
16b10 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64  as.** not been d
16b20 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
16b30 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72  under the cursor
16b40 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
16b50 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
16b60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
16b70 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56  beCursorMoveto(V
16b80 64 62 65 43 75 72 73 6f 72 20 2a 2a 70 70 2c 20  dbeCursor **pp, 
16b90 69 6e 74 20 2a 70 69 43 6f 6c 29 7b 0a 20 20 56  int *piCol){.  V
16ba0 64 62 65 43 75 72 73 6f 72 20 2a 70 20 3d 20 2a  dbeCursor *p = *
16bb0 70 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 43 75  pp;.  if( p->eCu
16bc0 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
16bd0 54 52 45 45 20 29 7b 0a 20 20 20 20 69 66 28 20  TREE ){.    if( 
16be0 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
16bf0 6f 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  o ){.      int i
16c00 4d 61 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Map;.      if( p
16c10 2d 3e 61 41 6c 74 4d 61 70 20 26 26 20 28 69 4d  ->aAltMap && (iM
16c20 61 70 20 3d 20 70 2d 3e 61 41 6c 74 4d 61 70 5b  ap = p->aAltMap[
16c30 31 2b 2a 70 69 43 6f 6c 5d 29 3e 30 20 29 7b 0a  1+*piCol])>0 ){.
16c40 20 20 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d          *pp = p-
16c50 3e 70 41 6c 74 43 75 72 73 6f 72 3b 0a 20 20 20  >pAltCursor;.   
16c60 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 4d       *piCol = iM
16c70 61 70 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  ap - 1;.        
16c80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16c90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16ca0 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 44 65 66  return handleDef
16cb0 65 72 72 65 64 4d 6f 76 65 74 6f 28 70 29 3b 0a  erredMoveto(p);.
16cc0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
16cd0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
16ce0 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70  HasMoved(p->uc.p
16cf0 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20  Cursor) ){.     
16d00 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f   return handleMo
16d10 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20  vedCursor(p);.  
16d20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
16d30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
16d40 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
16d50 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a  ng functions:.**
16d60 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
16d70 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73  erialType().** s
16d80 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
16d90 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c  TypeLen().** sql
16da0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65  ite3VdbeSerialLe
16db0 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
16dc0 62 65 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a  beSerialPut().**
16dd0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
16de0 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e  alGet().**.** en
16df0 63 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f  capsulate the co
16e00 64 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a  de that serializ
16e10 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74  es values for st
16e20 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a  orage in SQLite.
16e30 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65  ** data and inde
16e40 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20  x records. Each 
16e50 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65  serialized value
16e60 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a   consists of a.*
16e70 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20  * 'serial-type' 
16e80 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61  and a blob of da
16e90 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74  ta. The serial t
16ea0 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65  ype is an 8-byte
16eb0 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74   unsigned.** int
16ec0 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20  eger, stored as 
16ed0 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  a varint..**.** 
16ee0 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64  In an SQLite ind
16ef0 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73  ex record, the s
16f00 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74  erial type is st
16f10 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65  ored directly be
16f20 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62  fore.** the blob
16f30 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74   of data that it
16f40 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e   corresponds to.
16f50 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f   In a table reco
16f60 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a  rd, all serial.*
16f70 2a 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72  * types are stor
16f80 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
16f90 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61  of the record, a
16fa0 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20  nd the blobs of 
16fb0 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65  data at.** the e
16fc0 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20  nd. Hence these 
16fd0 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20  functions allow 
16fe0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61  the caller to ha
16ff0 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69  ndle the.** seri
17000 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61  al-type and data
17010 20 62 6c 6f 62 20 73 65 70 61 72 61 74 65 6c 79   blob separately
17020 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
17030 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63  owing table desc
17040 72 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75  ribes the variou
17050 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65  s storage classe
17060 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a  s for data:.**.*
17070 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20  *   serial type 
17080 20 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20         bytes of 
17090 64 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a  data      type.*
170a0 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
170b0 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
170c0 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d  ------    ------
170d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20  ---------.**    
170e0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
170f0 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
17100 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20       NULL.**    
17110 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
17120 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
17130 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
17140 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20  ger.**      2   
17150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17160 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73    2            s
17170 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
17180 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20        3         
17190 20 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20              3   
171a0 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
171b0 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
171c0 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4               
171d0 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
171e0 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
171f0 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20  r.**      5     
17200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17210 36 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  6            sig
17220 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
17230 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
17240 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
17250 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
17260 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20  teger.**      7 
17270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17280 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
17290 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20   IEEE float.**  
172a0 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
172b0 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
172c0 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63         Integer c
172d0 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20  onstant 0.**    
172e0 20 20 39 20 20 20 20 20 20 20 20 20 20 20 20 20    9             
172f0 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
17300 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e       Integer con
17310 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31  stant 1.**     1
17320 30 2c 31 31 20 20 20 20 20 20 20 20 20 20 20 20  0,11            
17330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17340 20 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20     reserved for 
17350 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20  expansion.**    
17360 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20  N>=12 and even  
17370 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20       (N-12)/2   
17380 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20       BLOB.**    
17390 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20  N>=13 and odd   
173a0 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20       (N-13)/2   
173b0 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20       text.**.** 
173c0 54 68 65 20 38 20 61 6e 64 20 39 20 74 79 70 65  The 8 and 9 type
173d0 73 20 77 65 72 65 20 61 64 64 65 64 20 69 6e 20  s were added in 
173e0 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d  3.3.0, file form
173f0 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72  at 4.  Prior ver
17400 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69  sions.** of SQLi
17410 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65  te will not unde
17420 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72  rstand those ser
17430 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f  ial types..*/../
17440 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
17450 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20  serial-type for 
17460 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
17470 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32   in pMem..*/.u32
17480 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
17490 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d  alType(Mem *pMem
174a0 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61  , int file_forma
174b0 74 2c 20 75 33 32 20 2a 70 4c 65 6e 29 7b 0a 20  t, u32 *pLen){. 
174c0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65   int flags = pMe
174d0 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 75 33 32 20  m->flags;.  u32 
174e0 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c  n;..  assert( pL
174f0 65 6e 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 66  en!=0 );.  if( f
17500 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  lags&MEM_Null ){
17510 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a  .    *pLen = 0;.
17520 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
17530 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  }.  if( flags&ME
17540 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20  M_Int ){.    /* 
17550 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74 68  Figure out wheth
17560 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20  er to use 1, 2, 
17570 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e  4, 6 or 8 bytes.
17580 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d   */.#   define M
17590 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 36 34  AX_6BYTE ((((i64
175a0 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33 32  )0x00008000)<<32
175b0 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d  )-1).    i64 i =
175c0 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20   pMem->u.i;.    
175d0 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20 69  u64 u;.    if( i
175e0 3c 30 20 29 7b 0a 20 20 20 20 20 20 75 20 3d 20  <0 ){.      u = 
175f0 7e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ~i;.    }else{. 
17600 20 20 20 20 20 75 20 3d 20 69 3b 0a 20 20 20 20       u = i;.    
17610 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37  }.    if( u<=127
17620 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69   ){.      if( (i
17630 26 31 29 3d 3d 69 20 26 26 20 66 69 6c 65 5f 66  &1)==i && file_f
17640 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20  ormat>=4 ){.    
17650 20 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20      *pLen = 0;. 
17660 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 2b         return 8+
17670 28 75 33 32 29 75 3b 0a 20 20 20 20 20 20 7d 65  (u32)u;.      }e
17680 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c  lse{.        *pL
17690 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
176a0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
176b0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
176c0 75 3c 3d 33 32 37 36 37 20 29 7b 20 2a 70 4c 65  u<=32767 ){ *pLe
176d0 6e 20 3d 20 32 3b 20 72 65 74 75 72 6e 20 32 3b  n = 2; return 2;
176e0 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33   }.    if( u<=83
176f0 38 38 36 30 37 20 29 7b 20 2a 70 4c 65 6e 20 3d  88607 ){ *pLen =
17700 20 33 3b 20 72 65 74 75 72 6e 20 33 3b 20 7d 0a   3; return 3; }.
17710 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34      if( u<=21474
17720 38 33 36 34 37 20 29 7b 20 2a 70 4c 65 6e 20 3d  83647 ){ *pLen =
17730 20 34 3b 20 72 65 74 75 72 6e 20 34 3b 20 7d 0a   4; return 4; }.
17740 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36      if( u<=MAX_6
17750 42 59 54 45 20 29 7b 20 2a 70 4c 65 6e 20 3d 20  BYTE ){ *pLen = 
17760 36 3b 20 72 65 74 75 72 6e 20 35 3b 20 7d 0a 20  6; return 5; }. 
17770 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20     *pLen = 8;.  
17780 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a    return 6;.  }.
17790 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
177a0 52 65 61 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65  Real ){.    *pLe
177b0 6e 20 3d 20 38 3b 0a 20 20 20 20 72 65 74 75 72  n = 8;.    retur
177c0 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  n 7;.  }.  asser
177d0 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c  t( pMem->db->mal
177e0 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61  locFailed || fla
177f0 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  gs&(MEM_Str|MEM_
17800 42 6c 6f 62 29 20 29 3b 0a 20 20 61 73 73 65 72  Blob) );.  asser
17810 74 28 20 70 4d 65 6d 2d 3e 6e 3e 3d 30 20 29 3b  t( pMem->n>=0 );
17820 0a 20 20 6e 20 3d 20 28 75 33 32 29 70 4d 65 6d  .  n = (u32)pMem
17830 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  ->n;.  if( flags
17840 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
17850 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e     n += pMem->u.
17860 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 2a 70 4c  nZero;.  }.  *pL
17870 65 6e 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e  en = n;.  return
17880 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28   ((n*2) + 12 + (
17890 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 21  (flags&MEM_Str)!
178a0 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  =0));.}../*.** T
178b0 68 65 20 73 69 7a 65 73 20 66 6f 72 20 73 65 72  he sizes for ser
178c0 69 61 6c 20 74 79 70 65 73 20 6c 65 73 73 20 74  ial types less t
178d0 68 61 6e 20 31 32 38 0a 2a 2f 0a 73 74 61 74 69  han 128.*/.stati
178e0 63 20 63 6f 6e 73 74 20 75 38 20 73 71 6c 69 74  c const u8 sqlit
178f0 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73  e3SmallTypeSizes
17900 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f  [] = {.        /
17910 2a 20 20 30 20 20 20 31 20 20 20 32 20 20 20 33  *  0   1   2   3
17920 20 20 20 34 20 20 20 35 20 20 20 36 20 20 20 37     4   5   6   7
17930 20 20 20 38 20 20 20 39 20 2a 2f 20 20 20 0a 2f     8   9 */   ./
17940 2a 20 20 20 30 20 2a 2f 20 20 20 30 2c 20 20 31  *   0 */   0,  1
17950 2c 20 20 32 2c 20 20 33 2c 20 20 34 2c 20 20 36  ,  2,  3,  4,  6
17960 2c 20 20 38 2c 20 20 38 2c 20 20 30 2c 20 20 30  ,  8,  8,  0,  0
17970 2c 0a 2f 2a 20 20 31 30 20 2a 2f 20 20 20 30 2c  ,./*  10 */   0,
17980 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 31 2c    0,  0,  0,  1,
17990 20 20 31 2c 20 20 32 2c 20 20 32 2c 20 20 33 2c    1,  2,  2,  3,
179a0 20 20 33 2c 0a 2f 2a 20 20 32 30 20 2a 2f 20 20    3,./*  20 */  
179b0 20 34 2c 20 20 34 2c 20 20 35 2c 20 20 35 2c 20   4,  4,  5,  5, 
179c0 20 36 2c 20 20 36 2c 20 20 37 2c 20 20 37 2c 20   6,  6,  7,  7, 
179d0 20 38 2c 20 20 38 2c 0a 2f 2a 20 20 33 30 20 2a   8,  8,./*  30 *
179e0 2f 20 20 20 39 2c 20 20 39 2c 20 31 30 2c 20 31  /   9,  9, 10, 1
179f0 30 2c 20 31 31 2c 20 31 31 2c 20 31 32 2c 20 31  0, 11, 11, 12, 1
17a00 32 2c 20 31 33 2c 20 31 33 2c 0a 2f 2a 20 20 34  2, 13, 13,./*  4
17a10 30 20 2a 2f 20 20 31 34 2c 20 31 34 2c 20 31 35  0 */  14, 14, 15
17a20 2c 20 31 35 2c 20 31 36 2c 20 31 36 2c 20 31 37  , 15, 16, 16, 17
17a30 2c 20 31 37 2c 20 31 38 2c 20 31 38 2c 0a 2f 2a  , 17, 18, 18,./*
17a40 20 20 35 30 20 2a 2f 20 20 31 39 2c 20 31 39 2c    50 */  19, 19,
17a50 20 32 30 2c 20 32 30 2c 20 32 31 2c 20 32 31 2c   20, 20, 21, 21,
17a60 20 32 32 2c 20 32 32 2c 20 32 33 2c 20 32 33 2c   22, 22, 23, 23,
17a70 0a 2f 2a 20 20 36 30 20 2a 2f 20 20 32 34 2c 20  ./*  60 */  24, 
17a80 32 34 2c 20 32 35 2c 20 32 35 2c 20 32 36 2c 20  24, 25, 25, 26, 
17a90 32 36 2c 20 32 37 2c 20 32 37 2c 20 32 38 2c 20  26, 27, 27, 28, 
17aa0 32 38 2c 0a 2f 2a 20 20 37 30 20 2a 2f 20 20 32  28,./*  70 */  2
17ab0 39 2c 20 32 39 2c 20 33 30 2c 20 33 30 2c 20 33  9, 29, 30, 30, 3
17ac0 31 2c 20 33 31 2c 20 33 32 2c 20 33 32 2c 20 33  1, 31, 32, 32, 3
17ad0 33 2c 20 33 33 2c 0a 2f 2a 20 20 38 30 20 2a 2f  3, 33,./*  80 */
17ae0 20 20 33 34 2c 20 33 34 2c 20 33 35 2c 20 33 35    34, 34, 35, 35
17af0 2c 20 33 36 2c 20 33 36 2c 20 33 37 2c 20 33 37  , 36, 36, 37, 37
17b00 2c 20 33 38 2c 20 33 38 2c 0a 2f 2a 20 20 39 30  , 38, 38,./*  90
17b10 20 2a 2f 20 20 33 39 2c 20 33 39 2c 20 34 30 2c   */  39, 39, 40,
17b20 20 34 30 2c 20 34 31 2c 20 34 31 2c 20 34 32 2c   40, 41, 41, 42,
17b30 20 34 32 2c 20 34 33 2c 20 34 33 2c 0a 2f 2a 20   42, 43, 43,./* 
17b40 31 30 30 20 2a 2f 20 20 34 34 2c 20 34 34 2c 20  100 */  44, 44, 
17b50 34 35 2c 20 34 35 2c 20 34 36 2c 20 34 36 2c 20  45, 45, 46, 46, 
17b60 34 37 2c 20 34 37 2c 20 34 38 2c 20 34 38 2c 0a  47, 47, 48, 48,.
17b70 2f 2a 20 31 31 30 20 2a 2f 20 20 34 39 2c 20 34  /* 110 */  49, 4
17b80 39 2c 20 35 30 2c 20 35 30 2c 20 35 31 2c 20 35  9, 50, 50, 51, 5
17b90 31 2c 20 35 32 2c 20 35 32 2c 20 35 33 2c 20 35  1, 52, 52, 53, 5
17ba0 33 2c 0a 2f 2a 20 31 32 30 20 2a 2f 20 20 35 34  3,./* 120 */  54
17bb0 2c 20 35 34 2c 20 35 35 2c 20 35 35 2c 20 35 36  , 54, 55, 55, 56
17bc0 2c 20 35 36 2c 20 35 37 2c 20 35 37 0a 7d 3b 0a  , 56, 57, 57.};.
17bd0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
17be0 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
17bf0 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69  data correspondi
17c00 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
17c10 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a  ed serial-type..
17c20 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  */.u32 sqlite3Vd
17c30 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
17c40 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29  u32 serial_type)
17c50 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  {.  if( serial_t
17c60 79 70 65 3e 3d 31 32 38 20 29 7b 0a 20 20 20 20  ype>=128 ){.    
17c70 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74  return (serial_t
17c80 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c  ype-12)/2;.  }el
17c90 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
17ca0 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 0a  serial_type<12 .
17cb0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
17cc0 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53  qlite3SmallTypeS
17cd0 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65  izes[serial_type
17ce0 5d 3d 3d 28 73 65 72 69 61 6c 5f 74 79 70 65 20  ]==(serial_type 
17cf0 2d 20 31 32 29 2f 32 20 29 3b 0a 20 20 20 20 72  - 12)/2 );.    r
17d00 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 6d 61  eturn sqlite3Sma
17d10 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69  llTypeSizes[seri
17d20 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a  al_type];.  }.}.
17d30 75 38 20 73 71 6c 69 74 65 33 56 64 62 65 4f 6e  u8 sqlite3VdbeOn
17d40 65 42 79 74 65 53 65 72 69 61 6c 54 79 70 65 4c  eByteSerialTypeL
17d50 65 6e 28 75 38 20 73 65 72 69 61 6c 5f 74 79 70  en(u8 serial_typ
17d60 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 65  e){.  assert( se
17d70 72 69 61 6c 5f 74 79 70 65 3c 31 32 38 20 29 3b  rial_type<128 );
17d80 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
17d90 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b  3SmallTypeSizes[
17da0 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 20 20 0a  serial_type];  .
17db0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61  }../*.** If we a
17dc0 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65  re on an archite
17dd0 63 74 75 72 65 20 77 69 74 68 20 6d 69 78 65 64  cture with mixed
17de0 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67  -endian floating
17df0 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a   .** points (ex:
17e00 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70   ARM7) then swap
17e10 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74   the lower 4 byt
17e20 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20  es with the .** 
17e30 75 70 70 65 72 20 34 20 62 79 74 65 73 2e 20 20  upper 4 bytes.  
17e40 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
17e50 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73  t..**.** For mos
17e60 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2c  t architectures,
17e70 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
17e80 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a  ..**.** (later):
17e90 20 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64    It is reported
17ea0 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20   to me that the 
17eb0 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f  mixed-endian pro
17ec0 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20  blem.** on ARM7 
17ed0 69 73 20 61 6e 20 69 73 73 75 65 20 77 69 74 68  is an issue with
17ee0 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74   GCC, not with t
17ef0 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49  he ARM7 chip.  I
17f00 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20  t seems.** that 
17f10 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f  early versions o
17f20 66 20 47 43 43 20 73 74 6f 72 65 64 20 74 68 65  f GCC stored the
17f30 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20   two words of a 
17f40 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20  64-bit.** float 
17f50 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64  in the wrong ord
17f60 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72  er.  And that er
17f70 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f  ror has been pro
17f80 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20  pagated.** ever 
17f90 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d  since.  The blam
17fa0 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  e is not necessa
17fb0 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74  rily with GCC, t
17fc0 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69  hough..** GCC mi
17fd0 67 68 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f  ght have just co
17fe0 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65  pying the proble
17ff0 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63  m from a prior c
18000 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d  ompiler..** I am
18010 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20   also told that 
18020 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
18030 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f  f GCC that follo
18040 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  w a different.**
18050 20 41 42 49 20 67 65 74 20 74 68 65 20 62 79 74   ABI get the byt
18060 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a  e order right..*
18070 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20  *.** Developers 
18080 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20  using SQLite on 
18090 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63  an ARM7 should c
180a0 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74  ompile and run t
180b0 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74  heir.** applicat
180c0 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49  ion using -DSQLI
180d0 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65  TE_DEBUG=1 at le
180e0 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20  ast once.  With 
180f0 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64  DEBUG.** enabled
18100 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62  , some asserts b
18110 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65  elow will ensure
18120 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20 6f   that the byte o
18130 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74  rder of.** float
18140 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
18150 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a   is correct..**.
18160 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20  ** (2007-08-30) 
18170 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20   Frank van Vugt 
18180 68 61 73 20 73 74 75 64 69 65 64 20 74 68 69 73  has studied this
18190 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79   problem closely
181a0 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64  .** and has send
181b0 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f   his findings to
181c0 20 74 68 65 20 53 51 4c 69 74 65 20 64 65 76 65   the SQLite deve
181d0 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a  lopers.  Frank.*
181e0 2a 20 77 72 69 74 65 73 20 74 68 61 74 20 73 6f  * writes that so
181f0 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73  me Linux kernels
18200 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20   offer floating 
18210 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a  point hardware.*
18220 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74  * emulation that
18230 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69   uses only 32-bi
18240 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74  t mantissas inst
18250 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a  ead of a full .*
18260 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72 65 71  * 48-bits as req
18270 75 69 72 65 64 20 62 79 20 74 68 65 20 49 45 45  uired by the IEE
18280 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68  E standard.  (Th
18290 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e  is is the.** CON
182a0 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20  FIG_FPE_FASTFPE 
182b0 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63  option.)  On suc
182c0 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74  h systems, float
182d0 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74  ing point.** byt
182e0 65 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d  e swapping becom
182f0 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61  es very complica
18300 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70  ted.  To avoid p
18310 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20  roblems,.** the 
18320 6e 65 63 65 73 73 61 72 79 20 62 79 74 65 20 73  necessary byte s
18330 77 61 70 70 69 6e 67 20 69 73 20 63 61 72 72 69  wapping is carri
18340 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36  ed out using a 6
18350 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a  4-bit integer.**
18360 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 36   rather than a 6
18370 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72  4-bit float.  Fr
18380 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20 74  ank assures us t
18390 68 61 74 20 74 68 65 20 63 6f 64 65 20 68 65 72  hat the code her
183a0 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68  e.** works for h
183b0 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76  im.  We, the dev
183c0 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f  elopers, have no
183d0 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64   way to independ
183e0 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20  ently.** verify 
183f0 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20  this, but Frank 
18400 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68  seems to know wh
18410 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67  at he is talking
18420 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20   about.** so we 
18430 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69  trust him..*/.#i
18440 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45  fdef SQLITE_MIXE
18450 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46  D_ENDIAN_64BIT_F
18460 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34 20  LOAT.static u64 
18470 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e  floatSwap(u64 in
18480 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20  ){.  union {.   
18490 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20   u64 r;.    u32 
184a0 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75  i[2];.  } u;.  u
184b0 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69  32 t;..  u.r = i
184c0 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b  n;.  t = u.i[0];
184d0 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b  .  u.i[0] = u.i[
184e0 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74  1];.  u.i[1] = t
184f0 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a  ;.  return u.r;.
18500 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d  }.# define swapM
18510 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
18520 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61  X)  X = floatSwa
18530 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  p(X).#else.# def
18540 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64  ine swapMixedEnd
18550 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64  ianFloat(X).#end
18560 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
18570 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64  the serialized d
18580 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65  ata blob for the
18590 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
185a0 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62   pMem into .** b
185b0 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65  uf. It is assume
185c0 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  d that the calle
185d0 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20  r has allocated 
185e0 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
185f0 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
18600 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
18610 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e  written..**.** n
18620 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e  Buf is the amoun
18630 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20  t of space left 
18640 69 6e 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 63  in buf[].  The c
18650 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
18660 69 62 6c 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f  ible.** for allo
18670 63 61 74 69 6e 67 20 65 6e 6f 75 67 68 20 73 70  cating enough sp
18680 61 63 65 20 74 6f 20 62 75 66 5b 5d 20 74 6f 20  ace to buf[] to 
18690 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20  hold the entire 
186a0 66 69 65 6c 64 2c 20 65 78 63 6c 75 73 69 76 65  field, exclusive
186b0 0a 2a 2a 20 6f 66 20 74 68 65 20 70 4d 65 6d 2d  .** of the pMem-
186c0 3e 75 2e 6e 5a 65 72 6f 20 62 79 74 65 73 20 66  >u.nZero bytes f
186d0 6f 72 20 61 20 4d 45 4d 5f 5a 65 72 6f 20 76 61  or a MEM_Zero va
186e0 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  lue..**.** Retur
186f0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
18700 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77  bytes actually w
18710 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b  ritten into buf[
18720 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a  ].  The number.*
18730 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  * of bytes in th
18740 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61  e zero-filled ta
18750 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69  il is included i
18760 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
18770 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68  ue only.** if th
18780 6f 73 65 20 62 79 74 65 73 20 77 65 72 65 20 7a  ose bytes were z
18790 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a  eroed in buf[]..
187a0 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56  */ .u32 sqlite3V
187b0 64 62 65 53 65 72 69 61 6c 50 75 74 28 75 38 20  dbeSerialPut(u8 
187c0 2a 62 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c  *buf, Mem *pMem,
187d0 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
187e0 29 7b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20  ){.  u32 len;.. 
187f0 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20   /* Integer and 
18800 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65  Real */.  if( se
18810 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20  rial_type<=7 && 
18820 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b  serial_type>0 ){
18830 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20  .    u64 v;.    
18840 75 33 32 20 69 3b 0a 20 20 20 20 69 66 28 20 73  u32 i;.    if( s
18850 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b  erial_type==7 ){
18860 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
18870 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66  izeof(v)==sizeof
18880 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 29 3b 0a 20  (pMem->u.r) );. 
18890 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20       memcpy(&v, 
188a0 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 73 69 7a 65  &pMem->u.r, size
188b0 6f 66 28 76 29 29 3b 0a 20 20 20 20 20 20 73 77  of(v));.      sw
188c0 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
188d0 61 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65  at(v);.    }else
188e0 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d  {.      v = pMem
188f0 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20  ->u.i;.    }.   
18900 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74   len = i = sqlit
18910 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73  e3SmallTypeSizes
18920 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20  [serial_type];. 
18930 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29     assert( i>0 )
18940 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
18950 62 75 66 5b 2d 2d 69 5d 20 3d 20 28 75 38 29 28  buf[--i] = (u8)(
18960 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76  v&0xFF);.      v
18970 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 77 68 69   >>= 8;.    }whi
18980 6c 65 28 20 69 20 29 3b 0a 20 20 20 20 72 65 74  le( i );.    ret
18990 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20  urn len;.  }..  
189a0 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f  /* String or blo
189b0 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  b */.  if( seria
189c0 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20  l_type>=12 ){.  
189d0 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
189e0 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67  n + ((pMem->flag
189f0 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d  s & MEM_Zero)?pM
18a00 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20  em->u.nZero:0). 
18a10 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20 28              == (
18a20 69 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65 53  int)sqlite3VdbeS
18a30 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
18a40 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20  ial_type) );.   
18a50 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a   len = pMem->n;.
18a60 20 20 20 20 69 66 28 20 6c 65 6e 3e 30 20 29 20      if( len>0 ) 
18a70 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d  memcpy(buf, pMem
18a80 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 72  ->z, len);.    r
18a90 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a  eturn len;.  }..
18aa0 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e    /* NULL or con
18ab0 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f  stants 0 or 1 */
18ac0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
18ad0 2f 2a 20 49 6e 70 75 74 20 22 78 22 20 69 73 20  /* Input "x" is 
18ae0 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 75 6e  a sequence of un
18af0 73 69 67 6e 65 64 20 63 68 61 72 61 63 74 65 72  signed character
18b00 73 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74  s that represent
18b10 20 61 0a 2a 2a 20 62 69 67 2d 65 6e 64 69 61 6e   a.** big-endian
18b20 20 69 6e 74 65 67 65 72 2e 20 20 52 65 74 75 72   integer.  Retur
18b30 6e 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  n the equivalent
18b40 20 6e 61 74 69 76 65 20 69 6e 74 65 67 65 72 0a   native integer.
18b50 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 4e 45 5f 42  */.#define ONE_B
18b60 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28 28  YTE_INT(x)    ((
18b70 69 38 29 28 78 29 5b 30 5d 29 0a 23 64 65 66 69  i8)(x)[0]).#defi
18b80 6e 65 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  ne TWO_BYTE_INT(
18b90 78 29 20 20 20 20 28 32 35 36 2a 28 69 38 29 28  x)    (256*(i8)(
18ba0 28 78 29 5b 30 5d 29 7c 28 78 29 5b 31 5d 29 0a  (x)[0])|(x)[1]).
18bb0 23 64 65 66 69 6e 65 20 54 48 52 45 45 5f 42 59  #define THREE_BY
18bc0 54 45 5f 49 4e 54 28 78 29 20 20 28 36 35 35 33  TE_INT(x)  (6553
18bd0 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28  6*(i8)((x)[0])|(
18be0 28 78 29 5b 31 5d 3c 3c 38 29 7c 28 78 29 5b 32  (x)[1]<<8)|(x)[2
18bf0 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f  ]).#define FOUR_
18c00 42 59 54 45 5f 55 49 4e 54 28 78 29 20 20 28 28  BYTE_UINT(x)  ((
18c10 28 75 33 32 29 28 78 29 5b 30 5d 3c 3c 32 34 29  (u32)(x)[0]<<24)
18c20 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28  |((x)[1]<<16)|((
18c30 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d  x)[2]<<8)|(x)[3]
18c40 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42  ).#define FOUR_B
18c50 59 54 45 5f 49 4e 54 28 78 29 20 28 31 36 37 37  YTE_INT(x) (1677
18c60 37 32 31 36 2a 28 69 38 29 28 28 78 29 5b 30 5d  7216*(i8)((x)[0]
18c70 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28  )|((x)[1]<<16)|(
18c80 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33  (x)[2]<<8)|(x)[3
18c90 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69  ])../*.** Deseri
18ca0 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20 62  alize the data b
18cb0 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  lob pointed to b
18cc0 79 20 62 75 66 20 61 73 20 73 65 72 69 61 6c 20  y buf as serial 
18cd0 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65  type serial_type
18ce0 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68  .** and store th
18cf0 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d  e result in pMem
18d00 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
18d10 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
18d20 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ad..**.** This f
18d30 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65  unction is imple
18d40 6d 65 6e 74 65 64 20 61 73 20 74 77 6f 20 73 65  mented as two se
18d50 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65 73 20  parate routines 
18d60 66 6f 72 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e  for performance.
18d70 0a 2a 2a 20 54 68 65 20 66 65 77 20 63 61 73 65  .** The few case
18d80 73 20 74 68 61 74 20 72 65 71 75 69 72 65 20 6c  s that require l
18d90 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 61  ocal variables a
18da0 72 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e  re broken out in
18db0 74 6f 20 61 20 73 65 70 61 72 61 74 65 0a 2a 2a  to a separate.**
18dc0 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61 74   routine so that
18dd0 20 69 6e 20 6d 6f 73 74 20 63 61 73 65 73 20 74   in most cases t
18de0 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 6d  he overhead of m
18df0 6f 76 69 6e 67 20 74 68 65 20 73 74 61 63 6b 20  oving the stack 
18e00 70 6f 69 6e 74 65 72 0a 2a 2a 20 69 73 20 61 76  pointer.** is av
18e10 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73 74 61 74 69  oided..*/ .stati
18e20 63 20 75 33 32 20 53 51 4c 49 54 45 5f 4e 4f 49  c u32 SQLITE_NOI
18e30 4e 4c 49 4e 45 20 73 65 72 69 61 6c 47 65 74 28  NLINE serialGet(
18e40 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
18e50 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20  d char *buf,    
18e60 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65   /* Buffer to de
18e70 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a  serialize from *
18e80 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74  /.  u32 serial_t
18e90 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
18ea0 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
18eb0 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
18ec0 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20  */.  Mem *pMem  
18ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ee0 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
18ef0 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65  l to write value
18f00 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 75 36   into */.){.  u6
18f10 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  4 x = FOUR_BYTE_
18f20 55 49 4e 54 28 62 75 66 29 3b 0a 20 20 75 33 32  UINT(buf);.  u32
18f30 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   y = FOUR_BYTE_U
18f40 49 4e 54 28 62 75 66 2b 34 29 3b 0a 20 20 78 20  INT(buf+4);.  x 
18f50 3d 20 28 78 3c 3c 33 32 29 20 2b 20 79 3b 0a 20  = (x<<32) + y;. 
18f60 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
18f70 3d 3d 36 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56  ==6 ){.    /* EV
18f80 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 38  IDENCE-OF: R-298
18f90 35 31 2d 35 32 32 37 32 20 56 61 6c 75 65 20 69  51-52272 Value i
18fa0 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 36  s a big-endian 6
18fb0 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 74 77 6f  4-bit.    ** two
18fc0 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74  s-complement int
18fd0 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 70 4d 65  eger. */.    pMe
18fe0 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29  m->u.i = *(i64*)
18ff0 26 78 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  &x;.    pMem->fl
19000 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
19010 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
19020 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 7d 65  m->u.i<0 );.  }e
19030 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  lse{.    /* EVID
19040 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 37 33 34 33  ENCE-OF: R-57343
19050 2d 34 39 31 31 34 20 56 61 6c 75 65 20 69 73 20  -49114 Value is 
19060 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 49 45 45  a big-endian IEE
19070 45 20 37 35 34 2d 32 30 30 38 20 36 34 2d 62 69  E 754-2008 64-bi
19080 74 0a 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e  t.    ** floatin
19090 67 20 70 6f 69 6e 74 20 6e 75 6d 62 65 72 2e 20  g point number. 
190a0 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
190b0 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69  NDEBUG) && !defi
190c0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
190d0 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a  FLOATING_POINT).
190e0 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68      /* Verify th
190f0 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20  at integers and 
19100 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
19110 61 6c 75 65 73 20 75 73 65 20 74 68 65 20 73 61  alues use the sa
19120 6d 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 20 6f  me.    ** byte o
19130 72 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20  rder.  Or, that 
19140 69 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f  if SQLITE_MIXED_
19150 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f  ENDIAN_64BIT_FLO
19160 41 54 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 66  AT is.    ** def
19170 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69 74  ined that 64-bit
19180 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
19190 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61 72  values really ar
191a0 65 20 6d 69 78 65 64 0a 20 20 20 20 2a 2a 20 65  e mixed.    ** e
191b0 6e 64 69 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ndian..    */.  
191c0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
191d0 36 34 20 74 31 20 3d 20 28 28 75 36 34 29 30 78  64 t1 = ((u64)0x
191e0 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20  3ff00000)<<32;. 
191f0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
19200 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b  double r1 = 1.0;
19210 0a 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31  .    u64 t2 = t1
19220 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64 45  ;.    swapMixedE
19230 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a  ndianFloat(t2);.
19240 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
19250 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74  of(r1)==sizeof(t
19260 32 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31  2) && memcmp(&r1
19270 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31  , &t2, sizeof(r1
19280 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  ))==0 );.#endif.
19290 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
192a0 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65  of(x)==8 && size
192b0 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 3d 3d 38  of(pMem->u.r)==8
192c0 20 29 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65   );.    swapMixe
192d0 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b  dEndianFloat(x);
192e0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65  .    memcpy(&pMe
192f0 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20 73 69 7a 65  m->u.r, &x, size
19300 6f 66 28 78 29 29 3b 0a 20 20 20 20 70 4d 65 6d  of(x));.    pMem
19310 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65  ->flags = sqlite
19320 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 75 2e 72  3IsNaN(pMem->u.r
19330 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d  ) ? MEM_Null : M
19340 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d 0a 20 20 72  EM_Real;.  }.  r
19350 65 74 75 72 6e 20 38 3b 0a 7d 0a 75 33 32 20 73  eturn 8;.}.u32 s
19360 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
19370 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73  Get(.  const uns
19380 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c  igned char *buf,
19390 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
193a0 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72  o deserialize fr
193b0 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69  om */.  u32 seri
193c0 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20  al_type,        
193d0 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20        /* Serial 
193e0 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c  type to deserial
193f0 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ize */.  Mem *pM
19400 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  em              
19410 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
19420 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76   cell to write v
19430 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a  alue into */.){.
19440 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c    switch( serial
19450 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  _type ){.    cas
19460 65 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65 72  e 10:   /* Reser
19470 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75  ved for future u
19480 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 31  se */.    case 1
19490 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64  1:   /* Reserved
194a0 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20   for future use 
194b0 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b  */.    case 0: {
194c0 20 20 2f 2a 20 4e 75 6c 6c 20 2a 2f 0a 20 20 20    /* Null */.   
194d0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
194e0 46 3a 20 52 2d 32 34 30 37 38 2d 30 39 33 37 35  F: R-24078-09375
194f0 20 56 61 6c 75 65 20 69 73 20 61 20 4e 55 4c 4c   Value is a NULL
19500 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
19510 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
19520 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  l;.      break;.
19530 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31      }.    case 1
19540 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
19550 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 38 38  DENCE-OF: R-4488
19560 35 2d 32 35 31 39 36 20 56 61 6c 75 65 20 69 73  5-25196 Value is
19570 20 61 6e 20 38 2d 62 69 74 20 74 77 6f 73 2d 63   an 8-bit twos-c
19580 6f 6d 70 6c 65 6d 65 6e 74 0a 20 20 20 20 20 20  omplement.      
19590 2a 2a 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  ** integer. */. 
195a0 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
195b0 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 62 75   ONE_BYTE_INT(bu
195c0 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  f);.      pMem->
195d0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
195e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
195f0 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
19600 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
19610 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32      }.    case 2
19620 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69  : { /* 2-byte si
19630 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
19640 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
19650 45 2d 4f 46 3a 20 52 2d 34 39 37 39 34 2d 33 35  E-OF: R-49794-35
19660 30 32 36 20 56 61 6c 75 65 20 69 73 20 61 20 62  026 Value is a b
19670 69 67 2d 65 6e 64 69 61 6e 20 31 36 2d 62 69 74  ig-endian 16-bit
19680 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63  .      ** twos-c
19690 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65  omplement intege
196a0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  r. */.      pMem
196b0 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f 42 59 54 45  ->u.i = TWO_BYTE
196c0 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20  _INT(buf);.     
196d0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
196e0 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65  EM_Int;.      te
196f0 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e  stcase( pMem->u.
19700 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  i<0 );.      ret
19710 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 2;.    }.   
19720 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d   case 3: { /* 3-
19730 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
19740 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  ger */.      /* 
19750 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
19760 37 38 33 39 2d 35 34 33 30 31 20 56 61 6c 75 65  7839-54301 Value
19770 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e   is a big-endian
19780 20 32 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a   24-bit.      **
19790 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74   twos-complement
197a0 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20   integer. */.   
197b0 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54     pMem->u.i = T
197c0 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 62 75  HREE_BYTE_INT(bu
197d0 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  f);.      pMem->
197e0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
197f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19800 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
19810 20 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a        return 3;.
19820 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34      }.    case 4
19830 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69  : { /* 4-byte si
19840 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
19850 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
19860 45 2d 4f 46 3a 20 52 2d 30 31 38 34 39 2d 32 36  E-OF: R-01849-26
19870 30 37 39 20 56 61 6c 75 65 20 69 73 20 61 20 62  079 Value is a b
19880 69 67 2d 65 6e 64 69 61 6e 20 33 32 2d 62 69 74  ig-endian 32-bit
19890 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63  .      ** twos-c
198a0 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65  omplement intege
198b0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  r. */.      pMem
198c0 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54  ->u.i = FOUR_BYT
198d0 45 5f 49 4e 54 28 62 75 66 29 3b 0a 23 69 66 64  E_INT(buf);.#ifd
198e0 65 66 20 5f 5f 48 50 5f 63 63 20 0a 20 20 20 20  ef __HP_cc .    
198f0 20 20 2f 2a 20 57 6f 72 6b 20 61 72 6f 75 6e 64    /* Work around
19900 20 61 20 73 69 67 6e 2d 65 78 74 65 6e 73 69 6f   a sign-extensio
19910 6e 20 62 75 67 20 69 6e 20 74 68 65 20 48 50 20  n bug in the HP 
19920 63 6f 6d 70 69 6c 65 72 20 66 6f 72 20 48 50 2f  compiler for HP/
19930 55 58 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  UX */.      if( 
19940 62 75 66 5b 30 5d 26 30 78 38 30 20 29 20 70 4d  buf[0]&0x80 ) pM
19950 65 6d 2d 3e 75 2e 69 20 7c 3d 20 30 78 66 66 66  em->u.i |= 0xfff
19960 66 66 66 66 66 38 30 30 30 30 30 30 30 4c 4c 3b  fffff80000000LL;
19970 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 70 4d  .#endif.      pM
19980 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
19990 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
199a0 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
199b0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
199c0 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   4;.    }.    ca
199d0 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74  se 5: { /* 6-byt
199e0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
199f0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
19a00 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 30 33 38  DENCE-OF: R-5038
19a10 35 2d 30 39 36 37 34 20 56 61 6c 75 65 20 69 73  5-09674 Value is
19a20 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 34 38   a big-endian 48
19a30 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77  -bit.      ** tw
19a40 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
19a50 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
19a60 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52  pMem->u.i = FOUR
19a70 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 32  _BYTE_UINT(buf+2
19a80 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33  ) + (((i64)1)<<3
19a90 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  2)*TWO_BYTE_INT(
19aa0 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  buf);.      pMem
19ab0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
19ac0 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
19ad0 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
19ae0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 36  ;.      return 6
19af0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
19b00 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20   6:   /* 8-byte 
19b10 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
19b20 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20  /.    case 7: { 
19b30 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67  /* IEEE floating
19b40 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20   point */.      
19b50 2f 2a 20 54 68 65 73 65 20 75 73 65 20 6c 6f 63  /* These use loc
19b60 61 6c 20 76 61 72 69 61 62 6c 65 73 2c 20 73 6f  al variables, so
19b70 20 64 6f 20 74 68 65 6d 20 69 6e 20 61 20 73 65   do them in a se
19b80 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65 0a 20  parate routine. 
19b90 20 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64       ** to avoid
19ba0 20 68 61 76 69 6e 67 20 74 6f 20 6d 6f 76 65 20   having to move 
19bb0 74 68 65 20 66 72 61 6d 65 20 70 6f 69 6e 74 65  the frame pointe
19bc0 72 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  r in the common 
19bd0 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 72 65  case */.      re
19be0 74 75 72 6e 20 73 65 72 69 61 6c 47 65 74 28 62  turn serialGet(b
19bf0 75 66 2c 73 65 72 69 61 6c 5f 74 79 70 65 2c 70  uf,serial_type,p
19c00 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Mem);.    }.    
19c10 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e  case 8:    /* In
19c20 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63  teger 0 */.    c
19c30 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74  ase 9: {  /* Int
19c40 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20  eger 1 */.      
19c50 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
19c60 52 2d 31 32 39 37 36 2d 32 32 38 39 33 20 56 61  R-12976-22893 Va
19c70 6c 75 65 20 69 73 20 74 68 65 20 69 6e 74 65 67  lue is the integ
19c80 65 72 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2f  er 0. */.      /
19c90 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
19ca0 2d 31 38 31 34 33 2d 31 32 31 32 31 20 56 61 6c  -18143-12121 Val
19cb0 75 65 20 69 73 20 74 68 65 20 69 6e 74 65 67 65  ue is the intege
19cc0 72 20 31 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  r 1. */.      pM
19cd0 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c  em->u.i = serial
19ce0 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70  _type-8;.      p
19cf0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
19d00 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
19d10 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
19d20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
19d30 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
19d40 20 52 2d 31 34 36 30 36 2d 33 31 35 36 34 20 56   R-14606-31564 V
19d50 61 6c 75 65 20 69 73 20 61 20 42 4c 4f 42 20 74  alue is a BLOB t
19d60 68 61 74 20 69 73 20 28 4e 2d 31 32 29 2f 32 20  hat is (N-12)/2 
19d70 62 79 74 65 73 20 69 6e 0a 20 20 20 20 20 20 2a  bytes in.      *
19d80 2a 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20 20 20  * length..      
19d90 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
19da0 52 2d 32 38 34 30 31 2d 30 30 31 34 30 20 56 61  R-28401-00140 Va
19db0 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 20  lue is a string 
19dc0 69 6e 20 74 68 65 20 74 65 78 74 20 65 6e 63 6f  in the text enco
19dd0 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 2a  ding and.      *
19de0 2a 20 28 4e 2d 31 33 29 2f 32 20 62 79 74 65 73  * (N-13)/2 bytes
19df0 20 69 6e 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20   in length. */. 
19e00 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
19e10 74 20 75 31 36 20 61 46 6c 61 67 5b 5d 20 3d 20  t u16 aFlag[] = 
19e20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45  { MEM_Blob|MEM_E
19e30 70 68 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45  phem, MEM_Str|ME
19e40 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20 20 20 20 20  M_Ephem };.     
19e50 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72   pMem->z = (char
19e60 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d   *)buf;.      pM
19e70 65 6d 2d 3e 6e 20 3d 20 28 73 65 72 69 61 6c 5f  em->n = (serial_
19e80 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20  type-12)/2;.    
19e90 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
19ea0 61 46 6c 61 67 5b 73 65 72 69 61 6c 5f 74 79 70  aFlag[serial_typ
19eb0 65 26 31 5d 3b 0a 20 20 20 20 20 20 72 65 74 75  e&1];.      retu
19ec0 72 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20  rn pMem->n;.    
19ed0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
19ee0 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ;.}./*.** This r
19ef0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
19f00 6f 20 61 6c 6c 6f 63 61 74 65 20 73 75 66 66 69  o allocate suffi
19f10 63 69 65 6e 74 20 73 70 61 63 65 20 66 6f 72 20  cient space for 
19f20 61 6e 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  an UnpackedRecor
19f30 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 6c  d.** structure l
19f40 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 62  arge enough to b
19f50 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c 69  e used with sqli
19f60 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
19f70 61 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65 20  ack() if.** the 
19f80 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
19f90 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b  s a pointer to K
19fa0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
19fb0 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a   pKeyInfo..**.**
19fc0 20 54 68 65 20 73 70 61 63 65 20 69 73 20 65 69   The space is ei
19fd0 74 68 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 75  ther allocated u
19fe0 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 4d 61  sing sqlite3DbMa
19ff0 6c 6c 6f 63 52 61 77 28 29 20 6f 72 20 66 72 6f  llocRaw() or fro
1a000 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20  m within.** the 
1a010 75 6e 61 6c 69 67 6e 65 64 20 62 75 66 66 65 72  unaligned buffer
1a020 20 70 61 73 73 65 64 20 76 69 61 20 74 68 65 20   passed via the 
1a030 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 64  second and third
1a040 20 61 72 67 75 6d 65 6e 74 73 20 28 70 72 65 73   arguments (pres
1a050 75 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20  umably.** stack 
1a060 73 70 61 63 65 29 2e 20 49 66 20 74 68 65 20 66  space). If the f
1a070 6f 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70 46  ormer, then *ppF
1a080 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 61 20  ree is set to a 
1a090 70 6f 69 6e 74 65 72 20 74 68 61 74 20 73 68 6f  pointer that sho
1a0a0 75 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75  uld.** be eventu
1a0b0 61 6c 6c 79 20 66 72 65 65 64 20 62 79 20 74 68  ally freed by th
1a0c0 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73  e caller using s
1a0d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 20  qlite3DbFree(). 
1a0e0 4f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 61  Or, if the .** a
1a0f0 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20  llocation comes 
1a100 66 72 6f 6d 20 74 68 65 20 70 53 70 61 63 65 2f  from the pSpace/
1a110 73 7a 53 70 61 63 65 20 62 75 66 66 65 72 2c 20  szSpace buffer, 
1a120 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20 74  *ppFree is set t
1a130 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65  o NULL.** before
1a140 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
1a150 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  * If an OOM erro
1a160 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  r occurs, NULL i
1a170 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55  s returned..*/.U
1a180 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73  npackedRecord *s
1a190 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55  qlite3VdbeAllocU
1a1a0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20  npackedRecord(. 
1a1b0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1a1c0 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
1a1d0 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
1a1e0 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f  of the record */
1a1f0 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 2c  .  char *pSpace,
1a200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a210 20 20 20 2f 2a 20 55 6e 61 6c 69 67 6e 65 64 20     /* Unaligned 
1a220 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  space available 
1a230 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61 63 65  */.  int szSpace
1a240 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a250 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1a260 70 53 70 61 63 65 5b 5d 20 69 6e 20 62 79 74 65  pSpace[] in byte
1a270 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70  s */.  char **pp
1a280 46 72 65 65 20 20 20 20 20 20 20 20 20 20 20 20  Free            
1a290 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43         /* OUT: C
1a2a0 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 66 72 65  aller should fre
1a2b0 65 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 2a  e this pointer *
1a2c0 2f 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52  /.){.  UnpackedR
1a2d0 65 63 6f 72 64 20 2a 70 3b 20 20 20 20 20 20 20  ecord *p;       
1a2e0 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b         /* Unpack
1a2f0 65 64 20 72 65 63 6f 72 64 20 74 6f 20 72 65 74  ed record to ret
1a300 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 66  urn */.  int nOf
1a310 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
1a320 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72           /* Incr
1a330 65 6d 65 6e 74 20 70 53 70 61 63 65 20 62 79 20  ement pSpace by 
1a340 6e 4f 66 66 20 74 6f 20 61 6c 69 67 6e 20 69 74  nOff to align it
1a350 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   */.  int nByte;
1a360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a370 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1a380 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65  of bytes require
1a390 64 20 66 6f 72 20 2a 70 20 2a 2f 0a 0a 20 20 2f  d for *p */..  /
1a3a0 2a 20 57 65 20 77 61 6e 74 20 74 6f 20 73 68 69  * We want to shi
1a3b0 66 74 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70  ft the pointer p
1a3c0 53 70 61 63 65 20 75 70 20 73 75 63 68 20 74 68  Space up such th
1a3d0 61 74 20 69 74 20 69 73 20 38 2d 62 79 74 65 20  at it is 8-byte 
1a3e0 61 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a 20 54 68  aligned..  ** Th
1a3f0 75 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 63  us, we need to c
1a400 61 6c 63 75 6c 61 74 65 20 61 20 76 61 6c 75 65  alculate a value
1a410 2c 20 6e 4f 66 66 2c 20 62 65 74 77 65 65 6e 20  , nOff, between 
1a420 30 20 61 6e 64 20 37 2c 20 74 6f 20 73 68 69 66  0 and 7, to shif
1a430 74 20 0a 20 20 2a 2a 20 69 74 20 62 79 2e 20 20  t .  ** it by.  
1a440 49 66 20 70 53 70 61 63 65 20 69 73 20 61 6c 72  If pSpace is alr
1a450 65 61 64 79 20 38 2d 62 79 74 65 20 61 6c 69 67  eady 8-byte alig
1a460 6e 65 64 2c 20 6e 4f 66 66 20 73 68 6f 75 6c 64  ned, nOff should
1a470 20 62 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20   be zero..  */. 
1a480 20 6e 4f 66 66 20 3d 20 28 38 20 2d 20 28 53 51   nOff = (8 - (SQ
1a490 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
1a4a0 70 53 70 61 63 65 29 20 26 20 37 29 29 20 26 20  pSpace) & 7)) & 
1a4b0 37 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55  7;.  nByte = ROU
1a4c0 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63  ND8(sizeof(Unpac
1a4d0 6b 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73 69  kedRecord)) + si
1a4e0 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49  zeof(Mem)*(pKeyI
1a4f0 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a  nfo->nField+1);.
1a500 20 20 69 66 28 20 6e 42 79 74 65 3e 73 7a 53 70    if( nByte>szSp
1a510 61 63 65 2b 6e 4f 66 66 20 29 7b 0a 20 20 20 20  ace+nOff ){.    
1a520 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63  p = (UnpackedRec
1a530 6f 72 64 20 2a 29 73 71 6c 69 74 65 33 44 62 4d  ord *)sqlite3DbM
1a540 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66  allocRaw(pKeyInf
1a550 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20  o->db, nByte);. 
1a560 20 20 20 2a 70 70 46 72 65 65 20 3d 20 28 63 68     *ppFree = (ch
1a570 61 72 20 2a 29 70 3b 0a 20 20 20 20 69 66 28 20  ar *)p;.    if( 
1a580 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  !p ) return 0;. 
1a590 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20   }else{.    p = 
1a5a0 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 2a  (UnpackedRecord*
1a5b0 29 26 70 53 70 61 63 65 5b 6e 4f 66 66 5d 3b 0a  )&pSpace[nOff];.
1a5c0 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20 30 3b      *ppFree = 0;
1a5d0 0a 20 20 7d 0a 0a 20 20 70 2d 3e 61 4d 65 6d 20  .  }..  p->aMem 
1a5e0 3d 20 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a  = (Mem*)&((char*
1a5f0 29 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f  )p)[ROUND8(sizeo
1a600 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  f(UnpackedRecord
1a610 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ))];.  assert( p
1a620 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
1a630 64 65 72 21 3d 30 20 29 3b 0a 20 20 70 2d 3e 70  der!=0 );.  p->p
1a640 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e  KeyInfo = pKeyIn
1a650 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20  fo;.  p->nField 
1a660 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  = pKeyInfo->nFie
1a670 6c 64 20 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e  ld + 1;.  return
1a680 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76   p;.}../*.** Giv
1a690 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74 65  en the nKey-byte
1a6a0 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72   encoding of a r
1a6b0 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c  ecord in pKey[],
1a6c0 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 0a 2a   populate the .*
1a6d0 2a 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  * UnpackedRecord
1a6e0 20 73 74 72 75 63 74 75 72 65 20 69 6e 64 69 63   structure indic
1a6f0 61 74 65 64 20 62 79 20 74 68 65 20 66 6f 75 72  ated by the four
1a700 74 68 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68  th argument with
1a710 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
1a720 20 6f 66 20 74 68 65 20 64 65 63 6f 64 65 64 20   of the decoded 
1a730 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64  record..*/ .void
1a740 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1a750 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49  rdUnpack(.  KeyI
1a760 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
1a770 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
1a780 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65 63 6f  n about the reco
1a790 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69  rd format */.  i
1a7a0 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20  nt nKey,        
1a7b0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1a7c0 20 74 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f   the binary reco
1a7d0 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  rd */.  const vo
1a7e0 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f  id *pKey,      /
1a7f0 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72 65 63  * The binary rec
1a800 6f 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ord */.  Unpacke
1a810 64 52 65 63 6f 72 64 20 2a 70 20 20 20 20 20 20  dRecord *p      
1a820 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69 73  /* Populate this
1a830 20 73 74 72 75 63 74 75 72 65 20 62 65 66 6f 72   structure befor
1a840 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a  e returning. */.
1a850 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  ){.  const unsig
1a860 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d  ned char *aKey =
1a870 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
1a880 20 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20   char *)pKey;.  
1a890 69 6e 74 20 64 3b 20 0a 20 20 75 33 32 20 69 64  int d; .  u32 id
1a8a0 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
1a8b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
1a8c0 73 65 74 20 69 6e 20 61 4b 65 79 5b 5d 20 74 6f  set in aKey[] to
1a8d0 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
1a8e0 75 31 36 20 75 3b 20 20 20 20 20 20 20 20 20 20  u16 u;          
1a8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a900 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70  /* Unsigned loop
1a910 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33   counter */.  u3
1a920 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a  2 szHdr;.  Mem *
1a930 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a  pMem = p->aMem;.
1a940 0a 20 20 70 2d 3e 64 65 66 61 75 6c 74 5f 72 63  .  p->default_rc
1a950 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
1a960 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
1a970 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20  MENT(pMem) );.  
1a980 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33  idx = getVarint3
1a990 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a  2(aKey, szHdr);.
1a9a0 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75    d = szHdr;.  u
1a9b0 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69   = 0;.  while( i
1a9c0 64 78 3c 73 7a 48 64 72 20 26 26 20 64 3c 3d 6e  dx<szHdr && d<=n
1a9d0 4b 65 79 20 29 7b 0a 20 20 20 20 75 33 32 20 73  Key ){.    u32 s
1a9e0 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20  erial_type;..   
1a9f0 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e   idx += getVarin
1aa00 74 33 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20  t32(&aKey[idx], 
1aa10 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
1aa20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b    pMem->enc = pK
1aa30 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20  eyInfo->enc;.   
1aa40 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79   pMem->db = pKey
1aa50 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a  Info->db;.    /*
1aa60 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30   pMem->flags = 0
1aa70 3b 20 2f 2f 20 73 71 6c 69 74 65 33 56 64 62 65  ; // sqlite3Vdbe
1aa80 53 65 72 69 61 6c 47 65 74 28 29 20 77 69 6c 6c  SerialGet() will
1aa90 20 73 65 74 20 74 68 69 73 20 66 6f 72 20 75 73   set this for us
1aaa0 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 73 7a   */.    pMem->sz
1aab0 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20  Malloc = 0;.    
1aac0 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d += sqlite3Vdbe
1aad0 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 5b  SerialGet(&aKey[
1aae0 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  d], serial_type,
1aaf0 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d   pMem);.    pMem
1ab00 2b 2b 3b 0a 20 20 20 20 69 66 28 20 28 2b 2b 75  ++;.    if( (++u
1ab10 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64 20 29 20 62  )>=p->nField ) b
1ab20 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  reak;.  }.  asse
1ab30 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d  rt( u<=pKeyInfo-
1ab40 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20  >nField + 1 );. 
1ab50 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a   p->nField = u;.
1ab60 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45  }..#if SQLITE_DE
1ab70 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  BUG./*.** This f
1ab80 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73  unction compares
1ab90 20 74 77 6f 20 69 6e 64 65 78 20 6f 72 20 74 61   two index or ta
1aba0 62 6c 65 20 72 65 63 6f 72 64 20 6b 65 79 73 20  ble record keys 
1abb0 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79 0a  in the same way.
1abc0 2a 2a 20 61 73 20 74 68 65 20 73 71 6c 69 74 65  ** as the sqlite
1abd0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1abe0 72 65 28 29 20 72 6f 75 74 69 6e 65 2e 20 55 6e  re() routine. Un
1abf0 6c 69 6b 65 20 56 64 62 65 52 65 63 6f 72 64 43  like VdbeRecordC
1ac00 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a 20 74 68 69  ompare(),.** thi
1ac10 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72  s function deser
1ac20 69 61 6c 69 7a 65 73 20 61 6e 64 20 63 6f 6d 70  ializes and comp
1ac30 61 72 65 73 20 76 61 6c 75 65 73 20 75 73 69 6e  ares values usin
1ac40 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  g the.** sqlite3
1ac50 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20  VdbeSerialGet() 
1ac60 61 6e 64 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  and sqlite3MemCo
1ac70 6d 70 61 72 65 28 29 20 66 75 6e 63 74 69 6f 6e  mpare() function
1ac80 73 2e 20 49 74 20 69 73 20 75 73 65 64 0a 2a 2a  s. It is used.**
1ac90 20 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61   in assert() sta
1aca0 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72  tements to ensur
1acb0 65 20 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d  e that the optim
1acc0 69 7a 65 64 20 63 6f 64 65 20 69 6e 0a 2a 2a 20  ized code in.** 
1acd0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1ace0 64 43 6f 6d 70 61 72 65 28 29 20 72 65 74 75 72  dCompare() retur
1acf0 6e 73 20 72 65 73 75 6c 74 73 20 77 69 74 68 20  ns results with 
1ad00 74 68 65 73 65 20 74 77 6f 20 70 72 69 6d 69 74  these two primit
1ad10 69 76 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ives..**.** Retu
1ad20 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 72  rn true if the r
1ad30 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69  esult of compari
1ad40 73 6f 6e 20 69 73 20 65 71 75 69 76 61 6c 65 6e  son is equivalen
1ad50 74 20 74 6f 20 64 65 73 69 72 65 64 52 65 73 75  t to desiredResu
1ad60 6c 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61  lt..** Return fa
1ad70 6c 73 65 20 69 66 20 74 68 65 72 65 20 69 73 20  lse if there is 
1ad80 61 20 64 69 73 61 67 72 65 65 6d 65 6e 74 2e 0a  a disagreement..
1ad90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
1ada0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
1adb0 65 62 75 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79  ebug(.  int nKey
1adc0 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
1add0 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65  Key1, /* Left ke
1ade0 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 55 6e 70  y */.  const Unp
1adf0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
1ae00 65 79 32 2c 20 2f 2a 20 52 69 67 68 74 20 6b 65  ey2, /* Right ke
1ae10 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 69 72  y */.  int desir
1ae20 65 64 52 65 73 75 6c 74 20 20 20 20 20 20 20 20  edResult        
1ae30 20 20 20 20 20 2f 2a 20 43 6f 72 72 65 63 74 20       /* Correct 
1ae40 61 6e 73 77 65 72 20 2a 2f 0a 29 7b 0a 20 20 75  answer */.){.  u
1ae50 33 32 20 64 31 3b 20 20 20 20 20 20 20 20 20 20  32 d1;          
1ae60 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
1ae70 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
1ae80 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  data element */.
1ae90 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20    u32 idx1;     
1aea0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
1aeb0 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
1aec0 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e  xt header elemen
1aed0 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72  t */.  u32 szHdr
1aee0 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  1;        /* Num
1aef0 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
1af00 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
1af10 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  i = 0;.  int rc 
1af20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  = 0;.  const uns
1af30 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
1af40 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  1 = (const unsig
1af50 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31  ned char *)pKey1
1af60 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  ;.  KeyInfo *pKe
1af70 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d  yInfo;.  Mem mem
1af80 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d  1;..  pKeyInfo =
1af90 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1afa0 6f 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66  o;.  if( pKeyInf
1afb0 6f 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74 75 72  o->db==0 ) retur
1afc0 6e 20 31 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20  n 1;.  mem1.enc 
1afd0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
1afe0 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65  .  mem1.db = pKe
1aff0 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20  yInfo->db;.  /* 
1b000 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20  mem1.flags = 0; 
1b010 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69 74   // Will be init
1b020 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c 69 74  ialized by sqlit
1b030 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1b040 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28  ) */.  VVA_ONLY(
1b050 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d   mem1.szMalloc =
1b060 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65   0; ) /* Only ne
1b070 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28 29  eded by assert()
1b080 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a   statements */..
1b090 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d    /* Compilers m
1b0a0 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74  ay complain that
1b0b0 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74   mem1.u.i is pot
1b0c0 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69  entially uniniti
1b0d0 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20  alized..  ** We 
1b0e0 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65  could initialize
1b0f0 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68 65   it, as shown he
1b100 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20 74  re, to silence t
1b110 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e  hose complaints.
1b120 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61 63  .  ** But in fac
1b130 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c  t, mem1.u.i will
1b140 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79 20   never actually 
1b150 62 65 20 75 73 65 64 20 75 6e 69 6e 69 74 69 61  be used uninitia
1b160 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67  lized, and doing
1b170 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63   .  ** the unnec
1b180 65 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69 7a  essary initializ
1b190 61 74 69 6f 6e 20 68 61 73 20 61 20 6d 65 61 73  ation has a meas
1b1a0 75 72 61 62 6c 65 20 6e 65 67 61 74 69 76 65 20  urable negative 
1b1b0 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a  performance.  **
1b1c0 20 69 6d 70 61 63 74 2c 20 73 69 6e 63 65 20 74   impact, since t
1b1d0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1b1e0 20 76 65 72 79 20 68 69 67 68 20 72 75 6e 6e 65   very high runne
1b1f0 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65 20 63  r.  And so, we c
1b200 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67  hoose.  ** to ig
1b210 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70 69 6c 65  nore the compile
1b220 72 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c  r warnings and l
1b230 65 61 76 65 20 74 68 69 73 20 76 61 72 69 61 62  eave this variab
1b240 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  le uninitialized
1b250 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d  ..  */.  /*  mem
1b260 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e  1.u.i = 0;  // n
1b270 6f 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65 20  ot needed, here 
1b280 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69  to silence compi
1b290 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20  ler warning */. 
1b2a0 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56 61   .  idx1 = getVa
1b2b0 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a  rint32(aKey1, sz
1b2c0 48 64 72 31 29 3b 0a 20 20 69 66 28 20 73 7a 48  Hdr1);.  if( szH
1b2d0 64 72 31 3e 39 38 33 30 37 20 29 20 72 65 74 75  dr1>98307 ) retu
1b2e0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1b2f0 54 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31  T;.  d1 = szHdr1
1b300 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
1b310 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65  Info->nField+pKe
1b320 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d  yInfo->nXField>=
1b330 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 7c  pPKey2->nField |
1b340 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
1b350 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
1b360 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d  fo->aSortOrder!=
1b370 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1b380 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e  KeyInfo->nField>
1b390 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
1b3a0 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43  dx1<=szHdr1 || C
1b3b0 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64  ORRUPT_DB );.  d
1b3c0 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  o{.    u32 seria
1b3d0 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a  l_type1;..    /*
1b3e0 20 52 65 61 64 20 74 68 65 20 73 65 72 69 61 6c   Read the serial
1b3f0 20 74 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e   types for the n
1b400 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65  ext element in e
1b410 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20  ach key. */.    
1b420 69 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69 6e  idx1 += getVarin
1b430 74 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31 2c  t32( aKey1+idx1,
1b440 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b   serial_type1 );
1b450 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20  ..    /* Verify 
1b460 74 68 61 74 20 74 68 65 72 65 20 69 73 20 65 6e  that there is en
1b470 6f 75 67 68 20 6b 65 79 20 73 70 61 63 65 20 72  ough key space r
1b480 65 6d 61 69 6e 69 6e 67 20 74 6f 20 61 76 6f 69  emaining to avoi
1b490 64 0a 20 20 20 20 2a 2a 20 61 20 62 75 66 66 65  d.    ** a buffe
1b4a0 72 20 6f 76 65 72 72 65 61 64 2e 20 20 54 68 65  r overread.  The
1b4b0 20 22 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65   "d1+serial_type
1b4c0 31 2b 32 22 20 73 75 62 65 78 70 72 65 73 73 69  1+2" subexpressi
1b4d0 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 61  on will.    ** a
1b4e0 6c 77 61 79 73 20 62 65 20 67 72 65 61 74 65 72  lways be greater
1b4f0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
1b500 6f 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  o the amount of 
1b510 72 65 71 75 69 72 65 64 20 6b 65 79 20 73 70 61  required key spa
1b520 63 65 2e 0a 20 20 20 20 2a 2a 20 55 73 65 20 74  ce..    ** Use t
1b530 68 61 74 20 61 70 70 72 6f 78 69 6d 61 74 69 6f  hat approximatio
1b540 6e 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 6d  n to avoid the m
1b550 6f 72 65 20 65 78 70 65 6e 73 69 76 65 20 63 61  ore expensive ca
1b560 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
1b570 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1b580 70 65 4c 65 6e 28 29 20 69 6e 20 74 68 65 20 63  peLen() in the c
1b590 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 20 20  ommon case..    
1b5a0 2a 2f 0a 20 20 20 20 69 66 28 20 64 31 2b 73 65  */.    if( d1+se
1b5b0 72 69 61 6c 5f 74 79 70 65 31 2b 32 3e 28 75 33  rial_type1+2>(u3
1b5c0 32 29 6e 4b 65 79 31 0a 20 20 20 20 20 26 26 20  2)nKey1.     && 
1b5d0 64 31 2b 73 71 6c 69 74 65 33 56 64 62 65 53 65  d1+sqlite3VdbeSe
1b5e0 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
1b5f0 61 6c 5f 74 79 70 65 31 29 3e 28 75 33 32 29 6e  al_type1)>(u32)n
1b600 4b 65 79 31 20 0a 20 20 20 20 29 7b 0a 20 20 20  Key1 .    ){.   
1b610 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1b620 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20  .    /* Extract 
1b630 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65  the values to be
1b640 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a   compared..    *
1b650 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69  /.    d1 += sqli
1b660 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1b670 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72  (&aKey1[d1], ser
1b680 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31  ial_type1, &mem1
1b690 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68  );..    /* Do th
1b6a0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20  e comparison.   
1b6b0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
1b6c0 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26  ite3MemCompare(&
1b6d0 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61  mem1, &pPKey2->a
1b6e0 4d 65 6d 5b 69 5d 2c 20 70 4b 65 79 49 6e 66 6f  Mem[i], pKeyInfo
1b6f0 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20  ->aColl[i]);.   
1b700 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
1b710 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31      assert( mem1
1b720 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20  .szMalloc==0 ); 
1b730 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20   /* See comment 
1b740 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69  below */.      i
1b750 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  f( pKeyInfo->aSo
1b760 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20  rtOrder[i] ){.  
1b770 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 20        rc = -rc; 
1b780 20 2f 2a 20 49 6e 76 65 72 74 20 74 68 65 20 72   /* Invert the r
1b790 65 73 75 6c 74 20 66 6f 72 20 44 45 53 43 20 73  esult for DESC s
1b7a0 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20  ort order. */.  
1b7b0 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
1b7c0 20 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64   debugCompareEnd
1b7d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b  ;.    }.    i++;
1b7e0 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c  .  }while( idx1<
1b7f0 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65  szHdr1 && i<pPKe
1b800 79 32 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a 20  y2->nField );.. 
1b810 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c   /* No memory al
1b820 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72  location is ever
1b830 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20   used on mem1.  
1b840 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67  Prove this using
1b850 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77  .  ** the follow
1b860 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49  ing assert().  I
1b870 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66  f the assert() f
1b880 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74  ails, it indicat
1b890 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79  es a.  ** memory
1b8a0 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64   leak and a need
1b8b0 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   to call sqlite3
1b8c0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
1b8d0 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  mem1)..  */.  as
1b8e0 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  sert( mem1.szMal
1b8f0 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  loc==0 );..  /* 
1b900 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73  rc==0 here means
1b910 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65   that one of the
1b920 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66   keys ran out of
1b930 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a   fields and.  **
1b940 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20   all the fields 
1b950 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74  up to that point
1b960 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74   were equal. Ret
1b970 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f  urn the default_
1b980 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20  rc.  ** value.  
1b990 2a 2f 0a 20 20 72 63 20 3d 20 70 50 4b 65 79 32  */.  rc = pPKey2
1b9a0 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 0a 64  ->default_rc;..d
1b9b0 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3a 0a  ebugCompareEnd:.
1b9c0 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65 73    if( desiredRes
1b9d0 75 6c 74 3d 3d 30 20 26 26 20 72 63 3d 3d 30 20  ult==0 && rc==0 
1b9e0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
1b9f0 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3c  ( desiredResult<
1ba00 30 20 26 26 20 72 63 3c 30 20 29 20 72 65 74 75  0 && rc<0 ) retu
1ba10 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69  rn 1;.  if( desi
1ba20 72 65 64 52 65 73 75 6c 74 3e 30 20 26 26 20 72  redResult>0 && r
1ba30 63 3e 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  c>0 ) return 1;.
1ba40 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42    if( CORRUPT_DB
1ba50 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
1ba60 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d  f( pKeyInfo->db-
1ba70 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1ba80 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
1ba90 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
1baa0 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  #if SQLITE_DEBUG
1bab0 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65  ./*.** Count the
1bac0 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64   number of field
1bad0 73 20 28 61 2e 6b 2e 61 2e 20 63 6f 6c 75 6d 6e  s (a.k.a. column
1bae0 73 29 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  s) in the record
1baf0 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 4b 65   given by.** pKe
1bb00 79 2c 6e 4b 65 79 2e 20 20 54 68 65 20 76 65 72  y,nKey.  The ver
1bb10 69 66 79 20 74 68 61 74 20 74 68 69 73 20 63 6f  ify that this co
1bb20 75 6e 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e  unt is less than
1bb30 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
1bb40 0a 2a 2a 20 6c 69 6d 69 74 20 67 69 76 65 6e 20  .** limit given 
1bb50 62 79 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  by pKeyInfo->nFi
1bb60 65 6c 64 20 2b 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld + pKeyInfo->
1bb70 6e 58 46 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49  nXField..**.** I
1bb80 66 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  f this constrain
1bb90 74 20 69 73 20 6e 6f 74 20 73 61 74 69 73 66 69  t is not satisfi
1bba0 65 64 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ed, it means tha
1bbb0 74 20 74 68 65 20 68 69 67 68 2d 73 70 65 65 64  t the high-speed
1bbc0 0a 2a 2a 20 76 64 62 65 52 65 63 6f 72 64 43 6f  .** vdbeRecordCo
1bbd0 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64 20 76  mpareInt() and v
1bbe0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1bbf0 53 74 72 69 6e 67 28 29 20 72 6f 75 74 69 6e 65  String() routine
1bc00 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f  s will.** not wo
1bc10 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 49  rk correctly.  I
1bc20 66 20 74 68 69 73 20 61 73 73 65 72 74 28 29 20  f this assert() 
1bc30 65 76 65 72 20 66 69 72 65 73 2c 20 69 74 20 70  ever fires, it p
1bc40 72 6f 62 61 62 6c 79 20 6d 65 61 6e 73 0a 2a 2a  robably means.**
1bc50 20 74 68 61 74 20 74 68 65 20 4b 65 79 49 6e 66   that the KeyInf
1bc60 6f 2e 6e 46 69 65 6c 64 20 6f 72 20 4b 65 79 49  o.nField or KeyI
1bc70 6e 66 6f 2e 6e 58 46 69 65 6c 64 20 76 61 6c 75  nfo.nXField valu
1bc80 65 73 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64  es were computed
1bc90 0a 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e  .** incorrectly.
1bca0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1bcb0 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43  vdbeAssertFieldC
1bcc0 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73  ountWithinLimits
1bcd0 28 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f  (.  int nKey, co
1bce0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
1bcf0 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20    /* The record 
1bd00 74 6f 20 76 65 72 69 66 79 20 2a 2f 20 0a 20 20  to verify */ .  
1bd10 63 6f 6e 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70  const KeyInfo *p
1bd20 4b 65 79 49 6e 66 6f 20 20 20 20 20 20 20 2f 2a  KeyInfo       /*
1bd30 20 43 6f 6d 70 61 72 65 20 73 69 7a 65 20 77 69   Compare size wi
1bd40 74 68 20 74 68 69 73 20 4b 65 79 49 6e 66 6f 20  th this KeyInfo 
1bd50 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 46 69 65  */.){.  int nFie
1bd60 6c 64 20 3d 20 30 3b 0a 20 20 75 33 32 20 73 7a  ld = 0;.  u32 sz
1bd70 48 64 72 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a  Hdr;.  u32 idx;.
1bd80 20 20 75 33 32 20 6e 6f 74 55 73 65 64 3b 0a 20    u32 notUsed;. 
1bd90 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1bda0 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f  char *aKey = (co
1bdb0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1bdc0 72 2a 29 70 4b 65 79 3b 0a 0a 20 20 69 66 28 20  r*)pKey;..  if( 
1bdd0 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74  CORRUPT_DB ) ret
1bde0 75 72 6e 3b 0a 20 20 69 64 78 20 3d 20 67 65 74  urn;.  idx = get
1bdf0 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73  Varint32(aKey, s
1be00 7a 48 64 72 29 3b 0a 20 20 61 73 73 65 72 74 28  zHdr);.  assert(
1be10 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73   nKey>=0 );.  as
1be20 73 65 72 74 28 20 73 7a 48 64 72 3c 3d 28 75 33  sert( szHdr<=(u3
1be30 32 29 6e 4b 65 79 20 29 3b 0a 20 20 77 68 69 6c  2)nKey );.  whil
1be40 65 28 20 69 64 78 3c 73 7a 48 64 72 20 29 7b 0a  e( idx<szHdr ){.
1be50 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61      idx += getVa
1be60 72 69 6e 74 33 32 28 61 4b 65 79 2b 69 64 78 2c  rint32(aKey+idx,
1be70 20 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 6e   notUsed);.    n
1be80 46 69 65 6c 64 2b 2b 3b 0a 20 20 7d 0a 20 20 61  Field++;.  }.  a
1be90 73 73 65 72 74 28 20 6e 46 69 65 6c 64 20 3c 3d  ssert( nField <=
1bea0 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
1beb0 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69  d+pKeyInfo->nXFi
1bec0 65 6c 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  eld );.}.#else.#
1bed0 20 64 65 66 69 6e 65 20 76 64 62 65 41 73 73 65   define vdbeAsse
1bee0 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68  rtFieldCountWith
1bef0 69 6e 4c 69 6d 69 74 73 28 41 2c 42 2c 43 29 0a  inLimits(A,B,C).
1bf00 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f  #endif../*.** Bo
1bf10 74 68 20 2a 70 4d 65 6d 31 20 61 6e 64 20 2a 70  th *pMem1 and *p
1bf20 4d 65 6d 32 20 63 6f 6e 74 61 69 6e 20 73 74 72  Mem2 contain str
1bf30 69 6e 67 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70  ing values. Comp
1bf40 61 72 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75  are the two valu
1bf50 65 73 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  es.** using the 
1bf60 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1bf70 63 65 20 70 43 6f 6c 6c 2e 20 41 73 20 75 73 75  ce pColl. As usu
1bf80 61 6c 2c 20 72 65 74 75 72 6e 20 61 20 6e 65 67  al, return a neg
1bf90 61 74 69 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20  ative , zero.** 
1bfa0 6f 72 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75  or positive valu
1bfb0 65 20 69 66 20 2a 70 4d 65 6d 31 20 69 73 20 6c  e if *pMem1 is l
1bfc0 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
1bfd0 74 6f 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  to or greater th
1bfe0 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72  an .** *pMem2, r
1bff0 65 73 70 65 63 74 69 76 65 6c 79 2e 20 53 69 6d  espectively. Sim
1c000 69 6c 61 72 20 69 6e 20 73 70 69 72 69 74 20 74  ilar in spirit t
1c010 6f 20 22 72 63 20 3d 20 28 2a 70 4d 65 6d 31 29  o "rc = (*pMem1)
1c020 20 2d 20 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a   - (*pMem2);"..*
1c030 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
1c040 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e  eCompareMemStrin
1c050 67 28 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a  g(.  const Mem *
1c060 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e 73 74 20 4d  pMem1,.  const M
1c070 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e  em *pMem2,.  con
1c080 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  st CollSeq *pCol
1c090 6c 2c 0a 20 20 75 38 20 2a 70 72 63 45 72 72 20  l,.  u8 *prcErr 
1c0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0b0 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 4f 4f       /* If an OO
1c0c0 4d 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 6f  M occurs, set to
1c0d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f   SQLITE_NOMEM */
1c0e0 0a 29 7b 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d  .){.  if( pMem1-
1c0f0 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63  >enc==pColl->enc
1c100 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 73   ){.    /* The s
1c110 74 72 69 6e 67 73 20 61 72 65 20 61 6c 72 65 61  trings are alrea
1c120 64 79 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63  dy in the correc
1c130 74 20 65 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c  t encoding.  Cal
1c140 6c 20 74 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f  l the.     ** co
1c150 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
1c160 6e 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20  n directly */.  
1c170 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e    return pColl->
1c180 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65  xCmp(pColl->pUse
1c190 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31  r,pMem1->n,pMem1
1c1a0 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65  ->z,pMem2->n,pMe
1c1b0 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b  m2->z);.  }else{
1c1c0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
1c1d0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c   const void *v1,
1c1e0 20 2a 76 32 3b 0a 20 20 20 20 69 6e 74 20 6e 31   *v2;.    int n1
1c1f0 2c 20 6e 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31  , n2;.    Mem c1
1c200 3b 0a 20 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20  ;.    Mem c2;.  
1c210 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1c220 49 6e 69 74 28 26 63 31 2c 20 70 4d 65 6d 31 2d  Init(&c1, pMem1-
1c230 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a  >db, MEM_Null);.
1c240 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1c250 65 6d 49 6e 69 74 28 26 63 32 2c 20 70 4d 65 6d  emInit(&c2, pMem
1c260 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  1->db, MEM_Null)
1c270 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1c280 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28  eMemShallowCopy(
1c290 26 63 31 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f  &c1, pMem1, MEM_
1c2a0 45 70 68 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69  Ephem);.    sqli
1c2b0 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f  te3VdbeMemShallo
1c2c0 77 43 6f 70 79 28 26 63 32 2c 20 70 4d 65 6d 32  wCopy(&c2, pMem2
1c2d0 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20  , MEM_Ephem);.  
1c2e0 20 20 76 31 20 3d 20 73 71 6c 69 74 65 33 56 61    v1 = sqlite3Va
1c2f0 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74 65 33  lueText((sqlite3
1c300 5f 76 61 6c 75 65 2a 29 26 63 31 2c 20 70 43 6f  _value*)&c1, pCo
1c310 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 31  ll->enc);.    n1
1c320 20 3d 20 76 31 3d 3d 30 20 3f 20 30 20 3a 20 63   = v1==0 ? 0 : c
1c330 31 2e 6e 3b 0a 20 20 20 20 76 32 20 3d 20 73 71  1.n;.    v2 = sq
1c340 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 28  lite3ValueText((
1c350 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26  sqlite3_value*)&
1c360 63 32 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b  c2, pColl->enc);
1c370 0a 20 20 20 20 6e 32 20 3d 20 76 32 3d 3d 30 20  .    n2 = v2==0 
1c380 3f 20 30 20 3a 20 63 32 2e 6e 3b 0a 20 20 20 20  ? 0 : c2.n;.    
1c390 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  rc = pColl->xCmp
1c3a0 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e  (pColl->pUser, n
1c3b0 31 2c 20 76 31 2c 20 6e 32 2c 20 76 32 29 3b 0a  1, v1, n2, v2);.
1c3c0 20 20 20 20 69 66 28 20 28 76 31 3d 3d 30 20 7c      if( (v1==0 |
1c3d0 7c 20 76 32 3d 3d 30 29 20 26 26 20 70 72 63 45  | v2==0) && prcE
1c3e0 72 72 20 29 20 2a 70 72 63 45 72 72 20 3d 20 53  rr ) *prcErr = S
1c3f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1c400 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1c410 65 6c 65 61 73 65 28 26 63 31 29 3b 0a 20 20 20  elease(&c1);.   
1c420 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1c430 65 6c 65 61 73 65 28 26 63 32 29 3b 0a 20 20 20  elease(&c2);.   
1c440 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1c450 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
1c460 20 74 77 6f 20 62 6c 6f 62 73 2e 20 20 52 65 74   two blobs.  Ret
1c470 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  urn negative, ze
1c480 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ro, or positive 
1c490 69 66 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  if the first.** 
1c4a0 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
1c4b0 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74  ual to, or great
1c4c0 65 72 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f  er than the seco
1c4d0 6e 64 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  nd, respectively
1c4e0 2e 0a 2a 2a 20 49 66 20 6f 6e 65 20 62 6c 6f 62  ..** If one blob
1c4f0 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20   is a prefix of 
1c500 74 68 65 20 6f 74 68 65 72 2c 20 74 68 65 6e 20  the other, then 
1c510 74 68 65 20 73 68 6f 72 74 65 72 20 69 73 20 74  the shorter is t
1c520 68 65 20 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 73 74  he lessor..*/.st
1c530 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
1c540 4c 49 4e 45 20 69 6e 74 20 73 71 6c 69 74 65 33  LINE int sqlite3
1c550 42 6c 6f 62 43 6f 6d 70 61 72 65 28 63 6f 6e 73  BlobCompare(cons
1c560 74 20 4d 65 6d 20 2a 70 42 31 2c 20 63 6f 6e 73  t Mem *pB1, cons
1c570 74 20 4d 65 6d 20 2a 70 42 32 29 7b 0a 20 20 69  t Mem *pB2){.  i
1c580 6e 74 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70 42  nt c = memcmp(pB
1c590 31 2d 3e 7a 2c 20 70 42 32 2d 3e 7a 2c 20 70 42  1->z, pB2->z, pB
1c5a0 31 2d 3e 6e 3e 70 42 32 2d 3e 6e 20 3f 20 70 42  1->n>pB2->n ? pB
1c5b0 32 2d 3e 6e 20 3a 20 70 42 31 2d 3e 6e 29 3b 0a  2->n : pB1->n);.
1c5c0 20 20 69 66 28 20 63 20 29 20 72 65 74 75 72 6e    if( c ) return
1c5d0 20 63 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 31   c;.  return pB1
1c5e0 2d 3e 6e 20 2d 20 70 42 32 2d 3e 6e 3b 0a 7d 0a  ->n - pB2->n;.}.
1c5f0 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 63 6f 6d 70  ./*.** Do a comp
1c600 61 72 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 61  arison between a
1c610 20 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69   64-bit signed i
1c620 6e 74 65 67 65 72 20 61 6e 64 20 61 20 36 34 2d  nteger and a 64-
1c630 62 69 74 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69  bit floating-poi
1c640 6e 74 0a 2a 2a 20 6e 75 6d 62 65 72 2e 20 20 52  nt.** number.  R
1c650 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20  eturn negative, 
1c660 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76  zero, or positiv
1c670 65 20 69 66 20 74 68 65 20 66 69 72 73 74 20 28  e if the first (
1c680 69 36 34 29 20 69 73 20 6c 65 73 73 20 74 68 61  i64) is less tha
1c690 6e 2c 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 2c 20  n,.** equal to, 
1c6a0 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
1c6b0 74 68 65 20 73 65 63 6f 6e 64 20 28 64 6f 75 62  the second (doub
1c6c0 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  le)..*/.static i
1c6d0 6e 74 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f  nt sqlite3IntFlo
1c6e0 61 74 43 6f 6d 70 61 72 65 28 69 36 34 20 69 2c  atCompare(i64 i,
1c6f0 20 64 6f 75 62 6c 65 20 72 29 7b 0a 20 20 69 66   double r){.  if
1c700 28 20 73 69 7a 65 6f 66 28 4c 4f 4e 47 44 4f 55  ( sizeof(LONGDOU
1c710 42 4c 45 5f 54 59 50 45 29 3e 38 20 29 7b 0a 20  BLE_TYPE)>8 ){. 
1c720 20 20 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59     LONGDOUBLE_TY
1c730 50 45 20 78 20 3d 20 28 4c 4f 4e 47 44 4f 55 42  PE x = (LONGDOUB
1c740 4c 45 5f 54 59 50 45 29 69 3b 0a 20 20 20 20 69  LE_TYPE)i;.    i
1c750 66 28 20 78 3c 72 20 29 20 72 65 74 75 72 6e 20  f( x<r ) return 
1c760 2d 31 3b 0a 20 20 20 20 69 66 28 20 78 3e 72 20  -1;.    if( x>r 
1c770 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20  ) return +1;.   
1c780 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
1c790 73 65 7b 0a 20 20 20 20 69 36 34 20 79 3b 0a 20  se{.    i64 y;. 
1c7a0 20 20 20 64 6f 75 62 6c 65 20 73 3b 0a 20 20 20     double s;.   
1c7b0 20 69 66 28 20 72 3c 2d 39 32 32 33 33 37 32 30   if( r<-92233720
1c7c0 33 36 38 35 34 37 37 35 38 30 38 2e 30 20 29 20  36854775808.0 ) 
1c7d0 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 69  return +1;.    i
1c7e0 66 28 20 72 3e 39 32 32 33 33 37 32 30 33 36 38  f( r>92233720368
1c7f0 35 34 37 37 35 38 30 37 2e 30 20 29 20 72 65 74  54775807.0 ) ret
1c800 75 72 6e 20 2d 31 3b 0a 20 20 20 20 79 20 3d 20  urn -1;.    y = 
1c810 28 69 36 34 29 72 3b 0a 20 20 20 20 69 66 28 20  (i64)r;.    if( 
1c820 69 3c 79 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  i<y ) return -1;
1c830 0a 20 20 20 20 69 66 28 20 69 3e 79 20 29 7b 0a  .    if( i>y ){.
1c840 20 20 20 20 20 20 69 66 28 20 79 3d 3d 53 4d 41        if( y==SMA
1c850 4c 4c 45 53 54 5f 49 4e 54 36 34 20 26 26 20 72  LLEST_INT64 && r
1c860 3e 30 2e 30 20 29 20 72 65 74 75 72 6e 20 2d 31  >0.0 ) return -1
1c870 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2b  ;.      return +
1c880 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 20 3d  1;.    }.    s =
1c890 20 28 64 6f 75 62 6c 65 29 69 3b 0a 20 20 20 20   (double)i;.    
1c8a0 69 66 28 20 73 3c 72 20 29 20 72 65 74 75 72 6e  if( s<r ) return
1c8b0 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 73 3e 72   -1;.    if( s>r
1c8c0 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20   ) return +1;.  
1c8d0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1c8e0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
1c8f0 20 74 68 65 20 76 61 6c 75 65 73 20 63 6f 6e 74   the values cont
1c900 61 69 6e 65 64 20 62 79 20 74 68 65 20 74 77 6f  ained by the two
1c910 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2c 20 72   memory cells, r
1c920 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61  eturning.** nega
1c930 74 69 76 65 2c 20 7a 65 72 6f 20 6f 72 20 70 6f  tive, zero or po
1c940 73 69 74 69 76 65 20 69 66 20 70 4d 65 6d 31 20  sitive if pMem1 
1c950 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
1c960 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74  ual to, or great
1c970 65 72 0a 2a 2a 20 74 68 61 6e 20 70 4d 65 6d 32  er.** than pMem2
1c980 2e 20 53 6f 72 74 69 6e 67 20 6f 72 64 65 72 20  . Sorting order 
1c990 69 73 20 4e 55 4c 4c 27 73 20 66 69 72 73 74 2c  is NULL's first,
1c9a0 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6e 75 6d   followed by num
1c9b0 62 65 72 73 20 28 69 6e 74 65 67 65 72 73 0a 2a  bers (integers.*
1c9c0 2a 20 61 6e 64 20 72 65 61 6c 73 29 20 73 6f 72  * and reals) sor
1c9d0 74 65 64 20 6e 75 6d 65 72 69 63 61 6c 6c 79 2c  ted numerically,
1c9e0 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65 78   followed by tex
1c9f0 74 20 6f 72 64 65 72 65 64 20 62 79 20 74 68 65  t ordered by the
1ca00 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
1ca10 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 61 6e 64  quence pColl and
1ca20 20 66 69 6e 61 6c 6c 79 20 62 6c 6f 62 27 73 20   finally blob's 
1ca30 6f 72 64 65 72 65 64 20 62 79 20 6d 65 6d 63 6d  ordered by memcm
1ca40 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e  p()..**.** Two N
1ca50 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 63  ULL values are c
1ca60 6f 6e 73 69 64 65 72 65 64 20 65 71 75 61 6c 20  onsidered equal 
1ca70 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
1ca80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ca90 4d 65 6d 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74  MemCompare(const
1caa0 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e   Mem *pMem1, con
1cab0 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20 63  st Mem *pMem2, c
1cac0 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43  onst CollSeq *pC
1cad0 6f 6c 6c 29 7b 0a 20 20 69 6e 74 20 66 31 2c 20  oll){.  int f1, 
1cae0 66 32 3b 0a 20 20 69 6e 74 20 63 6f 6d 62 69 6e  f2;.  int combin
1caf0 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 20 66 31 20  ed_flags;..  f1 
1cb00 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a  = pMem1->flags;.
1cb10 20 20 66 32 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c    f2 = pMem2->fl
1cb20 61 67 73 3b 0a 20 20 63 6f 6d 62 69 6e 65 64 5f  ags;.  combined_
1cb30 66 6c 61 67 73 20 3d 20 66 31 7c 66 32 3b 0a 20  flags = f1|f2;. 
1cb40 20 61 73 73 65 72 74 28 20 28 63 6f 6d 62 69 6e   assert( (combin
1cb50 65 64 5f 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  ed_flags & MEM_R
1cb60 6f 77 53 65 74 29 3d 3d 30 20 29 3b 0a 20 0a 20  owSet)==0 );. . 
1cb70 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65   /* If one value
1cb80 20 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69 73 20   is NULL, it is 
1cb90 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6f 74  less than the ot
1cba0 68 65 72 2e 20 49 66 20 62 6f 74 68 20 76 61 6c  her. If both val
1cbb0 75 65 73 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c  ues.  ** are NUL
1cbc0 4c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a  L, return 0..  *
1cbd0 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64  /.  if( combined
1cbe0 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20  _flags&MEM_Null 
1cbf0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 66  ){.    return (f
1cc00 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66  2&MEM_Null) - (f
1cc10 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d  1&MEM_Null);.  }
1cc20 0a 0a 20 20 2f 2a 20 41 74 20 6c 65 61 73 74 20  ..  /* At least 
1cc30 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20 76  one of the two v
1cc40 61 6c 75 65 73 20 69 73 20 61 20 6e 75 6d 62 65  alues is a numbe
1cc50 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d  r.  */.  if( com
1cc60 62 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d  bined_flags&(MEM
1cc70 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29  _Int|MEM_Real) )
1cc80 7b 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20  {.    if( (f1 & 
1cc90 66 32 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30  f2 & MEM_Int)!=0
1cca0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d   ){.      if( pM
1ccb0 65 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32  em1->u.i < pMem2
1ccc0 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2d  ->u.i ) return -
1ccd0 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  1;.      if( pMe
1cce0 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d  m1->u.i > pMem2-
1ccf0 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2b 31  >u.i ) return +1
1cd00 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
1cd10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1cd20 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 52  (f1 & f2 & MEM_R
1cd30 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eal)!=0 ){.     
1cd40 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20   if( pMem1->u.r 
1cd50 3c 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72  < pMem2->u.r ) r
1cd60 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
1cd70 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3e  if( pMem1->u.r >
1cd80 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65   pMem2->u.r ) re
1cd90 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72  turn +1;.      r
1cda0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
1cdb0 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 49     if( (f1&MEM_I
1cdc0 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  nt)!=0 ){.      
1cdd0 69 66 28 20 28 66 32 26 4d 45 4d 5f 52 65 61 6c  if( (f2&MEM_Real
1cde0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1cdf0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e  return sqlite3In
1ce00 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d  tFloatCompare(pM
1ce10 65 6d 31 2d 3e 75 2e 69 2c 20 70 4d 65 6d 32 2d  em1->u.i, pMem2-
1ce20 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >u.r);.      }el
1ce30 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  se{.        retu
1ce40 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20  rn -1;.      }. 
1ce50 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31     }.    if( (f1
1ce60 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b  &MEM_Real)!=0 ){
1ce70 0a 20 20 20 20 20 20 69 66 28 20 28 66 32 26 4d  .      if( (f2&M
1ce80 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20  EM_Int)!=0 ){.  
1ce90 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 73 71        return -sq
1cea0 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d  lite3IntFloatCom
1ceb0 70 61 72 65 28 70 4d 65 6d 32 2d 3e 75 2e 69 2c  pare(pMem2->u.i,
1cec0 20 70 4d 65 6d 31 2d 3e 75 2e 72 29 3b 0a 20 20   pMem1->u.r);.  
1ced0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1cee0 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
1cef0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1cf00 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 7d 0a 0a  return +1;.  }..
1cf10 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75    /* If one valu
1cf20 65 20 69 73 20 61 20 73 74 72 69 6e 67 20 61 6e  e is a string an
1cf30 64 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 61  d the other is a
1cf40 20 62 6c 6f 62 2c 20 74 68 65 20 73 74 72 69 6e   blob, the strin
1cf50 67 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20  g is less..  ** 
1cf60 49 66 20 62 6f 74 68 20 61 72 65 20 73 74 72 69  If both are stri
1cf70 6e 67 73 2c 20 63 6f 6d 70 61 72 65 20 75 73 69  ngs, compare usi
1cf80 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ng the collating
1cf90 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f   functions..  */
1cfa0 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f  .  if( combined_
1cfb0 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b  flags&MEM_Str ){
1cfc0 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20 4d  .    if( (f1 & M
1cfd0 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20  EM_Str)==0 ){.  
1cfe0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1cff0 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 32 20    }.    if( (f2 
1d000 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b  & MEM_Str)==0 ){
1d010 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
1d020 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  ;.    }..    ass
1d030 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d  ert( pMem1->enc=
1d040 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20 7c 7c 20 70  =pMem2->enc || p
1d050 4d 65 6d 31 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  Mem1->db->malloc
1d060 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 61 73  Failed );.    as
1d070 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63  sert( pMem1->enc
1d080 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c  ==SQLITE_UTF8 ||
1d090 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d   .            pM
1d0a0 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  em1->enc==SQLITE
1d0b0 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d 65 6d  _UTF16LE || pMem
1d0c0 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  1->enc==SQLITE_U
1d0d0 54 46 31 36 42 45 20 29 3b 0a 0a 20 20 20 20 2f  TF16BE );..    /
1d0e0 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  * The collation 
1d0f0 73 65 71 75 65 6e 63 65 20 6d 75 73 74 20 62 65  sequence must be
1d100 20 64 65 66 69 6e 65 64 20 61 74 20 74 68 69 73   defined at this
1d110 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69 66 0a   point, even if.
1d120 20 20 20 20 2a 2a 20 74 68 65 20 75 73 65 72 20      ** the user 
1d130 64 65 6c 65 74 65 73 20 74 68 65 20 63 6f 6c 6c  deletes the coll
1d140 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 61  ation sequence a
1d150 66 74 65 72 20 74 68 65 20 76 64 62 65 20 70 72  fter the vdbe pr
1d160 6f 67 72 61 6d 20 69 73 0a 20 20 20 20 2a 2a 20  ogram is.    ** 
1d170 63 6f 6d 70 69 6c 65 64 20 28 74 68 69 73 20 77  compiled (this w
1d180 61 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 74 68  as not always th
1d190 65 20 63 61 73 65 29 2e 0a 20 20 20 20 2a 2f 0a  e case)..    */.
1d1a0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 43 6f      assert( !pCo
1d1b0 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43 6d  ll || pColl->xCm
1d1c0 70 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 43  p );..    if( pC
1d1d0 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74  oll ){.      ret
1d1e0 75 72 6e 20 76 64 62 65 43 6f 6d 70 61 72 65 4d  urn vdbeCompareM
1d1f0 65 6d 53 74 72 69 6e 67 28 70 4d 65 6d 31 2c 20  emString(pMem1, 
1d200 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20 30 29  pMem2, pColl, 0)
1d210 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49  ;.    }.    /* I
1d220 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  f a NULL pointer
1d230 20 77 61 73 20 70 61 73 73 65 64 20 61 73 20 74   was passed as t
1d240 68 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e 63 74  he collate funct
1d250 69 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67  ion, fall throug
1d260 68 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20  h.    ** to the 
1d270 62 6c 6f 62 20 63 61 73 65 20 61 6e 64 20 75 73  blob case and us
1d280 65 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a  e memcmp().  */.
1d290 20 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74 68 20    }. .  /* Both 
1d2a0 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 62  values must be b
1d2b0 6c 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65 20 75  lobs.  Compare u
1d2c0 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 20  sing memcmp().  
1d2d0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  */.  return sqli
1d2e0 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70  te3BlobCompare(p
1d2f0 4d 65 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a 7d 0a  Mem1, pMem2);.}.
1d300 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ../*.** The firs
1d310 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
1d320 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
1d330 6f 6e 20 69 73 20 61 20 73 65 72 69 61 6c 2d 74  on is a serial-t
1d340 79 70 65 20 74 68 61 74 0a 2a 2a 20 63 6f 72 72  ype that.** corr
1d350 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 69 6e  esponds to an in
1d360 74 65 67 65 72 20 2d 20 61 6c 6c 20 76 61 6c 75  teger - all valu
1d370 65 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  es between 1 and
1d380 20 39 20 69 6e 63 6c 75 73 69 76 65 20 0a 2a 2a   9 inclusive .**
1d390 20 65 78 63 65 70 74 20 37 2e 20 54 68 65 20 73   except 7. The s
1d3a0 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20  econd points to 
1d3b0 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
1d3c0 69 6e 67 20 61 6e 20 69 6e 74 65 67 65 72 20 76  ing an integer v
1d3d0 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61 6c 69 7a  alue.** serializ
1d3e0 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ed according to 
1d3f0 73 65 72 69 61 6c 5f 74 79 70 65 2e 20 54 68 69  serial_type. Thi
1d400 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72  s function deser
1d410 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64 20 72  ializes.** and r
1d420 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65  eturns the value
1d430 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20  ..*/.static i64 
1d440 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65  vdbeRecordDecode
1d450 49 6e 74 28 75 33 32 20 73 65 72 69 61 6c 5f 74  Int(u32 serial_t
1d460 79 70 65 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61  ype, const u8 *a
1d470 4b 65 79 29 7b 0a 20 20 75 33 32 20 79 3b 0a 20  Key){.  u32 y;. 
1d480 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
1d490 5f 44 42 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74  _DB || (serial_t
1d4a0 79 70 65 3e 3d 31 20 26 26 20 73 65 72 69 61 6c  ype>=1 && serial
1d4b0 5f 74 79 70 65 3c 3d 39 20 26 26 20 73 65 72 69  _type<=9 && seri
1d4c0 61 6c 5f 74 79 70 65 21 3d 37 29 20 29 3b 0a 20  al_type!=7) );. 
1d4d0 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f   switch( serial_
1d4e0 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
1d4f0 20 30 3a 0a 20 20 20 20 63 61 73 65 20 31 3a 0a   0:.    case 1:.
1d500 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1d510 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1d520 20 20 20 20 20 20 72 65 74 75 72 6e 20 4f 4e 45        return ONE
1d530 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
1d540 0a 20 20 20 20 63 61 73 65 20 32 3a 0a 20 20 20  .    case 2:.   
1d550 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1d560 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1d570 20 20 20 72 65 74 75 72 6e 20 54 57 4f 5f 42 59     return TWO_BY
1d580 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1d590 20 20 63 61 73 65 20 33 3a 0a 20 20 20 20 20 20    case 3:.      
1d5a0 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
1d5b0 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
1d5c0 72 65 74 75 72 6e 20 54 48 52 45 45 5f 42 59 54  return THREE_BYT
1d5d0 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1d5e0 20 63 61 73 65 20 34 3a 20 7b 0a 20 20 20 20 20   case 4: {.     
1d5f0 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
1d600 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
1d610 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   y = FOUR_BYTE_U
1d620 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
1d630 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69   return (i64)*(i
1d640 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d 0a 20 20  nt*)&y;.    }.  
1d650 20 20 63 61 73 65 20 35 3a 20 7b 0a 20 20 20 20    case 5: {.    
1d660 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1d670 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1d680 20 20 72 65 74 75 72 6e 20 46 4f 55 52 5f 42 59    return FOUR_BY
1d690 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20  TE_UINT(aKey+2) 
1d6a0 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29  + (((i64)1)<<32)
1d6b0 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b  *TWO_BYTE_INT(aK
1d6c0 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  ey);.    }.    c
1d6d0 61 73 65 20 36 3a 20 7b 0a 20 20 20 20 20 20 75  ase 6: {.      u
1d6e0 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45  64 x = FOUR_BYTE
1d6f0 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
1d700 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1d710 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1d720 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c     x = (x<<32) |
1d730 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1d740 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 72  aKey+4);.      r
1d750 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69 36 34  eturn (i64)*(i64
1d760 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  *)&x;.    }.  }.
1d770 0a 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61  .  return (seria
1d780 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a  l_type - 8);.}..
1d790 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1d7a0 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65  ion compares the
1d7b0 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20   two table rows 
1d7c0 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  or index records
1d7d0 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79  .** specified by
1d7e0 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20   {nKey1, pKey1} 
1d7f0 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20  and pPKey2.  It 
1d800 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69  returns a negati
1d810 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70  ve, zero.** or p
1d820 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20  ositive integer 
1d830 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20  if key1 is less 
1d840 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f  than, equal to o
1d850 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68  r .** greater th
1d860 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e  an key2.  The {n
1d870 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79  Key1, pKey1} key
1d880 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a   must be a blob.
1d890 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ** created by th
1d8a0 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  e OP_MakeRecord 
1d8b0 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44  opcode of the VD
1d8c0 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a  BE.  The pPKey2.
1d8d0 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61  ** key must be a
1d8e0 20 70 61 72 73 65 64 20 6b 65 79 20 73 75 63 68   parsed key such
1d8f0 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   as obtained fro
1d900 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  m.** sqlite3Vdbe
1d910 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a  ParseRecord..**.
1d920 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62  ** If argument b
1d930 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Skip is non-zero
1d940 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  , it is assumed 
1d950 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
1d960 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 64  has already.** d
1d970 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74  etermined that t
1d980 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20  he first fields 
1d990 6f 66 20 74 68 65 20 6b 65 79 73 20 61 72 65 20  of the keys are 
1d9a0 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79  equal..**.** Key
1d9b0 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f  1 and Key2 do no
1d9c0 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69  t have to contai
1d9d0 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  n the same numbe
1d9e0 72 20 6f 66 20 66 69 65 6c 64 73 2e 20 49 66 20  r of fields. If 
1d9f0 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73 20 74  all .** fields t
1da00 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 62 6f  hat appear in bo
1da10 74 68 20 6b 65 79 73 20 61 72 65 20 65 71 75 61  th keys are equa
1da20 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79 32 2d 3e  l, then pPKey2->
1da30 64 65 66 61 75 6c 74 5f 72 63 20 69 73 20 0a 2a  default_rc is .*
1da40 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  * returned..**.*
1da50 2a 20 49 66 20 64 61 74 61 62 61 73 65 20 63 6f  * If database co
1da60 72 72 75 70 74 69 6f 6e 20 69 73 20 64 69 73 63  rruption is disc
1da70 6f 76 65 72 65 64 2c 20 73 65 74 20 70 50 4b 65  overed, set pPKe
1da80 79 32 2d 3e 65 72 72 43 6f 64 65 20 74 6f 20 0a  y2->errCode to .
1da90 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ** SQLITE_CORRUP
1daa0 54 20 61 6e 64 20 72 65 74 75 72 6e 20 30 2e 20  T and return 0. 
1dab0 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
1dac0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
1dad0 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e 65 72 72 43  .** pPKey2->errC
1dae0 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 53 51  ode is set to SQ
1daf0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 2c 20  LITE_NOMEM and, 
1db00 69 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c  if it is not NUL
1db10 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c 6f 63  L, the.** malloc
1db20 2d 66 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74  -failed flag set
1db30 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e   on database han
1db40 64 6c 65 20 28 70 50 4b 65 79 32 2d 3e 70 4b 65  dle (pPKey2->pKe
1db50 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a 69  yInfo->db)..*/.i
1db60 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  nt sqlite3VdbeRe
1db70 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53  cordCompareWithS
1db80 6b 69 70 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31  kip(.  int nKey1
1db90 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
1dba0 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b  ey1,   /* Left k
1dbb0 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ey */.  Unpacked
1dbc0 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20  Record *pPKey2, 
1dbd0 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
1dbe0 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 53   key */.  int bS
1dbf0 6b 69 70 20 20 20 20 20 20 20 20 20 20 20 20 20  kip             
1dc00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1dc10 74 72 75 65 2c 20 73 6b 69 70 20 74 68 65 20 66  true, skip the f
1dc20 69 72 73 74 20 66 69 65 6c 64 20 2a 2f 0a 29 7b  irst field */.){
1dc30 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 20  .  u32 d1;      
1dc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc50 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
1dc60 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
1dc70 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f   data element */
1dc80 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
1dc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dca0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e     /* Index of n
1dcb0 65 78 74 20 66 69 65 6c 64 20 74 6f 20 63 6f 6d  ext field to com
1dcc0 70 61 72 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a  pare */.  u32 sz
1dcd0 48 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  Hdr1;           
1dce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1dcf0 65 20 6f 66 20 72 65 63 6f 72 64 20 68 65 61 64  e of record head
1dd00 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  er in bytes */. 
1dd10 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20   u32 idx1;      
1dd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd30 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69   /* Offset of fi
1dd40 72 73 74 20 74 79 70 65 20 69 6e 20 68 65 61 64  rst type in head
1dd50 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  er */.  int rc =
1dd60 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1dd70 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1dd80 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d  n value */.  Mem
1dd90 20 2a 70 52 68 73 20 3d 20 70 50 4b 65 79 32 2d   *pRhs = pPKey2-
1dda0 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20  >aMem;       /* 
1ddb0 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20 70 50  Next field of pP
1ddc0 4b 65 79 32 20 74 6f 20 63 6f 6d 70 61 72 65 20  Key2 to compare 
1ddd0 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
1dde0 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d  eyInfo = pPKey2-
1ddf0 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 63 6f 6e  >pKeyInfo;.  con
1de00 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1de10 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74   *aKey1 = (const
1de20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1de30 29 70 4b 65 79 31 3b 0a 20 20 4d 65 6d 20 6d 65  )pKey1;.  Mem me
1de40 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 62 53 6b  m1;..  /* If bSk
1de50 69 70 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ip is true, then
1de60 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
1de70 61 6c 72 65 61 64 79 20 64 65 74 65 72 6d 69 6e  already determin
1de80 65 64 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ed that the firs
1de90 74 0a 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65  t.  ** two eleme
1dea0 6e 74 73 20 69 6e 20 74 68 65 20 6b 65 79 73 20  nts in the keys 
1deb0 61 72 65 20 65 71 75 61 6c 2e 20 46 69 78 20 74  are equal. Fix t
1dec0 68 65 20 76 61 72 69 6f 75 73 20 73 74 61 63 6b  he various stack
1ded0 20 76 61 72 69 61 62 6c 65 73 20 73 6f 0a 20 20   variables so.  
1dee0 2a 2a 20 74 68 61 74 20 74 68 69 73 20 72 6f 75  ** that this rou
1def0 74 69 6e 65 20 62 65 67 69 6e 73 20 63 6f 6d 70  tine begins comp
1df00 61 72 69 6e 67 20 61 74 20 74 68 65 20 73 65 63  aring at the sec
1df10 6f 6e 64 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20  ond field. */.  
1df20 69 66 28 20 62 53 6b 69 70 20 29 7b 0a 20 20 20  if( bSkip ){.   
1df30 20 75 33 32 20 73 31 3b 0a 20 20 20 20 69 64 78   u32 s1;.    idx
1df40 31 20 3d 20 31 20 2b 20 67 65 74 56 61 72 69 6e  1 = 1 + getVarin
1df50 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73  t32(&aKey1[1], s
1df60 31 29 3b 0a 20 20 20 20 73 7a 48 64 72 31 20 3d  1);.    szHdr1 =
1df70 20 61 4b 65 79 31 5b 30 5d 3b 0a 20 20 20 20 64   aKey1[0];.    d
1df80 31 20 3d 20 73 7a 48 64 72 31 20 2b 20 73 71 6c  1 = szHdr1 + sql
1df90 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1dfa0 70 65 4c 65 6e 28 73 31 29 3b 0a 20 20 20 20 69  peLen(s1);.    i
1dfb0 20 3d 20 31 3b 0a 20 20 20 20 70 52 68 73 2b 2b   = 1;.    pRhs++
1dfc0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1dfd0 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33  dx1 = getVarint3
1dfe0 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29  2(aKey1, szHdr1)
1dff0 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72  ;.    d1 = szHdr
1e000 31 3b 0a 20 20 20 20 69 66 28 20 64 31 3e 28 75  1;.    if( d1>(u
1e010 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b  nsigned)nKey1 ){
1e020 20 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e   .      pPKey2->
1e030 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51  errCode = (u8)SQ
1e040 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1e050 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T;.      return 
1e060 30 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f  0;  /* Corruptio
1e070 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69  n */.    }.    i
1e080 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 56 56 41   = 0;.  }..  VVA
1e090 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61  _ONLY( mem1.szMa
1e0a0 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f  lloc = 0; ) /* O
1e0b0 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73  nly needed by as
1e0c0 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
1e0d0 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  s */.  assert( p
1e0e0 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
1e0f0 3e 6e 46 69 65 6c 64 2b 70 50 4b 65 79 32 2d 3e  >nField+pPKey2->
1e100 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c  pKeyInfo->nXFiel
1e110 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c  d>=pPKey2->nFiel
1e120 64 20 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52  d .       || COR
1e130 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
1e140 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ert( pPKey2->pKe
1e150 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
1e160 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
1e170 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  ( pPKey2->pKeyIn
1e180 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a  fo->nField>0 );.
1e190 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d    assert( idx1<=
1e1a0 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50  szHdr1 || CORRUP
1e1b0 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  T_DB );.  do{.  
1e1c0 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
1e1d0 65 3b 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69  e;..    /* RHS i
1e1e0 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a  s an integer */.
1e1f0 20 20 20 20 69 66 28 20 70 52 68 73 2d 3e 66 6c      if( pRhs->fl
1e200 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b  ags & MEM_Int ){
1e210 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79  .      serial_ty
1e220 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d  pe = aKey1[idx1]
1e230 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e240 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31  ( serial_type==1
1e250 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  2 );.      if( s
1e260 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29  erial_type>=10 )
1e270 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b  {.        rc = +
1e280 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
1e290 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
1e2a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
1e2b0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
1e2c0 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70  e if( serial_typ
1e2d0 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20  e==7 ){.        
1e2e0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1e2f0 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c  lGet(&aKey1[d1],
1e300 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d   serial_type, &m
1e310 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63  em1);.        rc
1e320 20 3d 20 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c   = -sqlite3IntFl
1e330 6f 61 74 43 6f 6d 70 61 72 65 28 70 52 68 73 2d  oatCompare(pRhs-
1e340 3e 75 2e 69 2c 20 6d 65 6d 31 2e 75 2e 72 29 3b  >u.i, mem1.u.r);
1e350 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1e360 20 20 20 20 20 20 69 36 34 20 6c 68 73 20 3d 20        i64 lhs = 
1e370 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65  vdbeRecordDecode
1e380 49 6e 74 28 73 65 72 69 61 6c 5f 74 79 70 65 2c  Int(serial_type,
1e390 20 26 61 4b 65 79 31 5b 64 31 5d 29 3b 0a 20 20   &aKey1[d1]);.  
1e3a0 20 20 20 20 20 20 69 36 34 20 72 68 73 20 3d 20        i64 rhs = 
1e3b0 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20  pRhs->u.i;.     
1e3c0 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73 20 29     if( lhs<rhs )
1e3d0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1e3e0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   -1;.        }el
1e3f0 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73 20 29  se if( lhs>rhs )
1e400 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1e410 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   +1;.        }. 
1e420 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1e430 20 20 2f 2a 20 52 48 53 20 69 73 20 72 65 61 6c    /* RHS is real
1e440 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28   */.    else if(
1e450 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d   pRhs->flags & M
1e460 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20  EM_Real ){.     
1e470 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61   serial_type = a
1e480 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20  Key1[idx1];.    
1e490 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1e4a0 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 20  e>=10 ){.       
1e4b0 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 73   /* Serial types
1e4c0 20 31 32 20 6f 72 20 67 72 65 61 74 65 72 20 61   12 or greater a
1e4d0 72 65 20 73 74 72 69 6e 67 73 20 61 6e 64 20 62  re strings and b
1e4e0 6c 6f 62 73 20 28 67 72 65 61 74 65 72 20 74 68  lobs (greater th
1e4f0 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  an.        ** nu
1e500 6d 62 65 72 73 29 2e 20 54 79 70 65 73 20 31 30  mbers). Types 10
1e510 20 61 6e 64 20 31 31 20 61 72 65 20 63 75 72 72   and 11 are curr
1e520 65 6e 74 6c 79 20 22 72 65 73 65 72 76 65 64 20  ently "reserved 
1e530 66 6f 72 20 66 75 74 75 72 65 20 0a 20 20 20 20  for future .    
1e540 20 20 20 20 2a 2a 20 75 73 65 22 2c 20 73 6f 20      ** use", so 
1e550 69 74 20 64 6f 65 73 6e 27 74 20 72 65 61 6c 6c  it doesn't reall
1e560 79 20 6d 61 74 74 65 72 20 77 68 61 74 20 74 68  y matter what th
1e570 65 20 72 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d  e results of com
1e580 70 61 72 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  paring.        *
1e590 2a 20 74 68 65 6d 20 74 6f 20 6e 75 6d 62 65 72  * them to number
1e5a0 69 63 20 76 61 6c 75 65 73 20 61 72 65 2e 20 20  ic values are.  
1e5b0 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
1e5c0 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  +1;.      }else 
1e5d0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
1e5e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1e5f0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
1e600 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
1e610 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1e620 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72  (&aKey1[d1], ser
1e630 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29  ial_type, &mem1)
1e640 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 65  ;.        if( se
1e650 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a  rial_type==7 ){.
1e660 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 65            if( me
1e670 6d 31 2e 75 2e 72 3c 70 52 68 73 2d 3e 75 2e 72  m1.u.r<pRhs->u.r
1e680 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e690 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  rc = -1;.       
1e6a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d     }else if( mem
1e6b0 31 2e 75 2e 72 3e 70 52 68 73 2d 3e 75 2e 72 20  1.u.r>pRhs->u.r 
1e6c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1e6d0 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20  c = +1;.        
1e6e0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
1e6f0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e{.          rc 
1e700 3d 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61  = sqlite3IntFloa
1e710 74 43 6f 6d 70 61 72 65 28 6d 65 6d 31 2e 75 2e  tCompare(mem1.u.
1e720 69 2c 20 70 52 68 73 2d 3e 75 2e 72 29 3b 0a 20  i, pRhs->u.r);. 
1e730 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1e740 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
1e750 48 53 20 69 73 20 61 20 73 74 72 69 6e 67 20 2a  HS is a string *
1e760 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70  /.    else if( p
1e770 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Rhs->flags & MEM
1e780 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 67 65  _Str ){.      ge
1e790 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31  tVarint32(&aKey1
1e7a0 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74  [idx1], serial_t
1e7b0 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ype);.      test
1e7c0 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70  case( serial_typ
1e7d0 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69  e==12 );.      i
1e7e0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31  f( serial_type<1
1e7f0 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  2 ){.        rc 
1e800 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
1e810 65 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74  e if( !(serial_t
1e820 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20  ype & 0x01) ){. 
1e830 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a         rc = +1;.
1e840 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e850 20 20 20 20 20 6d 65 6d 31 2e 6e 20 3d 20 28 73       mem1.n = (s
1e860 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29  erial_type - 12)
1e870 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65   / 2;.        te
1e880 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31  stcase( (d1+mem1
1e890 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e  .n)==(unsigned)n
1e8a0 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20  Key1 );.        
1e8b0 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65  testcase( (d1+me
1e8c0 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69 67 6e  m1.n+1)==(unsign
1e8d0 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20  ed)nKey1 );.    
1e8e0 20 20 20 20 69 66 28 20 28 64 31 2b 6d 65 6d 31      if( (d1+mem1
1e8f0 2e 6e 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29  .n) > (unsigned)
1e900 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20  nKey1 ){.       
1e910 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f     pPKey2->errCo
1e920 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f  de = (u8)SQLITE_
1e930 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1e940 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
1e950 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e960 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a   /* Corruption *
1e970 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  /.        }else 
1e980 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  if( pKeyInfo->aC
1e990 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  oll[i] ){.      
1e9a0 20 20 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70      mem1.enc = p
1e9b0 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20  KeyInfo->enc;.  
1e9c0 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 64 62 20          mem1.db 
1e9d0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
1e9e0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 66            mem1.f
1e9f0 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a  lags = MEM_Str;.
1ea00 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 7a            mem1.z
1ea10 20 3d 20 28 63 68 61 72 2a 29 26 61 4b 65 79 31   = (char*)&aKey1
1ea20 5b 64 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [d1];.          
1ea30 72 63 20 3d 20 76 64 62 65 43 6f 6d 70 61 72 65  rc = vdbeCompare
1ea40 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 20 20 20  MemString(.     
1ea50 20 20 20 20 20 20 20 20 20 26 6d 65 6d 31 2c 20           &mem1, 
1ea60 70 52 68 73 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e  pRhs, pKeyInfo->
1ea70 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b 65 79  aColl[i], &pPKey
1ea80 32 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20  2->errCode.     
1ea90 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
1eaa0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1eab0 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28   int nCmp = MIN(
1eac0 6d 65 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29  mem1.n, pRhs->n)
1ead0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1eae0 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64   memcmp(&aKey1[d
1eaf0 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d  1], pRhs->z, nCm
1eb00 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  p);.          if
1eb10 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6d  ( rc==0 ) rc = m
1eb20 65 6d 31 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b  em1.n - pRhs->n;
1eb30 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
1eb40 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1eb50 2a 20 52 48 53 20 69 73 20 61 20 62 6c 6f 62 20  * RHS is a blob 
1eb60 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  */.    else if( 
1eb70 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pRhs->flags & ME
1eb80 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20  M_Blob ){.      
1eb90 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
1eba0 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c  y1[idx1], serial
1ebb0 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65  _type);.      te
1ebc0 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74  stcase( serial_t
1ebd0 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20  ype==12 );.     
1ebe0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1ebf0 3c 31 32 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74  <12 || (serial_t
1ec00 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20  ype & 0x01) ){. 
1ec10 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
1ec20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ec30 20 20 20 20 20 69 6e 74 20 6e 53 74 72 20 3d 20       int nStr = 
1ec40 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31  (serial_type - 1
1ec50 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20  2) / 2;.        
1ec60 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53  testcase( (d1+nS
1ec70 74 72 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e  tr)==(unsigned)n
1ec80 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20  Key1 );.        
1ec90 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53  testcase( (d1+nS
1eca0 74 72 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64  tr+1)==(unsigned
1ecb0 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20  )nKey1 );.      
1ecc0 20 20 69 66 28 20 28 64 31 2b 6e 53 74 72 29 20    if( (d1+nStr) 
1ecd0 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  > (unsigned)nKey
1ece0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  1 ){.          p
1ecf0 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d  PKey2->errCode =
1ed00 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52   (u8)SQLITE_CORR
1ed10 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1ed20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1ed30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ed40 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  Corruption */.  
1ed50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ed60 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20         int nCmp 
1ed70 3d 20 4d 49 4e 28 6e 53 74 72 2c 20 70 52 68 73  = MIN(nStr, pRhs
1ed80 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ->n);.          
1ed90 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65  rc = memcmp(&aKe
1eda0 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c  y1[d1], pRhs->z,
1edb0 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20   nCmp);.        
1edc0 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63    if( rc==0 ) rc
1edd0 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e   = nStr - pRhs->
1ede0 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
1edf0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1ee00 2f 2a 20 52 48 53 20 69 73 20 6e 75 6c 6c 20 2a  /* RHS is null *
1ee10 2f 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  /.    else{.    
1ee20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20    serial_type = 
1ee30 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20  aKey1[idx1];.   
1ee40 20 20 20 72 63 20 3d 20 28 73 65 72 69 61 6c 5f     rc = (serial_
1ee50 74 79 70 65 21 3d 30 29 3b 0a 20 20 20 20 7d 0a  type!=0);.    }.
1ee60 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29  .    if( rc!=0 )
1ee70 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79  {.      if( pKey
1ee80 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
1ee90 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  [i] ){.        r
1eea0 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d  c = -rc;.      }
1eeb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 76  .      assert( v
1eec0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1eed0 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65  Debug(nKey1, pKe
1eee0 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 63 29 20  y1, pPKey2, rc) 
1eef0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1ef00 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d   mem1.szMalloc==
1ef10 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d  0 );  /* See com
1ef20 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20  ment below */.  
1ef30 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1ef40 20 20 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b 0a 20     }..    i++;. 
1ef50 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 20 20 64     pRhs++;.    d
1ef60 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  1 += sqlite3Vdbe
1ef70 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
1ef80 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
1ef90 69 64 78 31 20 2b 3d 20 73 71 6c 69 74 65 33 56  idx1 += sqlite3V
1efa0 61 72 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c 5f  arintLen(serial_
1efb0 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28  type);.  }while(
1efc0 20 69 64 78 31 3c 28 75 6e 73 69 67 6e 65 64 29   idx1<(unsigned)
1efd0 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65  szHdr1 && i<pPKe
1efe0 79 32 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64 31  y2->nField && d1
1eff0 3c 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  <=(unsigned)nKey
1f000 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65  1 );..  /* No me
1f010 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
1f020 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20  is ever used on 
1f030 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69  mem1.  Prove thi
1f040 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65  s using.  ** the
1f050 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
1f060 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73 73  t().  If the ass
1f070 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20  ert() fails, it 
1f080 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a  indicates a.  **
1f090 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64   memory leak and
1f0a0 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20   a need to call 
1f0b0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
1f0c0 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 20 20 2a  lease(&mem1).  *
1f0d0 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31  /.  assert( mem1
1f0e0 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  .szMalloc==0 );.
1f0f0 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65  .  /* rc==0 here
1f100 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20   means that one 
1f110 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20 6b  or both of the k
1f120 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66  eys ran out of f
1f130 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61  ields and.  ** a
1f140 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70  ll the fields up
1f150 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77   to that point w
1f160 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72  ere equal. Retur
1f170 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63  n the default_rc
1f180 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f  .  ** value.  */
1f190 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
1f1a0 50 54 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c  PT_DB .       ||
1f1b0 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1f1c0 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70  reDebug(nKey1, p
1f1d0 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 70 50  Key1, pPKey2, pP
1f1e0 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
1f1f0 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4b 65  ) .       || pKe
1f200 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  yInfo->db->mallo
1f210 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 70  cFailed.  );.  p
1f220 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20  PKey2->eqSeen = 
1f230 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 4b 65  1;.  return pPKe
1f240 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a  y2->default_rc;.
1f250 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
1f260 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a  eRecordCompare(.
1f270 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
1f280 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
1f290 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f    /* Left key */
1f2a0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
1f2b0 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20  d *pPKey2       
1f2c0 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20     /* Right key 
1f2d0 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  */.){.  return s
1f2e0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1f2f0 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28  CompareWithSkip(
1f300 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1f310 4b 65 79 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a  Key2, 0);.}.../*
1f320 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1f330 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65  n is an optimize
1f340 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  d version of sql
1f350 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1f360 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74  mpare() .** that
1f370 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20 66   (a) the first f
1f380 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69  ield of pPKey2 i
1f390 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 61 6e  s an integer, an
1f3a0 64 20 28 62 29 20 74 68 65 20 0a 2a 2a 20 73 69  d (b) the .** si
1f3b0 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72  ze-of-header var
1f3c0 69 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74  int at the start
1f3d0 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31   of (pKey1/nKey1
1f3e0 29 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67  ) fits in a sing
1f3f0 6c 65 0a 2a 2a 20 62 79 74 65 20 28 69 2e 65 2e  le.** byte (i.e.
1f400 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32   is less than 12
1f410 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f  8)..**.** To avo
1f420 69 64 20 63 6f 6e 63 65 72 6e 73 20 61 62 6f 75  id concerns abou
1f430 74 20 62 75 66 66 65 72 20 6f 76 65 72 72 65 61  t buffer overrea
1f440 64 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ds, this routine
1f450 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 0a 2a 2a   is only used.**
1f460 20 6f 6e 20 73 63 68 65 6d 61 73 20 77 68 65 72   on schemas wher
1f470 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61  e the maximum va
1f480 6c 69 64 20 68 65 61 64 65 72 20 73 69 7a 65 20  lid header size 
1f490 69 73 20 36 33 20 62 79 74 65 73 20 6f 72 20 6c  is 63 bytes or l
1f4a0 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ess..*/.static i
1f4b0 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  nt vdbeRecordCom
1f4c0 70 61 72 65 49 6e 74 28 0a 20 20 69 6e 74 20 6e  pareInt(.  int n
1f4d0 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
1f4e0 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74   *pKey1, /* Left
1f4f0 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
1f500 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
1f510 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
1f520 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e   key */.){.  con
1f530 73 74 20 75 38 20 2a 61 4b 65 79 20 3d 20 26 28  st u8 *aKey = &(
1f540 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31  (const u8*)pKey1
1f550 29 5b 2a 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b  )[*(const u8*)pK
1f560 65 79 31 20 26 20 30 78 33 46 5d 3b 0a 20 20 69  ey1 & 0x3F];.  i
1f570 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d  nt serial_type =
1f580 20 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65   ((const u8*)pKe
1f590 79 31 29 5b 31 5d 3b 0a 20 20 69 6e 74 20 72 65  y1)[1];.  int re
1f5a0 73 3b 0a 20 20 75 33 32 20 79 3b 0a 20 20 75 36  s;.  u32 y;.  u6
1f5b0 34 20 78 3b 0a 20 20 69 36 34 20 76 20 3d 20 70  4 x;.  i64 v = p
1f5c0 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75  PKey2->aMem[0].u
1f5d0 2e 69 3b 0a 20 20 69 36 34 20 6c 68 73 3b 0a 0a  .i;.  i64 lhs;..
1f5e0 20 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c    vdbeAssertFiel
1f5f0 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69  dCountWithinLimi
1f600 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ts(nKey1, pKey1,
1f610 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1f620 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a  o);.  assert( (*
1f630 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d 30 78 33  (u8*)pKey1)<=0x3
1f640 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  F || CORRUPT_DB 
1f650 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72  );.  switch( ser
1f660 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20  ial_type ){.    
1f670 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62  case 1: { /* 1-b
1f680 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1f690 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20  er */.      lhs 
1f6a0 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61  = ONE_BYTE_INT(a
1f6b0 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
1f6c0 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
1f6d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f6e0 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20  }.    case 2: { 
1f6f0 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 2-byte signed
1f700 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1f710 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42 59 54 45    lhs = TWO_BYTE
1f720 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1f730 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
1f740 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1f750 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1f760 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20   3: { /* 3-byte 
1f770 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1f780 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54 48  /.      lhs = TH
1f790 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  REE_BYTE_INT(aKe
1f7a0 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
1f7b0 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
1f7c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f7d0 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a      case 4: { /*
1f7e0 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   4-byte signed i
1f7f0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1f800 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  y = FOUR_BYTE_UI
1f810 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1f820 6c 68 73 20 3d 20 28 69 36 34 29 2a 28 69 6e 74  lhs = (i64)*(int
1f830 2a 29 26 79 3b 0a 20 20 20 20 20 20 74 65 73 74  *)&y;.      test
1f840 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
1f850 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f860 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20  }.    case 5: { 
1f870 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 6-byte signed
1f880 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1f890 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f 42 59 54    lhs = FOUR_BYT
1f8a0 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b  E_UINT(aKey+2) +
1f8b0 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a   (((i64)1)<<32)*
1f8c0 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  TWO_BYTE_INT(aKe
1f8d0 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
1f8e0 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
1f8f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f900 20 20 20 20 63 61 73 65 20 36 3a 20 7b 20 2f 2a      case 6: { /*
1f910 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   8-byte signed i
1f920 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1f930 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  x = FOUR_BYTE_UI
1f940 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1f950 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f  x = (x<<32) | FO
1f960 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
1f970 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c 68 73 20  y+4);.      lhs 
1f980 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20  = *(i64*)&x;.   
1f990 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
1f9a0 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
1f9b0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1f9c0 65 20 38 3a 20 0a 20 20 20 20 20 20 6c 68 73 20  e 8: .      lhs 
1f9d0 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
1f9e0 3b 0a 20 20 20 20 63 61 73 65 20 39 3a 0a 20 20  ;.    case 9:.  
1f9f0 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a 20 20 20      lhs = 1;.   
1fa00 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f     break;..    /
1fa10 2a 20 54 68 69 73 20 63 61 73 65 20 63 6f 75 6c  * This case coul
1fa20 64 20 62 65 20 72 65 6d 6f 76 65 64 20 77 69 74  d be removed wit
1fa30 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68  hout changing th
1fa40 65 20 72 65 73 75 6c 74 73 20 6f 66 20 72 75 6e  e results of run
1fa50 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 69 73  ning.    ** this
1fa60 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64 69 6e 67   code. Including
1fa70 20 69 74 20 63 61 75 73 65 73 20 67 63 63 20 74   it causes gcc t
1fa80 6f 20 67 65 6e 65 72 61 74 65 20 61 20 66 61 73  o generate a fas
1fa90 74 65 72 20 73 77 69 74 63 68 20 0a 20 20 20 20  ter switch .    
1faa0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28 73 69  ** statement (si
1fab0 6e 63 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66  nce the range of
1fac0 20 73 77 69 74 63 68 20 74 61 72 67 65 74 73 20   switch targets 
1fad0 6e 6f 77 20 73 74 61 72 74 73 20 61 74 20 7a 65  now starts at ze
1fae0 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 73  ro and.    ** is
1faf0 20 63 6f 6e 74 69 67 75 6f 75 73 29 20 62 75 74   contiguous) but
1fb00 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20   does not cause 
1fb10 61 6e 79 20 64 75 70 6c 69 63 61 74 65 20 63 6f  any duplicate co
1fb20 64 65 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74  de to be generat
1fb30 65 64 0a 20 20 20 20 2a 2a 20 28 61 73 20 67 63  ed.    ** (as gc
1fb40 63 20 69 73 20 63 6c 65 76 65 72 20 65 6e 6f 75  c is clever enou
1fb50 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68  gh to combine th
1fb60 65 20 74 77 6f 20 6c 69 6b 65 20 63 61 73 65 73  e two like cases
1fb70 29 2e 20 4f 74 68 65 72 20 0a 20 20 20 20 2a 2a  ). Other .    **
1fb80 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69 67 68 74   compilers might
1fb90 20 62 65 20 73 69 6d 69 6c 61 72 2e 20 20 2a 2f   be similar.  */
1fba0 20 0a 20 20 20 20 63 61 73 65 20 30 3a 20 63 61   .    case 0: ca
1fbb0 73 65 20 37 3a 0a 20 20 20 20 20 20 72 65 74 75  se 7:.      retu
1fbc0 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  rn sqlite3VdbeRe
1fbd0 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79  cordCompare(nKey
1fbe0 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1fbf0 29 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  );..    default:
1fc00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
1fc10 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1fc20 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b  ompare(nKey1, pK
1fc30 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 20 20  ey1, pPKey2);.  
1fc40 7d 0a 0a 20 20 69 66 28 20 76 3e 6c 68 73 20 29  }..  if( v>lhs )
1fc50 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65  {.    res = pPKe
1fc60 79 32 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73 65 20  y2->r1;.  }else 
1fc70 69 66 28 20 76 3c 6c 68 73 20 29 7b 0a 20 20 20  if( v<lhs ){.   
1fc80 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
1fc90 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  2;.  }else if( p
1fca0 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20  PKey2->nField>1 
1fcb0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69  ){.    /* The fi
1fcc0 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  rst fields of th
1fcd0 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65  e two keys are e
1fce0 71 75 61 6c 2e 20 43 6f 6d 70 61 72 65 20 74 68  qual. Compare th
1fcf0 65 20 74 72 61 69 6c 69 6e 67 20 0a 20 20 20 20  e trailing .    
1fd00 2a 2a 20 66 69 65 6c 64 73 2e 20 20 2a 2f 0a 20  ** fields.  */. 
1fd10 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33     res = sqlite3
1fd20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1fd30 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c  eWithSkip(nKey1,
1fd40 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
1fd50 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
1fd60 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 69   /* The first fi
1fd70 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20  elds of the two 
1fd80 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 20 61  keys are equal a
1fd90 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  nd there are no 
1fda0 74 72 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a 20  trailing.    ** 
1fdb0 66 69 65 6c 64 73 2e 20 52 65 74 75 72 6e 20 70  fields. Return p
1fdc0 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
1fdd0 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  c in this case. 
1fde0 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b  */.    res = pPK
1fdf0 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b  ey2->default_rc;
1fe00 0a 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 71 53  .    pPKey2->eqS
1fe10 65 65 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  een = 1;.  }..  
1fe20 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f  assert( vdbeReco
1fe30 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
1fe40 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
1fe50 65 79 32 2c 20 72 65 73 29 20 29 3b 0a 20 20 72  ey2, res) );.  r
1fe60 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
1fe70 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1fe80 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65  n is an optimize
1fe90 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  d version of sql
1fea0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1feb0 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74  mpare() .** that
1fec0 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20 66   (a) the first f
1fed0 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69  ield of pPKey2 i
1fee0 73 20 61 20 73 74 72 69 6e 67 2c 20 74 68 61 74  s a string, that
1fef0 20 28 62 29 20 74 68 65 20 66 69 72 73 74 20 66   (b) the first f
1ff00 69 65 6c 64 0a 2a 2a 20 75 73 65 73 20 74 68 65  ield.** uses the
1ff10 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1ff20 6e 63 65 20 42 49 4e 41 52 59 20 61 6e 64 20 28  nce BINARY and (
1ff30 63 29 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  c) that the size
1ff40 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e  -of-header varin
1ff50 74 20 0a 2a 2a 20 61 74 20 74 68 65 20 73 74 61  t .** at the sta
1ff60 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65  rt of (pKey1/nKe
1ff70 79 31 29 20 66 69 74 73 20 69 6e 20 61 20 73 69  y1) fits in a si
1ff80 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a 73 74  ngle byte..*/.st
1ff90 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63  atic int vdbeRec
1ffa0 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67  ordCompareString
1ffb0 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
1ffc0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
1ffd0 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f  , /* Left key */
1ffe0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
1fff0 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20  d *pPKey2       
20000 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
20010 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  .){.  const u8 *
20020 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75  aKey1 = (const u
20030 38 2a 29 70 4b 65 79 31 3b 0a 20 20 69 6e 74 20  8*)pKey1;.  int 
20040 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 20 20 69  serial_type;.  i
20050 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73 73 65 72  nt res;..  asser
20060 74 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b  t( pPKey2->aMem[
20070 30 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  0].flags & MEM_S
20080 74 72 20 29 3b 0a 20 20 76 64 62 65 41 73 73 65  tr );.  vdbeAsse
20090 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68  rtFieldCountWith
200a0 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20  inLimits(nKey1, 
200b0 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70  pKey1, pPKey2->p
200c0 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 67 65 74 56  KeyInfo);.  getV
200d0 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31  arint32(&aKey1[1
200e0 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  ], serial_type);
200f0 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
20100 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 72 65 73  pe<12 ){.    res
20110 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 20 20   = pPKey2->r1;  
20120 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b      /* (pKey1/nK
20130 65 79 31 29 20 69 73 20 61 20 6e 75 6d 62 65 72  ey1) is a number
20140 20 6f 72 20 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20   or a null */.  
20150 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65 72 69  }else if( !(seri
20160 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20  al_type & 0x01) 
20170 29 7b 20 0a 20 20 20 20 72 65 73 20 3d 20 70 50  ){ .    res = pP
20180 4b 65 79 32 2d 3e 72 32 3b 20 20 20 20 20 20 2f  Key2->r2;      /
20190 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20  * (pKey1/nKey1) 
201a0 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d  is a blob */.  }
201b0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43  else{.    int nC
201c0 6d 70 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74 72  mp;.    int nStr
201d0 3b 0a 20 20 20 20 69 6e 74 20 73 7a 48 64 72 20  ;.    int szHdr 
201e0 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 0a 20 20 20  = aKey1[0];..   
201f0 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f   nStr = (serial_
20200 74 79 70 65 2d 31 32 29 20 2f 20 32 3b 0a 20 20  type-12) / 2;.  
20210 20 20 69 66 28 20 28 73 7a 48 64 72 20 2b 20 6e    if( (szHdr + n
20220 53 74 72 29 20 3e 20 6e 4b 65 79 31 20 29 7b 0a  Str) > nKey1 ){.
20230 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72        pPKey2->er
20240 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49  rCode = (u8)SQLI
20250 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
20260 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
20270 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f      /* Corruptio
20280 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n */.    }.    n
20290 43 6d 70 20 3d 20 4d 49 4e 28 20 70 50 4b 65 79  Cmp = MIN( pPKey
202a0 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53  2->aMem[0].n, nS
202b0 74 72 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  tr );.    res = 
202c0 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 73 7a  memcmp(&aKey1[sz
202d0 48 64 72 5d 2c 20 70 50 4b 65 79 32 2d 3e 61 4d  Hdr], pPKey2->aM
202e0 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a  em[0].z, nCmp);.
202f0 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20  .    if( res==0 
20300 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 6e  ){.      res = n
20310 53 74 72 20 2d 20 70 50 4b 65 79 32 2d 3e 61 4d  Str - pPKey2->aM
20320 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20 20 69  em[0].n;.      i
20330 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
20340 20 20 20 20 20 69 66 28 20 70 50 4b 65 79 32 2d       if( pPKey2-
20350 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20  >nField>1 ){.   
20360 20 20 20 20 20 20 20 72 65 73 20 3d 20 73 71 6c         res = sql
20370 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
20380 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b  mpareWithSkip(nK
20390 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
203a0 79 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  y2, 1);.        
203b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
203c0 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64   res = pPKey2->d
203d0 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20 20  efault_rc;.     
203e0 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 71 53       pPKey2->eqS
203f0 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  een = 1;.       
20400 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
20410 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20  f( res>0 ){.    
20420 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
20430 2d 3e 72 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ->r2;.      }els
20440 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  e{.        res =
20450 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20   pPKey2->r1;.   
20460 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
20470 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20  f( res>0 ){.    
20480 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
20490 72 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r2;.    }else{. 
204a0 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
204b0 32 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  2->r1;.    }.  }
204c0 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64 62 65  ..  assert( vdbe
204d0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62  RecordCompareDeb
204e0 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ug(nKey1, pKey1,
204f0 20 70 50 4b 65 79 32 2c 20 72 65 73 29 0a 20 20   pPKey2, res).  
20500 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f       || CORRUPT_
20510 44 42 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 4b  DB.       || pPK
20520 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  ey2->pKeyInfo->d
20530 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a  b->mallocFailed.
20540 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65    );.  return re
20550 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  s;.}../*.** Retu
20560 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
20570 61 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  an sqlite3VdbeRe
20580 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 6f  cordCompare() co
20590 6d 70 61 74 69 62 6c 65 20 66 75 6e 63 74 69 6f  mpatible functio
205a0 6e 0a 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f  n.** suitable fo
205b0 72 20 63 6f 6d 70 61 72 69 6e 67 20 73 65 72 69  r comparing seri
205c0 61 6c 69 7a 65 64 20 72 65 63 6f 72 64 73 20 74  alized records t
205d0 6f 20 74 68 65 20 75 6e 70 61 63 6b 65 64 20 72  o the unpacked r
205e0 65 63 6f 72 64 20 70 61 73 73 65 64 0a 2a 2a 20  ecord passed.** 
205f0 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
20600 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43  ment..*/.RecordC
20610 6f 6d 70 61 72 65 20 73 71 6c 69 74 65 33 56 64  ompare sqlite3Vd
20620 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 55 6e  beFindCompare(Un
20630 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29  packedRecord *p)
20640 7b 0a 20 20 2f 2a 20 76 61 72 69 6e 74 52 65 63  {.  /* varintRec
20650 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20  ordCompareInt() 
20660 61 6e 64 20 76 61 72 69 6e 74 52 65 63 6f 72 64  and varintRecord
20670 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29 20  CompareString() 
20680 62 6f 74 68 20 61 73 73 75 6d 65 0a 20 20 2a 2a  both assume.  **
20690 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f   that the size-o
206a0 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20  f-header varint 
206b0 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 74  that occurs at t
206c0 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68  he start of each
206d0 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 66 69 74   record.  ** fit
206e0 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79  s in a single by
206f0 74 65 20 28 69 2e 65 2e 20 69 73 20 31 32 37 20  te (i.e. is 127 
20700 6f 72 20 6c 65 73 73 29 2e 20 76 61 72 69 6e 74  or less). varint
20710 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
20720 28 29 0a 20 20 2a 2a 20 61 6c 73 6f 20 61 73 73  ().  ** also ass
20730 75 6d 65 73 20 74 68 61 74 20 69 74 20 69 73 20  umes that it is 
20740 73 61 66 65 20 74 6f 20 6f 76 65 72 72 65 61 64  safe to overread
20750 20 61 20 62 75 66 66 65 72 20 62 79 20 61 74 20   a buffer by at 
20760 6c 65 61 73 74 20 74 68 65 20 0a 20 20 2a 2a 20  least the .  ** 
20770 6d 61 78 69 6d 75 6d 20 70 6f 73 73 69 62 6c 65  maximum possible
20780 20 6c 65 67 61 6c 20 68 65 61 64 65 72 20 73 69   legal header si
20790 7a 65 20 70 6c 75 73 20 38 20 62 79 74 65 73 2e  ze plus 8 bytes.
207a0 20 42 65 63 61 75 73 65 20 74 68 65 72 65 20 69   Because there i
207b0 73 0a 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65  s.  ** guarantee
207c0 64 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74  d to be at least
207d0 20 37 34 20 28 62 75 74 20 6e 6f 74 20 31 33 36   74 (but not 136
207e0 29 20 62 79 74 65 73 20 6f 66 20 70 61 64 64 69  ) bytes of paddi
207f0 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63  ng following eac
20800 68 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 70 61  h.  ** buffer pa
20810 73 73 65 64 20 74 6f 20 76 61 72 69 6e 74 52 65  ssed to varintRe
20820 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29  cordCompareInt()
20830 20 74 68 69 73 20 6d 61 6b 65 73 20 69 74 20 63   this makes it c
20840 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 0a 20 20 2a  onvenient to.  *
20850 2a 20 6c 69 6d 69 74 20 74 68 65 20 73 69 7a 65  * limit the size
20860 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 74   of the header t
20870 6f 20 36 34 20 62 79 74 65 73 20 69 6e 20 63 61  o 64 bytes in ca
20880 73 65 73 20 77 68 65 72 65 20 74 68 65 20 66 69  ses where the fi
20890 72 73 74 20 66 69 65 6c 64 0a 20 20 2a 2a 20 69  rst field.  ** i
208a0 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 20 20  s an integer..  
208b0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65 61 73 69  **.  ** The easi
208c0 65 73 74 20 77 61 79 20 74 6f 20 65 6e 66 6f 72  est way to enfor
208d0 63 65 20 74 68 69 73 20 6c 69 6d 69 74 20 69 73  ce this limit is
208e0 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 6f 6e 6c   to consider onl
208f0 79 20 72 65 63 6f 72 64 73 20 77 69 74 68 0a 20  y records with. 
20900 20 2a 2a 20 31 33 20 66 69 65 6c 64 73 20 6f 72   ** 13 fields or
20910 20 6c 65 73 73 2e 20 49 66 20 74 68 65 20 66 69   less. If the fi
20920 72 73 74 20 66 69 65 6c 64 20 69 73 20 61 6e 20  rst field is an 
20930 69 6e 74 65 67 65 72 2c 20 74 68 65 20 6d 61 78  integer, the max
20940 69 6d 75 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a 20  imum legal.  ** 
20950 68 65 61 64 65 72 20 73 69 7a 65 20 69 73 20 28  header size is (
20960 31 32 2a 35 20 2b 20 31 20 2b 20 31 29 20 62 79  12*5 + 1 + 1) by
20970 74 65 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28  tes.  */.  if( (
20980 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  p->pKeyInfo->nFi
20990 65 6c 64 20 2b 20 70 2d 3e 70 4b 65 79 49 6e 66  eld + p->pKeyInf
209a0 6f 2d 3e 6e 58 46 69 65 6c 64 29 3c 3d 31 33 20  o->nXField)<=13 
209b0 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  ){.    int flags
209c0 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c   = p->aMem[0].fl
209d0 61 67 73 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ags;.    if( p->
209e0 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
209f0 72 64 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20  rder[0] ){.     
20a00 20 70 2d 3e 72 31 20 3d 20 31 3b 0a 20 20 20 20   p->r1 = 1;.    
20a10 20 20 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a 20 20    p->r2 = -1;.  
20a20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
20a30 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20 20 20 20 20  ->r1 = -1;.     
20a40 20 70 2d 3e 72 32 20 3d 20 31 3b 0a 20 20 20 20   p->r2 = 1;.    
20a50 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  }.    if( (flags
20a60 20 26 20 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a 20   & MEM_Int) ){. 
20a70 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65       return vdbe
20a80 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
20a90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74  ;.    }.    test
20aa0 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45  case( flags & ME
20ab0 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 74 65  M_Real );.    te
20ac0 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20  stcase( flags & 
20ad0 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 20 20  MEM_Null );.    
20ae0 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20  testcase( flags 
20af0 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20  & MEM_Blob );.  
20b00 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 28    if( (flags & (
20b10 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e 75 6c  MEM_Real|MEM_Nul
20b20 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20  l|MEM_Blob))==0 
20b30 26 26 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  && p->pKeyInfo->
20b40 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29 7b 0a 20  aColl[0]==0 ){. 
20b50 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61       assert( fla
20b60 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a  gs & MEM_Str );.
20b70 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62        return vdb
20b80 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74  eRecordCompareSt
20b90 72 69 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ring;.    }.  }.
20ba0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
20bb0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
20bc0 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75  re;.}../*.** pCu
20bd0 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69  r points at an i
20be0 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65 61 74  ndex entry creat
20bf0 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f  ed using the OP_
20c00 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
20c10 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72  e..** Read the r
20c20 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74 20 66  owid (the last f
20c30 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f  ield in the reco
20c40 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74  rd) and store it
20c50 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52   in *rowid..** R
20c60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
20c70 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
20c80 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72  rks, or an error
20c90 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
20ca0 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68  .**.** pCur migh
20cb0 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f  t be pointing to
20cc0 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20 66   text obtained f
20cd0 72 6f 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61  rom a corrupt da
20ce0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
20cf0 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63  So the content c
20d00 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64  annot be trusted
20d10 2e 20 20 44 6f 20 61 70 70 72 6f 70 72 69 61 74  .  Do appropriat
20d20 65 20 63 68 65 63 6b 73 20 6f 6e 20 74 68 65 20  e checks on the 
20d30 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  content..*/.int 
20d40 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f  sqlite3VdbeIdxRo
20d50 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  wid(sqlite3 *db,
20d60 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
20d70 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20   i64 *rowid){.  
20d80 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30  i64 nCellKey = 0
20d90 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33  ;.  int rc;.  u3
20da0 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20  2 szHdr;        
20db0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68  /* Size of the h
20dc0 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74  eader */.  u32 t
20dd0 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20  ypeRowid;    /* 
20de0 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74  Serial type of t
20df0 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33  he rowid */.  u3
20e00 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20  2 lenRowid;     
20e10 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72  /* Size of the r
20e20 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c  owid */.  Mem m,
20e30 20 76 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68   v;..  /* Get th
20e40 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e  e size of the in
20e50 64 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79  dex entry.  Only
20e60 20 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73   indices entries
20e70 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68   of less.  ** th
20e80 61 6e 20 32 47 69 42 20 61 72 65 20 73 75 70 70  an 2GiB are supp
20e90 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c  ort - anything l
20ea0 61 72 67 65 20 6d 75 73 74 20 62 65 20 64 61 74  arge must be dat
20eb0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
20ec0 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75  ..  ** Any corru
20ed0 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65  ption is detecte
20ee0 64 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65  d in sqlite3Btre
20ef0 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c  eParseCellPtr(),
20f00 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a   though, so.  **
20f10 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73   this code can s
20f20 61 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61  afely assume tha
20f30 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32  t nCellKey is 32
20f40 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61  -bits  .  */.  a
20f50 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
20f60 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
20f70 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56 41 5f  (pCur) );.  VVA_
20f80 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74  ONLY(rc =) sqlit
20f90 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
20fa0 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b  Cur, &nCellKey);
20fb0 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
20fc0 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 20  QLITE_OK );     
20fd0 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61 79  /* pCur is alway
20fe0 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69  s valid so KeySi
20ff0 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a  ze cannot fail *
21000 2f 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43 65  /.  assert( (nCe
21010 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f 4d  llKey & SQLITE_M
21020 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e 43  AX_U32)==(u64)nC
21030 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20  ellKey );..  /* 
21040 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d 70  Read in the comp
21050 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  lete content of 
21060 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20  the index entry 
21070 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
21080 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20  MemInit(&m, db, 
21090 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  0);.  rc = sqlit
210a0 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
210b0 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32  ee(pCur, 0, (u32
210c0 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d  )nCellKey, 1, &m
210d0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
210e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
210f0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  }..  /* The inde
21100 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67  x entry must beg
21110 69 6e 20 77 69 74 68 20 61 20 68 65 61 64 65 72  in with a header
21120 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64   size */.  (void
21130 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38  )getVarint32((u8
21140 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20  *)m.z, szHdr);. 
21150 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72   testcase( szHdr
21160 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==3 );.  testcas
21170 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b  e( szHdr==m.n );
21180 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28  .  if( unlikely(
21190 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29  szHdr<3 || (int)
211a0 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20  szHdr>m.n) ){.  
211b0 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
211c0 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
211d0 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20  ..  /* The last 
211e0 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e 64  field of the ind
211f0 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20  ex should be an 
21200 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20 52 4f  integer - the RO
21210 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79  WID..  ** Verify
21220 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 65   that the last e
21230 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73 20 61  ntry really is a
21240 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  n integer. */.  
21250 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33  (void)getVarint3
21260 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64  2((u8*)&m.z[szHd
21270 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64 29  r-1], typeRowid)
21280 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
21290 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20  peRowid==1 );.  
212a0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
212b0 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74  wid==2 );.  test
212c0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
212d0 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =3 );.  testcase
212e0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34 20 29  ( typeRowid==4 )
212f0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
21300 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20  peRowid==5 );.  
21310 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
21320 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74  wid==6 );.  test
21330 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
21340 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =8 );.  testcase
21350 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39 20 29  ( typeRowid==9 )
21360 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
21370 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20  (typeRowid<1 || 
21380 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74  typeRowid>9 || t
21390 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a  ypeRowid==7) ){.
213a0 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77      goto idx_row
213b0 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20  id_corruption;. 
213c0 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20   }.  lenRowid = 
213d0 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65  sqlite3SmallType
213e0 53 69 7a 65 73 5b 74 79 70 65 52 6f 77 69 64 5d  Sizes[typeRowid]
213f0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 75  ;.  testcase( (u
21400 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65  32)m.n==szHdr+le
21410 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20  nRowid );.  if( 
21420 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e  unlikely((u32)m.
21430 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64  n<szHdr+lenRowid
21440 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
21450 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
21460 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65  on;.  }..  /* Fe
21470 74 63 68 20 74 68 65 20 69 6e 74 65 67 65 72 20  tch the integer 
21480 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
21490 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  he index record 
214a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
214b0 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26  SerialGet((u8*)&
214c0 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64  m.z[m.n-lenRowid
214d0 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76  ], typeRowid, &v
214e0 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e  );.  *rowid = v.
214f0 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  u.i;.  sqlite3Vd
21500 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
21510 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
21520 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  E_OK;..  /* Jump
21530 20 68 65 72 65 20 69 66 20 64 61 74 61 62 61 73   here if databas
21540 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  e corruption is 
21550 64 65 74 65 63 74 65 64 20 61 66 74 65 72 20 6d  detected after m
21560 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61   has been.  ** a
21570 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20  llocated.  Free 
21580 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64  the m object and
21590 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
215a0 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72  ORRUPT. */.idx_r
215b0 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a  owid_corruption:
215c0 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e 73  .  testcase( m.s
215d0 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20  zMalloc!=0 );.  
215e0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
215f0 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
21600 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
21610 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a  PT_BKPT;.}../*.*
21620 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65  * Compare the ke
21630 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  y of the index e
21640 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
21650 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20   pC is pointing 
21660 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68  to against.** th
21670 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20  e key string in 
21680 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74  pUnpacked.  Writ
21690 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e  e into *pRes a n
216a0 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  umber.** that is
216b0 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c   negative, zero,
216c0 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20   or positive if 
216d0 70 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  pC is less than,
216e0 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72   equal to,.** or
216f0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 55   greater than pU
21700 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e  npacked.  Return
21710 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
21720 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e  ccess..**.** pUn
21730 70 61 63 6b 65 64 20 69 73 20 65 69 74 68 65 72  packed is either
21740 20 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74   created without
21750 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74   a rowid or is t
21760 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74  runcated so that
21770 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65   it.** omits the
21780 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
21790 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74  d.  The rowid at
217a0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
217b0 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69  index entry.** i
217c0 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c  s ignored as wel
217d0 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20  l.  Hence, this 
217e0 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d  routine only com
217f0 70 61 72 65 73 20 74 68 65 20 70 72 65 66 69 78  pares the prefix
21800 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65  es .** of the ke
21810 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ys prior to the 
21820 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74  final rowid, not
21830 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e   the entire key.
21840 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
21850 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65  dbeIdxKeyCompare
21860 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
21870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21880 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
21890 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
218a0 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 2c   VdbeCursor *pC,
218b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218c0 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
218d0 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e  to compare again
218e0 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  st */.  Unpacked
218f0 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65  Record *pUnpacke
21900 64 2c 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61  d,       /* Unpa
21910 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  cked version of 
21920 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65  key */.  int *re
21930 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
21940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
21950 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  te the compariso
21960 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f  n result here */
21970 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  .){.  i64 nCellK
21980 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ey = 0;.  int rc
21990 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
219a0 75 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20  ur;.  Mem m;..  
219b0 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72  assert( pC->eCur
219c0 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
219d0 52 45 45 20 29 3b 0a 20 20 70 43 75 72 20 3d 20  REE );.  pCur = 
219e0 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a  pC->uc.pCursor;.
219f0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
21a00 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
21a10 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56  lid(pCur) );.  V
21a20 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71  VA_ONLY(rc =) sq
21a30 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
21a40 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65  e(pCur, &nCellKe
21a50 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  y);.  assert( rc
21a60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20  ==SQLITE_OK );  
21a70 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77    /* pCur is alw
21a80 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79  ays valid so Key
21a90 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  Size cannot fail
21aa0 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65   */.  /* nCellKe
21ab0 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  y will always be
21ac0 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 30   between 0 and 0
21ad0 78 66 66 66 66 66 66 66 66 20 62 65 63 61 75 73  xffffffff becaus
21ae0 65 20 6f 66 20 74 68 65 20 77 61 79 0a 20 20 2a  e of the way.  *
21af0 2a 20 74 68 61 74 20 62 74 72 65 65 50 61 72 73  * that btreePars
21b00 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 20 73  eCellPtr() and s
21b10 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33  qlite3GetVarint3
21b20 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e  2() are implemen
21b30 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65  ted */.  if( nCe
21b40 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c  llKey<=0 || nCel
21b50 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66 20  lKey>0x7fffffff 
21b60 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b  ){.    *res = 0;
21b70 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
21b80 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
21b90 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
21ba0 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62  beMemInit(&m, db
21bb0 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  , 0);.  rc = sql
21bc0 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
21bd0 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75  tree(pCur, 0, (u
21be0 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20  32)nCellKey, 1, 
21bf0 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  &m);.  if( rc ){
21c00 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
21c10 20 20 7d 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c    }.  *res = sql
21c20 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
21c30 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20  mpare(m.n, m.z, 
21c40 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73 71  pUnpacked);.  sq
21c50 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
21c60 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
21c70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
21c80 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
21c90 6e 65 20 73 65 74 73 20 74 68 65 20 76 61 6c 75  ne sets the valu
21ca0 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  e to be returned
21cb0 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63   by subsequent c
21cc0 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  alls to.** sqlit
21cd0 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20  e3_changes() on 
21ce0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
21cf0 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f  dle 'db'. .*/.vo
21d00 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
21d10 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33  tChanges(sqlite3
21d20 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67   *db, int nChang
21d30 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  e){.  assert( sq
21d40 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
21d50 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
21d60 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e   db->nChange = n
21d70 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54  Change;.  db->nT
21d80 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43  otalChange += nC
21d90 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
21da0 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68  Set a flag in th
21db0 65 20 76 64 62 65 20 74 6f 20 75 70 64 61 74 65  e vdbe to update
21dc0 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
21dd0 74 65 72 20 77 68 65 6e 20 69 74 20 69 73 20 66  ter when it is f
21de0 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72  inalised.** or r
21df0 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eset..*/.void sq
21e00 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68  lite3VdbeCountCh
21e10 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a  anges(Vdbe *v){.
21e20 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e    v->changeCntOn
21e30 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d   = 1;.}../*.** M
21e40 61 72 6b 20 65 76 65 72 79 20 70 72 65 70 61 72  ark every prepar
21e50 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73  ed statement ass
21e60 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64  ociated with a d
21e70 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
21e80 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64  on.** as expired
21e90 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72  ..**.** An expir
21ea0 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61  ed statement mea
21eb0 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c  ns that recompil
21ec0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61  ation of the sta
21ed0 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63  tement is.** rec
21ee0 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65  ommend.  Stateme
21ef0 6e 74 73 20 65 78 70 69 72 65 20 77 68 65 6e 20  nts expire when 
21f00 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68  things happen th
21f10 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a  at make their.**
21f20 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65   programs obsole
21f30 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73  te.  Removing us
21f40 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74  er-defined funct
21f50 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e  ions or collatin
21f60 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20  g.** sequences, 
21f70 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61  or changing an a
21f80 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e  uthorization fun
21f90 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79  ction are the ty
21fa0 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73  pes of.** things
21fb0 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61   that make prepa
21fc0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  red statements o
21fd0 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64  bsolete..*/.void
21fe0 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
21ff0 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
22000 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
22010 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28   Vdbe *p;.  for(
22020 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70  p = db->pVdbe; p
22030 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
22040 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20     p->expired = 
22050 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
22060 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62  Return the datab
22070 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ase associated w
22080 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f  ith the Vdbe..*/
22090 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65  .sqlite3 *sqlite
220a0 33 56 64 62 65 44 62 28 56 64 62 65 20 2a 76 29  3VdbeDb(Vdbe *v)
220b0 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62  {.  return v->db
220c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
220d0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
220e0 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  n sqlite3_value 
220f0 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
22100 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 62  ning the value b
22110 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65  ound.** paramete
22120 72 20 69 56 61 72 20 6f 66 20 56 4d 20 76 2e 20  r iVar of VM v. 
22130 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 76  Except, if the v
22140 61 6c 75 65 20 69 73 20 61 6e 20 53 51 4c 20 4e  alue is an SQL N
22150 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  ULL, return .** 
22160 30 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73  0 instead. Unles
22170 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70  s it is NULL, ap
22180 70 6c 79 20 61 66 66 69 6e 69 74 79 20 61 66 66  ply affinity aff
22190 20 28 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c   (one of the SQL
221a0 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e  ITE_AFF_*.** con
221b0 73 74 61 6e 74 73 29 20 74 6f 20 74 68 65 20 76  stants) to the v
221c0 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75  alue before retu
221d0 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  rning it..**.** 
221e0 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
221f0 75 65 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  ue must be freed
22200 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75   by the caller u
22210 73 69 6e 67 20 73 71 6c 69 74 65 33 56 61 6c 75  sing sqlite3Valu
22220 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69  eFree()..*/.sqli
22230 74 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74  te3_value *sqlit
22240 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61  e3VdbeGetBoundVa
22250 6c 75 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  lue(Vdbe *v, int
22260 20 69 56 61 72 2c 20 75 38 20 61 66 66 29 7b 0a   iVar, u8 aff){.
22270 20 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30    assert( iVar>0
22280 20 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20   );.  if( v ){. 
22290 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26     Mem *pMem = &
222a0 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b  v->aVar[iVar-1];
222b0 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70 4d 65  .    if( 0==(pMe
222c0 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  m->flags & MEM_N
222d0 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ull) ){.      sq
222e0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65  lite3_value *pRe
222f0 74 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  t = sqlite3Value
22300 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20  New(v->db);.    
22310 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
22320 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22330 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29  eMemCopy((Mem *)
22340 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20  pRet, pMem);.   
22350 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
22360 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70  eApplyAffinity(p
22370 52 65 74 2c 20 61 66 66 2c 20 53 51 4c 49 54 45  Ret, aff, SQLITE
22380 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20 7d 0a  _UTF8);.      }.
22390 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 52 65        return pRe
223a0 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  t;.    }.  }.  r
223b0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
223c0 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51 4c 20  * Configure SQL 
223d0 76 61 72 69 61 62 6c 65 20 69 56 61 72 20 73 6f  variable iVar so
223e0 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20 61 20   that binding a 
223f0 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69 74 20  new value to it 
22400 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71  signals.** to sq
22410 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65  lite3_reoptimize
22420 28 29 20 74 68 61 74 20 72 65 2d 70 72 65 70 61  () that re-prepa
22430 72 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65  ring the stateme
22440 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a  nt may result.**
22450 20 69 6e 20 61 20 62 65 74 74 65 72 20 71 75 65   in a better que
22460 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64  ry plan..*/.void
22470 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56   sqlite3VdbeSetV
22480 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c 20  armask(Vdbe *v, 
22490 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61 73 73  int iVar){.  ass
224a0 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20  ert( iVar>0 );. 
224b0 20 69 66 28 20 69 56 61 72 3e 33 32 20 29 7b 0a   if( iVar>32 ){.
224c0 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 3d      v->expmask =
224d0 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20 7d   0xffffffff;.  }
224e0 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70  else{.    v->exp
224f0 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32 29 31 20  mask |= ((u32)1 
22500 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b 0a 20 20  << (iVar-1));.  
22510 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
22520 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
22530 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e  TABLE./*.** Tran
22540 73 66 65 72 20 65 72 72 6f 72 20 6d 65 73 73 61  sfer error messa
22550 67 65 20 74 65 78 74 20 66 72 6f 6d 20 61 6e 20  ge text from an 
22560 73 71 6c 69 74 65 33 5f 76 74 61 62 2e 7a 45 72  sqlite3_vtab.zEr
22570 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65  rMsg (text store
22580 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  d.** in memory o
22590 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
225a0 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74  ite3_malloc) int
225b0 6f 20 61 20 56 64 62 65 2e 7a 45 72 72 4d 73 67  o a Vdbe.zErrMsg
225c0 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a   (text stored.**
225d0 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
225e0 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
225f0 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f  DbMalloc)..*/.vo
22600 69 64 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d  id sqlite3VtabIm
22610 70 6f 72 74 45 72 72 6d 73 67 28 56 64 62 65 20  portErrmsg(Vdbe 
22620 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62  *p, sqlite3_vtab
22630 20 2a 70 56 74 61 62 29 7b 0a 20 20 69 66 28 20   *pVtab){.  if( 
22640 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29  pVtab->zErrMsg )
22650 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
22660 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 73  b = p->db;.    s
22670 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
22680 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
22690 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73    p->zErrMsg = s
226a0 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
226b0 62 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  b, pVtab->zErrMs
226c0 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  g);.    sqlite3_
226d0 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72  free(pVtab->zErr
226e0 4d 73 67 29 3b 0a 20 20 20 20 70 56 74 61 62 2d  Msg);.    pVtab-
226f0 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
22700 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
22710 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
22720 4c 54 41 42 4c 45 20 2a 2f 0a                    LTABLE */.