/ Hex Artifact Content
Login

Artifact 82969fb2558e6cf57601e283f0101d0f60f5a4f2:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e  #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72  e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
02d0: 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20 29  , sizeof(Vdbe) )
02e0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
02f0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62  eturn 0;.  p->db
0300: 20 3d 20 64 62 3b 0a 20 20 69 66 28 20 64 62 2d   = db;.  if( db-
0310: 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 64 62  >pVdbe ){.    db
0320: 2d 3e 70 56 64 62 65 2d 3e 70 50 72 65 76 20 3d  ->pVdbe->pPrev =
0330: 20 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65   p;.  }.  p->pNe
0340: 78 74 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a  xt = db->pVdbe;.
0350: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
0360: 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b    db->pVdbe = p;
0370: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
0380: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20  BE_MAGIC_INIT;. 
0390: 20 70 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61   p->pParse = pPa
03a0: 72 73 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rse;.  assert( p
03b0: 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30  Parse->aLabel==0
03c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
03d0: 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20  arse->nLabel==0 
03e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
03f0: 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30  rse->nOpAlloc==0
0400: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
0410: 61 72 73 65 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 3d  arse->szOpAlloc=
0420: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  =0 );.  return p
0430: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
0440: 65 20 74 68 65 20 65 72 72 6f 72 20 73 74 72 69  e the error stri
0450: 6e 67 20 73 74 6f 72 65 64 20 69 6e 20 56 64 62  ng stored in Vdb
0460: 65 2e 7a 45 72 72 4d 73 67 0a 2a 2f 0a 76 6f 69  e.zErrMsg.*/.voi
0470: 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72  d sqlite3VdbeErr
0480: 6f 72 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  or(Vdbe *p, cons
0490: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
04a0: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
04b0: 20 61 70 3b 0a 20 20 73 71 6c 69 74 65 33 44 62   ap;.  sqlite3Db
04c0: 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 7a  Free(p->db, p->z
04d0: 45 72 72 4d 73 67 29 3b 0a 20 20 76 61 5f 73 74  ErrMsg);.  va_st
04e0: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
04f0: 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d  ;.  p->zErrMsg =
0500: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
0510: 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c  (p->db, zFormat,
0520: 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
0530: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  p);.}../*.** Rem
0540: 65 6d 62 65 72 20 74 68 65 20 53 51 4c 20 73 74  ember the SQL st
0550: 72 69 6e 67 20 66 6f 72 20 61 20 70 72 65 70 61  ring for a prepa
0560: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  red statement..*
0570: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
0580: 62 65 53 65 74 53 71 6c 28 56 64 62 65 20 2a 70  beSetSql(Vdbe *p
0590: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  , const char *z,
05a0: 20 69 6e 74 20 6e 2c 20 69 6e 74 20 69 73 50 72   int n, int isPr
05b0: 65 70 61 72 65 56 32 29 7b 0a 20 20 61 73 73 65  epareV2){.  asse
05c0: 72 74 28 20 69 73 50 72 65 70 61 72 65 56 32 3d  rt( isPrepareV2=
05d0: 3d 31 20 7c 7c 20 69 73 50 72 65 70 61 72 65 56  =1 || isPrepareV
05e0: 32 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  2==0 );.  if( p=
05f0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66  =0 ) return;.#if
0600: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
0610: 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 21  OMIT_TRACE) && !
0620: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
0630: 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 29 0a 20 20  NABLE_SQLLOG).  
0640: 69 66 28 20 21 69 73 50 72 65 70 61 72 65 56 32  if( !isPrepareV2
0650: 20 29 20 72 65 74 75 72 6e 3b 0a 23 65 6e 64 69   ) return;.#endi
0660: 66 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a  f.  assert( p->z
0670: 53 71 6c 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a  Sql==0 );.  p->z
0680: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53  Sql = sqlite3DbS
0690: 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 2c  trNDup(p->db, z,
06a0: 20 6e 29 3b 0a 20 20 70 2d 3e 69 73 50 72 65 70   n);.  p->isPrep
06b0: 61 72 65 56 32 20 3d 20 28 75 38 29 69 73 50 72  areV2 = (u8)isPr
06c0: 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a  epareV2;.}../*.*
06d0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 53 51 4c  * Return the SQL
06e0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
06f0: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
0700: 65 6d 65 6e 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63  ement.*/.const c
0710: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 71 6c  har *sqlite3_sql
0720: 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70  (sqlite3_stmt *p
0730: 53 74 6d 74 29 7b 0a 20 20 56 64 62 65 20 2a 70  Stmt){.  Vdbe *p
0740: 20 3d 20 28 56 64 62 65 20 2a 29 70 53 74 6d 74   = (Vdbe *)pStmt
0750: 3b 0a 20 20 72 65 74 75 72 6e 20 70 20 3f 20 70  ;.  return p ? p
0760: 2d 3e 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->zSql : 0;.}../
0770: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
0780: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
0790: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
07a0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
07b0: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
07c0: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
07d0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
07e0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
07f0: 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b 0a 20 20  .  tmp = *pA;.  
0800: 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70 42  *pA = *pB;.  *pB
0810: 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20 3d   = tmp;.  pTmp =
0820: 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 41   pA->pNext;.  pA
0830: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70 4e  ->pNext = pB->pN
0840: 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78 74  ext;.  pB->pNext
0850: 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70 20   = pTmp;.  pTmp 
0860: 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20 70  = pA->pPrev;.  p
0870: 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e 70  A->pPrev = pB->p
0880: 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72 65  Prev;.  pB->pPre
0890: 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d 70  v = pTmp;.  zTmp
08a0: 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70   = pA->zSql;.  p
08b0: 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a 53  A->zSql = pB->zS
08c0: 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20 3d  ql;.  pB->zSql =
08d0: 20 7a 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73 50   zTmp;.  pB->isP
08e0: 72 65 70 61 72 65 56 32 20 3d 20 70 41 2d 3e 69  repareV2 = pA->i
08f0: 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f  sPrepareV2;.}../
0900: 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20  *.** Resize the 
0910: 56 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73  Vdbe.aOp array s
0920: 6f 20 74 68 61 74 20 69 74 20 69 73 20 61 74 20  o that it is at 
0930: 6c 65 61 73 74 20 6e 4f 70 20 65 6c 65 6d 65 6e  least nOp elemen
0940: 74 73 20 6c 61 72 67 65 72 20 0a 2a 2a 20 74 68  ts larger .** th
0950: 61 6e 20 69 74 73 20 63 75 72 72 65 6e 74 20 73  an its current s
0960: 69 7a 65 2e 20 6e 4f 70 20 69 73 20 67 75 61 72  ize. nOp is guar
0970: 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 65 73  anteed to be les
0980: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a  s than or equal.
0990: 2a 2a 20 74 6f 20 31 30 32 34 2f 73 69 7a 65 6f  ** to 1024/sizeo
09a0: 66 28 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f(Op)..**.** If 
09b0: 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79  an out-of-memory
09c0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
09d0: 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74 68 65  ile resizing the
09e0: 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a   array, return.*
09f0: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20  * SQLITE_NOMEM. 
0a00: 49 6e 20 74 68 69 73 20 63 61 73 65 20 56 64 62  In this case Vdb
0a10: 65 2e 61 4f 70 20 61 6e 64 20 50 61 72 73 65 2e  e.aOp and Parse.
0a20: 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20  nOpAlloc remain 
0a30: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 28 74  .** unchanged (t
0a40: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 61  his is so that a
0a50: 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61  ny opcodes alrea
0a60: 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e  dy allocated can
0a70: 20 62 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74 6c   be .** correctl
0a80: 79 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 61 6c  y deallocated al
0a90: 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72 65 73  ong with the res
0aa0: 74 20 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a  t of the Vdbe)..
0ab0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 72  */.static int gr
0ac0: 6f 77 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a  owOpArray(Vdbe *
0ad0: 76 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 56  v, int nOp){.  V
0ae0: 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 50  dbeOp *pNew;.  P
0af0: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
0b00: 72 73 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53  rse;..  /* The S
0b10: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
0b20: 4f 43 5f 53 54 52 45 53 53 20 63 6f 6d 70 69 6c  OC_STRESS compil
0b30: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
0b40: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 66 6f 72   designed to for
0b50: 63 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 66 72 65  ce.  ** more fre
0b60: 71 75 65 6e 74 20 72 65 61 6c 6c 6f 63 73 20 61  quent reallocs a
0b70: 6e 64 20 68 65 6e 63 65 20 70 72 6f 76 69 64 65  nd hence provide
0b80: 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74   more opportunit
0b90: 69 65 73 20 66 6f 72 20 0a 20 20 2a 2a 20 73 69  ies for .  ** si
0ba0: 6d 75 6c 61 74 65 64 20 4f 4f 4d 20 66 61 75 6c  mulated OOM faul
0bb0: 74 73 2e 20 20 53 51 4c 49 54 45 5f 54 45 53 54  ts.  SQLITE_TEST
0bc0: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20  _REALLOC_STRESS 
0bd0: 69 73 20 67 65 6e 65 72 61 6c 6c 79 20 75 73 65  is generally use
0be0: 64 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 65  d.  ** during te
0bf0: 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 57 69 74  sting only.  Wit
0c00: 68 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  h SQLITE_TEST_RE
0c10: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 67 72 6f  ALLOC_STRESS gro
0c20: 77 20 74 68 65 20 6f 70 20 61 72 72 61 79 0a 20  w the op array. 
0c30: 20 2a 2a 20 62 79 20 74 68 65 20 6d 69 6e 69 6d   ** by the minim
0c40: 75 6d 2a 20 61 6d 6f 75 6e 74 20 72 65 71 75 69  um* amount requi
0c50: 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 73 69  red until the si
0c60: 7a 65 20 72 65 61 63 68 65 73 20 35 31 32 2e 20  ze reaches 512. 
0c70: 20 4e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65   Normal.  ** ope
0c80: 72 61 74 69 6f 6e 20 28 77 69 74 68 6f 75 74 20  ration (without 
0c90: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
0ca0: 4c 4f 43 5f 53 54 52 45 53 53 29 20 69 73 20 74  LOC_STRESS) is t
0cb0: 6f 20 64 6f 75 62 6c 65 20 74 68 65 20 63 75 72  o double the cur
0cc0: 72 65 6e 74 0a 20 20 2a 2a 20 73 69 7a 65 20 6f  rent.  ** size o
0cd0: 66 20 74 68 65 20 6f 70 20 61 72 72 61 79 20 6f  f the op array o
0ce0: 72 20 61 64 64 20 31 4b 42 20 6f 66 20 73 70 61  r add 1KB of spa
0cf0: 63 65 2c 20 77 68 69 63 68 65 76 65 72 20 69 73  ce, whichever is
0d00: 20 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66   smaller. */.#if
0d10: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 5f  def SQLITE_TEST_
0d20: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 0a 20  REALLOC_STRESS. 
0d30: 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d 3e   int nNew = (p->
0d40: 6e 4f 70 41 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20  nOpAlloc>=512 ? 
0d50: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20  p->nOpAlloc*2 : 
0d60: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29  p->nOpAlloc+nOp)
0d70: 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 6e 4e  ;.#else.  int nN
0d80: 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f  ew = (p->nOpAllo
0d90: 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a  c ? p->nOpAlloc*
0da0: 32 20 3a 20 28 69 6e 74 29 28 31 30 32 34 2f 73  2 : (int)(1024/s
0db0: 69 7a 65 6f 66 28 4f 70 29 29 29 3b 0a 20 20 55  izeof(Op)));.  U
0dc0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
0dd0: 6e 4f 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nOp);.#endif..  
0de0: 61 73 73 65 72 74 28 20 6e 4f 70 3c 3d 28 31 30  assert( nOp<=(10
0df0: 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29 20 29  24/sizeof(Op)) )
0e00: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77  ;.  assert( nNew
0e10: 3e 3d 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e  >=(p->nOpAlloc+n
0e20: 4f 70 29 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20  Op) );.  pNew = 
0e30: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
0e40: 28 70 2d 3e 64 62 2c 20 76 2d 3e 61 4f 70 2c 20  (p->db, v->aOp, 
0e50: 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29  nNew*sizeof(Op))
0e60: 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ;.  if( pNew ){.
0e70: 20 20 20 20 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63      p->szOpAlloc
0e80: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
0e90: 6f 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e  ocSize(p->db, pN
0ea0: 65 77 29 3b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41  ew);.    p->nOpA
0eb0: 6c 6c 6f 63 20 3d 20 70 2d 3e 73 7a 4f 70 41 6c  lloc = p->szOpAl
0ec0: 6c 6f 63 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a  loc/sizeof(Op);.
0ed0: 20 20 20 20 76 2d 3e 61 4f 70 20 3d 20 70 4e 65      v->aOp = pNe
0ee0: 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  w;.  }.  return 
0ef0: 28 70 4e 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f  (pNew ? SQLITE_O
0f00: 4b 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  K : SQLITE_NOMEM
0f10: 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  );.}..#ifdef SQL
0f20: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69  ITE_DEBUG./* Thi
0f30: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73  s routine is jus
0f40: 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70  t a convenient p
0f50: 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 62 72  lace to set a br
0f60: 65 61 6b 70 6f 69 6e 74 20 74 68 61 74 20 77 69  eakpoint that wi
0f70: 6c 6c 0a 2a 2a 20 66 69 72 65 20 61 66 74 65 72  ll.** fire after
0f80: 20 65 61 63 68 20 6f 70 63 6f 64 65 20 69 73 20   each opcode is 
0f90: 69 6e 73 65 72 74 65 64 20 61 6e 64 20 64 69 73  inserted and dis
0fa0: 70 6c 61 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20  played using.** 
0fb0: 22 50 52 41 47 4d 41 20 76 64 62 65 5f 61 64 64  "PRAGMA vdbe_add
0fc0: 6f 70 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a  optrace=on"..*/.
0fd0: 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74  static void test
0fe0: 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e  _addop_breakpoin
0ff0: 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  t(void){.  stati
1000: 63 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e  c int n = 0;.  n
1010: 2b 2b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ++;.}.#endif../*
1020: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 69 6e  .** Add a new in
1030: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65  struction to the
1040: 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72 75 63   list of instruc
1050: 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20 69 6e  tions current in
1060: 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52   the.** VDBE.  R
1070: 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73  eturn the addres
1080: 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73  s of the new ins
1090: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  truction..**.** 
10a0: 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a  Parameters:.**.*
10b0: 2a 20 20 20 20 70 20 20 20 20 20 20 20 20 20 20  *    p          
10c0: 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20       Pointer to 
10d0: 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20  the VDBE.**.**  
10e0: 20 20 6f 70 20 20 20 20 20 20 20 20 20 20 20 20    op            
10f0: 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66 6f 72    The opcode for
1100: 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   this instructio
1110: 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70  n.**.**    p1, p
1120: 32 2c 20 70 33 20 20 20 20 20 20 4f 70 65 72 61  2, p3      Opera
1130: 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  nds.**.** Use th
1140: 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  e sqlite3VdbeRes
1150: 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 6e 63  olveLabel() func
1160: 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20 61  tion to fix an a
1170: 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68  ddress and.** th
1180: 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  e sqlite3VdbeCha
1190: 6e 67 65 50 34 28 29 20 66 75 6e 63 74 69 6f 6e  ngeP4() function
11a0: 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76   to change the v
11b0: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 0a 2a  alue of the P4.*
11c0: 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 73 74  * operand..*/.st
11d0: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
11e0: 4c 49 4e 45 20 69 6e 74 20 67 72 6f 77 4f 70 33  LINE int growOp3
11f0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
1200: 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32  , int p1, int p2
1210: 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20 61 73 73  , int p3){.  ass
1220: 65 72 74 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e  ert( p->pParse->
1230: 6e 4f 70 41 6c 6c 6f 63 3c 3d 70 2d 3e 6e 4f 70  nOpAlloc<=p->nOp
1240: 20 29 3b 0a 20 20 69 66 28 20 67 72 6f 77 4f 70   );.  if( growOp
1250: 41 72 72 61 79 28 70 2c 20 31 29 20 29 20 72 65  Array(p, 1) ) re
1260: 74 75 72 6e 20 31 3b 0a 20 20 61 73 73 65 72 74  turn 1;.  assert
1270: 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70  ( p->pParse->nOp
1280: 41 6c 6c 6f 63 3e 70 2d 3e 6e 4f 70 20 29 3b 0a  Alloc>p->nOp );.
1290: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
12a0: 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70  VdbeAddOp3(p, op
12b0: 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 7d  , p1, p2, p3);.}
12c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
12d0: 41 64 64 4f 70 33 28 56 64 62 65 20 2a 70 2c 20  AddOp3(Vdbe *p, 
12e0: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20  int op, int p1, 
12f0: 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b  int p2, int p3){
1300: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65  .  int i;.  Vdbe
1310: 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20  Op *pOp;..  i = 
1320: 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74  p->nOp;.  assert
1330: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
1340: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
1350: 20 61 73 73 65 72 74 28 20 6f 70 3e 30 20 26 26   assert( op>0 &&
1360: 20 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66   op<0xff );.  if
1370: 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70  ( p->pParse->nOp
1380: 41 6c 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20  Alloc<=i ){.    
1390: 72 65 74 75 72 6e 20 67 72 6f 77 4f 70 33 28 70  return growOp3(p
13a0: 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33  , op, p1, p2, p3
13b0: 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b  );.  }.  p->nOp+
13c0: 2b 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61  +;.  pOp = &p->a
13d0: 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70  Op[i];.  pOp->op
13e0: 63 6f 64 65 20 3d 20 28 75 38 29 6f 70 3b 0a 20  code = (u8)op;. 
13f0: 20 70 4f 70 2d 3e 70 35 20 3d 20 30 3b 0a 20 20   pOp->p5 = 0;.  
1400: 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20  pOp->p1 = p1;.  
1410: 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20  pOp->p2 = p2;.  
1420: 70 4f 70 2d 3e 70 33 20 3d 20 70 33 3b 0a 20 20  pOp->p3 = p3;.  
1430: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  pOp->p4.p = 0;. 
1440: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
1450: 34 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66 64 65  4_NOTUSED;.#ifde
1460: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1470: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
1480: 0a 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  .  pOp->zComment
1490: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 0;.#endif.#if
14a0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
14b0: 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c  .  if( p->db->fl
14c0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
14d0: 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20  eAddopTrace ){. 
14e0: 20 20 20 69 6e 74 20 6a 6a 2c 20 6b 6b 3b 0a 20     int jj, kk;. 
14f0: 20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65     Parse *pParse
1500: 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20   = p->pParse;.  
1510: 20 20 66 6f 72 28 6a 6a 3d 6b 6b 3d 30 3b 20 6a    for(jj=kk=0; j
1520: 6a 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  j<SQLITE_N_COLCA
1530: 43 48 45 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20  CHE; jj++){.    
1540: 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
1550: 68 65 20 2a 78 20 3d 20 70 50 61 72 73 65 2d 3e  he *x = pParse->
1560: 61 43 6f 6c 43 61 63 68 65 20 2b 20 6a 6a 3b 0a  aColCache + jj;.
1570: 20 20 20 20 20 20 69 66 28 20 78 2d 3e 69 4c 65        if( x->iLe
1580: 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43 61 63  vel>pParse->iCac
1590: 68 65 4c 65 76 65 6c 20 7c 7c 20 78 2d 3e 69 52  heLevel || x->iR
15a0: 65 67 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  eg==0 ) continue
15b0: 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22  ;.      printf("
15c0: 20 72 5b 25 64 5d 3d 7b 25 64 3a 25 64 7d 22 2c   r[%d]={%d:%d}",
15d0: 20 78 2d 3e 69 52 65 67 2c 20 78 2d 3e 69 54 61   x->iReg, x->iTa
15e0: 62 6c 65 2c 20 78 2d 3e 69 43 6f 6c 75 6d 6e 29  ble, x->iColumn)
15f0: 3b 0a 20 20 20 20 20 20 6b 6b 2b 2b 3b 0a 20 20  ;.      kk++;.  
1600: 20 20 7d 0a 20 20 20 20 69 66 28 20 6b 6b 20 29    }.    if( kk )
1610: 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20   printf("\n");. 
1620: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
1630: 69 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e  intOp(0, i, &p->
1640: 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 74 65 73  aOp[i]);.    tes
1650: 74 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69  t_addop_breakpoi
1660: 6e 74 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  nt();.  }.#endif
1670: 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
1680: 46 49 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c  FILE.  pOp->cycl
1690: 65 73 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63  es = 0;.  pOp->c
16a0: 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23  nt = 0;.#endif.#
16b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42  ifdef SQLITE_VDB
16c0: 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 70 4f 70  E_COVERAGE.  pOp
16d0: 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 30 3b 0a  ->iSrcLine = 0;.
16e0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
16f0: 69 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  i;.}.int sqlite3
1700: 56 64 62 65 41 64 64 4f 70 30 28 56 64 62 65 20  VdbeAddOp0(Vdbe 
1710: 2a 70 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72  *p, int op){.  r
1720: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1730: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30  eAddOp3(p, op, 0
1740: 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73  , 0, 0);.}.int s
1750: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
1760: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
1770: 2c 20 69 6e 74 20 70 31 29 7b 0a 20 20 72 65 74  , int p1){.  ret
1780: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41  urn sqlite3VdbeA
1790: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
17a0: 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71   0, 0);.}.int sq
17b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17c0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  Vdbe *p, int op,
17d0: 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29   int p1, int p2)
17e0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
17f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
1800: 6f 70 2c 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a  op, p1, p2, 0);.
1810: 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  }../* Generate c
1820: 6f 64 65 20 66 6f 72 20 61 6e 20 75 6e 63 6f 6e  ode for an uncon
1830: 64 69 74 69 6f 6e 61 6c 20 6a 75 6d 70 20 74 6f  ditional jump to
1840: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 44 65   instruction iDe
1850: 73 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  st.*/.int sqlite
1860: 33 56 64 62 65 47 6f 74 6f 28 56 64 62 65 20 2a  3VdbeGoto(Vdbe *
1870: 70 2c 20 69 6e 74 20 69 44 65 73 74 29 7b 0a 20  p, int iDest){. 
1880: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1890: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f  dbeAddOp3(p, OP_
18a0: 47 6f 74 6f 2c 20 30 2c 20 69 44 65 73 74 2c 20  Goto, 0, iDest, 
18b0: 30 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61  0);.}../* Genera
18c0: 74 65 20 63 6f 64 65 20 74 6f 20 63 61 75 73 65  te code to cause
18d0: 20 74 68 65 20 73 74 72 69 6e 67 20 7a 53 74 72   the string zStr
18e0: 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 69 6e   to be loaded in
18f0: 74 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69  to.** register i
1900: 44 65 73 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Dest.*/.int sqli
1910: 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
1920: 67 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  g(Vdbe *p, int i
1930: 44 65 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  Dest, const char
1940: 20 2a 7a 53 74 72 29 7b 0a 20 20 72 65 74 75 72   *zStr){.  retur
1950: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  n sqlite3VdbeAdd
1960: 4f 70 34 28 70 2c 20 4f 50 5f 53 74 72 69 6e 67  Op4(p, OP_String
1970: 38 2c 20 30 2c 20 69 44 65 73 74 2c 20 30 2c 20  8, 0, iDest, 0, 
1980: 7a 53 74 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  zStr, 0);.}../*.
1990: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
19a0: 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a 65   that initialize
19b0: 73 20 6d 75 6c 74 69 70 6c 65 20 72 65 67 69 73  s multiple regis
19c0: 74 65 72 73 20 74 6f 20 73 74 72 69 6e 67 20 6f  ters to string o
19d0: 72 20 69 6e 74 65 67 65 72 0a 2a 2a 20 63 6f 6e  r integer.** con
19e0: 73 74 61 6e 74 73 2e 20 20 54 68 65 20 72 65 67  stants.  The reg
19f0: 69 73 74 65 72 73 20 62 65 67 69 6e 20 77 69 74  isters begin wit
1a00: 68 20 69 44 65 73 74 20 61 6e 64 20 69 6e 63 72  h iDest and incr
1a10: 65 61 73 65 20 63 6f 6e 73 65 63 75 74 69 76 65  ease consecutive
1a20: 6c 79 2e 0a 2a 2a 20 4f 6e 65 20 72 65 67 69 73  ly..** One regis
1a30: 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ter is initializ
1a40: 65 64 20 66 6f 72 20 65 61 63 68 20 63 68 61 72  ed for each char
1a50: 61 63 67 74 65 72 20 69 6e 20 7a 54 79 70 65 73  acgter in zTypes
1a60: 5b 5d 2e 20 20 46 6f 72 20 65 61 63 68 0a 2a 2a  [].  For each.**
1a70: 20 22 73 22 20 63 68 61 72 61 63 74 65 72 20 69   "s" character i
1a80: 6e 20 7a 54 79 70 65 73 5b 5d 2c 20 74 68 65 20  n zTypes[], the 
1a90: 72 65 67 69 73 74 65 72 20 69 73 20 61 20 73 74  register is a st
1aa0: 72 69 6e 67 20 69 66 20 74 68 65 20 61 72 67 75  ring if the argu
1ab0: 6d 65 6e 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 4e  ment is.** not N
1ac0: 55 4c 4c 2c 20 6f 72 20 4f 50 5f 4e 75 6c 6c 20  ULL, or OP_Null 
1ad0: 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  if the value is 
1ae0: 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20  a null pointer. 
1af0: 20 46 6f 72 20 65 61 63 68 20 22 69 22 20 63 68   For each "i" ch
1b00: 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 7a 54  aracter.** in zT
1b10: 79 70 65 73 5b 5d 2c 20 74 68 65 20 72 65 67 69  ypes[], the regi
1b20: 73 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69  ster is initiali
1b30: 7a 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  zed to an intege
1b40: 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
1b50: 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28  e3VdbeMultiLoad(
1b60: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65  Vdbe *p, int iDe
1b70: 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  st, const char *
1b80: 7a 54 79 70 65 73 2c 20 2e 2e 2e 29 7b 0a 20 20  zTypes, ...){.  
1b90: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e  va_list ap;.  in
1ba0: 74 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20  t i;.  char c;. 
1bb0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 54   va_start(ap, zT
1bc0: 79 70 65 73 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ypes);.  for(i=0
1bd0: 3b 20 28 63 20 3d 20 7a 54 79 70 65 73 5b 69 5d  ; (c = zTypes[i]
1be0: 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  )!=0; i++){.    
1bf0: 69 66 28 20 63 3d 3d 27 73 27 20 29 7b 0a 20 20  if( c=='s' ){.  
1c00: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1c10: 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63  z = va_arg(ap, c
1c20: 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20  onst char*);.   
1c30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c40: 64 4f 70 34 28 70 2c 20 7a 3d 3d 30 20 3f 20 4f  dOp4(p, z==0 ? O
1c50: 50 5f 4e 75 6c 6c 20 3a 20 4f 50 5f 53 74 72 69  P_Null : OP_Stri
1c60: 6e 67 38 2c 20 30 2c 20 69 44 65 73 74 2b 2b 2c  ng8, 0, iDest++,
1c70: 20 30 2c 20 7a 2c 20 30 29 3b 0a 20 20 20 20 7d   0, z, 0);.    }
1c80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1c90: 72 74 28 20 63 3d 3d 27 69 27 20 29 3b 0a 20 20  rt( c=='i' );.  
1ca0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1cb0: 64 64 4f 70 32 28 70 2c 20 4f 50 5f 49 6e 74 65  ddOp2(p, OP_Inte
1cc0: 67 65 72 2c 20 76 61 5f 61 72 67 28 61 70 2c 20  ger, va_arg(ap, 
1cd0: 69 6e 74 29 2c 20 69 44 65 73 74 2b 2b 29 3b 0a  int), iDest++);.
1ce0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65      }.  }.  va_e
1cf0: 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nd(ap);.}../*.**
1d00: 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74   Add an opcode t
1d10: 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65  hat includes the
1d20: 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 20 70   p4 value as a p
1d30: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  ointer..*/.int s
1d40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1d50: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
1d60: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
1d70: 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69  he opcode to thi
1d80: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  s VM */.  int op
1d90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1da0: 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20   The new opcode 
1db0: 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20  */.  int p1,    
1dc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1dd0: 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P1 operand */.  
1de0: 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20  int p2,         
1df0: 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70      /* The P2 op
1e00: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
1e10: 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  3,             /
1e20: 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64  * The P3 operand
1e30: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1e40: 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68 65   *zP4,    /* The
1e50: 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P4 operand */. 
1e60: 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20 20   int p4type     
1e70: 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61       /* P4 opera
1e80: 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20  nd type */.){.  
1e90: 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74  int addr = sqlit
1ea0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
1eb0: 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b  op, p1, p2, p3);
1ec0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
1ed0: 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20  angeP4(p, addr, 
1ee0: 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20  zP4, p4type);.  
1ef0: 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
1f00: 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63  /*.** Add an opc
1f10: 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65  ode that include
1f20: 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 77  s the p4 value w
1f30: 69 74 68 20 61 20 50 34 5f 49 4e 54 36 34 20 6f  ith a P4_INT64 o
1f40: 72 0a 2a 2a 20 50 34 5f 52 45 41 4c 20 74 79 70  r.** P4_REAL typ
1f50: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1f60: 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28  3VdbeAddOp4Dup8(
1f70: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
1f80: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
1f90: 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73  e opcode to this
1fa0: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c   VM */.  int op,
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fc0: 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a  The new opcode *
1fd0: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20  /.  int p1,     
1fe0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1ff0: 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  1 operand */.  i
2000: 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20  nt p2,          
2010: 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65     /* The P2 ope
2020: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33  rand */.  int p3
2030: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2040: 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   The P3 operand 
2050: 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a  */.  const u8 *z
2060: 50 34 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  P4,      /* The 
2070: 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P4 operand */.  
2080: 69 6e 74 20 70 34 74 79 70 65 20 20 20 20 20 20  int p4type      
2090: 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e      /* P4 operan
20a0: 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 63  d type */.){.  c
20b0: 68 61 72 20 2a 70 34 63 6f 70 79 20 3d 20 73 71  har *p4copy = sq
20c0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
20d0: 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 70  (sqlite3VdbeDb(p
20e0: 29 2c 20 38 29 3b 0a 20 20 69 66 28 20 70 34 63  ), 8);.  if( p4c
20f0: 6f 70 79 20 29 20 6d 65 6d 63 70 79 28 70 34 63  opy ) memcpy(p4c
2100: 6f 70 79 2c 20 7a 50 34 2c 20 38 29 3b 0a 20 20  opy, zP4, 8);.  
2110: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
2120: 62 65 41 64 64 4f 70 34 28 70 2c 20 6f 70 2c 20  beAddOp4(p, op, 
2130: 70 31 2c 20 70 32 2c 20 70 33 2c 20 70 34 63 6f  p1, p2, p3, p4co
2140: 70 79 2c 20 70 34 74 79 70 65 29 3b 0a 7d 0a 0a  py, p4type);.}..
2150: 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 4f 50 5f  /*.** Add an OP_
2160: 50 61 72 73 65 53 63 68 65 6d 61 20 6f 70 63 6f  ParseSchema opco
2170: 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  de.  This routin
2180: 65 20 69 73 20 62 72 6f 6b 65 6e 20 6f 75 74 20  e is broken out 
2190: 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56  from.** sqlite3V
21a0: 64 62 65 41 64 64 4f 70 34 28 29 20 73 69 6e 63  dbeAddOp4() sinc
21b0: 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20 61 6c  e it needs to al
21c0: 73 6f 20 6e 65 65 64 73 20 74 6f 20 6d 61 72 6b  so needs to mark
21d0: 20 61 6c 6c 20 62 74 72 65 65 73 0a 2a 2a 20 61   all btrees.** a
21e0: 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20 75 73  s having been us
21f0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 57  ed..**.** The zW
2200: 68 65 72 65 20 73 74 72 69 6e 67 20 6d 75 73 74  here string must
2210: 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69   have been obtai
2220: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
2230: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68  _malloc()..** Th
2240: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
2250: 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20 6f  take ownership o
2260: 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20  f the allocated 
2270: 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20  memory..*/.void 
2280: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61  sqlite3VdbeAddPa
2290: 72 73 65 53 63 68 65 6d 61 4f 70 28 56 64 62 65  rseSchemaOp(Vdbe
22a0: 20 2a 70 2c 20 69 6e 74 20 69 44 62 2c 20 63 68   *p, int iDb, ch
22b0: 61 72 20 2a 7a 57 68 65 72 65 29 7b 0a 20 20 69  ar *zWhere){.  i
22c0: 6e 74 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 56  nt j;.  sqlite3V
22d0: 64 62 65 41 64 64 4f 70 34 28 70 2c 20 4f 50 5f  dbeAddOp4(p, OP_
22e0: 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62  ParseSchema, iDb
22f0: 2c 20 30 2c 20 30 2c 20 7a 57 68 65 72 65 2c 20  , 0, 0, zWhere, 
2300: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 66  P4_DYNAMIC);.  f
2310: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d  or(j=0; j<p->db-
2320: 3e 6e 44 62 3b 20 6a 2b 2b 29 20 73 71 6c 69 74  >nDb; j++) sqlit
2330: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
2340: 70 2c 20 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p, j);.}../*.** 
2350: 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68  Add an opcode th
2360: 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  at includes the 
2370: 70 34 20 76 61 6c 75 65 20 61 73 20 61 6e 20 69  p4 value as an i
2380: 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  nteger..*/.int s
2390: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
23a0: 49 6e 74 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  Int(.  Vdbe *p, 
23b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
23c0: 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20  d the opcode to 
23d0: 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74  this VM */.  int
23e0: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
23f0: 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f   /* The new opco
2400: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20  de */.  int p1, 
2410: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2420: 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f  he P1 operand */
2430: 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20  .  int p2,      
2440: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32         /* The P2
2450: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
2460: 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20  t p3,           
2470: 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72    /* The P3 oper
2480: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 20  and */.  int p4 
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24a0: 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 61  The P4 operand a
24b0: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a  s an integer */.
24c0: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20  ){.  int addr = 
24d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
24e0: 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c  3(p, op, p1, p2,
24f0: 20 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   p3);.  sqlite3V
2500: 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61  dbeChangeP4(p, a
2510: 64 64 72 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f  ddr, SQLITE_INT_
2520: 54 4f 5f 50 54 52 28 70 34 29 2c 20 50 34 5f 49  TO_PTR(p4), P4_I
2530: 4e 54 33 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  NT32);.  return 
2540: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  addr;.}../*.** C
2550: 72 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62  reate a new symb
2560: 6f 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61  olic label for a
2570: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
2580: 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65  at has yet to be
2590: 0a 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20  .** coded.  The 
25a0: 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69  symbolic label i
25b0: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20  s really just a 
25c0: 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e  negative number.
25d0: 20 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63    The.** label c
25e0: 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 74 68  an be used as th
25f0: 65 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e  e P2 value of an
2600: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74   operation.  Lat
2610: 65 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  er, when.** the 
2620: 6c 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65  label is resolve
2630: 64 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20  d to a specific 
2640: 61 64 64 72 65 73 73 2c 20 74 68 65 20 56 44 42  address, the VDB
2650: 45 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74  E will scan.** t
2660: 68 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61  hrough its opera
2670: 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68  tion list and ch
2680: 61 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20  ange all values 
2690: 6f 66 20 50 32 20 77 68 69 63 68 20 6d 61 74 63  of P2 which matc
26a0: 68 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69  h.** the label i
26b0: 6e 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64  nto the resolved
26c0: 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
26d0: 54 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74  The VDBE knows t
26e0: 68 61 74 20 61 20 50 32 20 76 61 6c 75 65 20 69  hat a P2 value i
26f0: 73 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73  s a label becaus
2700: 65 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20  e labels are.** 
2710: 61 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65 20  always negative 
2720: 61 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61 72  and P2 values ar
2730: 65 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20  e suppose to be 
2740: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a  non-negative..**
2750: 20 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69   Hence, a negati
2760: 76 65 20 50 32 20 76 61 6c 75 65 20 69 73 20 61  ve P2 value is a
2770: 20 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73 20   label that has 
2780: 79 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76  yet to be resolv
2790: 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69  ed..**.** Zero i
27a0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20  s returned if a 
27b0: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a  malloc() fails..
27c0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
27d0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 65  beMakeLabel(Vdbe
27e0: 20 2a 76 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *v){.  Parse *p
27f0: 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20   = v->pParse;.  
2800: 69 6e 74 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65  int i = p->nLabe
2810: 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 76  l++;.  assert( v
2820: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
2830: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
2840: 28 20 28 69 20 26 20 28 69 2d 31 29 29 3d 3d 30  ( (i & (i-1))==0
2850: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65   ){.    p->aLabe
2860: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  l = sqlite3DbRea
2870: 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62  llocOrFree(p->db
2880: 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 20 0a 20 20  , 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 28 69 2a 32 2b 31 29 2a 73 69 7a       (i*2+1)*siz
28c0: 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d  eof(p->aLabel[0]
28d0: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ));.  }.  if( p-
28e0: 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70  >aLabel ){.    p
28f0: 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31  ->aLabel[i] = -1
2900: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 41  ;.  }.  return A
2910: 44 44 52 28 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  DDR(i);.}../*.**
2920: 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22   Resolve label "
2930: 78 22 20 74 6f 20 62 65 20 74 68 65 20 61 64 64  x" to be the add
2940: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
2950: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a   instruction to.
2960: 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20  ** be inserted. 
2970: 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22   The parameter "
2980: 78 22 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  x" must have bee
2990: 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  n obtained from.
29a0: 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20  ** a prior call 
29b0: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  to sqlite3VdbeMa
29c0: 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f  keLabel()..*/.vo
29d0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  id sqlite3VdbeRe
29e0: 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20  solveLabel(Vdbe 
29f0: 2a 76 2c 20 69 6e 74 20 78 29 7b 0a 20 20 50 61  *v, int x){.  Pa
2a00: 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72  rse *p = v->pPar
2a10: 73 65 3b 0a 20 20 69 6e 74 20 6a 20 3d 20 41 44  se;.  int j = AD
2a20: 44 52 28 78 29 3b 0a 20 20 61 73 73 65 72 74 28  DR(x);.  assert(
2a30: 20 76 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   v->magic==VDBE_
2a40: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
2a50: 61 73 73 65 72 74 28 20 6a 3c 70 2d 3e 6e 4c 61  assert( j<p->nLa
2a60: 62 65 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  bel );.  assert(
2a70: 20 6a 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70   j>=0 );.  if( p
2a80: 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20  ->aLabel ){.    
2a90: 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76  p->aLabel[j] = v
2aa0: 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e  ->nOp;.  }.  p->
2ab0: 69 46 69 78 65 64 4f 70 20 3d 20 76 2d 3e 6e 4f  iFixedOp = v->nO
2ac0: 70 20 2d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p - 1;.}../*.** 
2ad0: 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20 61 73  Mark the VDBE as
2ae0: 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 6f 6e   one that can on
2af0: 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65 20 74 69  ly be run one ti
2b00: 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  me..*/.void sqli
2b10: 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e  te3VdbeRunOnlyOn
2b20: 63 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70  ce(Vdbe *p){.  p
2b30: 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20  ->runOnlyOnce = 
2b40: 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  1;.}..#ifdef SQL
2b50: 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c  ITE_DEBUG /* sql
2b60: 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f  ite3AssertMayAbo
2b70: 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f  rt() logic */../
2b80: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
2b90: 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75 6e 63  ng type and func
2ba0: 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f  tion are used to
2bb0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
2bc0: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20   all opcodes.** 
2bd0: 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e 20 70  in a Vdbe main p
2be0: 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63 68 20  rogram and each 
2bf0: 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72  of the sub-progr
2c00: 61 6d 73 20 28 74 72 69 67 67 65 72 73 29 20 69  ams (triggers) i
2c10: 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65  t may .** invoke
2c20: 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64   directly or ind
2c30: 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68 6f 75  irectly. It shou
2c40: 6c 64 20 62 65 20 75 73 65 64 20 61 73 20 66 6f  ld be used as fo
2c50: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f  llows:.**.**   O
2c60: 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62  p *pOp;.**   Vdb
2c70: 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 2a  eOpIter sIter;.*
2c80: 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26 73  *.**   memset(&s
2c90: 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
2ca0: 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49  sIter));.**   sI
2cb0: 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20 20 20  ter.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 2f 2f 20 76 20 69 73 20 6f 66        // v is of
2ce0: 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20   type Vdbe* .** 
2cf0: 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20    while( (pOp = 
2d00: 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65  opIterNext(&sIte
2d10: 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f  r)) ){.**     //
2d20: 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69   Do something wi
2d30: 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a  th pOp.**   }.**
2d40: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2d50: 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70  (v->db, sIter.ap
2d60: 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70  Sub);.** .*/.typ
2d70: 65 64 65 66 20 73 74 72 75 63 74 20 56 64 62 65  edef struct Vdbe
2d80: 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49 74 65  OpIter VdbeOpIte
2d90: 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65 4f 70  r;.struct VdbeOp
2da0: 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20 2a 76  Iter {.  Vdbe *v
2db0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2dc0: 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 69      /* Vdbe to i
2dd0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
2de0: 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f  he opcodes of */
2df0: 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a  .  SubProgram **
2e00: 61 70 53 75 62 3b 20 20 20 20 20 20 20 20 2f 2a  apSub;        /*
2e10: 20 41 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f   Array of subpro
2e20: 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  grams */.  int n
2e30: 53 75 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sub;            
2e40: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2e50: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 70  of entries in ap
2e60: 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64  Sub */.  int iAd
2e70: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
2e80: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
2e90: 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  f next instructi
2ea0: 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  on to return */.
2eb0: 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20 20 20    int iSub;     
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ed0: 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  0 = main program
2ee0: 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75 62 2d  , 1 = first sub-
2ef0: 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a  program etc. */.
2f00: 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f 70  };.static Op *op
2f10: 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f 70 49  IterNext(VdbeOpI
2f20: 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62 65 20  ter *p){.  Vdbe 
2f30: 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20  *v = p->v;.  Op 
2f40: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20  *pRet = 0;.  Op 
2f50: 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b  *aOp;.  int nOp;
2f60: 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3c  ..  if( p->iSub<
2f70: 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20  =p->nSub ){..   
2f80: 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20   if( p->iSub==0 
2f90: 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 76  ){.      aOp = v
2fa0: 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70  ->aOp;.      nOp
2fb0: 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d   = v->nOp;.    }
2fc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f 70 20  else{.      aOp 
2fd0: 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53  = p->apSub[p->iS
2fe0: 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20  ub-1]->aOp;.    
2ff0: 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62    nOp = p->apSub
3000: 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70  [p->iSub-1]->nOp
3010: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
3020: 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70  rt( p->iAddr<nOp
3030: 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d 20   );..    pRet = 
3040: 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a  &aOp[p->iAddr];.
3050: 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a      p->iAddr++;.
3060: 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64 64 72      if( p->iAddr
3070: 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 70  ==nOp ){.      p
3080: 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20  ->iSub++;.      
3090: 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20 20  p->iAddr = 0;.  
30a0: 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 70    }.  .    if( p
30b0: 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  Ret->p4type==P4_
30c0: 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20  SUBPROGRAM ){.  
30d0: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
30e0: 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65  (p->nSub+1)*size
30f0: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b  of(SubProgram*);
3100: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
3110: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
3120: 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nSub; j++){.  
3130: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 70 53        if( p->apS
3140: 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e  ub[j]==pRet->p4.
3150: 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b  pProgram ) break
3160: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3170: 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29  if( j==p->nSub )
3180: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53  {.        p->apS
3190: 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ub = sqlite3DbRe
31a0: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64  allocOrFree(v->d
31b0: 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79  b, p->apSub, nBy
31c0: 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  te);.        if(
31d0: 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20   !p->apSub ){.  
31e0: 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30          pRet = 0
31f0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
3200: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 70  .          p->ap
3210: 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d  Sub[p->nSub++] =
3220: 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72   pRet->p4.pProgr
3230: 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  am;.        }.  
3240: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
3250: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
3260: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69  }../*.** Check i
3270: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 73 74  f the program st
3280: 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d 20 61  ored in the VM a
3290: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
32a0: 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72  Parse may.** thr
32b0: 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65  ow an ABORT exce
32c0: 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67 20 74  ption (causing t
32d0: 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75  he statement, bu
32e0: 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74 72 61  t not entire tra
32f0: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62  nsaction.** to b
3300: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 20  e rolled back). 
3310: 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  This condition i
3320: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6d 61  s true if the ma
3330: 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20 61 6e  in program or an
3340: 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72 61 6d  y.** sub-program
3350: 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6f  s contains any o
3360: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
3370: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48  .**.**   *  OP_H
3380: 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c 49  alt with P1=SQLI
3390: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e  TE_CONSTRAINT an
33a0: 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a  d P2=OE_Abort..*
33b0: 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 49 66  *   *  OP_HaltIf
33c0: 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53 51 4c  Null with P1=SQL
33d0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61  ITE_CONSTRAINT a
33e0: 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a  nd P2=OE_Abort..
33f0: 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72  **   *  OP_Destr
3400: 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55  oy.**   *  OP_VU
3410: 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50  pdate.**   *  OP
3420: 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20  _VRename.**   * 
3430: 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 77 69   OP_FkCounter wi
3440: 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65 64 69  th P2==0 (immedi
3450: 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
3460: 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a 20 20  constraint).**  
3470: 20 2a 20 20 4f 50 5f 43 72 65 61 74 65 54 61 62   *  OP_CreateTab
3480: 6c 65 20 61 6e 64 20 4f 50 5f 49 6e 69 74 43 6f  le and OP_InitCo
3490: 72 6f 75 74 69 6e 65 20 28 66 6f 72 20 43 52 45  routine (for CRE
34a0: 41 54 45 20 54 41 42 4c 45 20 41 53 20 53 45 4c  ATE TABLE AS SEL
34b0: 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54  ECT ...).**.** T
34c0: 68 65 6e 20 63 68 65 63 6b 20 74 68 61 74 20 74  hen check that t
34d0: 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 72 73  he value of Pars
34e0: 65 2e 6d 61 79 41 62 6f 72 74 20 69 73 20 74 72  e.mayAbort is tr
34f0: 75 65 20 69 66 20 61 6e 0a 2a 2a 20 41 42 4f 52  ue if an.** ABOR
3500: 54 20 6d 61 79 20 62 65 20 74 68 72 6f 77 6e 2c  T may be thrown,
3510: 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77   or false otherw
3520: 69 73 65 2e 20 52 65 74 75 72 6e 20 74 72 75 65  ise. Return true
3530: 20 69 66 20 69 74 20 64 6f 65 73 0a 2a 2a 20 6d   if it does.** m
3540: 61 74 63 68 2c 20 6f 72 20 66 61 6c 73 65 20 6f  atch, or false o
3550: 74 68 65 72 77 69 73 65 2e 20 54 68 69 73 20 66  therwise. This f
3560: 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 74 65 6e  unction is inten
3570: 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 61  ded to be used a
3580: 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 61 6e 20  s.** part of an 
3590: 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74  assert statement
35a0: 20 69 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   in the compiler
35b0: 2e 20 53 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a  . Similar to:.**
35c0: 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 73 71  .**   assert( sq
35d0: 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74 4d  lite3VdbeAssertM
35e0: 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 2d 3e  ayAbort(pParse->
35f0: 70 56 64 62 65 2c 20 70 50 61 72 73 65 2d 3e 6d  pVdbe, pParse->m
3600: 61 79 41 62 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69  ayAbort) );.*/.i
3610: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 73  nt sqlite3VdbeAs
3620: 73 65 72 74 4d 61 79 41 62 6f 72 74 28 56 64 62  sertMayAbort(Vdb
3630: 65 20 2a 76 2c 20 69 6e 74 20 6d 61 79 41 62 6f  e *v, int mayAbo
3640: 72 74 29 7b 0a 20 20 69 6e 74 20 68 61 73 41 62  rt){.  int hasAb
3650: 6f 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68  ort = 0;.  int h
3660: 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 30 3b  asFkCounter = 0;
3670: 0a 20 20 69 6e 74 20 68 61 73 43 72 65 61 74 65  .  int hasCreate
3680: 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74  Table = 0;.  int
3690: 20 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e   hasInitCoroutin
36a0: 65 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 70 4f 70  e = 0;.  Op *pOp
36b0: 3b 0a 20 20 56 64 62 65 4f 70 49 74 65 72 20 73  ;.  VdbeOpIter s
36c0: 49 74 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26  Iter;.  memset(&
36d0: 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  sIter, 0, sizeof
36e0: 28 73 49 74 65 72 29 29 3b 0a 20 20 73 49 74 65  (sIter));.  sIte
36f0: 72 2e 76 20 3d 20 76 3b 0a 0a 20 20 77 68 69 6c  r.v = v;..  whil
3700: 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74 65 72  e( (pOp = opIter
3710: 4e 65 78 74 28 26 73 49 74 65 72 29 29 21 3d 30  Next(&sIter))!=0
3720: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 63 6f   ){.    int opco
3730: 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  de = pOp->opcode
3740: 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65  ;.    if( opcode
3750: 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20 7c 7c 20  ==OP_Destroy || 
3760: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61  opcode==OP_VUpda
3770: 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  te || opcode==OP
3780: 5f 56 52 65 6e 61 6d 65 20 0a 20 20 20 20 20 7c  _VRename .     |
3790: 7c 20 28 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48  | ((opcode==OP_H
37a0: 61 6c 74 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  alt || opcode==O
37b0: 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20  P_HaltIfNull) . 
37c0: 20 20 20 20 20 26 26 20 28 28 70 4f 70 2d 3e 70       && ((pOp->p
37d0: 31 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  1&0xff)==SQLITE_
37e0: 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70 4f  CONSTRAINT && pO
37f0: 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 29  p->p2==OE_Abort)
3800: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 68  ).    ){.      h
3810: 61 73 41 62 6f 72 74 20 3d 20 31 3b 0a 20 20 20  asAbort = 1;.   
3820: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3830: 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d      if( opcode==
3840: 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20 29  OP_CreateTable )
3850: 20 68 61 73 43 72 65 61 74 65 54 61 62 6c 65 20   hasCreateTable 
3860: 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 6f 70 63  = 1;.    if( opc
3870: 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 43 6f 72 6f  ode==OP_InitCoro
3880: 75 74 69 6e 65 20 29 20 68 61 73 49 6e 69 74 43  utine ) hasInitC
3890: 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 23 69  oroutine = 1;.#i
38a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
38b0: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
38c0: 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50    if( opcode==OP
38d0: 5f 46 6b 43 6f 75 6e 74 65 72 20 26 26 20 70 4f  _FkCounter && pO
38e0: 70 2d 3e 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d  p->p1==0 && pOp-
38f0: 3e 70 32 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  >p2==1 ){.      
3900: 68 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 31  hasFkCounter = 1
3910: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
3920: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
3930: 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e  ee(v->db, sIter.
3940: 61 70 53 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65  apSub);..  /* Re
3950: 74 75 72 6e 20 74 72 75 65 20 69 66 20 68 61 73  turn true if has
3960: 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e  Abort==mayAbort.
3970: 20 4f 72 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20   Or if a malloc 
3980: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
3990: 2e 0a 20 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63  ..  ** If malloc
39a0: 20 66 61 69 6c 65 64 2c 20 74 68 65 6e 20 74 68   failed, then th
39b0: 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61  e while() loop a
39c0: 62 6f 76 65 20 6d 61 79 20 6e 6f 74 20 68 61 76  bove may not hav
39d0: 65 20 69 74 65 72 61 74 65 64 0a 20 20 2a 2a 20  e iterated.  ** 
39e0: 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f  through all opco
39f0: 64 65 73 20 61 6e 64 20 68 61 73 41 62 6f 72 74  des and hasAbort
3a00: 20 6d 61 79 20 62 65 20 73 65 74 20 69 6e 63 6f   may be set inco
3a10: 72 72 65 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a  rrectly. Return.
3a20: 20 20 2a 2a 20 74 72 75 65 20 66 6f 72 20 74 68    ** true for th
3a30: 69 73 20 63 61 73 65 20 74 6f 20 70 72 65 76 65  is case to preve
3a40: 6e 74 20 74 68 65 20 61 73 73 65 72 74 28 29 20  nt the assert() 
3a50: 69 6e 20 74 68 65 20 63 61 6c 6c 65 72 73 20 66  in the callers f
3a60: 72 61 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66  rame.  ** from f
3a70: 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65  ailing.  */.  re
3a80: 74 75 72 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61  turn ( v->db->ma
3a90: 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 68 61  llocFailed || ha
3aa0: 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74  sAbort==mayAbort
3ab0: 20 7c 7c 20 68 61 73 46 6b 43 6f 75 6e 74 65 72   || hasFkCounter
3ac0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  .              |
3ad0: 7c 20 28 68 61 73 43 72 65 61 74 65 54 61 62 6c  | (hasCreateTabl
3ae0: 65 20 26 26 20 68 61 73 49 6e 69 74 43 6f 72 6f  e && hasInitCoro
3af0: 75 74 69 6e 65 29 20 29 3b 0a 7d 0a 23 65 6e 64  utine) );.}.#end
3b00: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
3b10: 55 47 20 2d 20 74 68 65 20 73 71 6c 69 74 65 33  UG - the sqlite3
3b20: 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29  AssertMayAbort()
3b30: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a   function */../*
3b40: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3b50: 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
3b60: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76   all opcodes hav
3b70: 65 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e  e been inserted.
3b80: 20 20 49 74 20 6c 6f 6f 70 73 0a 2a 2a 20 74 68    It loops.** th
3b90: 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 6f 70  rough all the op
3ba0: 63 6f 64 65 73 20 61 6e 64 20 66 69 78 65 73 20  codes and fixes 
3bb0: 75 70 20 73 6f 6d 65 20 64 65 74 61 69 6c 73 2e  up some details.
3bc0: 0a 2a 2a 0a 2a 2a 20 28 31 29 20 46 6f 72 20 65  .**.** (1) For e
3bd0: 61 63 68 20 6a 75 6d 70 20 69 6e 73 74 72 75 63  ach jump instruc
3be0: 74 69 6f 6e 20 77 69 74 68 20 61 20 6e 65 67 61  tion with a nega
3bf0: 74 69 76 65 20 50 32 20 76 61 6c 75 65 20 28 61  tive P2 value (a
3c00: 20 6c 61 62 65 6c 29 0a 2a 2a 20 20 20 20 20 72   label).**     r
3c10: 65 73 6f 6c 76 65 20 74 68 65 20 50 32 20 76 61  esolve the P2 va
3c20: 6c 75 65 20 74 6f 20 61 6e 20 61 63 74 75 61 6c  lue to an actual
3c30: 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
3c40: 28 32 29 20 43 6f 6d 70 75 74 65 20 74 68 65 20  (2) Compute the 
3c50: 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
3c60: 66 20 61 72 67 75 6d 65 6e 74 73 20 75 73 65 64  f arguments used
3c70: 20 62 79 20 61 6e 79 20 53 51 4c 20 66 75 6e 63   by any SQL func
3c80: 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20  tion.**     and 
3c90: 73 74 6f 72 65 20 74 68 61 74 20 76 61 6c 75 65  store that value
3ca0: 20 69 6e 20 2a 70 4d 61 78 46 75 6e 63 41 72 67   in *pMaxFuncArg
3cb0: 73 2e 0a 2a 2a 0a 2a 2a 20 28 33 29 20 55 70 64  s..**.** (3) Upd
3cc0: 61 74 65 20 74 68 65 20 56 64 62 65 2e 72 65 61  ate the Vdbe.rea
3cd0: 64 4f 6e 6c 79 20 61 6e 64 20 56 64 62 65 2e 62  dOnly and Vdbe.b
3ce0: 49 73 52 65 61 64 65 72 20 66 6c 61 67 73 20 74  IsReader flags t
3cf0: 6f 20 61 63 63 75 72 61 74 65 6c 79 0a 2a 2a 20  o accurately.** 
3d00: 20 20 20 20 69 6e 64 69 63 61 74 65 20 77 68 61      indicate wha
3d10: 74 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  t the prepared s
3d20: 74 61 74 65 6d 65 6e 74 20 61 63 74 75 61 6c 6c  tatement actuall
3d30: 79 20 64 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 34  y does..**.** (4
3d40: 29 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  ) Initialize the
3d50: 20 70 34 2e 78 41 64 76 61 6e 63 65 20 70 6f 69   p4.xAdvance poi
3d60: 6e 74 65 72 20 6f 6e 20 6f 70 63 6f 64 65 73 20  nter on opcodes 
3d70: 74 68 61 74 20 75 73 65 20 69 74 2e 0a 2a 2a 0a  that use it..**.
3d80: 2a 2a 20 28 35 29 20 52 65 63 6c 61 69 6d 20 74  ** (5) Reclaim t
3d90: 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
3da0: 74 65 64 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  ted for storing 
3db0: 6c 61 62 65 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69  labels..*/.stati
3dc0: 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32  c void resolveP2
3dd0: 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20  Values(Vdbe *p, 
3de0: 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  int *pMaxFuncArg
3df0: 73 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  s){.  int i;.  i
3e00: 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a 70  nt nMaxArgs = *p
3e10: 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20 20 4f  MaxFuncArgs;.  O
3e20: 70 20 2a 70 4f 70 3b 0a 20 20 50 61 72 73 65 20  p *pOp;.  Parse 
3e30: 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61  *pParse = p->pPa
3e40: 72 73 65 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62  rse;.  int *aLab
3e50: 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 61 4c 61  el = pParse->aLa
3e60: 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e  bel;.  p->readOn
3e70: 6c 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 62 49 73  ly = 1;.  p->bIs
3e80: 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 66 6f  Reader = 0;.  fo
3e90: 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d  r(pOp=p->aOp, i=
3ea0: 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20  p->nOp-1; i>=0; 
3eb0: 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  i--, pOp++){.   
3ec0: 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70   u8 opcode = pOp
3ed0: 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 2f  ->opcode;..    /
3ee0: 2a 20 4e 4f 54 45 3a 20 42 65 20 73 75 72 65 20  * NOTE: Be sure 
3ef0: 74 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70 63 6f  to update mkopco
3f00: 64 65 68 2e 61 77 6b 20 77 68 65 6e 20 61 64 64  deh.awk when add
3f10: 69 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e 67 0a  ing or removing.
3f20: 20 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72 6f      ** cases fro
3f30: 6d 20 74 68 69 73 20 73 77 69 74 63 68 21 20 2a  m this switch! *
3f40: 2f 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70  /.    switch( op
3f50: 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61  code ){.      ca
3f60: 73 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  se OP_Transactio
3f70: 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  n: {.        if(
3f80: 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29 20 70 2d   pOp->p2!=0 ) p-
3f90: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20  >readOnly = 0;. 
3fa0: 20 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20 74         /* fall t
3fb0: 68 72 75 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  hru */.      }. 
3fc0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41 75 74       case OP_Aut
3fd0: 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20 20 63  oCommit:.      c
3fe0: 61 73 65 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74  ase OP_Savepoint
3ff0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 62  : {.        p->b
4000: 49 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20 20  IsReader = 1;.  
4010: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4020: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
4030: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20  ITE_OMIT_WAL.   
4040: 20 20 20 63 61 73 65 20 4f 50 5f 43 68 65 63 6b     case OP_Check
4050: 70 6f 69 6e 74 3a 0a 23 65 6e 64 69 66 0a 20 20  point:.#endif.  
4060: 20 20 20 20 63 61 73 65 20 4f 50 5f 56 61 63 75      case OP_Vacu
4070: 75 6d 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  um:.      case O
4080: 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b  P_JournalMode: {
4090: 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 65 61 64  .        p->read
40a0: 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  Only = 0;.      
40b0: 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d    p->bIsReader =
40c0: 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   1;.        brea
40d0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  k;.      }.#ifnd
40e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
40f0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
4100: 20 20 63 61 73 65 20 4f 50 5f 56 55 70 64 61 74    case OP_VUpdat
4110: 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e: {.        if(
4120: 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67   pOp->p2>nMaxArg
4130: 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70  s ) nMaxArgs = p
4140: 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20 20  Op->p2;.        
4150: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
4160: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 46 69       case OP_VFi
4170: 6c 74 65 72 3a 20 7b 0a 20 20 20 20 20 20 20 20  lter: {.        
4180: 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 61  int n;.        a
4190: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d 20  ssert( p->nOp - 
41a0: 69 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20 20  i >= 3 );.      
41b0: 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31    assert( pOp[-1
41c0: 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74  ].opcode==OP_Int
41d0: 65 67 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  eger );.        
41e0: 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a  n = pOp[-1].p1;.
41f0: 20 20 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d          if( n>nM
4200: 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67  axArgs ) nMaxArg
4210: 73 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 62  s = n;.        b
4220: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65  reak;.      }.#e
4230: 6e 64 69 66 0a 20 20 20 20 20 20 63 61 73 65 20  ndif.      case 
4240: 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20 20 20 63  OP_Next:.      c
4250: 61 73 65 20 4f 50 5f 4e 65 78 74 49 66 4f 70 65  ase OP_NextIfOpe
4260: 6e 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  n:.      case OP
4270: 5f 53 6f 72 74 65 72 4e 65 78 74 3a 20 7b 0a 20  _SorterNext: {. 
4280: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78         pOp->p4.x
4290: 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74 65  Advance = sqlite
42a0: 33 42 74 72 65 65 4e 65 78 74 3b 0a 20 20 20 20  3BtreeNext;.    
42b0: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
42c0: 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20  = P4_ADVANCE;.  
42d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
42e0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
42f0: 4f 50 5f 50 72 65 76 3a 0a 20 20 20 20 20 20 63  OP_Prev:.      c
4300: 61 73 65 20 4f 50 5f 50 72 65 76 49 66 4f 70 65  ase OP_PrevIfOpe
4310: 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 4f 70  n: {.        pOp
4320: 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20  ->p4.xAdvance = 
4330: 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
4340: 69 6f 75 73 3b 0a 20 20 20 20 20 20 20 20 70 4f  ious;.        pO
4350: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41  p->p4type = P4_A
4360: 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20  DVANCE;.        
4370: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
4380: 20 20 20 7d 0a 0a 20 20 20 20 70 4f 70 2d 3e 6f     }..    pOp->o
4390: 70 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33  pflags = sqlite3
43a0: 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 6f  OpcodeProperty[o
43b0: 70 63 6f 64 65 5d 3b 0a 20 20 20 20 69 66 28 20  pcode];.    if( 
43c0: 28 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20  (pOp->opflags & 
43d0: 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26  OPFLG_JUMP)!=0 &
43e0: 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20  & pOp->p2<0 ){. 
43f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 41 44 44       assert( ADD
4400: 52 28 70 4f 70 2d 3e 70 32 29 3c 70 50 61 72 73  R(pOp->p2)<pPars
4410: 65 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20  e->nLabel );.   
4420: 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61     pOp->p2 = aLa
4430: 62 65 6c 5b 41 44 44 52 28 70 4f 70 2d 3e 70 32  bel[ADDR(pOp->p2
4440: 29 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  )];.    }.  }.  
4450: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
4460: 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 4c 61  >db, pParse->aLa
4470: 62 65 6c 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  bel);.  pParse->
4480: 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 70 50  aLabel = 0;.  pP
4490: 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 3d 20 30  arse->nLabel = 0
44a0: 3b 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  ;.  *pMaxFuncArg
44b0: 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 20 20  s = nMaxArgs;.  
44c0: 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65  assert( p->bIsRe
44d0: 61 64 65 72 21 3d 30 20 7c 7c 20 44 62 4d 61 73  ader!=0 || DbMas
44e0: 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65  kAllZero(p->btre
44f0: 65 4d 61 73 6b 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a  eMask) );.}../*.
4500: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 64  ** Return the ad
4510: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
4520: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
4530: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f   be inserted..*/
4540: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
4550: 43 75 72 72 65 6e 74 41 64 64 72 28 56 64 62 65  CurrentAddr(Vdbe
4560: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
4570: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
4580: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72  AGIC_INIT );.  r
4590: 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a  eturn p->nOp;.}.
45a0: 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68  ./*.** Verify th
45b0: 61 74 20 61 74 20 6c 65 61 73 74 20 4e 20 6f 70  at at least N op
45c0: 63 6f 64 65 20 73 6c 6f 74 73 20 61 72 65 20 61  code slots are a
45d0: 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 20 77 69  vailable in p wi
45e0: 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69 6e 67 20  thout.** having 
45f0: 74 6f 20 6d 61 6c 6c 6f 63 20 66 6f 72 20 6d 6f  to malloc for mo
4600: 72 65 20 73 70 61 63 65 2e 20 20 54 68 69 73 20  re space.  This 
4610: 69 6e 74 65 72 66 61 63 65 20 69 73 20 75 73 65  interface is use
4620: 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
4630: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66   only..*/.#ifdef
4640: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 76 6f   SQLITE_DEBUG.vo
4650: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 56 65  id sqlite3VdbeVe
4660: 72 69 66 79 41 76 61 69 6c 61 62 6c 65 53 70 61  rifyAvailableSpa
4670: 63 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ce(Vdbe *p, int 
4680: 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  N){.  assert( p-
4690: 3e 6e 4f 70 20 2b 20 4e 20 3c 3d 20 70 2d 3e 70  >nOp + N <= p->p
46a0: 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20  Parse->nOpAlloc 
46b0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
46c0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
46d0: 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
46e0: 65 72 20 74 6f 20 74 68 65 20 61 72 72 61 79 20  er to the array 
46f0: 6f 66 20 6f 70 63 6f 64 65 73 20 61 73 73 6f 63  of opcodes assoc
4700: 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68  iated with.** th
4710: 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73  e Vdbe passed as
4720: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
4730: 65 6e 74 2e 20 49 74 20 69 73 20 74 68 65 20 63  ent. It is the c
4740: 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62  allers responsib
4750: 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61  ility.** to arra
4760: 6e 67 65 20 66 6f 72 20 74 68 65 20 72 65 74 75  nge for the retu
4770: 72 6e 65 64 20 61 72 72 61 79 20 74 6f 20 62 65  rned array to be
4780: 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
4790: 64 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20  d using the .** 
47a0: 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
47b0: 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ) function..**.*
47c0: 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * Before returni
47d0: 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20 73 65 74  ng, *pnOp is set
47e0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
47f0: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
4800: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72   returned.** arr
4810: 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78  ay. Also, *pnMax
4820: 41 72 67 20 69 73 20 73 65 74 20 74 6f 20 74 68  Arg is set to th
4830: 65 20 6c 61 72 67 65 72 20 6f 66 20 69 74 73 20  e larger of its 
4840: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61 6e  current value an
4850: 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  d .** the number
4860: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
4870: 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20  he Vdbe.apArg[] 
4880: 61 72 72 61 79 20 72 65 71 75 69 72 65 64 20 74  array required t
4890: 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 0a 2a  o execute the .*
48a0: 2a 20 72 65 74 75 72 6e 65 64 20 70 72 6f 67 72  * returned progr
48b0: 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73  am..*/.VdbeOp *s
48c0: 71 6c 69 74 65 33 56 64 62 65 54 61 6b 65 4f 70  qlite3VdbeTakeOp
48d0: 41 72 72 61 79 28 56 64 62 65 20 2a 70 2c 20 69  Array(Vdbe *p, i
48e0: 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70  nt *pnOp, int *p
48f0: 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56 64 62 65  nMaxArg){.  Vdbe
4900: 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70  Op *aOp = p->aOp
4910: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 4f 70 20  ;.  assert( aOp 
4920: 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  && !p->db->mallo
4930: 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a  cFailed );..  /*
4940: 20 43 68 65 63 6b 20 74 68 61 74 20 73 71 6c 69   Check that sqli
4950: 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
4960: 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65  () was not calle
4970: 64 20 6f 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a  d on this VM */.
4980: 20 20 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b    assert( DbMask
4990: 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65  AllZero(p->btree
49a0: 4d 61 73 6b 29 20 29 3b 0a 0a 20 20 72 65 73 6f  Mask) );..  reso
49b0: 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 70  lveP2Values(p, p
49c0: 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f  nMaxArg);.  *pnO
49d0: 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d  p = p->nOp;.  p-
49e0: 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74 75  >aOp = 0;.  retu
49f0: 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aOp;.}../*.**
4a00: 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73   Add a whole lis
4a10: 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20  t of operations 
4a20: 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  to the operation
4a30: 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20   stack.  Return 
4a40: 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20  a.** pointer to 
4a50: 74 68 65 20 66 69 72 73 74 20 6f 70 65 72 61 74  the first operat
4a60: 69 6f 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f  ion inserted..*/
4a70: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33  .VdbeOp *sqlite3
4a80: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 0a 20  VdbeAddOpList(. 
4a90: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4ab0: 20 41 64 64 20 6f 70 63 6f 64 65 73 20 74 6f 20   Add opcodes to 
4ac0: 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
4ad0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
4ae0: 6e 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  nOp,            
4af0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4b00: 65 72 20 6f 66 20 6f 70 63 6f 64 65 73 20 74 6f  er of opcodes to
4b10: 20 61 64 64 20 2a 2f 0a 20 20 56 64 62 65 4f 70   add */.  VdbeOp
4b20: 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70 2c  List const *aOp,
4b30: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70         /* The op
4b40: 63 6f 64 65 73 20 74 6f 20 62 65 20 61 64 64 65  codes to be adde
4b50: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65  d */.  int iLine
4b60: 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  no              
4b70: 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 2d 66 69      /* Source-fi
4b80: 6c 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 6f  le line number o
4b90: 66 20 66 69 72 73 74 20 6f 70 63 6f 64 65 20 2a  f first opcode *
4ba0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
4bb0: 56 64 62 65 4f 70 20 2a 70 4f 75 74 2c 20 2a 70  VdbeOp *pOut, *p
4bc0: 46 69 72 73 74 3b 0a 20 20 61 73 73 65 72 74 28  First;.  assert(
4bd0: 20 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65   nOp>0 );.  asse
4be0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
4bf0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
4c00: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20  .  if( p->nOp + 
4c10: 6e 4f 70 20 3e 20 70 2d 3e 70 50 61 72 73 65 2d  nOp > p->pParse-
4c20: 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67 72 6f  >nOpAlloc && gro
4c30: 77 4f 70 41 72 72 61 79 28 70 2c 20 6e 4f 70 29  wOpArray(p, nOp)
4c40: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
4c50: 3b 0a 20 20 7d 0a 20 20 70 46 69 72 73 74 20 3d  ;.  }.  pFirst =
4c60: 20 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b   pOut = &p->aOp[
4c70: 70 2d 3e 6e 4f 70 5d 3b 0a 20 20 66 6f 72 28 69  p->nOp];.  for(i
4c80: 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20  =0; i<nOp; i++, 
4c90: 61 4f 70 2b 2b 2c 20 70 4f 75 74 2b 2b 29 7b 0a  aOp++, pOut++){.
4ca0: 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64 65      pOut->opcode
4cb0: 20 3d 20 61 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a   = aOp->opcode;.
4cc0: 20 20 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20 61      pOut->p1 = a
4cd0: 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 70 4f 75 74  Op->p1;.    pOut
4ce0: 2d 3e 70 32 20 3d 20 61 4f 70 2d 3e 70 32 3b 0a  ->p2 = aOp->p2;.
4cf0: 20 20 20 20 61 73 73 65 72 74 28 20 61 4f 70 2d      assert( aOp-
4d00: 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20 20 70 4f  >p2>=0 );.    pO
4d10: 75 74 2d 3e 70 33 20 3d 20 61 4f 70 2d 3e 70 33  ut->p3 = aOp->p3
4d20: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 79  ;.    pOut->p4ty
4d30: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
4d40: 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20  .    pOut->p4.p 
4d50: 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70  = 0;.    pOut->p
4d60: 35 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  5 = 0;.#ifdef SQ
4d70: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
4d80: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20  AIN_COMMENTS.   
4d90: 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20   pOut->zComment 
4da0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  = 0;.#endif.#ifd
4db0: 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  ef SQLITE_VDBE_C
4dc0: 4f 56 45 52 41 47 45 0a 20 20 20 20 70 4f 75 74  OVERAGE.    pOut
4dd0: 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69  ->iSrcLine = iLi
4de0: 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20 20  neno+i;.#else.  
4df0: 20 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b    (void)iLineno;
4e00: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
4e10: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
4e20: 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  if( p->db->flags
4e30: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64   & SQLITE_VdbeAd
4e40: 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
4e50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
4e60: 6e 74 4f 70 28 30 2c 20 69 2b 70 2d 3e 6e 4f 70  ntOp(0, i+p->nOp
4e70: 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 70 2d 3e 6e  , &p->aOp[i+p->n
4e80: 4f 70 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Op]);.    }.#end
4e90: 69 66 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 20  if.  }.  p->nOp 
4ea0: 2b 3d 20 6e 4f 70 3b 0a 20 20 72 65 74 75 72 6e  += nOp;.  return
4eb0: 20 70 46 69 72 73 74 3b 0a 7d 0a 0a 23 69 66 20   pFirst;.}..#if 
4ec0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
4ed0: 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
4ee0: 54 41 54 55 53 29 0a 2f 2a 0a 2a 2a 20 41 64 64  TATUS)./*.** Add
4ef0: 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65   an entry to the
4f00: 20 61 72 72 61 79 20 6f 66 20 63 6f 75 6e 74 65   array of counte
4f10: 72 73 20 6d 61 6e 61 67 65 64 20 62 79 20 73 71  rs managed by sq
4f20: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73  lite3_stmt_scans
4f30: 74 61 74 75 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64  tatus()..*/.void
4f40: 20 73 71 6c 69 74 65 33 56 64 62 65 53 63 61 6e   sqlite3VdbeScan
4f50: 53 74 61 74 75 73 28 0a 20 20 56 64 62 65 20 2a  Status(.  Vdbe *
4f60: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
4f70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 4d 20            /* VM 
4f80: 74 6f 20 61 64 64 20 73 63 61 6e 73 74 61 74 75  to add scanstatu
4f90: 73 28 29 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  s() to */.  int 
4fa0: 61 64 64 72 45 78 70 6c 61 69 6e 2c 20 20 20 20  addrExplain,    
4fb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
4fc0: 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 45 78 70  ddress of OP_Exp
4fd0: 6c 61 69 6e 20 28 6f 72 20 30 29 20 2a 2f 0a 20  lain (or 0) */. 
4fe0: 20 69 6e 74 20 61 64 64 72 4c 6f 6f 70 2c 20 20   int addrLoop,  
4ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5000: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6c   /* Address of l
5010: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 20 0a  oop counter */ .
5020: 20 20 69 6e 74 20 61 64 64 72 56 69 73 69 74 2c    int addrVisit,
5030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5040: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
5050: 72 6f 77 73 20 76 69 73 69 74 65 64 20 63 6f 75  rows visited cou
5060: 6e 74 65 72 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  nter */.  LogEst
5070: 20 6e 45 73 74 2c 20 20 20 20 20 20 20 20 20 20   nEst,          
5080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74            /* Est
5090: 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  imated number of
50a0: 20 6f 75 74 70 75 74 20 72 6f 77 73 20 2a 2f 0a   output rows */.
50b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
50c0: 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
50d0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62    /* Name of tab
50e0: 6c 65 20 6f 72 20 69 6e 64 65 78 20 62 65 69 6e  le or index bein
50f0: 67 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 29 7b 0a  g scanned */.){.
5100: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70    int nByte = (p
5110: 2d 3e 6e 53 63 61 6e 2b 31 29 20 2a 20 73 69 7a  ->nScan+1) * siz
5120: 65 6f 66 28 53 63 61 6e 53 74 61 74 75 73 29 3b  eof(ScanStatus);
5130: 0a 20 20 53 63 61 6e 53 74 61 74 75 73 20 2a 61  .  ScanStatus *a
5140: 4e 65 77 3b 0a 20 20 61 4e 65 77 20 3d 20 28 53  New;.  aNew = (S
5150: 63 61 6e 53 74 61 74 75 73 2a 29 73 71 6c 69 74  canStatus*)sqlit
5160: 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64  e3DbRealloc(p->d
5170: 62 2c 20 70 2d 3e 61 53 63 61 6e 2c 20 6e 42 79  b, p->aScan, nBy
5180: 74 65 29 3b 0a 20 20 69 66 28 20 61 4e 65 77 20  te);.  if( aNew 
5190: 29 7b 0a 20 20 20 20 53 63 61 6e 53 74 61 74 75  ){.    ScanStatu
51a0: 73 20 2a 70 4e 65 77 20 3d 20 26 61 4e 65 77 5b  s *pNew = &aNew[
51b0: 70 2d 3e 6e 53 63 61 6e 2b 2b 5d 3b 0a 20 20 20  p->nScan++];.   
51c0: 20 70 4e 65 77 2d 3e 61 64 64 72 45 78 70 6c 61   pNew->addrExpla
51d0: 69 6e 20 3d 20 61 64 64 72 45 78 70 6c 61 69 6e  in = addrExplain
51e0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72  ;.    pNew->addr
51f0: 4c 6f 6f 70 20 3d 20 61 64 64 72 4c 6f 6f 70 3b  Loop = addrLoop;
5200: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 56  .    pNew->addrV
5210: 69 73 69 74 20 3d 20 61 64 64 72 56 69 73 69 74  isit = addrVisit
5220: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 45 73 74  ;.    pNew->nEst
5230: 20 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 4e 65   = nEst;.    pNe
5240: 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  w->zName = sqlit
5250: 65 33 44 62 53 74 72 44 75 70 28 70 2d 3e 64 62  e3DbStrDup(p->db
5260: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d  , zName);.    p-
5270: 3e 61 53 63 61 6e 20 3d 20 61 4e 65 77 3b 0a 20  >aScan = aNew;. 
5280: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
5290: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
52a0: 61 6c 75 65 20 6f 66 20 74 68 65 20 6f 70 63 6f  alue of the opco
52b0: 64 65 2c 20 6f 72 20 50 31 2c 20 50 32 2c 20 50  de, or P1, P2, P
52c0: 33 2c 20 6f 72 20 50 35 20 6f 70 65 72 61 6e 64  3, or P5 operand
52d0: 73 0a 2a 2a 20 66 6f 72 20 61 20 73 70 65 63 69  s.** for a speci
52e0: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
52f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5300: 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65  VdbeChangeOpcode
5310: 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64  (Vdbe *p, u32 ad
5320: 64 72 2c 20 75 38 20 69 4e 65 77 4f 70 63 6f 64  dr, u8 iNewOpcod
5330: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e){.  sqlite3Vdb
5340: 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e  eGetOp(p,addr)->
5350: 6f 70 63 6f 64 65 20 3d 20 69 4e 65 77 4f 70 63  opcode = iNewOpc
5360: 6f 64 65 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  ode;.}.void sqli
5370: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
5380: 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64  Vdbe *p, u32 add
5390: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73  r, int val){.  s
53a0: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
53b0: 70 2c 61 64 64 72 29 2d 3e 70 31 20 3d 20 76 61  p,addr)->p1 = va
53c0: 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  l;.}.void sqlite
53d0: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 56 64  3VdbeChangeP2(Vd
53e0: 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c  be *p, u32 addr,
53f0: 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c   int val){.  sql
5400: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c  ite3VdbeGetOp(p,
5410: 61 64 64 72 29 2d 3e 70 32 20 3d 20 76 61 6c 3b  addr)->p2 = val;
5420: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
5430: 64 62 65 43 68 61 6e 67 65 50 33 28 56 64 62 65  dbeChangeP3(Vdbe
5440: 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69   *p, u32 addr, i
5450: 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74  nt val){.  sqlit
5460: 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64  e3VdbeGetOp(p,ad
5470: 64 72 29 2d 3e 70 33 20 3d 20 76 61 6c 3b 0a 7d  dr)->p3 = val;.}
5480: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
5490: 65 43 68 61 6e 67 65 50 35 28 56 64 62 65 20 2a  eChangeP5(Vdbe *
54a0: 70 2c 20 75 38 20 70 35 29 7b 0a 20 20 69 66 28  p, u8 p5){.  if(
54b0: 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46   !p->db->mallocF
54c0: 61 69 6c 65 64 20 29 20 70 2d 3e 61 4f 70 5b 70  ailed ) p->aOp[p
54d0: 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20 70 35  ->nOp-1].p5 = p5
54e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
54f0: 65 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64  e the P2 operand
5500: 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   of instruction 
5510: 61 64 64 72 20 73 6f 20 74 68 61 74 20 69 74 20  addr so that it 
5520: 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65  points to.** the
5530: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
5540: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
5550: 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f   to be coded..*/
5560: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
5570: 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a  eJumpHere(Vdbe *
5580: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
5590: 70 2d 3e 70 50 61 72 73 65 2d 3e 69 46 69 78 65  p->pParse->iFixe
55a0: 64 4f 70 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31  dOp = p->nOp - 1
55b0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
55c0: 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c  hangeP2(p, addr,
55d0: 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a   p->nOp);.}.../*
55e0: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74  .** If the input
55f0: 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75   FuncDef structu
5600: 72 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c  re is ephemeral,
5610: 20 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20   then free it.  
5620: 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65  If.** the FuncDe
5630: 66 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61  f is not epherma
5640: 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69  l, then do nothi
5650: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
5660: 69 64 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c  id freeEphemeral
5670: 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33  Function(sqlite3
5680: 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70   *db, FuncDef *p
5690: 44 65 66 29 7b 0a 20 20 69 66 28 20 41 4c 57 41  Def){.  if( ALWA
56a0: 59 53 28 70 44 65 66 29 20 26 26 20 28 70 44 65  YS(pDef) && (pDe
56b0: 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
56c0: 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d  QLITE_FUNC_EPHEM
56d0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
56e0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44  te3DbFree(db, pD
56f0: 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ef);.  }.}..stat
5700: 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65  ic void vdbeFree
5710: 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20  OpArray(sqlite3 
5720: 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a  *, Op *, int);..
5730: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50  /*.** Delete a P
5740: 34 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73  4 value if neces
5750: 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sary..*/.static 
5760: 76 6f 69 64 20 66 72 65 65 50 34 28 73 71 6c 69  void freeP4(sqli
5770: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 70 34 74  te3 *db, int p4t
5780: 79 70 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a  ype, void *p4){.
5790: 20 20 69 66 28 20 70 34 20 29 7b 0a 20 20 20 20    if( p4 ){.    
57a0: 61 73 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20  assert( db );.  
57b0: 20 20 73 77 69 74 63 68 28 20 70 34 74 79 70 65    switch( p4type
57c0: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50   ){.      case P
57d0: 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20  4_FUNCCTX: {.   
57e0: 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72       freeEphemer
57f0: 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28  alFunction(db, (
5800: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
5810: 2a 29 70 34 29 2d 3e 70 46 75 6e 63 29 3b 0a 20  *)p4)->pFunc);. 
5820: 20 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74         /* Fall t
5830: 68 72 6f 75 67 68 20 69 6e 74 6f 20 74 68 65 20  hrough into the 
5840: 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20  next case */.   
5850: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
5860: 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20 20 20 63  P4_REAL:.      c
5870: 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20  ase P4_INT64:.  
5880: 20 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41      case P4_DYNA
5890: 4d 49 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20  MIC:.      case 
58a0: 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20  P4_INTARRAY: {. 
58b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
58c0: 46 72 65 65 28 64 62 2c 20 70 34 29 3b 0a 20 20  Free(db, p4);.  
58d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
58e0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
58f0: 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20  P4_KEYINFO: {.  
5900: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e        if( db->pn
5910: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20  BytesFreed==0 ) 
5920: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e  sqlite3KeyInfoUn
5930: 72 65 66 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34  ref((KeyInfo*)p4
5940: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
5950: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66  ;.      }.#ifdef
5960: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
5970: 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20  URSOR_HINTS.    
5980: 20 20 63 61 73 65 20 50 34 5f 45 58 50 52 3a 20    case P4_EXPR: 
5990: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
59a0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
59b0: 28 45 78 70 72 2a 29 70 34 29 3b 0a 20 20 20 20  (Expr*)p4);.    
59c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
59d0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
59e0: 63 61 73 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a  case P4_MPRINTF:
59f0: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64   {.        if( d
5a00: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
5a10: 3d 30 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  =0 ) sqlite3_fre
5a20: 65 28 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62  e(p4);.        b
5a30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
5a40: 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43      case P4_FUNC
5a50: 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 66  DEF: {.        f
5a60: 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63  reeEphemeralFunc
5a70: 74 69 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44 65  tion(db, (FuncDe
5a80: 66 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20  f*)p4);.        
5a90: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
5aa0: 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d       case P4_MEM
5ab0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
5ac0: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
5ad0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
5ae0: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
5af0: 65 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  e((sqlite3_value
5b00: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 7d  *)p4);.        }
5b10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
5b20: 4d 65 6d 20 2a 70 20 3d 20 28 4d 65 6d 2a 29 70  Mem *p = (Mem*)p
5b30: 34 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  4;.          if(
5b40: 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73   p->szMalloc ) s
5b50: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
5b60: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
5b70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
5b80: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
5b90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5ba0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
5bb0: 20 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41       case P4_VTA
5bc0: 42 20 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  B : {.        if
5bd0: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
5be0: 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56  ed==0 ) sqlite3V
5bf0: 74 61 62 55 6e 6c 6f 63 6b 28 28 56 54 61 62 6c  tabUnlock((VTabl
5c00: 65 20 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20  e *)p4);.       
5c10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
5c20: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
5c30: 2a 2a 20 46 72 65 65 20 74 68 65 20 73 70 61 63  ** Free the spac
5c40: 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
5c50: 61 4f 70 20 61 6e 64 20 61 6e 79 20 70 34 20 76  aOp and any p4 v
5c60: 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  alues allocated 
5c70: 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64  for the.** opcod
5c80: 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  es contained wit
5c90: 68 69 6e 2e 20 49 66 20 61 4f 70 20 69 73 20 6e  hin. If aOp is n
5ca0: 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73 20 61 73  ot NULL it is as
5cb0: 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  sumed to contain
5cc0: 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69 65 73   .** nOp entries
5cd0: 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
5ce0: 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61  d vdbeFreeOpArra
5cf0: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4f  y(sqlite3 *db, O
5d00: 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f 70 29  p *aOp, int nOp)
5d10: 7b 0a 20 20 69 66 28 20 61 4f 70 20 29 7b 0a 20  {.  if( aOp ){. 
5d20: 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20     Op *pOp;.    
5d30: 66 6f 72 28 70 4f 70 3d 61 4f 70 3b 20 70 4f 70  for(pOp=aOp; pOp
5d40: 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b  <&aOp[nOp]; pOp+
5d50: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  +){.      if( pO
5d60: 70 2d 3e 70 34 74 79 70 65 20 29 20 66 72 65 65  p->p4type ) free
5d70: 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79  P4(db, pOp->p4ty
5d80: 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a  pe, pOp->p4.p);.
5d90: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
5da0: 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d  ABLE_EXPLAIN_COM
5db0: 4d 45 4e 54 53 0a 20 20 20 20 20 20 73 71 6c 69  MENTS.      sqli
5dc0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f  te3DbFree(db, pO
5dd0: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65  p->zComment);.#e
5de0: 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d 0a  ndif     .    }.
5df0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
5e00: 72 65 65 28 64 62 2c 20 61 4f 70 29 3b 0a 7d 0a  ree(db, aOp);.}.
5e10: 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65 20  ./*.** Link the 
5e20: 53 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a 65 63  SubProgram objec
5e30: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
5e40: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
5e50: 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 0a  into the linked.
5e60: 2a 2a 20 6c 69 73 74 20 61 74 20 56 64 62 65 2e  ** list at Vdbe.
5e70: 70 53 75 62 50 72 6f 67 72 61 6d 2e 20 54 68 69  pSubProgram. Thi
5e80: 73 20 6c 69 73 74 20 69 73 20 75 73 65 64 20 74  s list is used t
5e90: 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73 75 62  o delete all sub
5ea0: 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65  -program.** obje
5eb0: 63 74 73 20 77 68 65 6e 20 74 68 65 20 56 4d 20  cts when the VM 
5ec0: 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71  is no longer req
5ed0: 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  uired..*/.void s
5ee0: 71 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b 53 75  qlite3VdbeLinkSu
5ef0: 62 50 72 6f 67 72 61 6d 28 56 64 62 65 20 2a 70  bProgram(Vdbe *p
5f00: 56 64 62 65 2c 20 53 75 62 50 72 6f 67 72 61 6d  Vdbe, SubProgram
5f10: 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65 78 74   *p){.  p->pNext
5f20: 20 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72   = pVdbe->pProgr
5f30: 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70 50 72  am;.  pVdbe->pPr
5f40: 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a  ogram = p;.}../*
5f50: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6f  .** Change the o
5f60: 70 63 6f 64 65 20 61 74 20 61 64 64 72 20 69 6e  pcode at addr in
5f70: 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a 69 6e  to OP_Noop.*/.in
5f80: 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  t sqlite3VdbeCha
5f90: 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a  ngeToNoop(Vdbe *
5fa0: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
5fb0: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69  VdbeOp *pOp;.  i
5fc0: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
5fd0: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
5fe0: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64 64  0;.  assert( add
5ff0: 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e  r>=0 && addr<p->
6000: 6e 4f 70 20 29 3b 0a 20 20 70 4f 70 20 3d 20 26  nOp );.  pOp = &
6010: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
6020: 66 72 65 65 50 34 28 70 2d 3e 64 62 2c 20 70 4f  freeP4(p->db, pO
6030: 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p4type, pOp->
6040: 70 34 2e 70 29 3b 0a 20 20 6d 65 6d 73 65 74 28  p4.p);.  memset(
6050: 70 4f 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  pOp, 0, sizeof(p
6060: 4f 70 5b 30 5d 29 29 3b 0a 20 20 70 4f 70 2d 3e  Op[0]));.  pOp->
6070: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70  opcode = OP_Noop
6080: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
6090: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 61  ./*.** If the la
60a0: 73 74 20 6f 70 63 6f 64 65 20 69 73 20 22 6f 70  st opcode is "op
60b0: 22 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20  " and it is not 
60c0: 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  a jump destinati
60d0: 6f 6e 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 6d 6f  on,.** then remo
60e0: 76 65 20 69 74 2e 20 20 52 65 74 75 72 6e 20 74  ve it.  Return t
60f0: 72 75 65 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20  rue if and only 
6100: 69 66 20 61 6e 20 6f 70 63 6f 64 65 20 77 61 73  if an opcode was
6110: 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74   removed..*/.int
6120: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
6130: 74 65 50 72 69 6f 72 4f 70 63 6f 64 65 28 56 64  tePriorOpcode(Vd
6140: 62 65 20 2a 70 2c 20 75 38 20 6f 70 29 7b 0a 20  be *p, u8 op){. 
6150: 20 69 66 28 20 28 70 2d 3e 6e 4f 70 2d 31 29 3e   if( (p->nOp-1)>
6160: 28 70 2d 3e 70 50 61 72 73 65 2d 3e 69 46 69 78  (p->pParse->iFix
6170: 65 64 4f 70 29 20 26 26 20 70 2d 3e 61 4f 70 5b  edOp) && p->aOp[
6180: 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65  p->nOp-1].opcode
6190: 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 72 65 74 75  ==op ){.    retu
61a0: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  rn sqlite3VdbeCh
61b0: 61 6e 67 65 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d  angeToNoop(p, p-
61c0: 3e 6e 4f 70 2d 31 29 3b 0a 20 20 7d 65 6c 73 65  >nOp-1);.  }else
61d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
61e0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
61f0: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
6200: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
6210: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
6220: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
6230: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
6240: 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72  seful when a lar
6250: 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f  ge program is lo
6260: 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73  aded from a.** s
6270: 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e  tatic array usin
6280: 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  g sqlite3VdbeAdd
6290: 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61  OpList but we wa
62a0: 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20  nt to make a.** 
62b0: 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65  few minor change
62c0: 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d  s to the program
62d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20  ..**.** If n>=0 
62e0: 74 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72  then the P4 oper
62f0: 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20  and is dynamic, 
6300: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63  meaning that a c
6310: 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74  opy of.** the st
6320: 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74  ring is made int
6330: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
6340: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
6350: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61  alloc()..** A va
6360: 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e  lue of n==0 mean
6370: 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20  s copy bytes of 
6380: 7a 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e  zP4 up to and in
6390: 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66  cluding the.** f
63a0: 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20  irst null byte. 
63b0: 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70   If n>0 then cop
63c0: 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a  y n+1 bytes of z
63d0: 50 34 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72  P4..** .** Other
63e0: 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34   values of n (P4
63f0: 5f 53 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c  _STATIC, P4_COLL
6400: 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61  SEQ etc.) indica
6410: 74 65 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e  te that zP4 poin
6420: 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e  ts.** to a strin
6430: 67 20 6f 72 20 73 74 72 75 63 74 75 72 65 20 74  g or structure t
6440: 68 61 74 20 69 73 20 67 75 61 72 61 6e 74 65 65  hat is guarantee
6450: 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74  d to exist for t
6460: 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a  he lifetime of.*
6470: 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74  * the Vdbe. In t
6480: 68 65 73 65 20 63 61 73 65 73 20 77 65 20 63 61  hese cases we ca
6490: 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20  n just copy the 
64a0: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  pointer..**.** I
64b0: 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68  f addr<0 then ch
64c0: 61 6e 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d  ange P4 on the m
64d0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73  ost recently ins
64e0: 65 72 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f  erted instructio
64f0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
6500: 64 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  d SQLITE_NOINLIN
6510: 45 20 76 64 62 65 43 68 61 6e 67 65 50 34 46 75  E vdbeChangeP4Fu
6520: 6c 6c 28 0a 20 20 56 64 62 65 20 2a 70 2c 0a 20  ll(.  Vdbe *p,. 
6530: 20 4f 70 20 2a 70 4f 70 2c 0a 20 20 63 6f 6e 73   Op *pOp,.  cons
6540: 74 20 63 68 61 72 20 2a 7a 50 34 2c 0a 20 20 69  t char *zP4,.  i
6550: 6e 74 20 6e 0a 29 7b 0a 20 20 69 66 28 20 70 4f  nt n.){.  if( pO
6560: 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20  p->p4type ){.   
6570: 20 66 72 65 65 50 34 28 70 2d 3e 64 62 2c 20 70   freeP4(p->db, p
6580: 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d  Op->p4type, pOp-
6590: 3e 70 34 2e 70 29 3b 0a 20 20 20 20 70 4f 70 2d  >p4.p);.    pOp-
65a0: 3e 70 34 74 79 70 65 20 3d 20 30 3b 0a 20 20 20  >p4type = 0;.   
65b0: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a   pOp->p4.p = 0;.
65c0: 20 20 7d 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b    }.  if( n<0 ){
65d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
65e0: 43 68 61 6e 67 65 50 34 28 70 2c 20 28 69 6e 74  ChangeP4(p, (int
65f0: 29 28 70 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 2c  )(pOp - p->aOp),
6600: 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73   zP4, n);.  }els
6610: 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  e{.    if( n==0 
6620: 29 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ) n = sqlite3Str
6630: 6c 65 6e 33 30 28 7a 50 34 29 3b 0a 20 20 20 20  len30(zP4);.    
6640: 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69  pOp->p4.z = sqli
6650: 74 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e  te3DbStrNDup(p->
6660: 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20  db, zP4, n);.   
6670: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
6680: 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d  4_DYNAMIC;.  }.}
6690: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
66a0: 65 43 68 61 6e 67 65 50 34 28 56 64 62 65 20 2a  eChangeP4(Vdbe *
66b0: 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e  p, int addr, con
66c0: 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e  st char *zP4, in
66d0: 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b  t n){.  Op *pOp;
66e0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
66f0: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
6700: 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
6710: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
6720: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
6730: 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NIT );.  assert(
6740: 20 70 2d 3e 61 4f 70 21 3d 30 20 7c 7c 20 64 62   p->aOp!=0 || db
6750: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6760: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
6770: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
6780: 69 66 28 20 6e 21 3d 50 34 5f 56 54 41 42 20 29  if( n!=P4_VTAB )
6790: 20 66 72 65 65 50 34 28 64 62 2c 20 6e 2c 20 28   freeP4(db, n, (
67a0: 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26  void*)*(char**)&
67b0: 7a 50 34 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  zP4);.    return
67c0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
67d0: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73  p->nOp>0 );.  as
67e0: 73 65 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f  sert( addr<p->nO
67f0: 70 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c  p );.  if( addr<
6800: 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20  0 ){.    addr = 
6810: 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a  p->nOp - 1;.  }.
6820: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
6830: 61 64 64 72 5d 3b 0a 20 20 69 66 28 20 6e 3e 3d  addr];.  if( n>=
6840: 30 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65  0 || pOp->p4type
6850: 20 29 7b 0a 20 20 20 20 76 64 62 65 43 68 61 6e   ){.    vdbeChan
6860: 67 65 50 34 46 75 6c 6c 28 70 2c 20 70 4f 70 2c  geP4Full(p, pOp,
6870: 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 72 65   zP4, n);.    re
6880: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
6890: 6e 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20  n==P4_INT32 ){. 
68a0: 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73     /* Note: this
68b0: 20 63 61 73 74 20 69 73 20 73 61 66 65 2c 20 62   cast is safe, b
68c0: 65 63 61 75 73 65 20 74 68 65 20 6f 72 69 67 69  ecause the origi
68d0: 6e 20 64 61 74 61 20 70 6f 69 6e 74 20 77 61 73  n data point was
68e0: 20 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74   an int.    ** t
68f0: 68 61 74 20 77 61 73 20 63 61 73 74 20 74 6f 20  hat was cast to 
6900: 61 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  a (const char *)
6910: 2e 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34  . */.    pOp->p4
6920: 2e 69 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f  .i = SQLITE_PTR_
6930: 54 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20  TO_INT(zP4);.   
6940: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
6950: 34 5f 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65  4_INT32;.  }else
6960: 20 69 66 28 20 7a 50 34 21 3d 30 20 29 7b 0a 20   if( zP4!=0 ){. 
6970: 20 20 20 61 73 73 65 72 74 28 20 6e 3c 30 20 29     assert( n<0 )
6980: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  ;.    pOp->p4.p 
6990: 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20  = (void*)zP4;.  
69a0: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
69b0: 28 73 69 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a  (signed char)n;.
69c0: 20 20 20 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54      if( n==P4_VT
69d0: 41 42 20 29 20 73 71 6c 69 74 65 33 56 74 61 62  AB ) sqlite3Vtab
69e0: 4c 6f 63 6b 28 28 56 54 61 62 6c 65 2a 29 7a 50  Lock((VTable*)zP
69f0: 34 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  4);.  }.}../*.**
6a00: 20 53 65 74 20 74 68 65 20 50 34 20 6f 6e 20 74   Set the P4 on t
6a10: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
6a20: 20 61 64 64 65 64 20 6f 70 63 6f 64 65 20 74 6f   added opcode to
6a30: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 66 6f 72   the KeyInfo for
6a40: 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 67 69   the.** index gi
6a50: 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ven..*/.void sql
6a60: 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
6a70: 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72  Info(Parse *pPar
6a80: 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29  se, Index *pIdx)
6a90: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
6aa0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
6ab0: 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
6ac0: 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d 30   assert( pIdx!=0
6ad0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
6ae0: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
6af0: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b   (char*)sqlite3K
6b00: 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50  eyInfoOfIndex(pP
6b10: 61 72 73 65 2c 20 70 49 64 78 29 2c 0a 20 20 20  arse, pIdx),.   
6b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b30: 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a     P4_KEYINFO);.
6b40: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
6b50: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
6b60: 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20 43  COMMENTS./*.** C
6b70: 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e  hange the commen
6b80: 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  t on the most re
6b90: 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73  cently coded ins
6ba0: 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a  truction.  Or.**
6bb0: 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70 20   insert a No-op 
6bc0: 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d 6d  and add the comm
6bd0: 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77 20  ent to that new 
6be0: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68  instruction.  Th
6bf0: 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20  is.** makes the 
6c00: 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20 72  code easier to r
6c10: 65 61 64 20 64 75 72 69 6e 67 20 64 65 62 75 67  ead during debug
6c20: 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 74  ging.  None of t
6c30: 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 69  his happens.** i
6c40: 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20 62  n a production b
6c50: 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uild..*/.static 
6c60: 76 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65 6e  void vdbeVCommen
6c70: 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74  t(Vdbe *p, const
6c80: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
6c90: 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20 61  va_list ap){.  a
6ca0: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
6cb0: 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a  || p->aOp==0 );.
6cc0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70    assert( p->aOp
6cd0: 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d  ==0 || p->aOp[p-
6ce0: 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74  >nOp-1].zComment
6cf0: 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61  ==0 || p->db->ma
6d00: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
6d10: 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20  if( p->nOp ){.  
6d20: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70    assert( p->aOp
6d30: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   );.    sqlite3D
6d40: 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e  bFree(p->db, p->
6d50: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43  aOp[p->nOp-1].zC
6d60: 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d 3e  omment);.    p->
6d70: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43  aOp[p->nOp-1].zC
6d80: 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65 33  omment = sqlite3
6d90: 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20  VMPrintf(p->db, 
6da0: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
6db0: 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
6dc0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65  VdbeComment(Vdbe
6dd0: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
6de0: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
6df0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
6e00: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61 5f  if( p ){.    va_
6e10: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
6e20: 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d  t);.    vdbeVCom
6e30: 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c  ment(p, zFormat,
6e40: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64   ap);.    va_end
6e50: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64  (ap);.  }.}.void
6e60: 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70   sqlite3VdbeNoop
6e70: 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  Comment(Vdbe *p,
6e80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
6e90: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
6ea0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20  _list ap;.  if( 
6eb0: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
6ec0: 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 50  VdbeAddOp0(p, OP
6ed0: 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f 73  _Noop);.    va_s
6ee0: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
6ef0: 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d  );.    vdbeVComm
6f00: 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20  ent(p, zFormat, 
6f10: 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28  ap);.    va_end(
6f20: 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ap);.  }.}.#endi
6f30: 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a  f  /* NDEBUG */.
6f40: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56  .#ifdef SQLITE_V
6f50: 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a 0a  DBE_COVERAGE./*.
6f60: 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65  ** Set the value
6f70: 20 69 66 20 74 68 65 20 69 53 72 63 4c 69 6e 65   if the iSrcLine
6f80: 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20 70   field for the p
6f90: 72 65 76 69 6f 75 73 6c 79 20 63 6f 64 65 64 20  reviously coded 
6fa0: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
6fb0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
6fc0: 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56 64  SetLineNumber(Vd
6fd0: 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e 65  be *v, int iLine
6fe0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
6ff0: 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53 72  GetOp(v,-1)->iSr
7000: 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a 7d  cLine = iLine;.}
7010: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
7020: 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 20  E_VDBE_COVERAGE 
7030: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
7040: 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20   the opcode for 
7050: 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e  a given address.
7060: 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73 73    If the address
7070: 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20   is -1, then.** 
7080: 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20  return the most 
7090: 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65  recently inserte
70a0: 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  d opcode..**.** 
70b0: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
70c0: 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73  cation error has
70d0: 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72 20   occurred prior 
70e0: 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 6f  to the calling o
70f0: 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  f this.** routin
7100: 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65  e, then a pointe
7110: 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64 62  r to a dummy Vdb
7120: 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74 75  eOp will be retu
7130: 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63 6f  rned.  That opco
7140: 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62 6c  de.** is readabl
7150: 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61 62  e but not writab
7160: 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69 73  le, though it is
7170: 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74 61   cast to a writa
7180: 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68  ble value..** Th
7190: 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64 75  e return of a du
71a0: 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77  mmy opcode allow
71b0: 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f  s the call to co
71c0: 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69  ntinue functioni
71d0: 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 6e 20 4f  ng.** after an O
71e0: 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75 74  OM fault without
71f0: 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63 6b   having to check
7200: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72   to see if the r
7210: 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74  eturn from .** t
7220: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
7230: 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20   valid pointer. 
7240: 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65   But because the
7250: 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73   dummy.opcode is
7260: 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c   0,.** dummy wil
7270: 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74 74  l never be writt
7280: 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20  en to.  This is 
7290: 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64 65  verified by code
72a0: 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a   inspection and.
72b0: 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77 69  ** by running wi
72c0: 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f 0a  th Valgrind..*/.
72d0: 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56  VdbeOp *sqlite3V
72e0: 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70  dbeGetOp(Vdbe *p
72f0: 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f  , int addr){.  /
7300: 2a 20 43 38 39 20 73 70 65 63 69 66 69 65 73 20  * C89 specifies 
7310: 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e  that the constan
7320: 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62  t "dummy" will b
7330: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  e initialized to
7340: 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c   all.  ** zeros,
7350: 20 77 68 69 63 68 20 69 73 20 63 6f 72 72 65 63   which is correc
7360: 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61 74  t.  MSVC generat
7370: 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65  es a warning, ne
7380: 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20  vertheless. */. 
7390: 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 64   static VdbeOp d
73a0: 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65  ummy;  /* Ignore
73b0: 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69 6e   the MSVC warnin
73c0: 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69  g about no initi
73d0: 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65  alizer */.  asse
73e0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
73f0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
7400: 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b  .  if( addr<0 ){
7410: 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e  .    addr = p->n
7420: 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73  Op - 1;.  }.  as
7430: 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26  sert( (addr>=0 &
7440: 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c  & addr<p->nOp) |
7450: 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  | p->db->mallocF
7460: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
7470: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
7480: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
7490: 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79   (VdbeOp*)&dummy
74a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
74b0: 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64  eturn &p->aOp[ad
74c0: 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20  dr];.  }.}..#if 
74d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
74e0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
74f0: 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52 65  MMENTS)./*.** Re
7500: 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
7510: 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f 66  value for one of
7520: 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 20   the parameters 
7530: 74 6f 20 74 68 65 20 6f 70 63 6f 64 65 20 70 4f  to the opcode pO
7540: 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20  p.** determined 
7550: 62 79 20 63 68 61 72 61 63 74 65 72 20 63 2e 0a  by character c..
7560: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 72  */.static int tr
7570: 61 6e 73 6c 61 74 65 50 28 63 68 61 72 20 63 2c  anslateP(char c,
7580: 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29 7b   const Op *pOp){
7590: 0a 20 20 69 66 28 20 63 3d 3d 27 31 27 20 29 20  .  if( c=='1' ) 
75a0: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b 0a  return pOp->p1;.
75b0: 20 20 69 66 28 20 63 3d 3d 27 32 27 20 29 20 72    if( c=='2' ) r
75c0: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a 20  eturn pOp->p2;. 
75d0: 20 69 66 28 20 63 3d 3d 27 33 27 20 29 20 72 65   if( c=='3' ) re
75e0: 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20 20  turn pOp->p3;.  
75f0: 69 66 28 20 63 3d 3d 27 34 27 20 29 20 72 65 74  if( c=='4' ) ret
7600: 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20  urn pOp->p4.i;. 
7610: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35 3b   return pOp->p5;
7620: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  .}../*.** Comput
7630: 65 20 61 20 73 74 72 69 6e 67 20 66 6f 72 20 74  e a string for t
7640: 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69 65  he "comment" fie
7650: 6c 64 20 6f 66 20 61 20 56 44 42 45 20 6f 70 63  ld of a VDBE opc
7660: 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a 0a  ode listing..**.
7670: 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73 69 73 3a  ** The Synopsis:
7680: 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65 6e   field in commen
7690: 74 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e 63  ts in the vdbe.c
76a0: 20 73 6f 75 72 63 65 20 66 69 6c 65 20 67 65 74   source file get
76b0: 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74  s converted.** t
76c0: 6f 20 61 6e 20 65 78 74 72 61 20 73 74 72 69 6e  o an extra strin
76d0: 67 20 74 68 61 74 20 69 73 20 61 70 70 65 6e 64  g that is append
76e0: 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65  ed to the sqlite
76f0: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20 20  3OpcodeName().  
7700: 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e 63  In the.** absenc
7710: 65 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d 65  e of other comme
7720: 6e 74 73 2c 20 74 68 69 73 20 73 79 6e 6f 70 73  nts, this synops
7730: 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63  is becomes the c
7740: 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f 70  omment on the op
7750: 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74 72  code..** Some tr
7760: 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72 73  anslation occurs
7770: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22 50  :.**.**       "P
7780: 58 22 20 20 20 20 20 20 2d 3e 20 20 22 72 5b 58  X"      ->  "r[X
7790: 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40  ]".**       "PX@
77a0: 50 59 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e 2e  PY"   ->  "r[X..
77b0: 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b 78  X+Y-1]"  or "r[x
77c0: 5d 22 20 69 66 20 79 20 69 73 20 30 20 6f 72 20  ]" if y is 0 or 
77d0: 31 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40 50  1.**       "PX@P
77e0: 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e 58  Y+1" ->  "r[X..X
77f0: 2b 59 5d 22 20 20 20 20 6f 72 20 22 72 5b 78 5d  +Y]"    or "r[x]
7800: 22 20 69 66 20 79 20 69 73 20 30 0a 2a 2a 20 20  " if y is 0.**  
7810: 20 20 20 20 20 22 50 59 2e 2e 50 59 22 20 20 2d       "PY..PY"  -
7820: 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20 20  >  "r[X..Y]"    
7830: 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79    or "r[x]" if y
7840: 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  <=x.*/.static in
7850: 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74  t displayComment
7860: 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f  (.  const Op *pO
7870: 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70  p,     /* The op
7880: 63 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d 65  code to be comme
7890: 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  nted */.  const 
78a0: 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a 20  char *zP4,   /* 
78b0: 50 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61 69  Previously obtai
78c0: 6e 65 64 20 76 61 6c 75 65 20 66 6f 72 20 50 34  ned value for P4
78d0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d   */.  char *zTem
78e0: 70 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  p,       /* Writ
78f0: 65 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f  e result here */
7900: 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20 20 20 20  .  int nTemp    
7910: 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61        /* Space a
7920: 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65 6d  vailable in zTem
7930: 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  p[] */.){.  cons
7940: 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b  t char *zOpName;
7950: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7960: 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74 20  Synopsis;.  int 
7970: 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69  nOpName;.  int i
7980: 69 2c 20 6a 6a 3b 0a 20 20 7a 4f 70 4e 61 6d 65  i, jj;.  zOpName
7990: 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65   = sqlite3Opcode
79a0: 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65  Name(pOp->opcode
79b0: 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d 20 73  );.  nOpName = s
79c0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
79d0: 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  OpName);.  if( z
79e0: 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b 31  OpName[nOpName+1
79f0: 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 65 65  ] ){.    int see
7a00: 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 63 68  nCom = 0;.    ch
7a10: 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e 6f 70  ar c;.    zSynop
7a20: 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b 3d  sis = zOpName +=
7a30: 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a 20 20   nOpName + 1;.  
7a40: 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20 6a    for(ii=jj=0; j
7a50: 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28 63 20  j<nTemp-1 && (c 
7a60: 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 29  = zSynopsis[ii])
7a70: 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  !=0; ii++){.    
7a80: 20 20 69 66 28 20 63 3d 3d 27 50 27 20 29 7b 0a    if( c=='P' ){.
7a90: 20 20 20 20 20 20 20 20 63 20 3d 20 7a 53 79 6e          c = zSyn
7aa0: 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20 20  opsis[++ii];.   
7ab0: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 34 27 20       if( c=='4' 
7ac0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
7ad0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7ae0: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
7af0: 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a 20 20  , "%s", zP4);.  
7b00: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
7b10: 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20 20 20  c=='X' ){.      
7b20: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7b30: 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a  intf(nTemp-jj, z
7b40: 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 70  Temp+jj, "%s", p
7b50: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20  Op->zComment);. 
7b60: 20 20 20 20 20 20 20 20 20 73 65 65 6e 43 6f 6d           seenCom
7b70: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 1;.        }e
7b80: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
7b90: 6e 74 20 76 31 20 3d 20 74 72 61 6e 73 6c 61 74  nt v1 = translat
7ba0: 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20 20 20  eP(c, pOp);.    
7bb0: 20 20 20 20 20 20 69 6e 74 20 76 32 3b 0a 20 20        int v2;.  
7bc0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7bd0: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a  snprintf(nTemp-j
7be0: 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 64  j, zTemp+jj, "%d
7bf0: 22 2c 20 76 31 29 3b 0a 20 20 20 20 20 20 20 20  ", v1);.        
7c00: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53    if( strncmp(zS
7c10: 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 40  ynopsis+ii+1, "@
7c20: 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20 20 20  P", 2)==0 ){.   
7c30: 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 33           ii += 3
7c40: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a  ;.            jj
7c50: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
7c60: 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20  n30(zTemp+jj);. 
7c70: 20 20 20 20 20 20 20 20 20 20 20 76 32 20 3d 20             v2 = 
7c80: 74 72 61 6e 73 6c 61 74 65 50 28 7a 53 79 6e 6f  translateP(zSyno
7c90: 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29 3b 0a  psis[ii], pOp);.
7ca0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
7cb0: 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69  strncmp(zSynopsi
7cc0: 73 2b 69 69 2b 31 2c 22 2b 31 22 2c 32 29 3d 3d  s+ii+1,"+1",2)==
7cd0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
7ce0: 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20 20 20     ii += 2;.    
7cf0: 20 20 20 20 20 20 20 20 20 20 76 32 2b 2b 3b 0a            v2++;.
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
7d10: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76 32            if( v2
7d20: 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >1 ){.          
7d30: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7d40: 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a  intf(nTemp-jj, z
7d50: 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22 2c  Temp+jj, "..%d",
7d60: 20 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20 20 20   v1+v2-1);.     
7d70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7d80: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
7d90: 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69  ncmp(zSynopsis+i
7da0: 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34 29 3d  i+1, "..P3", 4)=
7db0: 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d 30  =0 && pOp->p3==0
7dc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7dd0: 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20  ii += 4;.       
7de0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
7df0: 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c         jj += sql
7e00: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
7e10: 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 7d 65  mp+jj);.      }e
7e20: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 65  lse{.        zTe
7e30: 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20  mp[jj++] = c;.  
7e40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
7e50: 69 66 28 20 21 73 65 65 6e 43 6f 6d 20 26 26 20  if( !seenCom && 
7e60: 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20 70 4f  jj<nTemp-5 && pO
7e70: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20  p->zComment ){. 
7e80: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
7e90: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20  rintf(nTemp-jj, 
7ea0: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73 22  zTemp+jj, "; %s"
7eb0: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
7ec0: 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71  ;.      jj += sq
7ed0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
7ee0: 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a 20  emp+jj);.    }. 
7ef0: 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d 70 20     if( jj<nTemp 
7f00: 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30 3b  ) zTemp[jj] = 0;
7f10: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70  .  }else if( pOp
7f20: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20  ->zComment ){.  
7f30: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7f40: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
7f50: 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d   "%s", pOp->zCom
7f60: 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20 3d 20  ment);.    jj = 
7f70: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
7f80: 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  zTemp);.  }else{
7f90: 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20  .    zTemp[0] = 
7fa0: 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b 0a 20  0;.    jj = 0;. 
7fb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a 3b 0a   }.  return jj;.
7fc0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
7fd0: 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  TE_DEBUG */..#if
7fe0: 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34   VDBE_DISPLAY_P4
7ff0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
8000: 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52  TE_ENABLE_CURSOR
8010: 5f 48 49 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 54 72  _HINTS)./*.** Tr
8020: 61 6e 73 6c 61 74 65 20 74 68 65 20 50 34 2e 70  anslate the P4.p
8030: 45 78 70 72 20 76 61 6c 75 65 20 66 6f 72 20 61  Expr value for a
8040: 6e 20 4f 50 5f 43 75 72 73 6f 72 48 69 6e 74 20  n OP_CursorHint 
8050: 6f 70 63 6f 64 65 20 69 6e 74 6f 20 74 65 78 74  opcode into text
8060: 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20  .** that can be 
8070: 64 69 73 70 6c 61 79 65 64 20 69 6e 20 74 68 65  displayed in the
8080: 20 50 34 20 63 6f 6c 75 6d 6e 20 6f 66 20 45 58   P4 column of EX
8090: 50 4c 41 49 4e 20 6f 75 74 70 75 74 2e 0a 2a 2f  PLAIN output..*/
80a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69 73 70  .static int disp
80b0: 6c 61 79 50 34 45 78 70 72 28 69 6e 74 20 6e 54  layP4Expr(int nT
80c0: 65 6d 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70  emp, char *zTemp
80d0: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
80e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
80f0: 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 3b 0a  p = 0;.  int n;.
8100: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
8110: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
8120: 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 20  TK_STRING:.     
8130: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
8140: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
8150: 22 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  "%Q", pExpr->u.z
8160: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72  Token);.      br
8170: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8180: 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 20 20  _INTEGER:.      
8190: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
81a0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
81b0: 25 64 22 2c 20 70 45 78 70 72 2d 3e 75 2e 69 56  %d", pExpr->u.iV
81c0: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65  alue);.      bre
81d0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
81e0: 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 73 71 6c 69  NULL:.      sqli
81f0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
8200: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 4e 55 4c 4c  mp, zTemp, "NULL
8210: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
8220: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
8230: 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73  ISTER: {.      s
8240: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
8250: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 72  nTemp, zTemp, "r
8260: 5b 25 64 5d 22 2c 20 70 45 78 70 72 2d 3e 69 54  [%d]", pExpr->iT
8270: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65  able);.      bre
8280: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
8290: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
82a0: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
82b0: 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  >iColumn<0 ){.  
82c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
82d0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
82e0: 65 6d 70 2c 20 22 72 6f 77 69 64 22 29 3b 0a 20  emp, "rowid");. 
82f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8300: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
8310: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
8320: 70 2c 20 22 63 25 64 22 2c 20 28 69 6e 74 29 70  p, "c%d", (int)p
8330: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  Expr->iColumn);.
8340: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
8350: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
8360: 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20  ase TK_LT:      
8370: 7a 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20 20 20  zOp = "LT";     
8380: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8390: 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 4f 70   TK_LE:      zOp
83a0: 20 3d 20 22 4c 45 22 3b 20 20 20 20 20 20 62 72   = "LE";      br
83b0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
83c0: 5f 47 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20  _GT:      zOp = 
83d0: 22 47 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b  "GT";      break
83e0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  ;.    case TK_GE
83f0: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 47 45  :      zOp = "GE
8400: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
8410: 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20     case TK_NE:  
8420: 20 20 20 20 7a 4f 70 20 3d 20 22 4e 45 22 3b 20      zOp = "NE"; 
8430: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8440: 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20  case TK_EQ:     
8450: 20 7a 4f 70 20 3d 20 22 45 51 22 3b 20 20 20 20   zOp = "EQ";    
8460: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8470: 65 20 54 4b 5f 49 53 3a 20 20 20 20 20 20 7a 4f  e TK_IS:      zO
8480: 70 20 3d 20 22 49 53 22 3b 20 20 20 20 20 20 62  p = "IS";      b
8490: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
84a0: 4b 5f 49 53 4e 4f 54 3a 20 20 20 7a 4f 70 20 3d  K_ISNOT:   zOp =
84b0: 20 22 49 53 4e 4f 54 22 3b 20 20 20 62 72 65 61   "ISNOT";   brea
84c0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  k;.    case TK_A
84d0: 4e 44 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 41  ND:     zOp = "A
84e0: 4e 44 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  ND";     break;.
84f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
8500: 20 20 20 20 20 7a 4f 70 20 3d 20 22 4f 52 22 3b       zOp = "OR";
8510: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8520: 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20   case TK_PLUS:  
8530: 20 20 7a 4f 70 20 3d 20 22 41 44 44 22 3b 20 20    zOp = "ADD";  
8540: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8550: 73 65 20 54 4b 5f 53 54 41 52 3a 20 20 20 20 7a  se TK_STAR:    z
8560: 4f 70 20 3d 20 22 4d 55 4c 22 3b 20 20 20 20 20  Op = "MUL";     
8570: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8580: 54 4b 5f 4d 49 4e 55 53 3a 20 20 20 7a 4f 70 20  TK_MINUS:   zOp 
8590: 3d 20 22 53 55 42 22 3b 20 20 20 20 20 62 72 65  = "SUB";     bre
85a0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
85b0: 52 45 4d 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22  REM:     zOp = "
85c0: 52 45 4d 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  REM";     break;
85d0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
85e0: 41 4e 44 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54  AND:  zOp = "BIT
85f0: 41 4e 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  AND";  break;.  
8600: 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a    case TK_BITOR:
8610: 20 20 20 7a 4f 70 20 3d 20 22 42 49 54 4f 52 22     zOp = "BITOR"
8620: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
8630: 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20  ase TK_SLASH:   
8640: 7a 4f 70 20 3d 20 22 44 49 56 22 3b 20 20 20 20  zOp = "DIV";    
8650: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8660: 20 54 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 4f 70   TK_LSHIFT:  zOp
8670: 20 3d 20 22 4c 53 48 49 46 54 22 3b 20 20 62 72   = "LSHIFT";  br
8680: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8690: 5f 52 53 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20  _RSHIFT:  zOp = 
86a0: 22 52 53 48 49 46 54 22 3b 20 20 62 72 65 61 6b  "RSHIFT";  break
86b0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  ;.    case TK_CO
86c0: 4e 43 41 54 3a 20 20 7a 4f 70 20 3d 20 22 43 4f  NCAT:  zOp = "CO
86d0: 4e 43 41 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20  NCAT";  break;. 
86e0: 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
86f0: 53 3a 20 20 7a 4f 70 20 3d 20 22 4d 49 4e 55 53  S:  zOp = "MINUS
8700: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
8710: 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 20  case TK_UPLUS:  
8720: 20 7a 4f 70 20 3d 20 22 50 4c 55 53 22 3b 20 20   zOp = "PLUS";  
8730: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8740: 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 7a 4f  e TK_BITNOT:  zO
8750: 70 20 3d 20 22 42 49 54 4e 4f 54 22 3b 20 20 62  p = "BITNOT";  b
8760: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8770: 4b 5f 4e 4f 54 3a 20 20 20 20 20 7a 4f 70 20 3d  K_NOT:     zOp =
8780: 20 22 4e 4f 54 22 3b 20 20 20 20 20 62 72 65 61   "NOT";     brea
8790: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
87a0: 53 4e 55 4c 4c 3a 20 20 7a 4f 70 20 3d 20 22 49  SNULL:  zOp = "I
87b0: 53 4e 55 4c 4c 22 3b 20 20 62 72 65 61 6b 3b 0a  SNULL";  break;.
87c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
87d0: 55 4c 4c 3a 20 7a 4f 70 20 3d 20 22 4e 4f 54 4e  ULL: zOp = "NOTN
87e0: 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20  ULL"; break;..  
87f0: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
8800: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
8810: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
8820: 22 25 73 22 2c 20 22 65 78 70 72 22 29 3b 0a 20  "%s", "expr");. 
8830: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
8840: 0a 20 20 69 66 28 20 7a 4f 70 20 29 7b 0a 20 20  .  if( zOp ){.  
8850: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
8860: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
8870: 20 22 25 73 28 22 2c 20 7a 4f 70 29 3b 0a 20 20   "%s(", zOp);.  
8880: 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72    n = sqlite3Str
8890: 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20  len30(zTemp);.  
88a0: 20 20 6e 20 2b 3d 20 64 69 73 70 6c 61 79 50 34    n += displayP4
88b0: 45 78 70 72 28 6e 54 65 6d 70 2d 6e 2c 20 7a 54  Expr(nTemp-n, zT
88c0: 65 6d 70 2b 6e 2c 20 70 45 78 70 72 2d 3e 70 4c  emp+n, pExpr->pL
88d0: 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c  eft);.    if( n<
88e0: 6e 54 65 6d 70 2d 31 20 26 26 20 70 45 78 70 72  nTemp-1 && pExpr
88f0: 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ->pRight ){.    
8900: 20 20 7a 54 65 6d 70 5b 6e 2b 2b 5d 20 3d 20 27    zTemp[n++] = '
8910: 2c 27 3b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 64  ,';.      n += d
8920: 69 73 70 6c 61 79 50 34 45 78 70 72 28 6e 54 65  isplayP4Expr(nTe
8930: 6d 70 2d 6e 2c 20 7a 54 65 6d 70 2b 6e 2c 20 70  mp-n, zTemp+n, p
8940: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
8950: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
8960: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d  _snprintf(nTemp-
8970: 6e 2c 20 7a 54 65 6d 70 2b 6e 2c 20 22 29 22 29  n, zTemp+n, ")")
8980: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
8990: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
89a0: 54 65 6d 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  Temp);.}.#endif 
89b0: 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f  /* VDBE_DISPLAY_
89c0: 50 34 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  P4 && defined(SQ
89d0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
89e0: 4f 52 5f 48 49 4e 54 53 29 20 2a 2f 0a 0a 0a 23  OR_HINTS) */...#
89f0: 69 66 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f  if VDBE_DISPLAY_
8a00: 50 34 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  P4./*.** Compute
8a10: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64   a string that d
8a20: 65 73 63 72 69 62 65 73 20 74 68 65 20 50 34 20  escribes the P4 
8a30: 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e  parameter for an
8a40: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20   opcode..** Use 
8a50: 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65  zTemp for any re
8a60: 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79  quired temporary
8a70: 20 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a   buffer space..*
8a80: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 64  /.static char *d
8a90: 69 73 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70  isplayP4(Op *pOp
8aa0: 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69  , char *zTemp, i
8ab0: 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61  nt nTemp){.  cha
8ac0: 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a  r *zP4 = zTemp;.
8ad0: 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d 70 3e    assert( nTemp>
8ae0: 3d 32 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28  =20 );.  switch(
8af0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a   pOp->p4type ){.
8b00: 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49      case P4_KEYI
8b10: 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  NFO: {.      int
8b20: 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79   i, j;.      Key
8b30: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
8b40: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
8b50: 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  o;.      assert(
8b60: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
8b70: 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20  Order!=0 );.    
8b80: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
8b90: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
8ba0: 20 22 6b 28 25 64 22 2c 20 70 4b 65 79 49 6e 66   "k(%d", pKeyInf
8bb0: 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20  o->nField);.    
8bc0: 20 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72    i = sqlite3Str
8bd0: 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20  len30(zTemp);.  
8be0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
8bf0: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b  KeyInfo->nField;
8c00: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43   j++){.        C
8c10: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
8c20: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
8c30: 6a 5d 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  j];.        cons
8c40: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20  t char *zColl = 
8c50: 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a  pColl ? pColl->z
8c60: 4e 61 6d 65 20 3a 20 22 6e 69 6c 22 3b 0a 20 20  Name : "nil";.  
8c70: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71        int n = sq
8c80: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43  lite3Strlen30(zC
8c90: 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  oll);.        if
8ca0: 28 20 6e 3d 3d 36 20 26 26 20 6d 65 6d 63 6d 70  ( n==6 && memcmp
8cb0: 28 7a 43 6f 6c 6c 2c 22 42 49 4e 41 52 59 22 2c  (zColl,"BINARY",
8cc0: 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  6)==0 ){.       
8cd0: 20 20 20 7a 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a     zColl = "B";.
8ce0: 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 31 3b            n = 1;
8cf0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8d00: 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70     if( i+n>nTemp
8d10: 2d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -7 ){.          
8d20: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  memcpy(&zTemp[i]
8d30: 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20 20  ,",...",4);.    
8d40: 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20        i += 4;.  
8d50: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8d60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8d70: 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c   zTemp[i++] = ',
8d80: 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ';.        if( p
8d90: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
8da0: 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20  der[j] ){.      
8db0: 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d      zTemp[i++] =
8dc0: 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a   '-';.        }.
8dd0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
8de0: 7a 54 65 6d 70 5b 69 5d 2c 20 7a 43 6f 6c 6c 2c  zTemp[i], zColl,
8df0: 20 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69   n+1);.        i
8e00: 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20   += n;.      }. 
8e10: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
8e20: 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 65  = ')';.      zTe
8e30: 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[i] = 0;.     
8e40: 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d 70   assert( i<nTemp
8e50: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
8e60: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
8e70: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
8e80: 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20 63 61 73  OR_HINTS.    cas
8e90: 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20 20  e P4_EXPR: {.   
8ea0: 20 20 20 64 69 73 70 6c 61 79 50 34 45 78 70 72     displayP4Expr
8eb0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 70  (nTemp, zTemp, p
8ec0: 4f 70 2d 3e 70 34 2e 70 45 78 70 72 29 3b 0a 20  Op->p4.pExpr);. 
8ed0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8ee0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
8ef0: 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a  e P4_COLLSEQ: {.
8f00: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
8f10: 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Coll = pOp->p4.p
8f20: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69  Coll;.      sqli
8f30: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
8f40: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 28 25 2e 32  mp, zTemp, "(%.2
8f50: 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  0s)", pColl->zNa
8f60: 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  me);.      break
8f70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
8f80: 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20   P4_FUNCDEF: {. 
8f90: 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
8fa0: 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75  ef = pOp->p4.pFu
8fb0: 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  nc;.      sqlite
8fc0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
8fd0: 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 25 64 29  , zTemp, "%s(%d)
8fe0: 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20  ", pDef->zName, 
8ff0: 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20  pDef->nArg);.   
9000: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9010: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
9020: 42 55 47 0a 20 20 20 20 63 61 73 65 20 50 34 5f  BUG.    case P4_
9030: 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20 20  FUNCCTX: {.     
9040: 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d   FuncDef *pDef =
9050: 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78 2d 3e 70   pOp->p4.pCtx->p
9060: 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  Func;.      sqli
9070: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
9080: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 25  mp, zTemp, "%s(%
9090: 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65  d)", pDef->zName
90a0: 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20  , pDef->nArg);. 
90b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
90c0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
90d0: 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20  e P4_INT64: {.  
90e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
90f0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
9100: 70 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d  p, "%lld", *pOp-
9110: 3e 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20  >p4.pI64);.     
9120: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9130: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a    case P4_INT32:
9140: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
9150: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
9160: 20 7a 54 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f   zTemp, "%d", pO
9170: 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20  p->p4.i);.      
9180: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
9190: 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b   case P4_REAL: {
91a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
91b0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
91c0: 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a  Temp, "%.16g", *
91d0: 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a  pOp->p4.pReal);.
91e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
91f0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d   }.    case P4_M
9200: 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20  EM: {.      Mem 
9210: 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e  *pMem = pOp->p4.
9220: 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20  pMem;.      if( 
9230: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
9240: 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20  M_Str ){.       
9250: 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a   zP4 = pMem->z;.
9260: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
9270: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
9280: 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  M_Int ){.       
9290: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
92a0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
92b0: 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e  "%lld", pMem->u.
92c0: 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  i);.      }else 
92d0: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
92e0: 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  & MEM_Real ){.  
92f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
9300: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
9310: 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d  emp, "%.16g", pM
9320: 65 6d 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20  em->u.r);.      
9330: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
9340: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
9350: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
9360: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
9370: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 4e 55 4c 4c  mp, zTemp, "NULL
9380: 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ");.      }else{
9390: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
93a0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
93b0: 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20  EM_Blob );.     
93c0: 20 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29     zP4 = "(blob)
93d0: 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ";.      }.     
93e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
93f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9400: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
9410: 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a     case P4_VTAB:
9420: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
9430: 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70  _vtab *pVtab = p
9440: 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56  Op->p4.pVtab->pV
9450: 74 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  tab;.      sqlit
9460: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
9470: 70 2c 20 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a  p, zTemp, "vtab:
9480: 25 70 22 2c 20 70 56 74 61 62 29 3b 0a 20 20 20  %p", pVtab);.   
9490: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
94a0: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
94b0: 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20  P4_INTARRAY: {. 
94c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
94d0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
94e0: 6d 70 2c 20 22 69 6e 74 61 72 72 61 79 22 29 3b  mp, "intarray");
94f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9500: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
9510: 53 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20  SUBPROGRAM: {.  
9520: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
9530: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
9540: 70 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20  p, "program");. 
9550: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9560: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 41 44  }.    case P4_AD
9570: 56 41 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a  VANCE: {.      z
9580: 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  Temp[0] = 0;.   
9590: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
95a0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
95b0: 20 20 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e       zP4 = pOp->
95c0: 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 20  p4.z;.      if( 
95d0: 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  zP4==0 ){.      
95e0: 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20    zP4 = zTemp;. 
95f0: 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20         zTemp[0] 
9600: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
9610: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
9620: 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65 74   zP4!=0 );.  ret
9630: 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69  urn zP4;.}.#endi
9640: 66 20 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c 41  f /* VDBE_DISPLA
9650: 59 5f 50 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44  Y_P4 */../*.** D
9660: 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56 64  eclare to the Vd
9670: 62 65 20 74 68 61 74 20 74 68 65 20 42 54 72 65  be that the BTre
9680: 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d 3e  e object at db->
9690: 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a  aDb[i] is used..
96a0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70 61 72  **.** The prepar
96b0: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6e 65  ed statements ne
96c0: 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e 20 61 64  ed to know in ad
96d0: 76 61 6e 63 65 20 74 68 65 20 63 6f 6d 70 6c 65  vance the comple
96e0: 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20 61 74 74  te set of.** att
96f0: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
9700: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65  that will be use
9710: 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20 74 68 65  .  A mask of the
9720: 73 65 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20  se databases.** 
9730: 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 6e  is maintained in
9740: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2e 20 20   p->btreeMask.  
9750: 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20  The p->lockMask 
9760: 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 75 62  value is the sub
9770: 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62 74 72  set of.** p->btr
9780: 65 65 4d 61 73 6b 20 6f 66 20 64 61 74 61 62 61  eeMask of databa
9790: 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ses that will re
97a0: 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e 0a 2a 2f  quire a lock..*/
97b0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
97c0: 65 55 73 65 73 42 74 72 65 65 28 56 64 62 65 20  eUsesBtree(Vdbe 
97d0: 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61 73  *p, int i){.  as
97e0: 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
97f0: 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69 3c  p->db->nDb && i<
9800: 28 69 6e 74 29 73 69 7a 65 6f 66 28 79 44 62 4d  (int)sizeof(yDbM
9810: 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73 65  ask)*8 );.  asse
9820: 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f  rt( i<(int)sizeo
9830: 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a  f(p->btreeMask)*
9840: 38 20 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74  8 );.  DbMaskSet
9850: 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 69  (p->btreeMask, i
9860: 29 3b 0a 20 20 69 66 28 20 69 21 3d 31 20 26 26  );.  if( i!=1 &&
9870: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 68 61   sqlite3BtreeSha
9880: 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e 61 44 62  rable(p->db->aDb
9890: 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20 20  [i].pBt) ){.    
98a0: 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 6c 6f 63  DbMaskSet(p->loc
98b0: 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 7d 0a 7d  kMask, i);.  }.}
98c0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
98d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
98e0: 44 5f 43 41 43 48 45 29 0a 2f 2a 0a 2a 2a 20 49  D_CACHE)./*.** I
98f0: 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70  f SQLite is comp
9900: 69 6c 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20  iled to support 
9910: 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
9920: 65 20 61 6e 64 20 74 6f 20 62 65 20 74 68 72 65  e and to be thre
9930: 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20  adsafe,.** this 
9940: 72 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e 73 20  routine obtains 
9950: 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69  the mutex associ
9960: 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20 42  ated with each B
9970: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
9980: 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62 65  e.** that may be
9990: 20 61 63 63 65 73 73 65 64 20 62 79 20 74 68 65   accessed by the
99a0: 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e   VM passed as an
99b0: 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f   argument. In do
99c0: 69 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a 2a  ing so it also.*
99d0: 2a 20 73 65 74 73 20 74 68 65 20 42 74 53 68 61  * sets the BtSha
99e0: 72 65 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66  red.db member of
99f0: 20 65 61 63 68 20 6f 66 20 74 68 65 20 42 74 53   each of the BtS
9a00: 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 73  hared structures
9a10: 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68  , ensuring.** th
9a20: 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62  at the correct b
9a30: 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
9a40: 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20  back is invoked 
9a50: 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a  if required..**.
9a60: 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20  ** If SQLite is 
9a70: 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 62  not threadsafe b
9a80: 75 74 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20  ut does support 
9a90: 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
9aa0: 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74  e, then.** sqlit
9ab0: 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 20 69  e3BtreeEnter() i
9ac0: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74  s invoked to set
9ad0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62   the BtShared.db
9ae0: 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66   variables.** of
9af0: 20 61 6c 6c 20 6f 66 20 42 74 53 68 61 72 65 64   all of BtShared
9b00: 20 73 74 72 75 63 74 75 72 65 73 20 61 63 63 65   structures acce
9b10: 73 73 69 62 6c 65 20 76 69 61 20 74 68 65 20 64  ssible via the d
9b20: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a  atabase handle .
9b30: 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ** associated wi
9b40: 74 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a  th the VM..**.**
9b50: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f   If SQLite is no
9b60: 74 20 74 68 72 65 61 64 73 61 66 65 20 61 6e 64  t threadsafe and
9b70: 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
9b80: 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d  t shared-cache m
9b90: 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e  ode, this.** fun
9ba0: 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
9bb0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e 62  ..**.** The p->b
9bc0: 74 72 65 65 4d 61 73 6b 20 66 69 65 6c 64 20 69  treeMask field i
9bd0: 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 61  s a bitmask of a
9be0: 6c 6c 20 62 74 72 65 65 73 20 74 68 61 74 20 74  ll btrees that t
9bf0: 68 65 20 70 72 65 70 61 72 65 64 20 0a 2a 2a 20  he prepared .** 
9c00: 73 74 61 74 65 6d 65 6e 74 20 70 20 77 69 6c 6c  statement p will
9c10: 20 65 76 65 72 20 75 73 65 2e 20 20 4c 65 74 20   ever use.  Let 
9c20: 4e 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20  N be the number 
9c30: 6f 66 20 62 69 74 73 20 69 6e 20 70 2d 3e 62 74  of bits in p->bt
9c40: 72 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65  reeMask.** corre
9c50: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72 65  sponding to btre
9c60: 65 73 20 74 68 61 74 20 75 73 65 20 73 68 61 72  es that use shar
9c70: 65 64 20 63 61 63 68 65 2e 20 20 54 68 65 6e 20  ed cache.  Then 
9c80: 74 68 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a 2a  the runtime of.*
9c90: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
9ca0: 73 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20 4e  s N*N.  But as N
9cb0: 20 69 73 20 72 61 72 65 6c 79 20 6d 6f 72 65 20   is rarely more 
9cc0: 74 68 61 6e 20 31 2c 20 74 68 69 73 20 73 68 6f  than 1, this sho
9cd0: 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 20  uld not.** be a 
9ce0: 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64  problem..*/.void
9cf0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65   sqlite3VdbeEnte
9d00: 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  r(Vdbe *p){.  in
9d10: 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  t i;.  sqlite3 *
9d20: 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20  db;.  Db *aDb;. 
9d30: 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28 20   int nDb;.  if( 
9d40: 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d  DbMaskAllZero(p-
9d50: 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65 74  >lockMask) ) ret
9d60: 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d  urn;  /* The com
9d70: 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62  mon case */.  db
9d80: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20   = p->db;.  aDb 
9d90: 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62  = db->aDb;.  nDb
9da0: 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f   = db->nDb;.  fo
9db0: 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b  r(i=0; i<nDb; i+
9dc0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31  +){.    if( i!=1
9dd0: 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28 70   && DbMaskTest(p
9de0: 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26  ->lockMask,i) &&
9df0: 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70   ALWAYS(aDb[i].p
9e00: 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  Bt!=0) ){.      
9e10: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
9e20: 72 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20  r(aDb[i].pBt);. 
9e30: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
9e40: 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
9e50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
9e60: 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c  ED_CACHE) && SQL
9e70: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30  ITE_THREADSAFE>0
9e80: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c  ./*.** Unlock al
9e90: 6c 20 6f 66 20 74 68 65 20 62 74 72 65 65 73 20  l of the btrees 
9ea0: 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b 65  previously locke
9eb0: 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 73  d by a call to s
9ec0: 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28  qlite3VdbeEnter(
9ed0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  )..*/.static SQL
9ee0: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
9ef0: 64 20 76 64 62 65 4c 65 61 76 65 28 56 64 62 65  d vdbeLeave(Vdbe
9f00: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
9f10: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
9f20: 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e  Db *aDb;.  int n
9f30: 44 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62  Db;.  db = p->db
9f40: 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44  ;.  aDb = db->aD
9f50: 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e  b;.  nDb = db->n
9f60: 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  Db;.  for(i=0; i
9f70: 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nDb; i++){.    
9f80: 69 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d 61  if( i!=1 && DbMa
9f90: 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61  skTest(p->lockMa
9fa0: 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53 28  sk,i) && ALWAYS(
9fb0: 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29  aDb[i].pBt!=0) )
9fc0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
9fd0: 74 72 65 65 4c 65 61 76 65 28 61 44 62 5b 69 5d  treeLeave(aDb[i]
9fe0: 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  .pBt);.    }.  }
9ff0: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
a000: 64 62 65 4c 65 61 76 65 28 56 64 62 65 20 2a 70  dbeLeave(Vdbe *p
a010: 29 7b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41  ){.  if( DbMaskA
a020: 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61  llZero(p->lockMa
a030: 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  sk) ) return;  /
a040: 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
a050: 65 20 2a 2f 0a 20 20 76 64 62 65 4c 65 61 76 65  e */.  vdbeLeave
a060: 28 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  (p);.}.#endif..#
a070: 69 66 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f  if defined(VDBE_
a080: 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69  PROFILE) || defi
a090: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
a0a0: 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  )./*.** Print a 
a0b0: 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20  single opcode.  
a0c0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
a0d0: 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69  used for debuggi
a0e0: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  ng only..*/.void
a0f0: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
a100: 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20  tOp(FILE *pOut, 
a110: 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29  int pc, Op *pOp)
a120: 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20  {.  char *zP4;. 
a130: 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a   char zPtr[50];.
a140: 20 20 63 68 61 72 20 7a 43 6f 6d 5b 31 30 30 5d    char zCom[100]
a150: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
a160: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20   char *zFormat1 
a170: 3d 20 22 25 34 64 20 25 2d 31 33 73 20 25 34 64  = "%4d %-13s %4d
a180: 20 25 34 64 20 25 34 64 20 25 2d 31 33 73 20 25   %4d %4d %-13s %
a190: 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28  .2X %s\n";.  if(
a1a0: 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20   pOut==0 ) pOut 
a1b0: 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20  = stdout;.  zP4 
a1c0: 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c  = displayP4(pOp,
a1d0: 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50   zPtr, sizeof(zP
a1e0: 74 72 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  tr));.#ifdef SQL
a1f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
a200: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 64 69  IN_COMMENTS.  di
a210: 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70  splayComment(pOp
a220: 2c 20 7a 50 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a  , zP4, zCom, siz
a230: 65 6f 66 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73  eof(zCom));.#els
a240: 65 0a 20 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b  e.  zCom[0] = 0;
a250: 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 4e 42 3a  .#endif.  /* NB:
a260: 20 20 54 68 65 20 73 71 6c 69 74 65 33 4f 70 63    The sqlite3Opc
a270: 6f 64 65 4e 61 6d 65 28 29 20 66 75 6e 63 74 69  odeName() functi
a280: 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
a290: 64 20 62 79 20 63 6f 64 65 20 63 72 65 61 74 65  d by code create
a2a0: 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6d 6b  d.  ** by the mk
a2b0: 6f 70 63 6f 64 65 68 2e 61 77 6b 20 61 6e 64 20  opcodeh.awk and 
a2c0: 6d 6b 6f 70 63 6f 64 65 63 2e 61 77 6b 20 73 63  mkopcodec.awk sc
a2d0: 72 69 70 74 73 20 77 68 69 63 68 20 65 78 74 72  ripts which extr
a2e0: 61 63 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66  act the.  ** inf
a2f0: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
a300: 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20  e vdbe.c source 
a310: 74 65 78 74 20 2a 2f 0a 20 20 66 70 72 69 6e 74  text */.  fprint
a320: 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31  f(pOut, zFormat1
a330: 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c  , pc, .      sql
a340: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70  ite3OpcodeName(p
a350: 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70  Op->opcode), pOp
a360: 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70  ->p1, pOp->p2, p
a370: 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70  Op->p3, zP4, pOp
a380: 2d 3e 70 35 2c 0a 20 20 20 20 20 20 7a 43 6f 6d  ->p5,.      zCom
a390: 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70  .  );.  fflush(p
a3a0: 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Out);.}.#endif..
a3b0: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e  /*.** Release an
a3c0: 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20   array of N Mem 
a3d0: 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  elements.*/.stat
a3e0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d  ic void releaseM
a3f0: 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20  emArray(Mem *p, 
a400: 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20  int N){.  if( p 
a410: 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20  && N ){.    Mem 
a420: 2a 70 45 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a 20  *pEnd = &p[N];. 
a430: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
a440: 20 70 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20 6d   p->db;.    u8 m
a450: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64  alloc_failed = d
a460: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b  b->mallocFailed;
a470: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42  .    if( db->pnB
a480: 79 74 65 73 46 72 65 65 64 20 29 7b 0a 20 20 20  ytesFreed ){.   
a490: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69     do{.        i
a4a0: 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29  f( p->szMalloc )
a4b0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
a4c0: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
a4d0: 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b        }while( (+
a4e0: 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20  +p)<pEnd );.    
a4f0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
a500: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 61 73      do{.      as
a510: 73 65 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70  sert( (&p[1])==p
a520: 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d  End || p[0].db==
a530: 70 5b 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20  p[1].db );.     
a540: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a550: 56 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61  VdbeCheckMemInva
a560: 72 69 61 6e 74 73 28 70 29 20 29 3b 0a 0a 20 20  riants(p) );..  
a570: 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
a580: 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 69  k is really an i
a590: 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f  nlined version o
a5a0: 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  f sqlite3VdbeMem
a5b0: 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20 20 20  Release().      
a5c0: 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20 61 64  ** that takes ad
a5d0: 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20 66  vantage of the f
a5e0: 61 63 74 20 74 68 61 74 20 74 68 65 20 6d 65 6d  act that the mem
a5f0: 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65 20 69  ory cell value i
a600: 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  s .      ** bein
a610: 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66  g set to NULL af
a620: 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20 61 6e  ter releasing an
a630: 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72  y dynamic resour
a640: 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ces..      **.  
a650: 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73 74 69      ** The justi
a660: 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64 75 70  fication for dup
a670: 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20 69 73  licating code is
a680: 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e 67 20   that according 
a690: 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  to .      ** cal
a6a0: 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63 61 75  lgrind, this cau
a6b0: 73 65 73 20 61 20 63 65 72 74 61 69 6e 20 74 65  ses a certain te
a6c0: 73 74 20 63 61 73 65 20 74 6f 20 68 69 74 20 74  st case to hit t
a6d0: 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20 20 20  he CPU 4.7 .    
a6e0: 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65 73    ** percent les
a6f0: 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20 67 63  s (x86 linux, gc
a700: 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c  c version 4.1.2,
a710: 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20 0a 20   -O6) than if . 
a720: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d       ** sqlite3M
a730: 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65 72 65  emRelease() were
a740: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72   called from her
a750: 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74 68 69  e. With -O2, thi
a760: 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a  s jumps.      **
a770: 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e 74 2e   to 6.6 percent.
a780: 20 54 68 65 20 74 65 73 74 20 63 61 73 65 20 69   The test case i
a790: 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30 30 30  s inserting 1000
a7a0: 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74 61 62   rows into a tab
a7b0: 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77 69 74  le .      ** wit
a7c0: 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75 73 69  h no indexes usi
a7d0: 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72 65 70  ng a single prep
a7e0: 61 72 65 64 20 49 4e 53 45 52 54 20 73 74 61 74  ared INSERT stat
a7f0: 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20  ement, bind() . 
a800: 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65       ** and rese
a810: 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61 72 65  t(). Inserts are
a820: 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20 61 20   grouped into a 
a830: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
a840: 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74     */.      test
a850: 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26  case( p->flags &
a860: 20 4d 45 4d 5f 41 67 67 20 29 3b 0a 20 20 20 20   MEM_Agg );.    
a870: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66    testcase( p->f
a880: 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29  lags & MEM_Dyn )
a890: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
a8a0: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
a8b0: 5f 46 72 61 6d 65 20 29 3b 0a 20 20 20 20 20 20  _Frame );.      
a8c0: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61  testcase( p->fla
a8d0: 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20  gs & MEM_RowSet 
a8e0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
a8f0: 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d  flags&(MEM_Agg|M
a900: 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65  EM_Dyn|MEM_Frame
a910: 7c 4d 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b 0a  |MEM_RowSet) ){.
a920: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a930: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 29  dbeMemRelease(p)
a940: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
a950: 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 7b  ( p->szMalloc ){
a960: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a970: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d  DbFree(db, p->zM
a980: 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20  alloc);.        
a990: 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  p->szMalloc = 0;
a9a0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
a9b0: 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55  p->flags = MEM_U
a9c0: 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 7d 77  ndefined;.    }w
a9d0: 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64  hile( (++p)<pEnd
a9e0: 20 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c   );.    db->mall
a9f0: 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f  ocFailed = mallo
aa00: 63 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a  c_failed;.  }.}.
aa10: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
aa20: 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74  VdbeFrame object
aa30: 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e 74   and its content
aa40: 73 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a  s. VdbeFrame obj
aa50: 65 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f  ects are.** allo
aa60: 63 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f  cated by the OP_
aa70: 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69  Program opcode i
aa80: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  n sqlite3VdbeExe
aa90: 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  c()..*/.void sql
aaa0: 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c  ite3VdbeFrameDel
aab0: 65 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70  ete(VdbeFrame *p
aac0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65  ){.  int i;.  Me
aad0: 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46 72  m *aMem = VdbeFr
aae0: 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62  ameMem(p);.  Vdb
aaf0: 65 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72 20  eCursor **apCsr 
ab00: 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a  = (VdbeCursor **
ab10: 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64  )&aMem[p->nChild
ab20: 4d 65 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Mem];.  for(i=0;
ab30: 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b   i<p->nChildCsr;
ab40: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
ab50: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
ab60: 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29  (p->v, apCsr[i])
ab70: 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d  ;.  }.  releaseM
ab80: 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d  emArray(aMem, p-
ab90: 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73  >nChildMem);.  s
aba0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
abb0: 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69  v->db, p);.}..#i
abc0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
abd0: 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
abe0: 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f  Give a listing o
abf0: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e  f the program in
ac00: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
ac10: 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hine..**.** The 
ac20: 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68 65  interface is the
ac30: 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33   same as sqlite3
ac40: 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 75 74  VdbeExec().  But
ac50: 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72   instead of.** r
ac60: 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c  unning the code,
ac70: 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20   it invokes the 
ac80: 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f  callback once fo
ac90: 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69  r each instructi
aca0: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74  on..** This feat
acb0: 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 69  ure is used to i
acc0: 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49  mplement "EXPLAI
acd0: 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  N"..**.** When p
ace0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61  ->explain==1, ea
acf0: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  ch instruction i
ad00: 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65 6e 0a  s listed.  When.
ad10: 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  ** p->explain==2
ad20: 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69  , only OP_Explai
ad30: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61  n instructions a
ad40: 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20 74 68  re listed and th
ad50: 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e  ese.** are shown
ad60: 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   in a different 
ad70: 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c  format.  p->expl
ad80: 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64 20 74  ain==2 is used t
ad90: 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45  o implement.** E
ada0: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
adb0: 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d  N..**.** When p-
adc0: 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72  >explain==1, fir
add0: 73 74 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  st the main prog
ade0: 72 61 6d 20 69 73 20 6c 69 73 74 65 64 2c 20 74  ram is listed, t
adf0: 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74  hen each of.** t
ae00: 68 65 20 74 72 69 67 67 65 72 20 73 75 62 70 72  he trigger subpr
ae10: 6f 67 72 61 6d 73 20 61 72 65 20 6c 69 73 74 65  ograms are liste
ae20: 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f  d one by one..*/
ae30: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
ae40: 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20  List(.  Vdbe *p 
ae50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae60: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
ae70: 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20  .){.  int nRow; 
ae80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
aea0: 6f 70 20 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e  op when row coun
aeb0: 74 20 72 65 61 63 68 65 73 20 74 68 69 73 20 2a  t reaches this *
aec0: 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 30  /.  int nSub = 0
aed0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
aee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
aef0: 65 72 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20  er of sub-vdbes 
af00: 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20  seen so far */. 
af10: 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70   SubProgram **ap
af20: 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sub = 0;        
af30: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
af40: 66 20 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20  f sub-vdbes */. 
af50: 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20   Mem *pSub = 0; 
af60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af70: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
af80: 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79 20  cell hold array 
af90: 6f 66 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20  of subprogs */. 
afa0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
afb0: 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20  ->db;           
afc0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
afd0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
afe0: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
aff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b000: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
b010: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
b020: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
b030: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
b040: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
b050: 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ode */.  Mem *pM
b060: 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d  em = &p->aMem[1]
b070: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
b080: 20 46 69 72 73 74 20 4d 65 6d 20 6f 66 20 72 65   First Mem of re
b090: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 61  sult set */..  a
b0a0: 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69  ssert( p->explai
b0b0: 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n );.  assert( p
b0c0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
b0d0: 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73  GIC_RUN );.  ass
b0e0: 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
b0f0: 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d  TE_OK || p->rc==
b100: 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 70  SQLITE_BUSY || p
b110: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ->rc==SQLITE_NOM
b120: 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e  EM );..  /* Even
b130: 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63   though this opc
b140: 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ode does not use
b150: 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73   dynamic strings
b160: 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72 65   for.  ** the re
b170: 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c  sult, result col
b180: 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65 20  umns may become 
b190: 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75  dynamic if the u
b1a0: 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73  ser calls.  ** s
b1b0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
b1c0: 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20  xt16(), causing 
b1d0: 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f  a translation to
b1e0: 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67   UTF-16 encoding
b1f0: 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65  ..  */.  release
b200: 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20 38  MemArray(pMem, 8
b210: 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53  );.  p->pResultS
b220: 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  et = 0;..  if( p
b230: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ->rc==SQLITE_NOM
b240: 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  EM ){.    /* Thi
b250: 73 20 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d  s happens if a m
b260: 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61  alloc() inside a
b270: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
b280: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f  _column_text() o
b290: 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  r.    ** sqlite3
b2a0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29  _column_text16()
b2b0: 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20   failed.  */.   
b2c0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
b2d0: 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  d = 1;.    retur
b2e0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
b2f0: 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74    }..  /* When t
b300: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
b310: 70 75 74 20 72 6f 77 73 20 72 65 61 63 68 65 73  put rows reaches
b320: 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e   nRow, that mean
b330: 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69  s the.  ** listi
b340: 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65 64 20  ng has finished 
b350: 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 74 65 70  and sqlite3_step
b360: 28 29 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e  () should return
b370: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20   SQLITE_DONE..  
b380: 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68 65 20 73  ** nRow is the s
b390: 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  um of the number
b3a0: 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
b3b0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c  main program, pl
b3c0: 75 73 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d 20  us.  ** the sum 
b3d0: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
b3e0: 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72 69   rows in all tri
b3f0: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
b400: 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a   encountered.  *
b410: 2a 20 73 6f 20 66 61 72 2e 20 20 54 68 65 20 6e  * so far.  The n
b420: 52 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c 20 69  Row value will i
b430: 6e 63 72 65 61 73 65 20 61 73 20 6e 65 77 20 74  ncrease as new t
b440: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
b450: 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f  ms are.  ** enco
b460: 75 6e 74 65 72 65 64 2c 20 62 75 74 20 70 2d 3e  untered, but p->
b470: 70 63 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c  pc will eventual
b480: 6c 79 20 63 61 74 63 68 20 75 70 20 74 6f 20 6e  ly catch up to n
b490: 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77  Row..  */.  nRow
b4a0: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28   = p->nOp;.  if(
b4b0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
b4c0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72  {.    /* The fir
b4d0: 73 74 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  st 8 memory cell
b4e0: 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 74  s are used for t
b4f0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
b500: 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a  So we will.    *
b510: 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65  * commandeer the
b520: 20 39 74 68 20 63 65 6c 6c 20 74 6f 20 75 73 65   9th cell to use
b530: 20 61 73 20 73 74 6f 72 61 67 65 20 66 6f 72 20   as storage for 
b540: 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e  an array of poin
b550: 74 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74  ters.    ** to t
b560: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
b570: 6d 73 2e 20 20 54 68 65 20 56 44 42 45 20 69 73  ms.  The VDBE is
b580: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68   guaranteed to h
b590: 61 76 65 20 61 74 20 6c 65 61 73 74 20 39 0a 20  ave at least 9. 
b5a0: 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f     ** cells.  */
b5b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
b5c0: 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53  nMem>9 );.    pS
b5d0: 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d  ub = &p->aMem[9]
b5e0: 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  ;.    if( pSub->
b5f0: 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29  flags&MEM_Blob )
b600: 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68  {.      /* On th
b610: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
b620: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20  sqlite3_step(), 
b630: 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61  pSub will hold a
b640: 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20   NULL.  It is.  
b650: 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a      ** initializ
b660: 65 64 20 74 6f 20 61 20 42 4c 4f 42 20 62 79 20  ed to a BLOB by 
b670: 74 68 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41  the P4_SUBPROGRA
b680: 4d 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67  M processing log
b690: 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20  ic below */.    
b6a0: 20 20 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e    nSub = pSub->n
b6b0: 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a  /sizeof(Vdbe*);.
b6c0: 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28 53        apSub = (S
b6d0: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75  ubProgram **)pSu
b6e0: 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20  b->z;.    }.    
b6f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b  for(i=0; i<nSub;
b700: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f   i++){.      nRo
b710: 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e  w += apSub[i]->n
b720: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  Op;.    }.  }.. 
b730: 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e   do{.    i = p->
b740: 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20  pc++;.  }while( 
b750: 69 3c 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78 70  i<nRow && p->exp
b760: 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f  lain==2 && p->aO
b770: 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f  p[i].opcode!=OP_
b780: 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28  Explain );.  if(
b790: 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20   i>=nRow ){.    
b7a0: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
b7b0: 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K;.    rc = SQLI
b7c0: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  TE_DONE;.  }else
b7d0: 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e   if( db->u1.isIn
b7e0: 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20  terrupted ){.   
b7f0: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
b800: 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20 72  INTERRUPT;.    r
b810: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
b820: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
b830: 65 45 72 72 6f 72 28 70 2c 20 73 71 6c 69 74 65  eError(p, sqlite
b840: 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b  3ErrStr(p->rc));
b850: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
b860: 61 72 20 2a 7a 50 34 3b 0a 20 20 20 20 4f 70 20  ar *zP4;.    Op 
b870: 2a 70 4f 70 3b 0a 20 20 20 20 69 66 28 20 69 3c  *pOp;.    if( i<
b880: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20  p->nOp ){.      
b890: 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c 69  /* The output li
b8a0: 6e 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d 61  ne number is sma
b8b0: 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20 77  ll enough that w
b8c0: 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74  e are still in t
b8d0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e  he.      ** main
b8e0: 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20   program. */.   
b8f0: 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70     pOp = &p->aOp
b900: 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  [i];.    }else{.
b910: 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20        /* We are 
b920: 63 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e  currently listin
b930: 67 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20  g subprograms.  
b940: 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68  Figure out which
b950: 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 2a   one and.      *
b960: 2a 20 70 69 63 6b 20 75 70 20 74 68 65 20 61 70  * pick up the ap
b970: 70 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 65  propriate opcode
b980: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a  . */.      int j
b990: 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e  ;.      i -= p->
b9a0: 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  nOp;.      for(j
b9b0: 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d  =0; i>=apSub[j]-
b9c0: 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nOp; j++){.    
b9d0: 20 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a      i -= apSub[j
b9e0: 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a  ]->nOp;.      }.
b9f0: 20 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53        pOp = &apS
ba00: 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20  ub[j]->aOp[i];. 
ba10: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
ba20: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20  explain==1 ){.  
ba30: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
ba40: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
ba50: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20   pMem->u.i = i; 
ba60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ba80: 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65  * Program counte
ba90: 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b  r */.      pMem+
baa0: 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d  +;.  .      pMem
bab0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
bac0: 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d  atic|MEM_Str|MEM
bad0: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65  _Term;.      pMe
bae0: 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71  m->z = (char*)sq
baf0: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
bb00: 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a  pOp->opcode); /*
bb10: 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20   Opcode */.     
bb20: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a   assert( pMem->z
bb30: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65  !=0 );.      pMe
bb40: 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  m->n = sqlite3St
bb50: 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b  rlen30(pMem->z);
bb60: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  .      pMem->enc
bb70: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
bb80: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20        pMem++;.. 
bb90: 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20       /* When an 
bba0: 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64  OP_Program opcod
bbb0: 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 28  e is encounter (
bbc0: 74 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20  the only opcode 
bbd0: 74 68 61 74 20 68 61 73 0a 20 20 20 20 20 20 2a  that has.      *
bbe0: 2a 20 61 20 50 34 5f 53 55 42 50 52 4f 47 52 41  * a P4_SUBPROGRA
bbf0: 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20 65 78 70  M argument), exp
bc00: 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
bc10: 74 68 65 20 61 72 72 61 79 20 6f 66 20 73 75 62  the array of sub
bc20: 70 72 6f 67 72 61 6d 73 0a 20 20 20 20 20 20 2a  programs.      *
bc30: 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65  * kept in p->aMe
bc40: 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74  m[9].z to hold t
bc50: 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d  he new program -
bc60: 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20 73   assuming this s
bc70: 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20 20 20  ubprogram.      
bc80: 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61  ** has not alrea
bc90: 64 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20  dy been seen..  
bca0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
bcb0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
bcc0: 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20  _SUBPROGRAM ){. 
bcd0: 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65         int nByte
bce0: 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65   = (nSub+1)*size
bcf0: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b  of(SubProgram*);
bd00: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
bd10: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
bd20: 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20   j<nSub; j++){. 
bd30: 20 20 20 20 20 20 20 20 20 69 66 28 20 61 70 53           if( apS
bd40: 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70  ub[j]==pOp->p4.p
bd50: 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b  Program ) break;
bd60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
bd70: 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 26     if( j==nSub &
bd80: 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c  & SQLITE_OK==sql
bd90: 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28  ite3VdbeMemGrow(
bda0: 70 53 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53 75  pSub, nByte, nSu
bdb0: 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  b!=0) ){.       
bdc0: 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50     apSub = (SubP
bdd0: 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e  rogram **)pSub->
bde0: 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70 53  z;.          apS
bdf0: 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70  ub[nSub++] = pOp
be00: 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20  ->p4.pProgram;. 
be10: 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 66           pSub->f
be20: 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62  lags |= MEM_Blob
be30: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 75 62  ;.          pSub
be40: 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f  ->n = nSub*sizeo
be50: 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a  f(SubProgram*);.
be60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
be70: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65  }.    }..    pMe
be80: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
be90: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  nt;.    pMem->u.
bea0: 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20  i = pOp->p1;    
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bec0: 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20        /* P1 */. 
bed0: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
bee0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
bef0: 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d  M_Int;.    pMem-
bf00: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20  >u.i = pOp->p2; 
bf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf20: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a           /* P2 *
bf30: 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  /.    pMem++;.. 
bf40: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
bf50: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d   MEM_Int;.    pM
bf60: 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  em->u.i = pOp->p
bf70: 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3;              
bf80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
bf90: 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  3 */.    pMem++;
bfa0: 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ..    if( sqlite
bfb0: 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64  3VdbeMemClearAnd
bfc0: 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 31 30 30  Resize(pMem, 100
bfd0: 29 20 29 7b 20 2f 2a 20 50 34 20 2a 2f 0a 20 20  ) ){ /* P4 */.  
bfe0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
bff0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
c000: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
c010: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
c020: 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c    }.    pMem->fl
c030: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45  ags = MEM_Str|ME
c040: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 50 34 20  M_Term;.    zP4 
c050: 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c  = displayP4(pOp,
c060: 20 70 4d 65 6d 2d 3e 7a 2c 20 70 4d 65 6d 2d 3e   pMem->z, pMem->
c070: 73 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 69  szMalloc);.    i
c080: 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a 20  f( zP4!=pMem->z 
c090: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
c0a0: 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d  VdbeMemSetStr(pM
c0b0: 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20 53 51 4c  em, zP4, -1, SQL
c0c0: 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20  ITE_UTF8, 0);.  
c0d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
c0e0: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d  ssert( pMem->z!=
c0f0: 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  0 );.      pMem-
c100: 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  >n = sqlite3Strl
c110: 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  en30(pMem->z);. 
c120: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
c130: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
c140: 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a    }.    pMem++;.
c150: 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  .    if( p->expl
c160: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ain==1 ){.      
c170: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
c180: 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65  emClearAndResize
c190: 28 70 4d 65 6d 2c 20 34 29 20 29 7b 0a 20 20 20  (pMem, 4) ){.   
c1a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
c1b0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c1c0: 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
c1d0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
c1e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
c1f0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
c200: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
c210: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32       pMem->n = 2
c220: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
c230: 73 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d  snprintf(3, pMem
c240: 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70  ->z, "%.2x", pOp
c250: 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a  ->p5);   /* P5 *
c260: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  /.      pMem->en
c270: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
c280: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  .      pMem++;. 
c290: 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f   .#ifdef SQLITE_
c2a0: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
c2b0: 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 69 66  OMMENTS.      if
c2c0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
c2d0: 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70  ClearAndResize(p
c2e0: 4d 65 6d 2c 20 35 30 30 29 20 29 7b 0a 20 20 20  Mem, 500) ){.   
c2f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
c300: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c310: 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
c320: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
c330: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
c340: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
c350: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
c360: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64       pMem->n = d
c370: 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f  isplayComment(pO
c380: 70 2c 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c  p, zP4, pMem->z,
c390: 20 35 30 30 29 3b 0a 20 20 20 20 20 20 70 4d 65   500);.      pMe
c3a0: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
c3b0: 55 54 46 38 3b 0a 23 65 6c 73 65 0a 20 20 20 20  UTF8;.#else.    
c3c0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
c3d0: 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20  MEM_Null;       
c3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3f0: 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 23 65  /* Comment */.#e
c400: 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
c410: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20  p->nResColumn = 
c420: 38 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69  8 - 4*(p->explai
c430: 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65  n-1);.    p->pRe
c440: 73 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d  sultSet = &p->aM
c450: 65 6d 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 72 63  em[1];.    p->rc
c460: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
c470: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f    rc = SQLITE_RO
c480: 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  W;.  }.  return 
c490: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
c4a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
c4b0: 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  AIN */..#ifdef S
c4c0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
c4d0: 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20  * Print the SQL 
c4e0: 74 68 61 74 20 77 61 73 20 75 73 65 64 20 74 6f  that was used to
c4f0: 20 67 65 6e 65 72 61 74 65 20 61 20 56 44 42 45   generate a VDBE
c500: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69   program..*/.voi
c510: 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  d sqlite3VdbePri
c520: 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a  ntSql(Vdbe *p){.
c530: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
c540: 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 53  = 0;.  if( p->zS
c550: 71 6c 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 2d  ql ){.    z = p-
c560: 3e 7a 53 71 6c 3b 0a 20 20 7d 65 6c 73 65 20 69  >zSql;.  }else i
c570: 66 28 20 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a  f( p->nOp>=1 ){.
c580: 20 20 20 20 63 6f 6e 73 74 20 56 64 62 65 4f 70      const VdbeOp
c590: 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b   *pOp = &p->aOp[
c5a0: 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d  0];.    if( pOp-
c5b0: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74  >opcode==OP_Init
c5c0: 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30   && pOp->p4.z!=0
c5d0: 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 70 4f   ){.      z = pO
c5e0: 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 77  p->p4.z;.      w
c5f0: 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73  hile( sqlite3Iss
c600: 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a  pace(*z) ) z++;.
c610: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
c620: 7a 20 29 20 70 72 69 6e 74 66 28 22 53 51 4c 3a  z ) printf("SQL:
c630: 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a   [%s]\n", z);.}.
c640: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
c650: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
c660: 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e  _TRACE) && defin
c670: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
c680: 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20  _IOTRACE)./*.** 
c690: 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45  Print an IOTRACE
c6a0: 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67   message showing
c6b0: 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f   SQL content..*/
c6c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
c6d0: 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65  eIOTraceSql(Vdbe
c6e0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20   *p){.  int nOp 
c6f0: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65  = p->nOp;.  Vdbe
c700: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73  Op *pOp;.  if( s
c710: 71 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30  qlite3IoTrace==0
c720: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
c730: 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b   nOp<1 ) return;
c740: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
c750: 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  [0];.  if( pOp->
c760: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20  opcode==OP_Init 
c770: 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20  && pOp->p4.z!=0 
c780: 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  ){.    int i, j;
c790: 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30 30  .    char z[1000
c7a0: 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ];.    sqlite3_s
c7b0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
c7c0: 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d  ), z, "%s", pOp-
c7d0: 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28  >p4.z);.    for(
c7e0: 69 3d 30 3b 20 73 71 6c 69 74 65 33 49 73 73 70  i=0; sqlite3Issp
c7f0: 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b  ace(z[i]); i++){
c800: 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  }.    for(j=0; z
c810: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
c820: 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 73 70   if( sqlite3Issp
c830: 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20  ace(z[i]) ){.   
c840: 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21       if( z[i-1]!
c850: 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =' ' ){.        
c860: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a    z[j++] = ' ';.
c870: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c880: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
c890: 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20  [j++] = z[i];.  
c8a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
c8b0: 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71  z[j] = 0;.    sq
c8c0: 6c 69 74 65 33 49 6f 54 72 61 63 65 28 22 53 51  lite3IoTrace("SQ
c8d0: 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d  L %s\n", z);.  }
c8e0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51  .}.#endif /* !SQ
c8f0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20  LITE_OMIT_TRACE 
c900: 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
c910: 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a  _IOTRACE */../*.
c920: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  ** Allocate spac
c930: 65 20 66 72 6f 6d 20 61 20 66 69 78 65 64 20 73  e from a fixed s
c940: 69 7a 65 20 62 75 66 66 65 72 20 61 6e 64 20 72  ize buffer and r
c950: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
c960: 74 6f 0a 2a 2a 20 74 68 61 74 20 73 70 61 63 65  to.** that space
c970: 2e 20 20 49 66 20 69 6e 73 75 66 66 69 63 69 65  .  If insufficie
c980: 6e 74 20 73 70 61 63 65 20 69 73 20 61 76 61 69  nt space is avai
c990: 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 4e 55  lable, return NU
c9a0: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 42  LL..**.** The pB
c9b0: 75 66 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  uf parameter is 
c9c0: 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  the initial valu
c9d0: 65 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 77  e of a pointer w
c9e0: 68 69 63 68 20 77 69 6c 6c 0a 2a 2a 20 72 65 63  hich will.** rec
c9f0: 65 69 76 65 20 74 68 65 20 6e 65 77 20 6d 65 6d  eive the new mem
ca00: 6f 72 79 2e 20 20 70 42 75 66 20 69 73 20 6e 6f  ory.  pBuf is no
ca10: 72 6d 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20 49 66  rmally NULL.  If
ca20: 20 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20   pBuf is not.** 
ca30: 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74  NULL, it means t
ca40: 68 61 74 20 6d 65 6d 6f 72 79 20 73 70 61 63 65  hat memory space
ca50: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
ca60: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  n allocated and 
ca70: 74 68 61 74 0a 2a 2a 20 74 68 69 73 20 72 6f 75  that.** this rou
ca80: 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20  tine should not 
ca90: 61 6c 6c 6f 63 61 74 65 20 61 6e 79 20 6e 65 77  allocate any new
caa0: 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 70   memory.  When p
cab0: 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55  Buf is not.** NU
cac0: 4c 4c 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  LL simply return
cad0: 20 70 42 75 66 2e 20 20 4f 6e 6c 79 20 61 6c 6c   pBuf.  Only all
cae0: 6f 63 61 74 65 20 6e 65 77 20 6d 65 6d 6f 72 79  ocate new memory
caf0: 20 73 70 61 63 65 20 77 68 65 6e 20 70 42 75 66   space when pBuf
cb00: 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  .** is NULL..**.
cb10: 2a 2a 20 6e 42 79 74 65 20 69 73 20 74 68 65 20  ** nByte is the 
cb20: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
cb30: 6f 66 20 73 70 61 63 65 20 6e 65 65 64 65 64 2e  of space needed.
cb40: 0a 2a 2a 0a 2a 2a 20 70 46 72 6f 6d 20 70 6f 69  .**.** pFrom poi
cb50: 6e 74 73 20 74 6f 20 2a 70 6e 46 72 6f 6d 20 62  nts to *pnFrom b
cb60: 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c  ytes of availabl
cb70: 65 20 73 70 61 63 65 2e 20 20 4e 65 77 20 73 70  e space.  New sp
cb80: 61 63 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ace is allocated
cb90: 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 65 6e 64  .** from the end
cba0: 20 6f 66 20 74 68 65 20 70 46 72 6f 6d 20 62 75   of the pFrom bu
cbb0: 66 66 65 72 20 61 6e 64 20 2a 70 6e 46 72 6f 6d  ffer and *pnFrom
cbc0: 20 69 73 20 64 65 63 72 65 6d 65 6e 74 65 64 2e   is decremented.
cbd0: 0a 2a 2a 0a 2a 2a 20 2a 70 6e 4e 65 65 64 65 64  .**.** *pnNeeded
cbe0: 20 69 73 20 61 20 63 6f 75 6e 74 65 72 20 6f 66   is a counter of
cbf0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
cc00: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 68  ytes of space th
cc10: 61 74 20 68 61 76 65 20 66 61 69 6c 65 64 0a 2a  at have failed.*
cc20: 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2e 20 20  * to allocate.  
cc30: 49 66 20 74 68 65 72 65 20 69 73 20 69 6e 73 75  If there is insu
cc40: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 69  fficient space i
cc50: 6e 20 70 46 72 6f 6d 20 74 6f 20 73 61 74 69 73  n pFrom to satis
cc60: 66 79 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73  fy the.** reques
cc70: 74 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e  t, then incremen
cc80: 74 20 2a 70 6e 4e 65 65 64 65 64 20 62 79 20 74  t *pnNeeded by t
cc90: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65  he amount of the
cca0: 20 72 65 71 75 65 73 74 2e 0a 2a 2f 0a 73 74 61   request..*/.sta
ccb0: 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53  tic void *allocS
ccc0: 70 61 63 65 28 0a 20 20 76 6f 69 64 20 2a 70 42  pace(.  void *pB
ccd0: 75 66 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  uf,          /* 
cce0: 57 68 65 72 65 20 72 65 74 75 72 6e 20 70 6f 69  Where return poi
ccf0: 6e 74 65 72 20 77 69 6c 6c 20 62 65 20 73 74 6f  nter will be sto
cd00: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  red */.  int nBy
cd10: 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  te,           /*
cd20: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
cd30: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
cd40: 20 20 75 38 20 2a 70 46 72 6f 6d 2c 20 20 20 20    u8 *pFrom,    
cd50: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
cd60: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61   available for a
cd70: 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  llocation */.  i
cd80: 6e 74 20 2a 70 6e 46 72 6f 6d 2c 20 20 20 20 20  nt *pnFrom,     
cd90: 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53      /* IN/OUT: S
cda0: 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 61  pace available a
cdb0: 74 20 70 46 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  t pFrom */.  int
cdc0: 20 2a 70 6e 4e 65 65 64 65 64 20 20 20 20 20 20   *pnNeeded      
cdd0: 20 20 2f 2a 20 49 66 20 61 6c 6c 6f 63 61 74 69    /* If allocati
cde0: 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6d 61 64  on cannot be mad
cdf0: 65 2c 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e  e, increment *pn
ce00: 42 79 74 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  Byte */.){.  ass
ce10: 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
ce20: 41 4c 49 47 4e 4d 45 4e 54 28 70 46 72 6f 6d 29  ALIGNMENT(pFrom)
ce30: 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66 3d 3d   );.  if( pBuf==
ce40: 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d  0 ){.    nByte =
ce50: 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a   ROUND8(nByte);.
ce60: 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 3c 3d      if( nByte <=
ce70: 20 2a 70 6e 46 72 6f 6d 20 29 7b 0a 20 20 20 20   *pnFrom ){.    
ce80: 20 20 2a 70 6e 46 72 6f 6d 20 2d 3d 20 6e 42 79    *pnFrom -= nBy
ce90: 74 65 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d  te;.      pBuf =
cea0: 20 26 70 46 72 6f 6d 5b 2a 70 6e 46 72 6f 6d 5d   &pFrom[*pnFrom]
ceb0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
cec0: 20 20 20 2a 70 6e 4e 65 65 64 65 64 20 2b 3d 20     *pnNeeded += 
ced0: 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  nByte;.    }.  }
cee0: 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
cef0: 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
cf00: 70 42 75 66 29 20 29 3b 0a 20 20 72 65 74 75 72  pBuf) );.  retur
cf10: 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pBuf;.}../*.**
cf20: 20 52 65 77 69 6e 64 20 74 68 65 20 56 44 42 45   Rewind the VDBE
cf30: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67   back to the beg
cf40: 69 6e 6e 69 6e 67 20 69 6e 20 70 72 65 70 61 72  inning in prepar
cf50: 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e  ation for.** run
cf60: 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64  ning it..*/.void
cf70: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69   sqlite3VdbeRewi
cf80: 6e 64 28 56 64 62 65 20 2a 70 29 7b 0a 23 69 66  nd(Vdbe *p){.#if
cf90: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
cfa0: 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
cfb0: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a  d(VDBE_PROFILE).
cfc0: 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a    int i;.#endif.
cfd0: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
cfe0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
cff0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
d000: 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54  _INIT );..  /* T
d010: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61  here should be a
d020: 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f  t least one opco
d030: 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  de..  */.  asser
d040: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a  t( p->nOp>0 );..
d050: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67    /* Set the mag
d060: 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43  ic to VDBE_MAGIC
d070: 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68  _RUN sooner rath
d080: 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a  er than later. *
d090: 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  /.  p->magic = V
d0a0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a  DBE_MAGIC_RUN;..
d0b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
d0c0: 42 55 47 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69  BUG.  for(i=1; i
d0d0: 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a  <p->nMem; i++){.
d0e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
d0f0: 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62  Mem[i].db==p->db
d100: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   );.  }.#endif. 
d110: 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70   p->pc = -1;.  p
d120: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
d130: 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69  ;.  p->errorActi
d140: 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20  on = OE_Abort;. 
d150: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
d160: 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d  _MAGIC_RUN;.  p-
d170: 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
d180: 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b  p->cacheCtr = 1;
d190: 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69  .  p->minWriteFi
d1a0: 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a  leFormat = 255;.
d1b0: 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20    p->iStatement 
d1c0: 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e  = 0;.  p->nFkCon
d1d0: 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66  straint = 0;.#if
d1e0: 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45  def VDBE_PROFILE
d1f0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
d200: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
d210: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20  p->aOp[i].cnt = 
d220: 30 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d  0;.    p->aOp[i]
d230: 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 7d  .cycles = 0;.  }
d240: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
d250: 20 50 72 65 70 61 72 65 20 61 20 76 69 72 74 75   Prepare a virtu
d260: 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65  al machine for e
d270: 78 65 63 75 74 69 6f 6e 20 66 6f 72 20 74 68 65  xecution for the
d280: 20 66 69 72 73 74 20 74 69 6d 65 20 61 66 74 65   first time afte
d290: 72 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 74 68  r.** creating th
d2a0: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
d2b0: 65 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65  e.  This involve
d2c0: 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a  s things such.**
d2d0: 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 72   as allocating r
d2e0: 65 67 69 73 74 65 72 73 20 61 6e 64 20 69 6e 69  egisters and ini
d2f0: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72  tializing the pr
d300: 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a  ogram counter..*
d310: 2a 20 41 66 74 65 72 20 74 68 65 20 56 44 42 45  * After the VDBE
d320: 20 68 61 73 20 62 65 20 70 72 65 70 70 65 64 2c   has be prepped,
d330: 20 69 74 20 63 61 6e 20 62 65 20 65 78 65 63 75   it can be execu
d340: 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f  ted by one or mo
d350: 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73  re.** calls to s
d360: 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29  qlite3VdbeExec()
d370: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  .  .**.** This f
d380: 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63  unction may be c
d390: 61 6c 6c 65 64 20 65 78 61 63 74 6c 79 20 6f 6e  alled exactly on
d3a0: 63 65 20 6f 6e 20 65 61 63 68 20 76 69 72 74 75  ce on each virtu
d3b0: 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 41  al machine..** A
d3c0: 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
d3d0: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  e is called the 
d3e0: 56 4d 20 68 61 73 20 62 65 65 6e 20 22 70 61 63  VM has been "pac
d3f0: 6b 61 67 65 64 22 20 61 6e 64 20 69 73 20 72 65  kaged" and is re
d400: 61 64 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20 20  ady.** to run.  
d410: 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  After this routi
d420: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 66 75  ne is called, fu
d430: 72 74 68 65 72 20 63 61 6c 6c 73 20 74 6f 20 0a  rther calls to .
d440: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  ** sqlite3VdbeAd
d450: 64 4f 70 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  dOp() functions 
d460: 61 72 65 20 70 72 6f 68 69 62 69 74 65 64 2e 20  are prohibited. 
d470: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 69   This routine di
d480: 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74 68 65  sconnects.** the
d490: 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20 50   Vdbe from the P
d4a0: 61 72 73 65 20 6f 62 6a 65 63 74 20 74 68 61 74  arse object that
d4b0: 20 68 65 6c 70 65 64 20 67 65 6e 65 72 61 74 65   helped generate
d4c0: 20 69 74 20 73 6f 20 74 68 61 74 20 74 68 65 0a   it so that the.
d4d0: 2a 2a 20 74 68 65 20 56 64 62 65 20 62 65 63 6f  ** the Vdbe beco
d4e0: 6d 65 73 20 61 6e 20 69 6e 64 65 70 65 6e 64 65  mes an independe
d4f0: 6e 74 20 65 6e 74 69 74 79 20 61 6e 64 20 74 68  nt entity and th
d500: 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 63  e Parse object c
d510: 61 6e 20 62 65 0a 2a 2a 20 64 65 73 74 72 6f 79  an be.** destroy
d520: 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  ed..**.** Use th
d530: 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77  e sqlite3VdbeRew
d540: 69 6e 64 28 29 20 70 72 6f 63 65 64 75 72 65 20  ind() procedure 
d550: 74 6f 20 72 65 73 74 6f 72 65 20 61 20 76 69 72  to restore a vir
d560: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 61 63  tual machine bac
d570: 6b 0a 2a 2a 20 74 6f 20 69 74 73 20 69 6e 69 74  k.** to its init
d580: 69 61 6c 20 73 74 61 74 65 20 61 66 74 65 72 20  ial state after 
d590: 69 74 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2e  it has been run.
d5a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d5b0: 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20  VdbeMakeReady(. 
d5c0: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
d5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5e0: 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20  /* The VDBE */. 
d5f0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 20   Parse *pParse  
d600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d610: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
d620: 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  xt */.){.  sqlit
d630: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
d640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
d650: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
d660: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56  tion */.  int nV
d670: 61 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ar;             
d680: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
d690: 65 72 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73  er of parameters
d6a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20   */.  int nMem; 
d6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
d6d0: 66 20 56 4d 20 6d 65 6d 6f 72 79 20 72 65 67 69  f VM memory regi
d6e0: 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  sters */.  int n
d6f0: 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20  Cursor;         
d700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
d710: 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 72  ber of cursors r
d720: 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74  equired */.  int
d730: 20 6e 41 72 67 3b 20 20 20 20 20 20 20 20 20 20   nArg;          
d740: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
d750: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
d760: 74 73 20 69 6e 20 73 75 62 70 72 6f 67 72 61 6d  ts in subprogram
d770: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6e 63 65  s */.  int nOnce
d780: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d790: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
d7a0: 6f 66 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72  of OP_Once instr
d7b0: 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  uctions */.  int
d7c0: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
d7d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
d7e0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
d7f0: 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20   int nFree;     
d800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d810: 2f 2a 20 41 76 61 69 6c 61 62 6c 65 20 66 72 65  /* Available fre
d820: 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 75 38 20  e space */.  u8 
d830: 2a 7a 43 73 72 3b 20 20 20 20 20 20 20 20 20 20  *zCsr;          
d840: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
d850: 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20  emory available 
d860: 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a  for allocation *
d870: 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  /.  int nByte;  
d880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d890: 20 20 20 2f 2a 20 48 6f 77 20 6d 75 63 68 20 65     /* How much e
d8a0: 78 74 72 61 20 6d 65 6d 6f 72 79 20 69 73 20 6e  xtra memory is n
d8b0: 65 65 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  eeded */..  asse
d8c0: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
d8d0: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29  sert( p->nOp>0 )
d8e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
d8f0: 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  se!=0 );.  asser
d900: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
d910: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
d920: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
d930: 3d 3d 70 2d 3e 70 50 61 72 73 65 20 29 3b 0a 20  ==p->pParse );. 
d940: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
d950: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
d960: 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20  cFailed==0 );.  
d970: 6e 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nVar = pParse->n
d980: 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70 50  Var;.  nMem = pP
d990: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e 43  arse->nMem;.  nC
d9a0: 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
d9b0: 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20 70  nTab;.  nArg = p
d9c0: 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b 0a  Parse->nMaxArg;.
d9d0: 20 20 6e 4f 6e 63 65 20 3d 20 70 50 61 72 73 65    nOnce = pParse
d9e0: 2d 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20 6e  ->nOnce;.  if( n
d9f0: 4f 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e 63 65 20  Once==0 ) nOnce 
da00: 3d 20 31 3b 20 2f 2a 20 45 6e 73 75 72 65 20 61  = 1; /* Ensure a
da10: 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 79 74 65  t least one byte
da20: 20 69 6e 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67   in p->aOnceFlag
da30: 5b 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 46 6f  [] */.  .  /* Fo
da40: 72 20 65 61 63 68 20 63 75 72 73 6f 72 20 72 65  r each cursor re
da50: 71 75 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c 6c  quired, also all
da60: 6f 63 61 74 65 20 61 20 6d 65 6d 6f 72 79 20 63  ocate a memory c
da70: 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a  ell. Memory.  **
da80: 20 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e   cells (nMem+1-n
da90: 43 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69  Cursor)..nMem, i
daa0: 6e 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20 6e  nclusive, will n
dab0: 65 76 65 72 20 62 65 20 75 73 65 64 20 62 79 0a  ever be used by.
dac0: 20 20 2a 2a 20 74 68 65 20 76 64 62 65 20 70 72    ** the vdbe pr
dad0: 6f 67 72 61 6d 2e 20 49 6e 73 74 65 61 64 20 74  ogram. Instead t
dae0: 68 65 79 20 61 72 65 20 75 73 65 64 20 74 6f 20  hey are used to 
daf0: 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
db00: 6f 72 0a 20 20 2a 2a 20 56 64 62 65 43 75 72 73  or.  ** VdbeCurs
db10: 6f 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72 75  or/BtCursor stru
db20: 63 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f 62  ctures. The blob
db30: 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63   of memory assoc
db40: 69 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a 2a  iated with .  **
db50: 20 63 75 72 73 6f 72 20 30 20 69 73 20 73 74 6f   cursor 0 is sto
db60: 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65  red in memory ce
db70: 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20  ll nMem. Memory 
db80: 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20 20  cell (nMem-1).  
db90: 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62 6c  ** stores the bl
dba0: 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73  ob of memory ass
dbb0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
dbc0: 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a 2a  sor 1, etc..  **
dbd0: 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  .  ** See also: 
dbe0: 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29  allocateCursor()
dbf0: 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d  ..  */.  nMem +=
dc00: 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20   nCursor;..  /* 
dc10: 7a 43 73 72 20 77 69 6c 6c 20 69 6e 69 74 69 61  zCsr will initia
dc20: 6c 6c 79 20 70 6f 69 6e 74 20 74 6f 20 6e 46 72  lly point to nFr
dc30: 65 65 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73  ee bytes of unus
dc40: 65 64 20 73 70 61 63 65 20 61 74 20 74 68 65 0a  ed space at the.
dc50: 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20    ** end of the 
dc60: 6f 70 63 6f 64 65 20 61 72 72 61 79 2c 20 70 2d  opcode array, p-
dc70: 3e 61 4f 70 2e 20 20 54 68 65 20 63 6f 6d 70 75  >aOp.  The compu
dc80: 74 61 74 69 6f 6e 20 6f 66 20 6e 46 72 65 65 20  tation of nFree 
dc90: 69 73 0a 20 20 2a 2a 20 63 6f 6e 73 65 72 76 61  is.  ** conserva
dca0: 74 69 76 65 20 2d 20 69 74 20 6d 69 67 68 74 20  tive - it might 
dcb0: 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  be smaller than 
dcc0: 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72 20  the true number 
dcd0: 6f 66 20 66 72 65 65 0a 20 20 2a 2a 20 62 79 74  of free.  ** byt
dce0: 65 73 2c 20 62 75 74 20 6e 65 76 65 72 20 6c 61  es, but never la
dcf0: 72 67 65 72 2e 20 20 6e 46 72 65 65 20 6d 75 73  rger.  nFree mus
dd00: 74 20 62 65 20 61 20 6d 75 6c 74 69 70 6c 65 20  t be a multiple 
dd10: 6f 66 20 38 20 2d 20 69 74 20 69 73 0a 20 20 2a  of 8 - it is.  *
dd20: 2a 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 69  * rounded down i
dd30: 66 20 69 73 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20  f is not..  */. 
dd40: 20 6e 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65   n = ROUND8(size
dd50: 6f 66 28 4f 70 29 2a 70 2d 3e 6e 4f 70 29 3b 20  of(Op)*p->nOp); 
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dd70: 42 79 74 65 73 20 6f 66 20 6f 70 63 6f 64 65 20  Bytes of opcode 
dd80: 73 70 61 63 65 20 75 73 65 64 20 2a 2f 0a 20 20  space used */.  
dd90: 7a 43 73 72 20 3d 20 26 28 28 75 38 2a 29 70 2d  zCsr = &((u8*)p-
dda0: 3e 61 4f 70 29 5b 6e 5d 3b 20 20 20 20 20 20 20  >aOp)[n];       
ddb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
ddc0: 6e 75 73 65 64 20 6f 70 63 6f 64 65 20 73 70 61  nused opcode spa
ddd0: 63 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ce */.  assert( 
dde0: 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
ddf0: 4d 45 4e 54 28 7a 43 73 72 29 20 29 3b 0a 20 20  MENT(zCsr) );.  
de00: 6e 46 72 65 65 20 3d 20 52 4f 55 4e 44 44 4f 57  nFree = ROUNDDOW
de10: 4e 38 28 70 50 61 72 73 65 2d 3e 73 7a 4f 70 41  N8(pParse->szOpA
de20: 6c 6c 6f 63 20 2d 20 6e 29 3b 20 20 2f 2a 20 42  lloc - n);  /* B
de30: 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73  ytes of unused s
de40: 70 61 63 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  pace */.  assert
de50: 28 20 6e 46 72 65 65 3e 3d 30 20 29 3b 0a 20 20  ( nFree>=0 );.  
de60: 69 66 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20  if( nFree>0 ){. 
de70: 20 20 20 6d 65 6d 73 65 74 28 7a 43 73 72 2c 20     memset(zCsr, 
de80: 30 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 61  0, nFree);.    a
de90: 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
dea0: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 26 7a 43 73  E_ALIGNMENT(&zCs
deb0: 72 5b 6e 46 72 65 65 5d 29 20 29 3b 0a 20 20 7d  r[nFree]) );.  }
dec0: 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c  ..  resolveP2Val
ded0: 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20  ues(p, &nArg);. 
dee0: 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72   p->usesStmtJour
def0: 6e 61 6c 20 3d 20 28 75 38 29 28 70 50 61 72 73  nal = (u8)(pPars
df00: 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20  e->isMultiWrite 
df10: 26 26 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62  && pParse->mayAb
df20: 6f 72 74 29 3b 0a 20 20 69 66 28 20 70 50 61 72  ort);.  if( pPar
df30: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20 6e  se->explain && n
df40: 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 6e 4d  Mem<10 ){.    nM
df50: 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 70  em = 10;.  }.  p
df60: 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 0a  ->expired = 0;..
df70: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20    /* Memory for 
df80: 72 65 67 69 73 74 65 72 73 2c 20 70 61 72 61 6d  registers, param
df90: 65 74 65 72 73 2c 20 63 75 72 73 6f 72 2c 20 65  eters, cursor, e
dfa0: 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  tc, is allocated
dfb0: 20 69 6e 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73   in two.  ** pas
dfc0: 73 65 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72  ses.  On the fir
dfd0: 73 74 20 70 61 73 73 2c 20 77 65 20 74 72 79 20  st pass, we try 
dfe0: 74 6f 20 72 65 75 73 65 20 75 6e 75 73 65 64 20  to reuse unused 
dff0: 73 70 61 63 65 20 61 74 20 74 68 65 20 0a 20 20  space at the .  
e000: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70  ** end of the op
e010: 63 6f 64 65 20 61 72 72 61 79 2e 20 20 49 66 20  code array.  If 
e020: 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
e030: 20 73 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d   satisfy all mem
e040: 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  ory.  ** require
e050: 6d 65 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67  ments by reusing
e060: 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61   the opcode arra
e070: 79 20 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65  y tail, then the
e080: 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73   second.  ** pas
e090: 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74  s will fill in t
e0a0: 68 65 20 72 65 73 74 20 75 73 69 6e 67 20 61 20  he rest using a 
e0b0: 66 72 65 73 68 20 61 6c 6c 6f 63 61 74 69 6f 6e  fresh allocation
e0c0: 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  .  .  **.  ** Th
e0d0: 69 73 20 74 77 6f 2d 70 61 73 73 20 61 70 70 72  is two-pass appr
e0e0: 6f 61 63 68 20 74 68 61 74 20 72 65 75 73 65 73  oach that reuses
e0f0: 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20   as much memory 
e100: 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d  as possible from
e110: 0a 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76  .  ** the leftov
e120: 65 72 20 73 70 61 63 65 20 61 74 20 74 68 65 20  er space at the 
e130: 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64  end of the opcod
e140: 65 20 61 72 72 61 79 20 63 61 6e 20 73 69 67 6e  e array can sign
e150: 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72  ificantly.  ** r
e160: 65 64 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74  educe the amount
e170: 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20   of memory held 
e180: 62 79 20 61 20 70 72 65 70 61 72 65 64 20 73 74  by a prepared st
e190: 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
e1a0: 64 6f 20 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d  do {.    nByte =
e1b0: 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 20   0;.    p->aMem 
e1c0: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
e1d0: 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f  aMem, nMem*sizeo
e1e0: 66 28 4d 65 6d 29 2c 20 7a 43 73 72 2c 20 26 6e  f(Mem), zCsr, &n
e1f0: 46 72 65 65 2c 20 26 6e 42 79 74 65 29 3b 0a 20  Free, &nByte);. 
e200: 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c     p->aVar = all
e210: 6f 63 53 70 61 63 65 28 70 2d 3e 61 56 61 72 2c  ocSpace(p->aVar,
e220: 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d   nVar*sizeof(Mem
e230: 29 2c 20 7a 43 73 72 2c 20 26 6e 46 72 65 65 2c  ), zCsr, &nFree,
e240: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d   &nByte);.    p-
e250: 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70  >apArg = allocSp
e260: 61 63 65 28 70 2d 3e 61 70 41 72 67 2c 20 6e 41  ace(p->apArg, nA
e270: 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c  rg*sizeof(Mem*),
e280: 20 7a 43 73 72 2c 20 26 6e 46 72 65 65 2c 20 26   zCsr, &nFree, &
e290: 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61  nByte);.    p->a
e2a0: 7a 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63  zVar = allocSpac
e2b0: 65 28 70 2d 3e 61 7a 56 61 72 2c 20 6e 56 61 72  e(p->azVar, nVar
e2c0: 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2c 20  *sizeof(char*), 
e2d0: 7a 43 73 72 2c 20 26 6e 46 72 65 65 2c 20 26 6e  zCsr, &nFree, &n
e2e0: 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70  Byte);.    p->ap
e2f0: 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Csr = allocSpace
e300: 28 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72 73  (p->apCsr, nCurs
e310: 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75  or*sizeof(VdbeCu
e320: 72 73 6f 72 2a 29 2c 0a 20 20 20 20 20 20 20 20  rsor*),.        
e330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e340: 20 20 7a 43 73 72 2c 20 26 6e 46 72 65 65 2c 20    zCsr, &nFree, 
e350: 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e  &nByte);.    p->
e360: 61 4f 6e 63 65 46 6c 61 67 20 3d 20 61 6c 6c 6f  aOnceFlag = allo
e370: 63 53 70 61 63 65 28 70 2d 3e 61 4f 6e 63 65 46  cSpace(p->aOnceF
e380: 6c 61 67 2c 20 6e 4f 6e 63 65 2c 20 7a 43 73 72  lag, nOnce, zCsr
e390: 2c 20 26 6e 46 72 65 65 2c 20 26 6e 42 79 74 65  , &nFree, &nByte
e3a0: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
e3b0: 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41  _ENABLE_STMT_SCA
e3c0: 4e 53 54 41 54 55 53 0a 20 20 20 20 70 2d 3e 61  NSTATUS.    p->a
e3d0: 6e 45 78 65 63 20 3d 20 61 6c 6c 6f 63 53 70 61  nExec = allocSpa
e3e0: 63 65 28 70 2d 3e 61 6e 45 78 65 63 2c 20 70 2d  ce(p->anExec, p-
e3f0: 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34 29  >nOp*sizeof(i64)
e400: 2c 20 7a 43 73 72 2c 20 26 6e 46 72 65 65 2c 20  , zCsr, &nFree, 
e410: 26 6e 42 79 74 65 29 3b 0a 23 65 6e 64 69 66 0a  &nByte);.#endif.
e420: 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 29 7b      if( nByte ){
e430: 0a 20 20 20 20 20 20 70 2d 3e 70 46 72 65 65 20  .      p->pFree 
e440: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
e450: 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29  cZero(db, nByte)
e460: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 73 72  ;.    }.    zCsr
e470: 20 3d 20 70 2d 3e 70 46 72 65 65 3b 0a 20 20 20   = p->pFree;.   
e480: 20 6e 46 72 65 65 20 3d 20 6e 42 79 74 65 3b 0a   nFree = nByte;.
e490: 20 20 7d 77 68 69 6c 65 28 20 6e 42 79 74 65 20    }while( nByte 
e4a0: 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  && !db->mallocFa
e4b0: 69 6c 65 64 20 29 3b 0a 0a 20 20 70 2d 3e 6e 43  iled );..  p->nC
e4c0: 75 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b  ursor = nCursor;
e4d0: 0a 20 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20  .  p->nOnceFlag 
e4e0: 3d 20 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20 70  = nOnce;.  if( p
e4f0: 2d 3e 61 56 61 72 20 29 7b 0a 20 20 20 20 70 2d  ->aVar ){.    p-
e500: 3e 6e 56 61 72 20 3d 20 28 79 6e 56 61 72 29 6e  >nVar = (ynVar)n
e510: 56 61 72 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30  Var;.    for(n=0
e520: 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a  ; n<nVar; n++){.
e530: 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d        p->aVar[n]
e540: 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  .flags = MEM_Nul
e550: 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72  l;.      p->aVar
e560: 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20  [n].db = db;.   
e570: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e   }.  }.  if( p->
e580: 61 7a 56 61 72 20 26 26 20 70 50 61 72 73 65 2d  azVar && pParse-
e590: 3e 6e 7a 56 61 72 3e 30 20 29 7b 0a 20 20 20 20  >nzVar>0 ){.    
e5a0: 70 2d 3e 6e 7a 56 61 72 20 3d 20 70 50 61 72 73  p->nzVar = pPars
e5b0: 65 2d 3e 6e 7a 56 61 72 3b 0a 20 20 20 20 6d 65  e->nzVar;.    me
e5c0: 6d 63 70 79 28 70 2d 3e 61 7a 56 61 72 2c 20 70  mcpy(p->azVar, p
e5d0: 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 70 2d  Parse->azVar, p-
e5e0: 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 2d  >nzVar*sizeof(p-
e5f0: 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 20  >azVar[0]));.   
e600: 20 6d 65 6d 73 65 74 28 70 50 61 72 73 65 2d 3e   memset(pParse->
e610: 61 7a 56 61 72 2c 20 30 2c 20 70 50 61 72 73 65  azVar, 0, pParse
e620: 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70  ->nzVar*sizeof(p
e630: 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 30 5d 29  Parse->azVar[0])
e640: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
e650: 61 4d 65 6d 20 29 7b 0a 20 20 20 20 70 2d 3e 61  aMem ){.    p->a
e660: 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20 20  Mem--;          
e670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
e680: 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20  Mem[] goes from 
e690: 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 70  1..nMem */.    p
e6a0: 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20  ->nMem = nMem;  
e6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e6c0: 2a 20 20 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d  *       not from
e6d0: 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20   0..nMem-1 */.  
e6e0: 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d    for(n=1; n<=nM
e6f0: 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  em; n++){.      
e700: 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73  p->aMem[n].flags
e710: 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64   = MEM_Undefined
e720: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b  ;.      p->aMem[
e730: 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  n].db = db;.    
e740: 7d 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70 6c 61  }.  }.  p->expla
e750: 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65 78 70  in = pParse->exp
e760: 6c 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56  lain;.  sqlite3V
e770: 64 62 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d 0a  dbeRewind(p);.}.
e780: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56  ./*.** Close a V
e790: 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20 72  DBE cursor and r
e7a0: 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72  elease all the r
e7b0: 65 73 6f 75 72 63 65 73 20 74 68 61 74 20 63 75  esources that cu
e7c0: 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73  rsor .** happens
e7d0: 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69   to hold..*/.voi
e7e0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65  d sqlite3VdbeFre
e7f0: 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c  eCursor(Vdbe *p,
e800: 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78   VdbeCursor *pCx
e810: 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20  ){.  if( pCx==0 
e820: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
e830: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 78   }.  assert( pCx
e840: 2d 3e 70 42 74 3d 3d 30 20 7c 7c 20 70 43 78 2d  ->pBt==0 || pCx-
e850: 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
e860: 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 73 77  PE_BTREE );.  sw
e870: 69 74 63 68 28 20 70 43 78 2d 3e 65 43 75 72 54  itch( pCx->eCurT
e880: 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
e890: 43 55 52 54 59 50 45 5f 53 4f 52 54 45 52 3a 20  CURTYPE_SORTER: 
e8a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
e8b0: 64 62 65 53 6f 72 74 65 72 43 6c 6f 73 65 28 70  dbeSorterClose(p
e8c0: 2d 3e 64 62 2c 20 70 43 78 29 3b 0a 20 20 20 20  ->db, pCx);.    
e8d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
e8e0: 20 20 20 63 61 73 65 20 43 55 52 54 59 50 45 5f     case CURTYPE_
e8f0: 42 54 52 45 45 3a 20 7b 0a 20 20 20 20 20 20 69  BTREE: {.      i
e900: 66 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20  f( pCx->pBt ){. 
e910: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
e920: 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42  reeClose(pCx->pB
e930: 74 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  t);.        /* T
e940: 68 65 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20  he pCx->pCursor 
e950: 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75  will be close au
e960: 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20  tomatically, if 
e970: 69 74 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20  it exists, by.  
e980: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c        ** the cal
e990: 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 20 20  l above. */.    
e9a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e9b0: 20 61 73 73 65 72 74 28 20 70 43 78 2d 3e 75 63   assert( pCx->uc
e9c0: 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20  .pCursor!=0 );. 
e9d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
e9e0: 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70  reeCloseCursor(p
e9f0: 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b  Cx->uc.pCursor);
ea00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
ea10: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
ea20: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ea30: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
ea40: 20 63 61 73 65 20 43 55 52 54 59 50 45 5f 56 54   case CURTYPE_VT
ea50: 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AB: {.      sqli
ea60: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
ea70: 2a 70 56 43 75 72 20 3d 20 70 43 78 2d 3e 75 63  *pVCur = pCx->uc
ea80: 2e 70 56 43 75 72 3b 0a 20 20 20 20 20 20 63 6f  .pVCur;.      co
ea90: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75  nst sqlite3_modu
eaa0: 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 56  le *pModule = pV
eab0: 43 75 72 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64  Cur->pVtab->pMod
eac0: 75 6c 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ule;.      asser
ead0: 74 28 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d  t( pVCur->pVtab-
eae0: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20  >nRef>0 );.     
eaf0: 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e   pVCur->pVtab->n
eb00: 52 65 66 2d 2d 3b 0a 20 20 20 20 20 20 70 4d 6f  Ref--;.      pMo
eb10: 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 43  dule->xClose(pVC
eb20: 75 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ur);.      break
eb30: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
eb40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
eb50: 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 69 6e  e all cursors in
eb60: 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 61   the current fra
eb70: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  me..*/.static vo
eb80: 69 64 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49  id closeCursorsI
eb90: 6e 46 72 61 6d 65 28 56 64 62 65 20 2a 70 29 7b  nFrame(Vdbe *p){
eba0: 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20  .  if( p->apCsr 
ebb0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
ebc0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
ebd0: 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20  nCursor; i++){. 
ebe0: 20 20 20 20 20 56 64 62 65 43 75 72 73 6f 72 20       VdbeCursor 
ebf0: 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69  *pC = p->apCsr[i
ec00: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 20  ];.      if( pC 
ec10: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
ec20: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
ec30: 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 20 20 20  (p, pC);.       
ec40: 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30   p->apCsr[i] = 0
ec50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ec60: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70    }.}../*.** Cop
ec70: 79 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f  y the values sto
ec80: 72 65 64 20 69 6e 20 74 68 65 20 56 64 62 65 46  red in the VdbeF
ec90: 72 61 6d 65 20 73 74 72 75 63 74 75 72 65 20 74  rame structure t
eca0: 6f 20 69 74 73 20 56 64 62 65 2e 20 54 68 69 73  o its Vdbe. This
ecb0: 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 66 6f 72  .** is used, for
ecc0: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61   example, when a
ecd0: 20 74 72 69 67 67 65 72 20 73 75 62 2d 70 72 6f   trigger sub-pro
ece0: 67 72 61 6d 20 69 73 20 68 61 6c 74 65 64 20 74  gram is halted t
ecf0: 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e  o restore.** con
ed00: 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e  trol to the main
ed10: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74   program..*/.int
ed20: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
ed30: 65 52 65 73 74 6f 72 65 28 56 64 62 65 46 72 61  eRestore(VdbeFra
ed40: 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56  me *pFrame){.  V
ed50: 64 62 65 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d  dbe *v = pFrame-
ed60: 3e 76 3b 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f  >v;.  closeCurso
ed70: 72 73 49 6e 46 72 61 6d 65 28 76 29 3b 0a 23 69  rsInFrame(v);.#i
ed80: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
ed90: 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54  LE_STMT_SCANSTAT
eda0: 55 53 0a 20 20 76 2d 3e 61 6e 45 78 65 63 20 3d  US.  v->anExec =
edb0: 20 70 46 72 61 6d 65 2d 3e 61 6e 45 78 65 63 3b   pFrame->anExec;
edc0: 0a 23 65 6e 64 69 66 0a 20 20 76 2d 3e 61 4f 6e  .#endif.  v->aOn
edd0: 63 65 46 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d  ceFlag = pFrame-
ede0: 3e 61 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d  >aOnceFlag;.  v-
edf0: 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 72  >nOnceFlag = pFr
ee00: 61 6d 65 2d 3e 6e 4f 6e 63 65 46 6c 61 67 3b 0a  ame->nOnceFlag;.
ee10: 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d    v->aOp = pFram
ee20: 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70  e->aOp;.  v->nOp
ee30: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a   = pFrame->nOp;.
ee40: 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61    v->aMem = pFra
ee50: 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e  me->aMem;.  v->n
ee60: 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d  Mem = pFrame->nM
ee70: 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d  em;.  v->apCsr =
ee80: 20 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a   pFrame->apCsr;.
ee90: 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70    v->nCursor = p
eea0: 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a  Frame->nCursor;.
eeb0: 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77    v->db->lastRow
eec0: 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73  id = pFrame->las
eed0: 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68  tRowid;.  v->nCh
eee0: 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  ange = pFrame->n
eef0: 43 68 61 6e 67 65 3b 0a 20 20 76 2d 3e 64 62 2d  Change;.  v->db-
ef00: 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d  >nChange = pFram
ef10: 65 2d 3e 6e 44 62 43 68 61 6e 67 65 3b 0a 20 20  e->nDbChange;.  
ef20: 72 65 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70  return pFrame->p
ef30: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  c;.}../*.** Clos
ef40: 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a  e all cursors..*
ef50: 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73  *.** Also releas
ef60: 65 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65  e any dynamic me
ef70: 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68 65  mory held by the
ef80: 20 56 4d 20 69 6e 20 74 68 65 20 56 64 62 65 2e   VM in the Vdbe.
ef90: 61 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20  aMem memory .** 
efa0: 63 65 6c 6c 20 61 72 72 61 79 2e 20 54 68 69 73  cell array. This
efb0: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 61 73   is necessary as
efc0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
efd0: 20 61 72 72 61 79 20 6d 61 79 20 63 6f 6e 74 61   array may conta
efe0: 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74  in.** pointers t
eff0: 6f 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65  o VdbeFrame obje
f000: 63 74 73 2c 20 77 68 69 63 68 20 6d 61 79 20 69  cts, which may i
f010: 6e 20 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70  n turn contain p
f020: 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70  ointers to.** op
f030: 65 6e 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73  en cursors..*/.s
f040: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65  tatic void close
f050: 41 6c 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20  AllCursors(Vdbe 
f060: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46  *p){.  if( p->pF
f070: 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65  rame ){.    Vdbe
f080: 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20  Frame *pFrame;. 
f090: 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d     for(pFrame=p-
f0a0: 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d  >pFrame; pFrame-
f0b0: 3e 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65  >pParent; pFrame
f0c0: 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74  =pFrame->pParent
f0d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
f0e0: 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70  beFrameRestore(p
f0f0: 46 72 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70  Frame);.    p->p
f100: 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 70  Frame = 0;.    p
f110: 2d 3e 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20  ->nFrame = 0;.  
f120: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  }.  assert( p->n
f130: 46 72 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 63 6c  Frame==0 );.  cl
f140: 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d  oseCursorsInFram
f150: 65 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  e(p);.  if( p->a
f160: 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65 61  Mem ){.    relea
f170: 73 65 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e 61  seMemArray(&p->a
f180: 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29  Mem[1], p->nMem)
f190: 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70  ;.  }.  while( p
f1a0: 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20  ->pDelFrame ){. 
f1b0: 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 44     VdbeFrame *pD
f1c0: 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d  el = p->pDelFram
f1d0: 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46 72  e;.    p->pDelFr
f1e0: 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72  ame = pDel->pPar
f1f0: 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ent;.    sqlite3
f200: 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28  VdbeFrameDelete(
f210: 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pDel);.  }..  /*
f220: 20 44 65 6c 65 74 65 20 61 6e 79 20 61 75 78 64   Delete any auxd
f230: 61 74 61 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  ata allocations 
f240: 6d 61 64 65 20 62 79 20 74 68 65 20 56 4d 20 2a  made by the VM *
f250: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 41 75 78 44  /.  if( p->pAuxD
f260: 61 74 61 20 29 20 73 71 6c 69 74 65 33 56 64 62  ata ) sqlite3Vdb
f270: 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 70  eDeleteAuxData(p
f280: 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 61 73 73 65  , -1, 0);.  asse
f290: 72 74 28 20 70 2d 3e 70 41 75 78 44 61 74 61 3d  rt( p->pAuxData=
f2a0: 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  =0 );.}../*.** C
f2b0: 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20 61  lean up the VM a
f2c0: 66 74 65 72 20 61 20 73 69 6e 67 6c 65 20 72 75  fter a single ru
f2d0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
f2e0: 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a  d Cleanup(Vdbe *
f2f0: 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
f300: 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66 64  b = p->db;..#ifd
f310: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
f320: 20 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73    /* Execute ass
f330: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
f340: 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
f350: 74 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d  the Vdbe.apCsr[]
f360: 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e   and .  ** Vdbe.
f370: 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61  aMem[] arrays ha
f380: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
f390: 63 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a  cleaned up.  */.
f3a0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
f3b0: 2d 3e 61 70 43 73 72 20 29 20 66 6f 72 28 69 3d  ->apCsr ) for(i=
f3c0: 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b  0; i<p->nCursor;
f3d0: 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d   i++) assert( p-
f3e0: 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a  >apCsr[i]==0 );.
f3f0: 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b    if( p->aMem ){
f400: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
f410: 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61  =p->nMem; i++) a
f420: 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69  ssert( p->aMem[i
f430: 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 55 6e 64  ].flags==MEM_Und
f440: 65 66 69 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65  efined );.  }.#e
f450: 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 44  ndif..  sqlite3D
f460: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
f470: 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72  rMsg);.  p->zErr
f480: 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52  Msg = 0;.  p->pR
f490: 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a  esultSet = 0;.}.
f4a0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e  ./*.** Set the n
f4b0: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
f4c0: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c  columns that wil
f4d0: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  l be returned by
f4e0: 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61   this SQL.** sta
f4f0: 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20  tement. This is 
f500: 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69  now set at compi
f510: 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20  le time, rather 
f520: 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65  than during.** e
f530: 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20  xecution of the 
f540: 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20  vdbe program so 
f550: 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c  that sqlite3_col
f560: 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a  umn_count() can.
f570: 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  ** be called on 
f580: 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
f590: 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f   before sqlite3_
f5a0: 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  step()..*/.void 
f5b0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
f5c0: 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69  mCols(Vdbe *p, i
f5d0: 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a  nt nResColumn){.
f5e0: 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b    Mem *pColName;
f5f0: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
f600: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
f610: 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ..  releaseMemAr
f620: 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
f630: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43   p->nResColumn*C
f640: 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c  OLNAME_N);.  sql
f650: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
f660: 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e  ->aColName);.  n
f670: 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f   = nResColumn*CO
f680: 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52  LNAME_N;.  p->nR
f690: 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29  esColumn = (u16)
f6a0: 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d  nResColumn;.  p-
f6b0: 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c  >aColName = pCol
f6c0: 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c  Name = (Mem*)sql
f6d0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
f6e0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29  (db, sizeof(Mem)
f6f0: 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  *n );.  if( p->a
f700: 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ColName==0 ) ret
f710: 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d  urn;.  while( n-
f720: 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 70 43 6f  - > 0 ){.    pCo
f730: 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d  lName->flags = M
f740: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f  EM_Null;.    pCo
f750: 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64  lName->db = p->d
f760: 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b  b;.    pColName+
f770: 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  +;.  }.}../*.** 
f780: 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  Set the name of 
f790: 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d  the idx'th colum
f7a0: 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  n to be returned
f7b0: 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 61 74   by the SQL stat
f7c0: 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20  ement..** zName 
f7d0: 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65  must be a pointe
f7e0: 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69  r to a nul termi
f7f0: 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a  nated string..**
f800: 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75  .** This call mu
f810: 73 74 20 62 65 20 6d 61 64 65 20 61 66 74 65 72  st be made after
f820: 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
f830: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
f840: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ()..**.** The fi
f850: 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c 20 78  nal parameter, x
f860: 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65  Del, must be one
f870: 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d   of SQLITE_DYNAM
f880: 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  IC, SQLITE_STATI
f890: 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54  C.** or SQLITE_T
f8a0: 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69 74 20  RANSIENT. If it 
f8b0: 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  is SQLITE_DYNAMI
f8c0: 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75 66 66  C, then the buff
f8d0: 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f  er pointed.** to
f8e0: 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62   by zName will b
f8f0: 65 20 66 72 65 65 64 20 62 79 20 73 71 6c 69 74  e freed by sqlit
f900: 65 33 44 62 46 72 65 65 28 29 20 77 68 65 6e 20  e3DbFree() when 
f910: 74 68 65 20 76 64 62 65 20 69 73 20 64 65 73 74  the vdbe is dest
f920: 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  royed..*/.int sq
f930: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
f940: 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  ame(.  Vdbe *p, 
f950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f960: 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20          /* Vdbe 
f970: 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72 65 64  being configured
f980: 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20   */.  int idx,  
f990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9a0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
f9b0: 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20  of column zName 
f9c0: 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20  applies to */.  
f9d0: 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20 20 20  int var,        
f9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9f0: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 43   /* One of the C
fa00: 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e  OLNAME_* constan
fa10: 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ts */.  const ch
fa20: 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20  ar *zName,      
fa30: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
fa40: 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f  ter to buffer co
fa50: 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f  ntaining name */
fa60: 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28  .  void (*xDel)(
fa70: 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20 20 20  void*)          
fa80: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61      /* Memory ma
fa90: 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74 65 67  nagement strateg
faa0: 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29  y for zName */.)
fab0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
fac0: 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61  m *pColName;.  a
fad0: 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52  ssert( idx<p->nR
fae0: 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73  esColumn );.  as
faf0: 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d  sert( var<COLNAM
fb00: 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  E_N );.  if( p->
fb10: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
fb20: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
fb30: 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d  !zName || xDel!=
fb40: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20 29  SQLITE_DYNAMIC )
fb50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
fb60: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
fb70: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c   assert( p->aCol
fb80: 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f  Name!=0 );.  pCo
fb90: 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f  lName = &(p->aCo
fba0: 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d  lName[idx+var*p-
fbb0: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20  >nResColumn]);. 
fbc0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
fbd0: 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e  eMemSetStr(pColN
fbe0: 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20  ame, zName, -1, 
fbf0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78 44 65  SQLITE_UTF8, xDe
fc00: 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  l);.  assert( rc
fc10: 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c  !=0 || !zName ||
fc20: 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67   (pColName->flag
fc30: 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29  s&MEM_Term)!=0 )
fc40: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
fc50: 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f  ../*.** A read o
fc60: 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
fc70: 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ion may or may n
fc80: 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20  ot be active on 
fc90: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a  database handle.
fca0: 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61 6e  ** db. If a tran
fcb0: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
fcc0: 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66  e, commit it. If
fcd0: 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20 77   there is a.** w
fce0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
fcf0: 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74   spanning more t
fd00: 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65  han one database
fd10: 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75 74   file, this rout
fd20: 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72  ine.** takes car
fd30: 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  e of the master 
fd40: 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72 79  journal trickery
fd50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
fd60: 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74  vdbeCommit(sqlit
fd70: 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29  e3 *db, Vdbe *p)
fd80: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
fd90: 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a   nTrans = 0;  /*
fda0: 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62   Number of datab
fdb0: 61 73 65 73 20 77 69 74 68 20 61 6e 20 61 63 74  ases with an act
fdc0: 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ive write-transa
fdd0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ction */.  int r
fde0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
fdf0: 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74   int needXcommit
fe00: 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51   = 0;..#ifdef SQ
fe10: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
fe20: 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68  LTABLE.  /* With
fe30: 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71   this option, sq
fe40: 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 29 20  lite3VtabSync() 
fe50: 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65  is defined to be
fe60: 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51   simply .  ** SQ
fe70: 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20  LITE_OK so p is 
fe80: 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a  not used. .  */.
fe90: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
fea0: 45 52 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ER(p);.#endif.. 
feb0: 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67   /* Before doing
fec0: 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20   anything else, 
fed0: 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29  call the xSync()
fee0: 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e   callback for an
fef0: 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d  y.  ** virtual m
ff00: 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69  odule tables wri
ff10: 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61  tten in this tra
ff20: 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68  nsaction. This h
ff30: 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f  as to.  ** be do
ff40: 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d  ne before determ
ff50: 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61 20  ining whether a 
ff60: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
ff70: 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71  ile is .  ** req
ff80: 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79  uired, as an xSy
ff90: 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61  nc() callback ma
ffa0: 79 20 61 64 64 20 61 6e 20 61 74 74 61 63 68 65  y add an attache
ffb0: 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  d database.  ** 
ffc0: 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  to the transacti
ffd0: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  on..  */.  rc = 
ffe0: 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28  sqlite3VtabSync(
fff0: 64 62 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 54 68  db, p);..  /* Th
10000 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e  is loop determin
10010 65 73 20 28 61 29 20 69 66 20 74 68 65 20 63 6f  es (a) if the co
10020 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64  mmit hook should
10030 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a   be invoked and.
10040 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e    ** (b) how man
10050 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  y database files
10060 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65   have open write
10070 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e   transactions, n
10080 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69  ot .  ** includi
10090 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  ng the temp data
100a0 62 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70  base. (b) is imp
100b0 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65 20 69  ortant because i
100c0 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a  f more than .  *
100d0 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  * one database f
100e0 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  ile has an open 
100f0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
10100 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  n, a master jour
10110 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73  nal.  ** file is
10120 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e   required for an
10130 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a   atomic commit..
10140 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b    */ .  for(i=0;
10150 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
10160 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
10170 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70  ){ .    Btree *p
10180 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
10190 70 42 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  pBt;.    if( sql
101a0 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
101b0 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
101c0 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31   needXcommit = 1
101d0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d 31  ;.      if( i!=1
101e0 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20   ) nTrans++;.   
101f0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
10200 6e 74 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20  nter(pBt);.     
10210 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
10220 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28  erExclusiveLock(
10230 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
10240 72 28 70 42 74 29 29 3b 0a 20 20 20 20 20 20 73  r(pBt));.      s
10250 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
10260 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pBt);.    }.  }
10270 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
10280 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
10290 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
102a0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   If there are an
102b0 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  y write-transact
102c0 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76  ions at all, inv
102d0 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68  oke the commit h
102e0 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65  ook */.  if( nee
102f0 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e  dXcommit && db->
10300 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20  xCommitCallback 
10310 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e  ){.    rc = db->
10320 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28  xCommitCallback(
10330 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b  db->pCommitArg);
10340 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
10350 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10360 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f  TE_CONSTRAINT_CO
10370 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a  MMITHOOK;.    }.
10380 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69    }..  /* The si
10390 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d  mple case - no m
103a0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74  ore than one dat
103b0 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20  abase file (not 
103c0 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a  counting the.  *
103d0 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 29  * TEMP database)
103e0 20 68 61 73 20 61 20 74 72 61 6e 73 61 63 74 69   has a transacti
103f0 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68 65  on active.   The
10400 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f  re is no need fo
10410 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65  r the.  ** maste
10420 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a  r-journal..  **.
10430 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75    ** If the retu
10440 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69  rn value of sqli
10450 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
10460 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20  ame() is a zero 
10470 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69  length.  ** stri
10480 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  ng, it means the
10490 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69   main database i
104a0 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20  s :memory: or a 
104b0 74 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a  temp file.  In .
104c0 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77    ** that case w
104d0 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  e do not support
104e0 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69   atomic multi-fi
104f0 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75  le commits, so u
10500 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d  se the .  ** sim
10510 70 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f  ple case then to
10520 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d  o..  */.  if( 0=
10530 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  =sqlite3Strlen30
10540 28 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74  (sqlite3BtreeGet
10550 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62  Filename(db->aDb
10560 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20  [0].pBt)).   || 
10570 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20  nTrans<=1.  ){. 
10580 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
10590 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
105a0 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
105b0 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
105c0 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
105d0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
105e0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
105f0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
10600 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30  tPhaseOne(pBt, 0
10610 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
10620 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20  ..    /* Do the 
10630 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61  commit only if a
10640 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73 75 63  ll databases suc
10650 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65  cessfully comple
10660 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20  te phase 1. .   
10670 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68   ** If one of th
10680 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e BtreeCommitPha
10690 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61  seOne() calls fa
106a0 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61  ils, this indica
106b0 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f  tes an.    ** IO
106c0 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c   error while del
106d0 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74  eting or truncat
106e0 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ing a journal fi
106f0 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65  le. It is unlike
10700 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63  ly,.    ** but c
10710 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20  ould happen. In 
10720 74 68 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f  this case abando
10730 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64  n processing and
10740 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
10750 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  r..    */.    fo
10760 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
10770 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
10780 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
10790 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
107a0 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
107b0 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
107c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
107d0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
107e0 65 54 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20  eTwo(pBt, 0);.  
107f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
10800 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
10810 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
10820 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29  e3VtabCommit(db)
10830 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
10840 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61  * The complex ca
10850 73 65 20 2d 20 54 68 65 72 65 20 69 73 20 61 20  se - There is a 
10860 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65  multi-file write
10870 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74  -transaction act
10880 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72  ive..  ** This r
10890 65 71 75 69 72 65 73 20 61 20 6d 61 73 74 65 72  equires a master
108a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
108b0 20 65 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e   ensure the tran
108c0 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  saction is.  ** 
108d0 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63  committed atomic
108e0 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  ally..  */.#ifnd
108f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
10900 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20  ISKIO.  else{.  
10910 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
10920 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a  Vfs = db->pVfs;.
10930 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63      int needSync
10940 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a   = 0;.    char *
10950 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f  zMaster = 0;   /
10960 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20  * File-name for 
10970 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
10980 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63  al */.    char c
10990 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20  onst *zMainFile 
109a0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
109b0 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44  tFilename(db->aD
109c0 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73  b[0].pBt);.    s
109d0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61  qlite3_file *pMa
109e0 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36  ster = 0;.    i6
109f0 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  4 offset = 0;.  
10a00 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 69    int res;.    i
10a10 6e 74 20 72 65 74 72 79 43 6f 75 6e 74 20 3d 20  nt retryCount = 
10a20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61 69 6e  0;.    int nMain
10a30 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  File;..    /* Se
10a40 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f  lect a master jo
10a50 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
10a60 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e 46 69 6c 65  */.    nMainFile
10a70 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
10a80 33 30 28 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20  30(zMainFile);. 
10a90 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c     zMaster = sql
10aa0 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
10ab0 22 25 73 2d 6d 6a 58 58 58 58 58 58 39 58 58 7a  "%s-mjXXXXXX9XXz
10ac0 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20  ", zMainFile);. 
10ad0 20 20 20 69 66 28 20 7a 4d 61 73 74 65 72 3d 3d     if( zMaster==
10ae0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
10af0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 64 6f 20  E_NOMEM;.    do 
10b00 7b 0a 20 20 20 20 20 20 75 33 32 20 69 52 61 6e  {.      u32 iRan
10b10 64 6f 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 72  dom;.      if( r
10b20 65 74 72 79 43 6f 75 6e 74 20 29 7b 0a 20 20 20  etryCount ){.   
10b30 20 20 20 20 20 69 66 28 20 72 65 74 72 79 43 6f       if( retryCo
10b40 75 6e 74 3e 31 30 30 20 29 7b 0a 20 20 20 20 20  unt>100 ){.     
10b50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
10b60 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d  (SQLITE_FULL, "M
10b70 4a 20 64 65 6c 65 74 65 3a 20 25 73 22 2c 20 7a  J delete: %s", z
10b80 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
10b90 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
10ba0 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
10bb0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
10bc0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
10bd0 65 6c 73 65 20 69 66 28 20 72 65 74 72 79 43 6f  else if( retryCo
10be0 75 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  unt==1 ){.      
10bf0 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
10c00 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a  SQLITE_FULL, "MJ
10c10 20 63 6f 6c 6c 69 64 65 3a 20 25 73 22 2c 20 7a   collide: %s", z
10c20 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
10c30 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
10c40 20 72 65 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20   retryCount++;. 
10c50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e       sqlite3_ran
10c60 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69  domness(sizeof(i
10c70 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f  Random), &iRando
10c80 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
10c90 33 5f 73 6e 70 72 69 6e 74 66 28 31 33 2c 20 26  3_snprintf(13, &
10ca0 7a 4d 61 73 74 65 72 5b 6e 4d 61 69 6e 46 69 6c  zMaster[nMainFil
10cb0 65 5d 2c 20 22 2d 6d 6a 25 30 36 58 39 25 30 32  e], "-mj%06X9%02
10cc0 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  X",.            
10cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ce0 20 20 20 28 69 52 61 6e 64 6f 6d 3e 3e 38 29 26     (iRandom>>8)&
10cf0 30 78 66 66 66 66 66 66 2c 20 69 52 61 6e 64 6f  0xffffff, iRando
10d00 6d 26 30 78 66 66 29 3b 0a 20 20 20 20 20 20 2f  m&0xff);.      /
10d10 2a 20 54 68 65 20 61 6e 74 69 70 65 6e 75 6c 74  * The antipenult
10d20 69 6d 61 74 65 20 63 68 61 72 61 63 74 65 72 20  imate character 
10d30 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
10d40 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 0a  urnal name must.
10d50 20 20 20 20 20 20 2a 2a 20 62 65 20 22 39 22 20        ** be "9" 
10d60 74 6f 20 61 76 6f 69 64 20 6e 61 6d 65 20 63 6f  to avoid name co
10d70 6c 6c 69 73 69 6f 6e 73 20 77 68 65 6e 20 75 73  llisions when us
10d80 69 6e 67 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65  ing 8+3 filename
10d90 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  s. */.      asse
10da0 72 74 28 20 7a 4d 61 73 74 65 72 5b 73 71 6c 69  rt( zMaster[sqli
10db0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 73  te3Strlen30(zMas
10dc0 74 65 72 29 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a  ter)-3]=='9' );.
10dd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c        sqlite3Fil
10de0 65 53 75 66 66 69 78 33 28 7a 4d 61 69 6e 46 69  eSuffix3(zMainFi
10df0 6c 65 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  le, zMaster);.  
10e00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10e10 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
10e20 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41  Master, SQLITE_A
10e30 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72  CCESS_EXISTS, &r
10e40 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  es);.    }while(
10e50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
10e60 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69 66 28  & res );.    if(
10e70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
10e80 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20  {.      /* Open 
10e90 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
10ea0 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  al. */.      rc 
10eb0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d  = sqlite3OsOpenM
10ec0 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73  alloc(pVfs, zMas
10ed0 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a  ter, &pMaster, .
10ee0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
10ef0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
10f00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
10f10 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  TE|.          SQ
10f20 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
10f30 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  IVE|SQLITE_OPEN_
10f40 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20  MASTER_JOURNAL, 
10f50 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  0.      );.    }
10f60 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
10f70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10f80 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
10f90 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
10fa0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
10fb0 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74   }. .    /* Writ
10fc0 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61  e the name of ea
10fd0 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ch database file
10fe0 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74   in the transact
10ff0 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77  ion into the new
11000 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a  .    ** master j
11010 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
11020 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
11030 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c  at this point cl
11040 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64  ose.    ** and d
11050 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
11060 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
11070 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  ll the individua
11080 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a  l journal files.
11090 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76      ** still hav
110a0 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20  e 'null' as the 
110b0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
110c0 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20  ointer, so they 
110d0 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a  will roll.    **
110e0 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
110f0 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72 65  tly if a failure
11100 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a   occurs..    */.
11110 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
11120 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
11130 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
11140 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
11150 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
11160 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
11170 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
11180 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69   char const *zFi
11190 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  le = sqlite3Btre
111a0 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  eGetJournalname(
111b0 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pBt);.        if
111c0 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  ( zFile==0 ){.  
111d0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
111e0 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d  ;  /* Ignore TEM
111f0 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64  P and :memory: d
11200 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20  atabases */.    
11210 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
11220 73 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d  sert( zFile[0]!=
11230 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
11240 20 21 6e 65 65 64 53 79 6e 63 20 26 26 20 21 73   !needSync && !s
11250 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44  qlite3BtreeSyncD
11260 69 73 61 62 6c 65 64 28 70 42 74 29 20 29 7b 0a  isabled(pBt) ){.
11270 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79            needSy
11280 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
11290 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  }.        rc = s
112a0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d  qlite3OsWrite(pM
112b0 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71  aster, zFile, sq
112c0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
112d0 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b  ile)+1, offset);
112e0 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
112f0 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
11300 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20  30(zFile)+1;.   
11310 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
11320 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11330 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
11340 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
11350 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
11360 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
11370 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
11380 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
11390 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
113a0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  r);.          re
113b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
113c0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
113d0 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68  ..    /* Sync th
113e0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
113f0 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f   file. If the IO
11400 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64  CAP_SEQUENTIAL d
11410 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61  evice.    ** fla
11420 67 20 69 73 20 73 65 74 20 74 68 69 73 20 69 73  g is set this is
11430 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20   not required.. 
11440 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65     */.    if( ne
11450 65 64 53 79 6e 63 20 0a 20 20 20 20 20 26 26 20  edSync .     && 
11460 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76  0==(sqlite3OsDev
11470 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
11480 63 73 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49  cs(pMaster)&SQLI
11490 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
114a0 49 41 4c 29 0a 20 20 20 20 20 26 26 20 53 51 4c  IAL).     && SQL
114b0 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
114c0 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73  lite3OsSync(pMas
114d0 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  ter, SQLITE_SYNC
114e0 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b  _NORMAL)).    ){
114f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
11500 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
11510 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
11520 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
11530 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
11540 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
11550 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
11560 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
11570 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79      }..    /* Sy
11580 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69  nc all the db fi
11590 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20  les involved in 
115a0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
115b0 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20   The same call. 
115c0 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d     ** sets the m
115d0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
115e0 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e  inter in each in
115f0 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
11600 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65  . If.    ** an e
11610 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65  rror occurs here
11620 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  , do not delete 
11630 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
11640 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  al file..    **.
11650 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72      ** If the er
11660 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
11670 67 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  g the first call
11680 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
11690 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
116a0 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68  seOne(), then th
116b0 65 72 65 20 69 73 20 61 20 63 68 61 6e 63 65 20  ere is a chance 
116c0 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  that the.    ** 
116d0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
116e0 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68  ile will be orph
116f0 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e  aned. But we can
11700 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20  not delete it,. 
11710 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68     ** in case th
11720 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11730 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77   file name was w
11740 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
11750 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
11760 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 66  ile before the f
11770 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e  ailure occurred.
11780 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
11790 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
117a0 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
117b0 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74   i++){ .      Bt
117c0 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
117d0 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
117e0 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
117f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11800 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
11810 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72  One(pBt, zMaster
11820 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
11830 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
11840 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
11850 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
11860 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b  !=SQLITE_BUSY );
11870 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
11880 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11890 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
118a0 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
118b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
118c0 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74   }..    /* Delet
118d0 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
118e0 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
118f0 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e  commits the tran
11900 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20  saction. After. 
11910 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73     ** doing this
11920 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 69   the directory i
11930 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62  s synced again b
11940 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69  efore any indivi
11950 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e  dual.    ** tran
11960 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72  saction files ar
11970 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  e deleted..    *
11980 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
11990 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
119a0 20 7a 4d 61 73 74 65 72 2c 20 6e 65 65 64 53 79   zMaster, needSy
119b0 6e 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nc);.    sqlite3
119c0 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
119d0 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72  er);.    zMaster
119e0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63   = 0;.    if( rc
119f0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
11a00 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
11a10 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64  /* All files and
11a20 20 64 69 72 65 63 74 6f 72 69 65 73 20 68 61 76   directories hav
11a30 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  e already been s
11a40 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f  ynced, so the fo
11a50 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63  llowing.    ** c
11a60 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42  alls to sqlite3B
11a70 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
11a80 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c  wo() are only cl
11a90 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a  osing files and.
11aa0 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20      ** deleting 
11ab0 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f  or truncating jo
11ac0 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74  urnals. If somet
11ad0 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20  hing goes wrong 
11ae0 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69  while.    ** thi
11af0 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77  s is happening w
11b00 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63  e don't really c
11b10 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69  are. The integri
11b20 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ty of the.    **
11b30 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
11b40 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74 65  already guarante
11b50 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72  ed, but some str
11b60 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61  ay 'cold' journa
11b70 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65  ls.    ** may be
11b80 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52   lying around. R
11b90 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f  eturning an erro
11ba0 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c  r code won't hel
11bb0 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a  p matters..    *
11bc0 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69  /.    disable_si
11bd0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
11be0 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  s();.    sqlite3
11bf0 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
11c00 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  c();.    for(i=0
11c10 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
11c20 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20  ){ .      Btree 
11c30 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
11c40 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
11c50 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
11c60 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
11c70 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20  itPhaseTwo(pBt, 
11c80 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
11c90 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  }.    sqlite3End
11ca0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
11cb0 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c      enable_simul
11cc0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
11cd0 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74  ;..    sqlite3Vt
11ce0 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20  abCommit(db);.  
11cf0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
11d00 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  rn rc;.}../* .**
11d10 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
11d20 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 73 71  ecks that the sq
11d30 6c 69 74 65 33 2e 6e 56 64 62 65 41 63 74 69 76  lite3.nVdbeActiv
11d40 65 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65  e count variable
11d50 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20  .** matches the 
11d60 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73  number of vdbe's
11d70 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c   in the list sql
11d80 69 74 65 33 2e 70 56 64 62 65 20 74 68 61 74 20  ite3.pVdbe that 
11d90 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  are.** currently
11da0 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65   active. An asse
11db0 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74  rtion fails if t
11dc0 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f  he two counts do
11dd0 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54   not match..** T
11de0 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e  his is an intern
11df0 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e  al self-check on
11e00 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61  ly - it is not a
11e10 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63  n essential proc
11e20 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a  essing.** step..
11e30 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  **.** This is a 
11e40 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20  no-op if NDEBUG 
11e50 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23  is defined..*/.#
11e60 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74  ifndef NDEBUG.st
11e70 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41  atic void checkA
11e80 63 74 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c  ctiveVdbeCnt(sql
11e90 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62  ite3 *db){.  Vdb
11ea0 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20  e *p;.  int cnt 
11eb0 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74  = 0;.  int nWrit
11ec0 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52 65  e = 0;.  int nRe
11ed0 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62  ad = 0;.  p = db
11ee0 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65  ->pVdbe;.  while
11ef0 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73  ( p ){.    if( s
11f00 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73 79  qlite3_stmt_busy
11f10 28 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29  ((sqlite3_stmt*)
11f20 70 29 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b  p) ){.      cnt+
11f30 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  +;.      if( p->
11f40 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57  readOnly==0 ) nW
11f50 72 69 74 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66  rite++;.      if
11f60 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29  ( p->bIsReader )
11f70 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 20 7d 0a   nRead++;.    }.
11f80 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
11f90 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
11fa0 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62 65 41 63  cnt==db->nVdbeAc
11fb0 74 69 76 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tive );.  assert
11fc0 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 6e 56  ( nWrite==db->nV
11fd0 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20 61 73  dbeWrite );.  as
11fe0 73 65 72 74 28 20 6e 52 65 61 64 3d 3d 64 62 2d  sert( nRead==db-
11ff0 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 7d 0a  >nVdbeRead );.}.
12000 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68  #else.#define ch
12010 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
12020 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
12030 2a 20 49 66 20 74 68 65 20 56 64 62 65 20 70 61  * If the Vdbe pa
12040 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
12050 74 20 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65  t argument opene
12060 64 20 61 20 73 74 61 74 65 6d 65 6e 74 2d 74 72  d a statement-tr
12070 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c  ansaction,.** cl
12080 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41 72 67 75  ose it now. Argu
12090 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74 20 62 65  ment eOp must be
120a0 20 65 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e   either SAVEPOIN
120b0 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a  T_ROLLBACK or.**
120c0 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
120d0 53 45 2e 20 49 66 20 69 74 20 69 73 20 53 41 56  SE. If it is SAV
120e0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
120f0 20 74 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d   then the statem
12100 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ent.** transacti
12110 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
12120 6b 2e 20 49 66 20 65 4f 70 20 69 73 20 53 41 56  k. If eOp is SAV
12130 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20  EPOINT_RELEASE, 
12140 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61  then the .** sta
12150 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
12160 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  on is committed.
12170 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20  .**.** If an IO 
12180 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
12190 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58   SQLITE_IOERR_XX
121a0 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  X error code is 
121b0 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74  returned. .** Ot
121c0 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f  herwise SQLITE_O
121d0 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
121e0 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
121f0 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ent(Vdbe *p, int
12200 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65 33   eOp){.  sqlite3
12210 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e   *const db = p->
12220 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  db;.  int rc = S
12230 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
12240 49 66 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  If p->iStatement
12250 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
12260 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73   zero, then this
12270 20 56 64 62 65 20 6f 70 65 6e 65 64 20 61 20 0a   Vdbe opened a .
12280 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74    ** statement t
12290 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
122a0 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64  should be closed
122b0 20 68 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79 20   here. The only 
122c0 65 78 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20 69  exception.  ** i
122d0 73 20 74 68 61 74 20 61 6e 20 49 4f 20 65 72 72  s that an IO err
122e0 6f 72 20 6d 61 79 20 68 61 76 65 20 6f 63 63 75  or may have occu
122f0 72 72 65 64 2c 20 63 61 75 73 69 6e 67 20 61 6e  rred, causing an
12300 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62   emergency rollb
12310 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69  ack..  ** In thi
12320 73 20 63 61 73 65 20 28 64 62 2d 3e 6e 53 74 61  s case (db->nSta
12330 74 65 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e 64 20  tement==0), and 
12340 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67  there is nothing
12350 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69   to do..  */.  i
12360 66 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  f( db->nStatemen
12370 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65 6d 65  t && p->iStateme
12380 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  nt ){.    int i;
12390 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  .    const int i
123a0 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69  Savepoint = p->i
123b0 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20  Statement-1;..  
123c0 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53    assert( eOp==S
123d0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
123e0 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f  K || eOp==SAVEPO
123f0 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20  INT_RELEASE);.  
12400 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53    assert( db->nS
12410 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20  tatement>0 );.  
12420 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74    assert( p->iSt
12430 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53  atement==(db->nS
12440 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61  tatement+db->nSa
12450 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 20  vepoint) );..   
12460 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
12470 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
12480 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49    int rc2 = SQLI
12490 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74 72  TE_OK;.      Btr
124a0 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
124b0 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
124c0 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
124d0 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45     if( eOp==SAVE
124e0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
124f0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 32 20  {.          rc2 
12500 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  = sqlite3BtreeSa
12510 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56  vepoint(pBt, SAV
12520 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
12530 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
12540 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12550 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f  if( rc2==SQLITE_
12560 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
12570 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72  rc2 = sqlite3Btr
12580 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c  eeSavepoint(pBt,
12590 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
125a0 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  SE, iSavepoint);
125b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
125c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
125d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
125e0 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
125f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
12600 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74 61    }.    db->nSta
12610 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d  tement--;.    p-
12620 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >iStatement = 0;
12630 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
12640 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12650 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f   if( eOp==SAVEPO
12660 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
12670 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
12680 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e  ite3VtabSavepoin
12690 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f  t(db, SAVEPOINT_
126a0 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70  ROLLBACK, iSavep
126b0 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  oint);.      }. 
126c0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
126d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
126e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
126f0 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20  abSavepoint(db, 
12700 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
12710 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  E, iSavepoint);.
12720 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
12730 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61     /* If the sta
12740 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
12750 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  on is being roll
12760 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65  ed back, also re
12770 73 74 6f 72 65 20 74 68 65 20 0a 20 20 20 20 2a  store the .    *
12780 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
12790 65 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73  es deferred cons
127a0 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74  traint counter t
127b0 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 68  o the value it h
127c0 61 64 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a 20  ad when .    ** 
127d0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
127e0 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70  ansaction was op
127f0 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ened.  */.    if
12800 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  ( eOp==SAVEPOINT
12810 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
12820 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
12830 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44  Cons = p->nStmtD
12840 65 66 43 6f 6e 73 3b 0a 20 20 20 20 20 20 64 62  efCons;.      db
12850 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f  ->nDeferredImmCo
12860 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66  ns = p->nStmtDef
12870 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20  ImmCons;.    }. 
12880 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
12890 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
128a0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
128b0 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
128c0 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68  ion opened by th
128d0 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 68  e database .** h
128e0 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64  andle associated
128f0 20 77 69 74 68 20 74 68 65 20 56 4d 20 70 61 73   with the VM pas
12900 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
12910 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62  nt is about to b
12920 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e  e .** committed.
12930 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
12940 74 73 74 61 6e 64 69 6e 67 20 64 65 66 65 72 72  tstanding deferr
12950 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  ed foreign key c
12960 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f  onstraint.** vio
12970 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20  lations, return 
12980 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74  SQLITE_ERROR. Ot
12990 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
129a0 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  OK..**.** If the
129b0 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
129c0 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73  ng FK violations
129d0 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69   and this functi
129e0 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  on returns .** S
129f0 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73 65 74  QLITE_ERROR, set
12a00 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
12a10 68 65 20 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f  he VM to SQLITE_
12a20 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49  CONSTRAINT_FOREI
12a30 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72 69  GNKEY.** and wri
12a40 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  te an error mess
12a50 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65 6e 20  age to it. Then 
12a60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
12a70 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ROR..*/.#ifndef 
12a80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
12a90 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69  IGN_KEY.int sqli
12aa0 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 56  te3VdbeCheckFk(V
12ab0 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65 66 65  dbe *p, int defe
12ac0 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  rred){.  sqlite3
12ad0 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
12ae0 69 66 28 20 28 64 65 66 65 72 72 65 64 20 26 26  if( (deferred &&
12af0 20 28 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43   (db->nDeferredC
12b00 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72 65  ons+db->nDeferre
12b10 64 49 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20 20  dImmCons)>0) .  
12b20 20 7c 7c 20 28 21 64 65 66 65 72 72 65 64 20 26   || (!deferred &
12b30 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69  & p->nFkConstrai
12b40 6e 74 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20  nt>0) .  ){.    
12b50 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43  p->rc = SQLITE_C
12b60 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47  ONSTRAINT_FOREIG
12b70 4e 4b 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72 72  NKEY;.    p->err
12b80 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62  orAction = OE_Ab
12b90 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ort;.    sqlite3
12ba0 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22 46 4f  VdbeError(p, "FO
12bb0 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72  REIGN KEY constr
12bc0 61 69 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a 20  aint failed");. 
12bd0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12be0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
12bf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12c00 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
12c10 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
12c20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20  called the when 
12c30 61 20 56 44 42 45 20 74 72 69 65 73 20 74 6f 20  a VDBE tries to 
12c40 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44  halt.  If the VD
12c50 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63  BE.** has made c
12c60 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e  hanges and is in
12c70 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65   autocommit mode
12c80 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68  , then commit th
12c90 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20  ose.** changes. 
12ca0 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69   If a rollback i
12cb0 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64  s needed, then d
12cc0 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  o the rollback..
12cd0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
12ce0 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77  ne is the only w
12cf0 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73  ay to move the s
12d00 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f  tate of a VM fro
12d10 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49  m.** SQLITE_MAGI
12d20 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f  C_RUN to SQLITE_
12d30 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20  MAGIC_HALT.  It 
12d40 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a  is harmless to.*
12d50 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61  * call this on a
12d60 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74   VM that is in t
12d70 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  he SQLITE_MAGIC_
12d80 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  HALT state..**.*
12d90 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  * Return an erro
12da0 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20  r code.  If the 
12db0 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74  commit could not
12dc0 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73   complete becaus
12dd0 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e  e of.** lock con
12de0 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20  tention, return 
12df0 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66  SQLITE_BUSY.  If
12e00 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
12e10 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20  returned, it.** 
12e20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20  means the close 
12e30 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61  did not happen a
12e40 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  nd needs to be r
12e50 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  epeated..*/.int 
12e60 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28  sqlite3VdbeHalt(
12e70 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
12e80 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
12e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
12ea0 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72 61  sed to store tra
12eb0 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63 6f  nsient return co
12ec0 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  des */.  sqlite3
12ed0 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20   *db = p->db;.. 
12ee0 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
12ef0 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c  n contains the l
12f00 6f 67 69 63 20 74 68 61 74 20 64 65 74 65 72 6d  ogic that determ
12f10 69 6e 65 73 20 69 66 20 61 20 73 74 61 74 65 6d  ines if a statem
12f20 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e  ent or.  ** tran
12f30 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
12f40 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
12f50 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65  led back as a re
12f60 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a  sult of the.  **
12f70 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
12f80 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  is virtual machi
12f90 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ne. .  **.  ** I
12fa0 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  f any of the fol
12fb0 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f 63  lowing errors oc
12fc0 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  cur:.  **.  **  
12fd0 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a     SQLITE_NOMEM.
12fe0 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
12ff0 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 53  IOERR.  **     S
13000 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20  QLITE_FULL.  ** 
13010 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 52      SQLITE_INTER
13020 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  RUPT.  **.  ** T
13030 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  hen the internal
13040 20 63 61 63 68 65 20 6d 69 67 68 74 20 68 61 76   cache might hav
13050 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 61  e been left in a
13060 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20  n inconsistent. 
13070 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20 6e   ** state.  We n
13080 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  eed to rollback 
13090 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
130a0 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 68  ansaction, if th
130b0 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c  ere is.  ** one,
130c0 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65   or the complete
130d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20   transaction if 
130e0 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74  there is no stat
130f0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
13100 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70  n..  */..  if( p
13110 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
13120 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
13130 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
13140 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f 6e    }.  if( p->aOn
13150 63 65 46 6c 61 67 20 29 20 6d 65 6d 73 65 74 28  ceFlag ) memset(
13160 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 30 2c  p->aOnceFlag, 0,
13170 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 29 3b 0a   p->nOnceFlag);.
13180 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72    closeAllCursor
13190 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d  s(p);.  if( p->m
131a0 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43  agic!=VDBE_MAGIC
131b0 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  _RUN ){.    retu
131c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
131d0 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56  }.  checkActiveV
131e0 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f  dbeCnt(db);..  /
131f0 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72  * No commit or r
13200 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69  ollback needed i
13210 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65  f the program ne
13220 76 65 72 20 73 74 61 72 74 65 64 20 6f 72 20 69  ver started or i
13230 66 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 20 73  f the.  ** SQL s
13240 74 61 74 65 6d 65 6e 74 20 64 6f 65 73 20 6e 6f  tatement does no
13250 74 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  t read or write 
13260 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  a database file.
13270 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63    */.  if( p->pc
13280 3e 3d 30 20 26 26 20 70 2d 3e 62 49 73 52 65 61  >=0 && p->bIsRea
13290 64 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d  der ){.    int m
132a0 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72 79  rc;   /* Primary
132b0 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d   error code from
132c0 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e   p->rc */.    in
132d0 74 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d  t eStatementOp =
132e0 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 70   0;.    int isSp
132f0 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20  ecialError;     
13300 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f         /* Set to
13310 20 74 72 75 65 20 69 66 20 61 20 27 73 70 65 63   true if a 'spec
13320 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20  ial' error */.. 
13330 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62     /* Lock all b
13340 74 72 65 65 73 20 75 73 65 64 20 62 79 20 74 68  trees used by th
13350 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  e statement */. 
13360 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e     sqlite3VdbeEn
13370 74 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20  ter(p);..    /* 
13380 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66  Check for one of
13390 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72   the special err
133a0 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d  ors */.    mrc =
133b0 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a 20   p->rc & 0xff;. 
133c0 20 20 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f     isSpecialErro
133d0 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f  r = mrc==SQLITE_
133e0 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51  NOMEM || mrc==SQ
133f0 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20 20  LITE_IOERR.     
13400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13410 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49  || mrc==SQLITE_I
13420 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d  NTERRUPT || mrc=
13430 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20  =SQLITE_FULL;.  
13440 20 20 69 66 28 20 69 73 53 70 65 63 69 61 6c 45    if( isSpecialE
13450 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a  rror ){.      /*
13460 20 49 66 20 74 68 65 20 71 75 65 72 79 20 77 61   If the query wa
13470 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20  s read-only and 
13480 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
13490 73 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  s SQLITE_INTERRU
134a0 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f  PT, .      ** no
134b0 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63   rollback is nec
134c0 65 73 73 61 72 79 2e 20 4f 74 68 65 72 77 69 73  essary. Otherwis
134d0 65 2c 20 61 74 20 6c 65 61 73 74 20 61 20 73 61  e, at least a sa
134e0 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a  vepoint .      *
134f0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  * transaction mu
13500 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  st be rolled bac
13510 6b 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  k to restore the
13520 20 64 61 74 61 62 61 73 65 20 74 6f 20 61 20 0a   database to a .
13530 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74        ** consist
13540 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20  ent state..     
13550 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76 65   **.      ** Eve
13560 6e 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65  n if the stateme
13570 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c  nt is read-only,
13580 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
13590 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20 20   to perform.    
135a0 20 20 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e 74    ** a statement
135b0 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   or transaction 
135c0 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69  rollback operati
135d0 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72  on. If the error
135e0 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72   .      ** occur
135f0 72 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  red while writin
13600 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
13610 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72  , sub-journal or
13620 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
13630 2a 2a 20 66 69 6c 65 20 61 73 20 70 61 72 74 20  ** file as part 
13640 6f 66 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20  of an effort to 
13650 66 72 65 65 20 75 70 20 63 61 63 68 65 20 73 70  free up cache sp
13660 61 63 65 20 28 73 65 65 20 66 75 6e 63 74 69 6f  ace (see functio
13670 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72  n.      ** pager
13680 53 74 72 65 73 73 28 29 20 69 6e 20 70 61 67 65  Stress() in page
13690 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61  r.c), the rollba
136a0 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 20 74  ck is required t
136b0 6f 20 72 65 73 74 6f 72 65 20 0a 20 20 20 20 20  o restore .     
136c0 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f   ** the pager to
136d0 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74   a consistent st
136e0 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ate..      */.  
136f0 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64      if( !p->read
13700 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c  Only || mrc!=SQL
13710 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b  ITE_INTERRUPT ){
13720 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 72  .        if( (mr
13730 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
13740 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46  || mrc==SQLITE_F
13750 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65 73 53  ULL) && p->usesS
13760 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  tmtJournal ){.  
13770 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65          eStateme
13780 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54  ntOp = SAVEPOINT
13790 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20  _ROLLBACK;.     
137a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
137b0 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f      /* We are fo
137c0 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63  rced to roll bac
137d0 6b 20 74 68 65 20 61 63 74 69 76 65 20 74 72 61  k the active tra
137e0 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65  nsaction. Before
137f0 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20   doing.         
13800 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e   ** so, abort an
13810 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  y other statemen
13820 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63  ts this handle c
13830 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74  urrently has act
13840 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ive..          *
13850 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  /.          sqli
13860 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
13870 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  b, SQLITE_ABORT_
13880 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20  ROLLBACK);.     
13890 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73       sqlite3Clos
138a0 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
138b0 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61  .          db->a
138c0 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  utoCommit = 1;. 
138d0 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61           p->nCha
138e0 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nge = 0;.       
138f0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
13900 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ..    /* Check f
13910 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72  or immediate for
13920 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69  eign key violati
13930 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ons. */.    if( 
13940 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
13950 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
13960 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20  3VdbeCheckFk(p, 
13970 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  0);.    }.  .   
13980 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d   /* If the auto-
13990 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  commit flag is s
139a0 65 74 20 61 6e 64 20 74 68 69 73 20 69 73 20 74  et and this is t
139b0 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 77  he only active w
139c0 72 69 74 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d  riter .    ** VM
139d0 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 65 69 74  , then we do eit
139e0 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20  her a commit or 
139f0 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20  rollback of the 
13a00 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
13a10 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ion. .    **.   
13a20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62   ** Note: This b
13a30 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69  lock also runs i
13a40 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65  f one of the spe
13a50 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64  cial errors hand
13a60 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76  led .    ** abov
13a70 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20  e has occurred. 
13a80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
13a90 21 73 71 6c 69 74 65 33 56 74 61 62 49 6e 53 79  !sqlite3VtabInSy
13aa0 6e 63 28 64 62 29 20 0a 20 20 20 20 20 26 26 20  nc(db) .     && 
13ab0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a  db->autoCommit .
13ac0 20 20 20 20 20 26 26 20 64 62 2d 3e 6e 56 64 62       && db->nVdb
13ad0 65 57 72 69 74 65 3d 3d 28 70 2d 3e 72 65 61 64  eWrite==(p->read
13ae0 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b  Only==0) .    ){
13af0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
13b00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  ==SQLITE_OK || (
13b10 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
13b20 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70  OE_Fail && !isSp
13b30 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20  ecialError) ){. 
13b40 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
13b50 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70  te3VdbeCheckFk(p
13b60 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
13b70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13b80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
13b90 20 4e 45 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e   NEVER(p->readOn
13ba0 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ly) ){.         
13bb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65     sqlite3VdbeLe
13bc0 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ave(p);.        
13bd0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13be0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
13bf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
13c00 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
13c10 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59  RAINT_FOREIGNKEY
13c20 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
13c30 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54   .          /* T
13c40 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66  he auto-commit f
13c50 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
13c60 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61   vdbe program wa
13c70 73 20 73 75 63 63 65 73 73 66 75 6c 20 0a 20 20  s successful .  
13c80 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 68 69          ** or hi
13c90 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63  t an 'OR FAIL' c
13ca0 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68  onstraint and th
13cb0 65 72 65 20 61 72 65 20 6e 6f 20 64 65 66 65 72  ere are no defer
13cc0 72 65 64 20 66 6f 72 65 69 67 6e 0a 20 20 20 20  red foreign.    
13cd0 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e        ** key con
13ce0 73 74 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64  straints to hold
13cf0 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74   up the transact
13d00 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ion. This means 
13d10 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20  a commit .      
13d20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72      ** is requir
13d30 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ed. */.         
13d40 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74   rc = vdbeCommit
13d50 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20  (db, p);.       
13d60 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
13d70 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
13d80 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  & p->readOnly ){
13d90 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
13da0 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a  e3VdbeLeave(p);.
13db0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
13dc0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
13dd0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
13de0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13df0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
13e00 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20   = rc;.         
13e10 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
13e20 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  All(db, SQLITE_O
13e30 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  K);.          p-
13e40 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
13e50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13e60 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65         db->nDefe
13e70 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20  rredCons = 0;.  
13e80 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66          db->nDef
13e90 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30  erredImmCons = 0
13ea0 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
13eb0 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
13ec0 5f 44 65 66 65 72 46 4b 73 3b 0a 20 20 20 20 20  _DeferFKs;.     
13ed0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d       sqlite3Comm
13ee0 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65  itInternalChange
13ef0 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d  s(db);.        }
13f00 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13f10 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
13f20 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
13f30 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20  ITE_OK);.       
13f40 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
13f50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
13f60 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20  b->nStatement = 
13f70 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
13f80 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30   eStatementOp==0
13f90 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
13fa0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
13fb0 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  | p->errorAction
13fc0 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20  ==OE_Fail ){.   
13fd0 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f       eStatementO
13fe0 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  p = SAVEPOINT_RE
13ff0 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c  LEASE;.      }el
14000 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41  se if( p->errorA
14010 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20  ction==OE_Abort 
14020 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74  ){.        eStat
14030 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f  ementOp = SAVEPO
14040 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  INT_ROLLBACK;.  
14050 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14060 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
14070 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
14080 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29  _ABORT_ROLLBACK)
14090 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
140a0 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
140b0 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62  (db);.        db
140c0 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
140d0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68  ;.        p->nCh
140e0 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  ange = 0;.      
140f0 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
14100 2a 20 49 66 20 65 53 74 61 74 65 6d 65 6e 74 4f  * If eStatementO
14110 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  p is non-zero, t
14120 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20  hen a statement 
14130 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64  transaction need
14140 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63  s to.    ** be c
14150 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
14160 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71  ed back. Call sq
14170 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74  lite3VdbeCloseSt
14180 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20  atement() to.   
14190 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74 68   ** do so. If th
141a0 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 74  is operation ret
141b0 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20 61  urns an error, a
141c0 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  nd the current s
141d0 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20  tatement.    ** 
141e0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51  error code is SQ
141f0 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54  LITE_OK or SQLIT
14200 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68  E_CONSTRAINT, th
14210 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20  en promote the. 
14220 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 73 74     ** current st
14230 61 74 65 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f  atement error co
14240 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  de..    */.    i
14250 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20  f( eStatementOp 
14260 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
14270 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74  lite3VdbeCloseSt
14280 61 74 65 6d 65 6e 74 28 70 2c 20 65 53 74 61 74  atement(p, eStat
14290 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20  ementOp);.      
142a0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
142b0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
142c0 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63  ITE_OK || (p->rc
142d0 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43  &0xff)==SQLITE_C
142e0 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20 20 20  ONSTRAINT ){.   
142f0 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72         p->rc = r
14300 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  c;.          sql
14310 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
14320 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
14330 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67        p->zErrMsg
14340 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
14350 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
14360 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
14370 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
14380 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73  BACK);.        s
14390 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
143a0 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20  oints(db);.     
143b0 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
143c0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  t = 1;.        p
143d0 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
143e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
143f0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77      /* If this w
14400 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50  as an INSERT, UP
14410 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61  DATE or DELETE a
14420 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20  nd no statement 
14430 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20  transaction.    
14440 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c  ** has been roll
14450 65 64 20 62 61 63 6b 2c 20 75 70 64 61 74 65 20  ed back, update 
14460 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
14470 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63  nection change-c
14480 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a  ounter. .    */.
14490 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67      if( p->chang
144a0 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20  eCntOn ){.      
144b0 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  if( eStatementOp
144c0 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  !=SAVEPOINT_ROLL
144d0 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  BACK ){.        
144e0 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
144f0 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68  anges(db, p->nCh
14500 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ange);.      }el
14510 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
14520 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
14530 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  s(db, 0);.      
14540 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e  }.      p->nChan
14550 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  ge = 0;.    }.. 
14560 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68     /* Release th
14570 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73  e locks */.    s
14580 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28  qlite3VdbeLeave(
14590 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65  p);.  }..  /* We
145a0 20 68 61 76 65 20 73 75 63 63 65 73 73 66 75 6c   have successful
145b0 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c  ly halted and cl
145c0 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65  osed the VM.  Re
145d0 63 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e 20  cord this fact. 
145e0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
145f0 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56 64  0 ){.    db->nVd
14600 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20 20  beActive--;.    
14610 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79  if( !p->readOnly
14620 20 29 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74   ) db->nVdbeWrit
14630 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  e--;.    if( p->
14640 62 49 73 52 65 61 64 65 72 20 29 20 64 62 2d 3e  bIsReader ) db->
14650 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20 20  nVdbeRead--;.   
14660 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64   assert( db->nVd
14670 62 65 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e 56  beActive>=db->nV
14680 64 62 65 52 65 61 64 20 29 3b 0a 20 20 20 20 61  dbeRead );.    a
14690 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65  ssert( db->nVdbe
146a0 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65 57  Read>=db->nVdbeW
146b0 72 69 74 65 20 29 3b 0a 20 20 20 20 61 73 73 65  rite );.    asse
146c0 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 57 72 69  rt( db->nVdbeWri
146d0 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70  te>=0 );.  }.  p
146e0 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
146f0 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65  AGIC_HALT;.  che
14700 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
14710 64 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  db);.  if( p->db
14720 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
14730 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
14740 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
14750 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74  .  /* If the aut
14760 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
14770 20 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68   set to true, th
14780 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61  en any locks tha
14790 74 20 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a  t were held.  **
147a0 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64   by connection d
147b0 62 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20  b have now been 
147c0 72 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73  released. Call s
147d0 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
147e0 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a  Unlocked() .  **
147f0 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72   to invoke any r
14800 65 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e  equired unlock-n
14810 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e  otify callbacks.
14820 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
14830 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
14840 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
14850 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b  ionUnlocked(db);
14860 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
14870 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e  db->nVdbeActive>
14880 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d  0 || db->autoCom
14890 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53  mit==0 || db->nS
148a0 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20  tatement==0 );. 
148b0 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d   return (p->rc==
148c0 53 51 4c 49 54 45 5f 42 55 53 59 20 3f 20 53 51  SQLITE_BUSY ? SQ
148d0 4c 49 54 45 5f 42 55 53 59 20 3a 20 53 51 4c 49  LITE_BUSY : SQLI
148e0 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TE_OK);.}.../*.*
148f0 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64  * Each VDBE hold
14900 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  s the result of 
14910 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
14920 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63  sqlite3_step() c
14930 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e  all.** in p->rc.
14940 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
14950 65 74 73 20 74 68 61 74 20 72 65 73 75 6c 74 20  ets that result 
14960 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f  back to SQLITE_O
14970 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  K..*/.void sqlit
14980 65 33 56 64 62 65 52 65 73 65 74 53 74 65 70 52  e3VdbeResetStepR
14990 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a  esult(Vdbe *p){.
149a0 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
149b0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
149c0 70 79 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  py the error cod
149d0 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73  e and error mess
149e0 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  age belonging to
149f0 20 74 68 65 20 56 44 42 45 20 70 61 73 73 65 64   the VDBE passed
14a00 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74  .** as the first
14a10 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 69 74 73   argument to its
14a20 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
14a30 20 28 73 6f 20 74 68 61 74 20 74 68 65 79 20 77   (so that they w
14a40 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75 72  ill be .** retur
14a50 6e 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20  ned by calls to 
14a60 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
14a70 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 65 72  ) and sqlite3_er
14a80 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54  rmsg())..**.** T
14a90 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
14aa0 73 20 6e 6f 74 20 63 6c 65 61 72 20 74 68 65 20  s not clear the 
14ab0 56 44 42 45 20 65 72 72 6f 72 20 63 6f 64 65 20  VDBE error code 
14ac0 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a 75 73 74  or message, just
14ad0 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68 65 6d 20  .** copies them 
14ae0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
14af0 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  handle..*/.int s
14b00 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 66  qlite3VdbeTransf
14b10 65 72 45 72 72 6f 72 28 56 64 62 65 20 2a 70 29  erError(Vdbe *p)
14b20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
14b30 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72  = p->db;.  int r
14b40 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28  c = p->rc;.  if(
14b50 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20   p->zErrMsg ){. 
14b60 20 20 20 75 38 20 6d 61 6c 6c 6f 63 46 61 69 6c     u8 mallocFail
14b70 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ed = db->mallocF
14b80 61 69 6c 65 64 3b 0a 20 20 20 20 73 71 6c 69 74  ailed;.    sqlit
14b90 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
14ba0 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66 28 20 64  loc();.    if( d
14bb0 62 2d 3e 70 45 72 72 3d 3d 30 20 29 20 64 62 2d  b->pErr==0 ) db-
14bc0 3e 70 45 72 72 20 3d 20 73 71 6c 69 74 65 33 56  >pErr = sqlite3V
14bd0 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20  alueNew(db);.   
14be0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
14bf0 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31  Str(db->pErr, -1
14c00 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51  , p->zErrMsg, SQ
14c10 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
14c20 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
14c30 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
14c40 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
14c50 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
14c60 20 3d 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b   = mallocFailed;
14c70 0a 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65  .    db->errCode
14c80 20 3d 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = rc;.  }else{.
14c90 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14ca0 28 64 62 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20  (db, rc);.  }.  
14cb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
14cc0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
14cd0 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20  LE_SQLLOG./*.** 
14ce0 49 66 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  If an SQLITE_CON
14cf0 46 49 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20  FIG_SQLLOG hook 
14d00 69 73 20 72 65 67 69 73 74 65 72 65 64 20 61 6e  is registered an
14d10 64 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65  d the VM has bee
14d20 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b  n run, .** invok
14d30 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e it..*/.static 
14d40 76 6f 69 64 20 76 64 62 65 49 6e 76 6f 6b 65 53  void vdbeInvokeS
14d50 71 6c 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b 0a  qllog(Vdbe *v){.
14d60 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
14d70 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f  balConfig.xSqllo
14d80 67 20 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c 49  g && v->rc==SQLI
14d90 54 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 6c  TE_OK && v->zSql
14da0 20 26 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a   && v->pc>=0 ){.
14db0 20 20 20 20 63 68 61 72 20 2a 7a 45 78 70 61 6e      char *zExpan
14dc0 64 65 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ded = sqlite3Vdb
14dd0 65 45 78 70 61 6e 64 53 71 6c 28 76 2c 20 76 2d  eExpandSql(v, v-
14de0 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 61 73 73 65  >zSql);.    asse
14df0 72 74 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e  rt( v->db->init.
14e00 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69  busy==0 );.    i
14e10 66 28 20 7a 45 78 70 61 6e 64 65 64 20 29 7b 0a  f( zExpanded ){.
14e20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
14e30 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f  balConfig.xSqllo
14e40 67 28 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  g(.          sql
14e50 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
14e60 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e  .pSqllogArg, v->
14e70 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20 31  db, zExpanded, 1
14e80 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
14e90 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d  sqlite3DbFree(v-
14ea0 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 29 3b  >db, zExpanded);
14eb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c  .    }.  }.}.#el
14ec0 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65  se.# define vdbe
14ed0 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 0a  InvokeSqllog(x).
14ee0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c  #endif../*.** Cl
14ef0 65 61 6e 20 75 70 20 61 20 56 44 42 45 20 61 66  ean up a VDBE af
14f00 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75  ter execution bu
14f10 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  t do not delete 
14f20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20 79 65  the VDBE just ye
14f30 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20  t..** Write any 
14f40 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
14f50 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20  nto *pzErrMsg.  
14f60 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
14f70 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66  t code..**.** Af
14f80 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
14f90 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42   is run, the VDB
14fa0 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64  E should be read
14fb0 79 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64  y to be executed
14fc0 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a  .** again..**.**
14fd0 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61   To look at it a
14fe0 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73  nother way, this
14ff0 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20   routine resets 
15000 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
15010 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68  .** virtual mach
15020 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41  ine from VDBE_MA
15030 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f  GIC_RUN or VDBE_
15040 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20  MAGIC_HALT back 
15050 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43  to.** VDBE_MAGIC
15060 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _INIT..*/.int sq
15070 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28 56  lite3VdbeReset(V
15080 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dbe *p){.  sqlit
15090 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70  e3 *db;.  db = p
150a0 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ->db;..  /* If t
150b0 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75  he VM did not ru
150c0 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20  n to completion 
150d0 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74  or if it encount
150e0 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72  ered an.  ** err
150f0 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68  or, then it migh
15100 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  t not have been 
15110 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e  halted properly.
15120 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69    So halt.  ** i
15130 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71  t now..  */.  sq
15140 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29  lite3VdbeHalt(p)
15150 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56  ;..  /* If the V
15160 44 42 45 20 68 61 73 20 62 65 20 72 75 6e 20 65  DBE has be run e
15170 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74  ven partially, t
15180 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65  hen transfer the
15190 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a   error code.  **
151a0 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61   and error messa
151b0 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45  ge from the VDBE
151c0 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64   into the main d
151d0 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
151e0 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20  e.  But.  ** if 
151f0 74 68 65 20 56 44 42 45 20 68 61 73 20 6a 75 73  the VDBE has jus
15200 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75  t been set to ru
15210 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63  n but has not ac
15220 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20  tually executed 
15230 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63  any.  ** instruc
15240 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65  tions yet, leave
15250 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
15260 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61  se error informa
15270 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a  tion unchanged..
15280 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63    */.  if( p->pc
15290 3e 3d 30 20 29 7b 0a 20 20 20 20 76 64 62 65 49  >=0 ){.    vdbeI
152a0 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 70 29 3b 0a  nvokeSqllog(p);.
152b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 54      sqlite3VdbeT
152c0 72 61 6e 73 66 65 72 45 72 72 6f 72 28 70 29 3b  ransferError(p);
152d0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
152e0 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
152f0 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d  g);.    p->zErrM
15300 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  sg = 0;.    if( 
15310 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29  p->runOnlyOnce )
15320 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b   p->expired = 1;
15330 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
15340 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64  rc && p->expired
15350 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65   ){.    /* The e
15360 78 70 69 72 65 64 20 66 6c 61 67 20 77 61 73 20  xpired flag was 
15370 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20  set on the VDBE 
15380 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
15390 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20   call.    ** to 
153a0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20  sqlite3_step(). 
153b0 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20  For consistency 
153c0 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73  (since sqlite3_s
153d0 74 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a  tep() was.    **
153e0 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68   called), set th
153f0 65 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72  e database error
15400 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 73   in this case as
15410 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20   well..    */.  
15420 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69    sqlite3ErrorWi
15430 74 68 4d 73 67 28 64 62 2c 20 70 2d 3e 72 63 2c  thMsg(db, p->rc,
15440 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 22 25   p->zErrMsg ? "%
15450 73 22 20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72 4d  s" : 0, p->zErrM
15460 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sg);.    sqlite3
15470 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
15480 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a  rrMsg);.    p->z
15490 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a  ErrMsg = 0;.  }.
154a0 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c  .  /* Reclaim al
154b0 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  l memory used by
154c0 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20   the VDBE.  */. 
154d0 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20   Cleanup(p);..  
154e0 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e  /* Save profilin
154f0 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  g information fr
15500 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72 75 6e  om this VDBE run
15510 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44  ..  */.#ifdef VD
15520 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20  BE_PROFILE.  {. 
15530 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66     FILE *out = f
15540 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69  open("vdbe_profi
15550 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20  le.out", "a");. 
15560 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20     if( out ){.  
15570 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
15580 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d   fprintf(out, "-
15590 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f  --- ");.      fo
155a0 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
155b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   i++){.        f
155c0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32  printf(out, "%02
155d0 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70  x", p->aOp[i].op
155e0 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  code);.      }. 
155f0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
15600 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 69  , "\n");.      i
15610 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20  f( p->zSql ){.  
15620 20 20 20 20 20 20 63 68 61 72 20 63 2c 20 70 63        char c, pc
15630 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 70   = 0;.        fp
15640 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22  rintf(out, "-- "
15650 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
15660 3d 30 3b 20 28 63 20 3d 20 70 2d 3e 7a 53 71 6c  =0; (c = p->zSql
15670 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20  [i])!=0; i++){. 
15680 20 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3d           if( pc=
15690 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28  ='\n' ) fprintf(
156a0 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20  out, "-- ");.   
156b0 20 20 20 20 20 20 20 70 75 74 63 28 63 2c 20 6f         putc(c, o
156c0 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ut);.          p
156d0 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 7d  c = c;.        }
156e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63 21  .        if( pc!
156f0 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28  ='\n' ) fprintf(
15700 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  out, "\n");.    
15710 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
15720 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
15730 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
15740 7a 48 64 72 5b 31 30 30 5d 3b 0a 20 20 20 20 20  zHdr[100];.     
15750 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
15760 6e 74 66 28 73 69 7a 65 6f 66 28 7a 48 64 72 29  ntf(sizeof(zHdr)
15770 2c 20 7a 48 64 72 2c 20 22 25 36 75 20 25 31 32  , zHdr, "%6u %12
15780 6c 6c 75 20 25 38 6c 6c 75 20 22 2c 0a 20 20 20  llu %8llu ",.   
15790 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
157a0 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20  ].cnt,.         
157b0 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c    p->aOp[i].cycl
157c0 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  es,.           p
157d0 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f  ->aOp[i].cnt>0 ?
157e0 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
157f0 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20  s/p->aOp[i].cnt 
15800 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  : 0.        );. 
15810 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
15820 75 74 2c 20 22 25 73 22 2c 20 7a 48 64 72 29 3b  ut, "%s", zHdr);
15830 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15840 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c  VdbePrintOp(out,
15850 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b   i, &p->aOp[i]);
15860 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
15870 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20  close(out);.    
15880 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  }.  }.#endif.  p
15890 2d 3e 69 43 75 72 72 65 6e 74 54 69 6d 65 20 3d  ->iCurrentTime =
158a0 20 30 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d   0;.  p->magic =
158b0 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
158c0 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63  ;.  return p->rc
158d0 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a   & db->errMask;.
158e0 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  }. ./*.** Clean 
158f0 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20  up and delete a 
15900 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
15910 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e  tion.  Return an
15920 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
15930 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
15940 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79  code.  Write any
15950 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
15960 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d  ext into *pzErrM
15970 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sg..*/.int sqlit
15980 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56  e3VdbeFinalize(V
15990 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dbe *p){.  int r
159a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
159b0 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56   if( p->magic==V
159c0 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c  DBE_MAGIC_RUN ||
159d0 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
159e0 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20  MAGIC_HALT ){.  
159f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
15a00 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20  beReset(p);.    
15a10 61 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d  assert( (rc & p-
15a20 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72  >db->errMask)==r
15a30 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  c );.  }.  sqlit
15a40 65 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b  e3VdbeDelete(p);
15a50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15a60 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  ./*.** If parame
15a70 74 65 72 20 69 4f 70 20 69 73 20 6c 65 73 73 20  ter iOp is less 
15a80 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
15a90 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72  invoke the destr
15aa0 75 63 74 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c  uctor for.** all
15ab0 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 20   auxiliary data 
15ac0 70 6f 69 6e 74 65 72 73 20 63 75 72 72 65 6e 74  pointers current
15ad0 6c 79 20 63 61 63 68 65 64 20 62 79 20 74 68 65  ly cached by the
15ae0 20 56 4d 20 70 61 73 73 65 64 20 61 73 0a 2a 2a   VM passed as.**
15af0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
15b00 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  ent..**.** Or, i
15b10 66 20 69 4f 70 20 69 73 20 67 72 65 61 74 65 72  f iOp is greater
15b20 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
15b30 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  o zero, then the
15b40 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a 2a   destructor is.*
15b50 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66  * only invoked f
15b60 6f 72 20 74 68 6f 73 65 20 61 75 78 69 6c 69 61  or those auxilia
15b70 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73  ry data pointers
15b80 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20   created by the 
15b90 75 73 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  user .** functio
15ba0 6e 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65  n invoked by the
15bb0 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63   OP_Function opc
15bc0 6f 64 65 20 61 74 20 69 6e 73 74 72 75 63 74 69  ode at instructi
15bd0 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d  on iOp of .** VM
15be0 20 70 56 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79   pVdbe, and only
15bf0 20 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20   then if:.**.** 
15c00 20 20 20 2a 20 74 68 65 20 61 73 73 6f 63 69 61     * the associa
15c10 74 65 64 20 66 75 6e 63 74 69 6f 6e 20 70 61 72  ted function par
15c20 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 33 32  ameter is the 32
15c30 6e 64 20 6f 72 20 6c 61 74 65 72 20 28 63 6f 75  nd or later (cou
15c40 6e 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72  nting.**      fr
15c50 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
15c60 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  ), or.**.**    *
15c70 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
15c80 6e 67 20 62 69 74 20 69 6e 20 61 72 67 75 6d 65  ng bit in argume
15c90 6e 74 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72  nt mask is clear
15ca0 20 28 77 68 65 72 65 20 74 68 65 20 66 69 72 73   (where the firs
15cb0 74 0a 2a 2a 20 20 20 20 20 20 66 75 6e 63 74 69  t.**      functi
15cc0 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 63 6f 72  on parameter cor
15cd0 72 65 73 70 6f 6e 64 73 20 74 6f 20 62 69 74 20  responds to bit 
15ce0 30 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64  0 etc.)..*/.void
15cf0 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
15d00 74 65 41 75 78 44 61 74 61 28 56 64 62 65 20 2a  teAuxData(Vdbe *
15d10 70 56 64 62 65 2c 20 69 6e 74 20 69 4f 70 2c 20  pVdbe, int iOp, 
15d20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 41 75 78  int mask){.  Aux
15d30 44 61 74 61 20 2a 2a 70 70 20 3d 20 26 70 56 64  Data **pp = &pVd
15d40 62 65 2d 3e 70 41 75 78 44 61 74 61 3b 0a 20 20  be->pAuxData;.  
15d50 77 68 69 6c 65 28 20 2a 70 70 20 29 7b 0a 20 20  while( *pp ){.  
15d60 20 20 41 75 78 44 61 74 61 20 2a 70 41 75 78 20    AuxData *pAux 
15d70 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66 28 20 28  = *pp;.    if( (
15d80 69 4f 70 3c 30 29 0a 20 20 20 20 20 7c 7c 20 28  iOp<0).     || (
15d90 70 41 75 78 2d 3e 69 4f 70 3d 3d 69 4f 70 20 26  pAux->iOp==iOp &
15da0 26 20 28 70 41 75 78 2d 3e 69 41 72 67 3e 33 31  & (pAux->iArg>31
15db0 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20 4d 41 53   || !(mask & MAS
15dc0 4b 42 49 54 33 32 28 70 41 75 78 2d 3e 69 41 72  KBIT32(pAux->iAr
15dd0 67 29 29 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  g)))).    ){.   
15de0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 41 75     testcase( pAu
15df0 78 2d 3e 69 41 72 67 3d 3d 33 31 20 29 3b 0a 20  x->iArg==31 );. 
15e00 20 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78       if( pAux->x
15e10 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
15e20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28    pAux->xDelete(
15e30 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20  pAux->pAux);.   
15e40 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d     }.      *pp =
15e50 20 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20   pAux->pNext;.  
15e60 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
15e70 65 28 70 56 64 62 65 2d 3e 64 62 2c 20 70 41 75  e(pVdbe->db, pAu
15e80 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  x);.    }else{. 
15e90 20 20 20 20 20 70 70 3d 20 26 70 41 75 78 2d 3e       pp= &pAux->
15ea0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
15eb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
15ec0 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ll memory associ
15ed0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64  ated with the Vd
15ee0 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  be passed as the
15ef0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
15f00 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66 6f 72 20  ,.** except for 
15f10 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2c 20 77  object itself, w
15f20 68 69 63 68 20 69 73 20 70 72 65 73 65 72 76 65  hich is preserve
15f30 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66  d..**.** The dif
15f40 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
15f50 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
15f60 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
15f70 65 74 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a  ete() is that.**
15f80 20 56 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c   VdbeDelete() al
15f90 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56  so unlinks the V
15fa0 64 62 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73  dbe from the lis
15fb0 74 20 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61  t of VMs associa
15fc0 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
15fd0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
15fe0 69 6f 6e 20 61 6e 64 20 66 72 65 65 73 20 74 68  ion and frees th
15ff0 65 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2e  e object itself.
16000 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
16010 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28  VdbeClearObject(
16020 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62  sqlite3 *db, Vdb
16030 65 20 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f 67  e *p){.  SubProg
16040 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78  ram *pSub, *pNex
16050 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  t;.  int i;.  as
16060 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c  sert( p->db==0 |
16070 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20  | p->db==db );. 
16080 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
16090 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61  (p->aVar, p->nVa
160a0 72 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d  r);.  releaseMem
160b0 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
160c0 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  e, p->nResColumn
160d0 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66  *COLNAME_N);.  f
160e0 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67  or(pSub=p->pProg
160f0 72 61 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d  ram; pSub; pSub=
16100 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
16110 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b  t = pSub->pNext;
16120 0a 20 20 20 20 76 64 62 65 46 72 65 65 4f 70 41  .    vdbeFreeOpA
16130 72 72 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61  rray(db, pSub->a
16140 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a  Op, pSub->nOp);.
16150 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
16160 65 28 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d  e(db, pSub);.  }
16170 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61  .  for(i=p->nzVa
16180 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 20  r-1; i>=0; i--) 
16190 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
161a0 2c 20 70 2d 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a  , p->azVar[i]);.
161b0 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61    vdbeFreeOpArra
161c0 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d  y(db, p->aOp, p-
161d0 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  >nOp);.  sqlite3
161e0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43  DbFree(db, p->aC
161f0 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  olName);.  sqlit
16200 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
16210 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  zSql);.  sqlite3
16220 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46  DbFree(db, p->pF
16230 72 65 65 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  ree);.#ifdef SQL
16240 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
16250 53 43 41 4e 53 54 41 54 55 53 0a 20 20 66 6f 72  SCANSTATUS.  for
16260 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 63 61 6e  (i=0; i<p->nScan
16270 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
16280 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
16290 3e 61 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d 65 29  >aScan[i].zName)
162a0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
162b0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63  bFree(db, p->aSc
162c0 61 6e 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  an);.#endif.}../
162d0 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65  *.** Delete an e
162e0 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76  ntire VDBE..*/.v
162f0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  oid sqlite3VdbeD
16300 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a  elete(Vdbe *p){.
16310 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
16320 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30    if( NEVER(p==0
16330 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62  ) ) return;.  db
16340 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
16350 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
16360 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
16370 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ) );.  sqlite3Vd
16380 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 64 62  beClearObject(db
16390 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  , p);.  if( p->p
163a0 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Prev ){.    p->p
163b0 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
163c0 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b  >pNext;.  }else{
163d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
163e0 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20  >pVdbe==p );.   
163f0 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e   db->pVdbe = p->
16400 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pNext;.  }.  if(
16410 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
16420 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
16430 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d   = p->pPrev;.  }
16440 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
16450 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20  BE_MAGIC_DEAD;. 
16460 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71   p->db = 0;.  sq
16470 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
16480 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  p);.}../*.** The
16490 20 63 75 72 73 6f 72 20 22 70 22 20 68 61 73 20   cursor "p" has 
164a0 61 20 70 65 6e 64 69 6e 67 20 73 65 65 6b 20 6f  a pending seek o
164b0 70 65 72 61 74 69 6f 6e 20 74 68 61 74 20 68 61  peration that ha
164c0 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a  s not yet been.*
164d0 2a 20 63 61 72 72 69 65 64 20 6f 75 74 2e 20 20  * carried out.  
164e0 53 65 65 6b 20 74 68 65 20 63 75 72 73 6f 72 20  Seek the cursor 
164f0 6e 6f 77 2e 20 20 49 66 20 61 6e 20 65 72 72 6f  now.  If an erro
16500 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
16510 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69  .** the appropri
16520 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ate error code..
16530 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
16540 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61  LITE_NOINLINE ha
16550 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65  ndleDeferredMove
16560 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70  to(VdbeCursor *p
16570 29 7b 0a 20 20 69 6e 74 20 72 65 73 2c 20 72 63  ){.  int res, rc
16580 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
16590 54 45 53 54 0a 20 20 65 78 74 65 72 6e 20 69 6e  TEST.  extern in
165a0 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68  t sqlite3_search
165b0 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20  _count;.#endif. 
165c0 20 61 73 73 65 72 74 28 20 70 2d 3e 64 65 66 65   assert( p->defe
165d0 72 72 65 64 4d 6f 76 65 74 6f 20 29 3b 0a 20 20  rredMoveto );.  
165e0 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62  assert( p->isTab
165f0 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  le );.  assert( 
16600 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  p->eCurType==CUR
16610 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
16620 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
16630 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
16640 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 30  p->uc.pCursor, 0
16650 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65  , p->movetoTarge
16660 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 69  t, 0, &res);.  i
16670 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
16680 63 3b 0a 20 20 69 66 28 20 72 65 73 21 3d 30 20  c;.  if( res!=0 
16690 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
166a0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 23 69  CORRUPT_BKPT;.#i
166b0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
166c0 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63  .  sqlite3_searc
166d0 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69  h_count++;.#endi
166e0 66 0a 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d  f.  p->deferredM
166f0 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e  oveto = 0;.  p->
16700 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
16710 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 72 65 74  CHE_STALE;.  ret
16720 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
16730 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e  ../*.** Somethin
16740 67 20 68 61 73 20 6d 6f 76 65 64 20 63 75 72 73  g has moved curs
16750 6f 72 20 22 70 22 20 6f 75 74 20 6f 66 20 70 6c  or "p" out of pl
16760 61 63 65 2e 20 20 4d 61 79 62 65 20 74 68 65 20  ace.  Maybe the 
16770 72 6f 77 20 69 74 20 77 61 73 0a 2a 2a 20 70 6f  row it was.** po
16780 69 6e 74 65 64 20 74 6f 20 77 61 73 20 64 65 6c  inted to was del
16790 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
167a0 64 65 72 20 69 74 2e 20 20 4f 72 20 6d 61 79 62  der it.  Or mayb
167b0 65 20 74 68 65 20 62 74 72 65 65 20 77 61 73 0a  e the btree was.
167c0 2a 2a 20 72 65 62 61 6c 61 6e 63 65 64 2e 20 20  ** rebalanced.  
167d0 57 68 61 74 65 76 65 72 20 74 68 65 20 63 61 75  Whatever the cau
167e0 73 65 2c 20 74 72 79 20 74 6f 20 72 65 73 74 6f  se, try to resto
167f0 72 65 20 22 70 22 20 74 6f 20 74 68 65 20 70 6c  re "p" to the pl
16800 61 63 65 20 69 74 0a 2a 2a 20 69 73 20 73 75 70  ace it.** is sup
16810 70 6f 73 65 64 20 74 6f 20 62 65 20 70 6f 69 6e  posed to be poin
16820 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72 6f  ting.  If the ro
16830 77 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75  w was deleted ou
16840 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
16850 0a 2a 2a 20 63 75 72 73 6f 72 2c 20 73 65 74 20  .** cursor, set 
16860 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f  the cursor to po
16870 69 6e 74 20 74 6f 20 61 20 4e 55 4c 4c 20 72 6f  int to a NULL ro
16880 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  w..*/.static int
16890 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
168a0 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73   handleMovedCurs
168b0 6f 72 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70  or(VdbeCursor *p
168c0 29 7b 0a 20 20 69 6e 74 20 69 73 44 69 66 66 65  ){.  int isDiffe
168d0 72 65 6e 74 52 6f 77 2c 20 72 63 3b 0a 20 20 61  rentRow, rc;.  a
168e0 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79  ssert( p->eCurTy
168f0 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
16900 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
16910 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20  ->uc.pCursor!=0 
16920 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
16930 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
16940 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43  asMoved(p->uc.pC
16950 75 72 73 6f 72 29 20 29 3b 0a 20 20 72 63 20 3d  ursor) );.  rc =
16960 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
16970 73 6f 72 52 65 73 74 6f 72 65 28 70 2d 3e 75 63  sorRestore(p->uc
16980 2e 70 43 75 72 73 6f 72 2c 20 26 69 73 44 69 66  .pCursor, &isDif
16990 66 65 72 65 6e 74 52 6f 77 29 3b 0a 20 20 70 2d  ferentRow);.  p-
169a0 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
169b0 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66  ACHE_STALE;.  if
169c0 28 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77  ( isDifferentRow
169d0 20 29 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20   ) p->nullRow = 
169e0 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  1;.  return rc;.
169f0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
16a00 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
16a10 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69  e cursor is vali
16a20 64 2e 20 20 52 65 73 74 6f 72 65 20 74 68 65 20  d.  Restore the 
16a30 63 75 72 73 6f 72 0a 2a 2a 20 69 66 20 6e 65 65  cursor.** if nee
16a40 64 20 62 65 2e 20 20 52 65 74 75 72 6e 20 61 6e  d be.  Return an
16a50 79 20 49 2f 4f 20 65 72 72 6f 72 20 66 72 6f 6d  y I/O error from
16a60 20 74 68 65 20 72 65 73 74 6f 72 65 20 6f 70 65   the restore ope
16a70 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  ration..*/.int s
16a80 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72  qlite3VdbeCursor
16a90 52 65 73 74 6f 72 65 28 56 64 62 65 43 75 72 73  Restore(VdbeCurs
16aa0 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  or *p){.  assert
16ab0 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43  ( p->eCurType==C
16ac0 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
16ad0 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
16ae0 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
16af0 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20  (p->uc.pCursor) 
16b00 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61  ){.    return ha
16b10 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28  ndleMovedCursor(
16b20 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
16b30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
16b40 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
16b50 68 65 20 63 75 72 73 6f 72 20 70 20 69 73 20 72  he cursor p is r
16b60 65 61 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20  eady to read or 
16b70 77 72 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f  write the row to
16b80 20 77 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73   which it.** was
16b90 20 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64   last positioned
16ba0 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  .  Return an err
16bb0 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f  or code if an OO
16bc0 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65  M fault or I/O e
16bd0 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73  rror.** prevents
16be0 20 75 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f   us from positio
16bf0 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20  ning the cursor 
16c00 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 70  to its correct p
16c10 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  osition..**.** I
16c20 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61  f a MoveTo opera
16c30 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20  tion is pending 
16c40 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72  on the given cur
16c50 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61  sor, then do tha
16c60 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e  t.** MoveTo now.
16c70 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20    If no move is 
16c80 70 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74  pending, check t
16c90 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 6f 77  o see if the row
16ca0 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c   has been.** del
16cb0 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
16cc0 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 20 61  der the cursor a
16cd0 6e 64 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61  nd if it has, ma
16ce0 72 6b 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a  rk the row as.**
16cf0 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a   a NULL row..**.
16d00 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  ** If the cursor
16d10 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e   is already poin
16d20 74 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72  ting to the corr
16d30 65 63 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74  ect row and that
16d40 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20   row has.** not 
16d50 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74  been deleted out
16d60 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20   from under the 
16d70 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69  cursor, then thi
16d80 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
16d90 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
16da0 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f  ite3VdbeCursorMo
16db0 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20  veto(VdbeCursor 
16dc0 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 65 43  *p){.  if( p->eC
16dd0 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
16de0 42 54 52 45 45 20 29 7b 0a 20 20 20 20 69 66 28  BTREE ){.    if(
16df0 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65   p->deferredMove
16e00 74 6f 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  to ){.      retu
16e10 72 6e 20 68 61 6e 64 6c 65 44 65 66 65 72 72 65  rn handleDeferre
16e20 64 4d 6f 76 65 74 6f 28 70 29 3b 0a 20 20 20 20  dMoveto(p);.    
16e30 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
16e40 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
16e50 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73  oved(p->uc.pCurs
16e60 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  or) ){.      ret
16e70 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43  urn handleMovedC
16e80 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 7d 0a  ursor(p);.    }.
16e90 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
16ea0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
16eb0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
16ec0 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  unctions:.**.** 
16ed0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
16ee0 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74  lType().** sqlit
16ef0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
16f00 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Len().** sqlite3
16f10 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a  VdbeSerialLen().
16f20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
16f30 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c  rialPut().** sql
16f40 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
16f50 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73  t().**.** encaps
16f60 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  ulate the code t
16f70 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76  hat serializes v
16f80 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67  alues for storag
16f90 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64  e in SQLite.** d
16fa0 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65  ata and index re
16fb0 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69  cords. Each seri
16fc0 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e  alized value con
16fd0 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73  sists of a.** 's
16fe0 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20  erial-type' and 
16ff0 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20  a blob of data. 
17000 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  The serial type 
17010 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73  is an 8-byte uns
17020 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72  igned.** integer
17030 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61  , stored as a va
17040 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61  rint..**.** In a
17050 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72  n SQLite index r
17060 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61  ecord, the seria
17070 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64  l type is stored
17080 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65   directly before
17090 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20  .** the blob of 
170a0 64 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72  data that it cor
170b0 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20  responds to. In 
170c0 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20  a table record, 
170d0 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79  all serial.** ty
170e0 70 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61  pes are stored a
170f0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
17100 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74  he record, and t
17110 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61  he blobs of data
17120 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20   at.** the end. 
17130 48 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63  Hence these func
17140 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20  tions allow the 
17150 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65  caller to handle
17160 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74   the.** serial-t
17170 79 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f  ype and data blo
17180 62 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2a  b separately..**
17190 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
171a0 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65  g table describe
171b0 73 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74  s the various st
171c0 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f  orage classes fo
171d0 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20  r data:.**.**   
171e0 73 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20  serial type     
171f0 20 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61     bytes of data
17200 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20        type.**   
17210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
17220 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
17230 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --    ----------
17240 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20  -----.**      0 
17250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17260 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
17270 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20   NULL.**      1 
17280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17290 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
172a0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
172b0 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20  **      2       
172c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20                2 
172d0 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
172e0 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
172f0 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20    3             
17300 20 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20          3       
17310 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
17320 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20  ger.**      4   
17330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17340 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73    4            s
17350 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
17360 20 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20        5         
17370 20 20 20 20 20 20 20 20 20 20 20 20 36 20 20 20              6   
17380 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
17390 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
173a0 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6               
173b0 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
173c0 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
173d0 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20  r.**      7     
173e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173f0 38 20 20 20 20 20 20 20 20 20 20 20 20 49 45 45  8            IEE
17400 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20  E float.**      
17410 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  8               
17420 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
17430 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74     Integer const
17440 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20  ant 0.**      9 
17450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17460 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
17470 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   Integer constan
17480 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31  t 1.**     10,11
17490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
174b0 65 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 61  eserved for expa
174c0 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31  nsion.**    N>=1
174d0 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20  2 and even      
174e0 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20   (N-12)/2       
174f0 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31   BLOB.**    N>=1
17500 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20  3 and odd       
17510 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20   (N-13)/2       
17520 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20   text.**.** The 
17530 38 20 61 6e 64 20 39 20 74 79 70 65 73 20 77 65  8 and 9 types we
17540 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e  re added in 3.3.
17550 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34  0, file format 4
17560 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e  .  Prior version
17570 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77  s.** of SQLite w
17580 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61  ill not understa
17590 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20  nd those serial 
175a0 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  types..*/../*.**
175b0 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 72 69   Return the seri
175c0 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20  al-type for the 
175d0 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
175e0 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  pMem..*/.u32 sql
175f0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
17600 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e  pe(Mem *pMem, in
17610 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 75  t file_format, u
17620 33 32 20 2a 70 4c 65 6e 29 7b 0a 20 20 69 6e 74  32 *pLen){.  int
17630 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66   flags = pMem->f
17640 6c 61 67 73 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a  lags;.  u32 n;..
17650 20 20 61 73 73 65 72 74 28 20 70 4c 65 6e 21 3d    assert( pLen!=
17660 30 20 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  0 );.  if( flags
17670 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20  &MEM_Null ){.   
17680 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20   *pLen = 0;.    
17690 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
176a0 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e  if( flags&MEM_In
176b0 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75  t ){.    /* Figu
176c0 72 65 20 6f 75 74 20 77 68 65 74 68 65 72 20 74  re out whether t
176d0 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36  o use 1, 2, 4, 6
176e0 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a   or 8 bytes. */.
176f0 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36  #   define MAX_6
17700 42 59 54 45 20 28 28 28 28 69 36 34 29 30 78 30  BYTE ((((i64)0x0
17710 30 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29  0008000)<<32)-1)
17720 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65  .    i64 i = pMe
17730 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20  m->u.i;.    u64 
17740 75 3b 0a 20 20 20 20 69 66 28 20 69 3c 30 20 29  u;.    if( i<0 )
17750 7b 0a 20 20 20 20 20 20 75 20 3d 20 7e 69 3b 0a  {.      u = ~i;.
17760 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17770 20 75 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20   u = i;.    }.  
17780 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a    if( u<=127 ){.
17790 20 20 20 20 20 20 69 66 28 20 28 69 26 31 29 3d        if( (i&1)=
177a0 3d 69 20 26 26 20 66 69 6c 65 5f 66 6f 72 6d 61  =i && file_forma
177b0 74 3e 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20  t>=4 ){.        
177c0 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  *pLen = 0;.     
177d0 20 20 20 72 65 74 75 72 6e 20 38 2b 28 75 33 32     return 8+(u32
177e0 29 75 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  )u;.      }else{
177f0 0a 20 20 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d  .        *pLen =
17800 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   1;.        retu
17810 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
17820 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 33    }.    if( u<=3
17830 32 37 36 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20  2767 ){ *pLen = 
17840 32 3b 20 72 65 74 75 72 6e 20 32 3b 20 7d 0a 20  2; return 2; }. 
17850 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30     if( u<=838860
17860 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 33 3b 20  7 ){ *pLen = 3; 
17870 72 65 74 75 72 6e 20 33 3b 20 7d 0a 20 20 20 20  return 3; }.    
17880 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34  if( u<=214748364
17890 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 34 3b 20  7 ){ *pLen = 4; 
178a0 72 65 74 75 72 6e 20 34 3b 20 7d 0a 20 20 20 20  return 4; }.    
178b0 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45  if( u<=MAX_6BYTE
178c0 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 36 3b 20 72   ){ *pLen = 6; r
178d0 65 74 75 72 6e 20 35 3b 20 7d 0a 20 20 20 20 2a  eturn 5; }.    *
178e0 70 4c 65 6e 20 3d 20 38 3b 0a 20 20 20 20 72 65  pLen = 8;.    re
178f0 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66  turn 6;.  }.  if
17900 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c  ( flags&MEM_Real
17910 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20   ){.    *pLen = 
17920 38 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b  8;.    return 7;
17930 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
17940 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  Mem->db->mallocF
17950 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26 28  ailed || flags&(
17960 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62  MEM_Str|MEM_Blob
17970 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
17980 4d 65 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e  Mem->n>=0 );.  n
17990 20 3d 20 28 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b   = (u32)pMem->n;
179a0 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d  .  if( flags & M
179b0 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e  EM_Zero ){.    n
179c0 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72   += pMem->u.nZer
179d0 6f 3b 0a 20 20 7d 0a 20 20 2a 70 4c 65 6e 20 3d  o;.  }.  *pLen =
179e0 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e   n;.  return ((n
179f0 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61  *2) + 12 + ((fla
17a00 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29  gs&MEM_Str)!=0))
17a10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
17a20 69 7a 65 73 20 66 6f 72 20 73 65 72 69 61 6c 20  izes for serial 
17a30 74 79 70 65 73 20 6c 65 73 73 20 74 68 61 6e 20  types less than 
17a40 31 32 38 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  128.*/.static co
17a50 6e 73 74 20 75 38 20 73 71 6c 69 74 65 33 53 6d  nst u8 sqlite3Sm
17a60 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 5d 20 3d  allTypeSizes[] =
17a70 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 20 30   {.        /*  0
17a80 20 20 20 31 20 20 20 32 20 20 20 33 20 20 20 34     1   2   3   4
17a90 20 20 20 35 20 20 20 36 20 20 20 37 20 20 20 38     5   6   7   8
17aa0 20 20 20 39 20 2a 2f 20 20 20 0a 2f 2a 20 20 20     9 */   ./*   
17ab0 30 20 2a 2f 20 20 20 30 2c 20 20 31 2c 20 20 32  0 */   0,  1,  2
17ac0 2c 20 20 33 2c 20 20 34 2c 20 20 36 2c 20 20 38  ,  3,  4,  6,  8
17ad0 2c 20 20 38 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a  ,  8,  0,  0,./*
17ae0 20 20 31 30 20 2a 2f 20 20 20 30 2c 20 20 30 2c    10 */   0,  0,
17af0 20 20 30 2c 20 20 30 2c 20 20 31 2c 20 20 31 2c    0,  0,  1,  1,
17b00 20 20 32 2c 20 20 32 2c 20 20 33 2c 20 20 33 2c    2,  2,  3,  3,
17b10 0a 2f 2a 20 20 32 30 20 2a 2f 20 20 20 34 2c 20  ./*  20 */   4, 
17b20 20 34 2c 20 20 35 2c 20 20 35 2c 20 20 36 2c 20   4,  5,  5,  6, 
17b30 20 36 2c 20 20 37 2c 20 20 37 2c 20 20 38 2c 20   6,  7,  7,  8, 
17b40 20 38 2c 0a 2f 2a 20 20 33 30 20 2a 2f 20 20 20   8,./*  30 */   
17b50 39 2c 20 20 39 2c 20 31 30 2c 20 31 30 2c 20 31  9,  9, 10, 10, 1
17b60 31 2c 20 31 31 2c 20 31 32 2c 20 31 32 2c 20 31  1, 11, 12, 12, 1
17b70 33 2c 20 31 33 2c 0a 2f 2a 20 20 34 30 20 2a 2f  3, 13,./*  40 */
17b80 20 20 31 34 2c 20 31 34 2c 20 31 35 2c 20 31 35    14, 14, 15, 15
17b90 2c 20 31 36 2c 20 31 36 2c 20 31 37 2c 20 31 37  , 16, 16, 17, 17
17ba0 2c 20 31 38 2c 20 31 38 2c 0a 2f 2a 20 20 35 30  , 18, 18,./*  50
17bb0 20 2a 2f 20 20 31 39 2c 20 31 39 2c 20 32 30 2c   */  19, 19, 20,
17bc0 20 32 30 2c 20 32 31 2c 20 32 31 2c 20 32 32 2c   20, 21, 21, 22,
17bd0 20 32 32 2c 20 32 33 2c 20 32 33 2c 0a 2f 2a 20   22, 23, 23,./* 
17be0 20 36 30 20 2a 2f 20 20 32 34 2c 20 32 34 2c 20   60 */  24, 24, 
17bf0 32 35 2c 20 32 35 2c 20 32 36 2c 20 32 36 2c 20  25, 25, 26, 26, 
17c00 32 37 2c 20 32 37 2c 20 32 38 2c 20 32 38 2c 0a  27, 27, 28, 28,.
17c10 2f 2a 20 20 37 30 20 2a 2f 20 20 32 39 2c 20 32  /*  70 */  29, 2
17c20 39 2c 20 33 30 2c 20 33 30 2c 20 33 31 2c 20 33  9, 30, 30, 31, 3
17c30 31 2c 20 33 32 2c 20 33 32 2c 20 33 33 2c 20 33  1, 32, 32, 33, 3
17c40 33 2c 0a 2f 2a 20 20 38 30 20 2a 2f 20 20 33 34  3,./*  80 */  34
17c50 2c 20 33 34 2c 20 33 35 2c 20 33 35 2c 20 33 36  , 34, 35, 35, 36
17c60 2c 20 33 36 2c 20 33 37 2c 20 33 37 2c 20 33 38  , 36, 37, 37, 38
17c70 2c 20 33 38 2c 0a 2f 2a 20 20 39 30 20 2a 2f 20  , 38,./*  90 */ 
17c80 20 33 39 2c 20 33 39 2c 20 34 30 2c 20 34 30 2c   39, 39, 40, 40,
17c90 20 34 31 2c 20 34 31 2c 20 34 32 2c 20 34 32 2c   41, 41, 42, 42,
17ca0 20 34 33 2c 20 34 33 2c 0a 2f 2a 20 31 30 30 20   43, 43,./* 100 
17cb0 2a 2f 20 20 34 34 2c 20 34 34 2c 20 34 35 2c 20  */  44, 44, 45, 
17cc0 34 35 2c 20 34 36 2c 20 34 36 2c 20 34 37 2c 20  45, 46, 46, 47, 
17cd0 34 37 2c 20 34 38 2c 20 34 38 2c 0a 2f 2a 20 31  47, 48, 48,./* 1
17ce0 31 30 20 2a 2f 20 20 34 39 2c 20 34 39 2c 20 35  10 */  49, 49, 5
17cf0 30 2c 20 35 30 2c 20 35 31 2c 20 35 31 2c 20 35  0, 50, 51, 51, 5
17d00 32 2c 20 35 32 2c 20 35 33 2c 20 35 33 2c 0a 2f  2, 52, 53, 53,./
17d10 2a 20 31 32 30 20 2a 2f 20 20 35 34 2c 20 35 34  * 120 */  54, 54
17d20 2c 20 35 35 2c 20 35 35 2c 20 35 36 2c 20 35 36  , 55, 55, 56, 56
17d30 2c 20 35 37 2c 20 35 37 0a 7d 3b 0a 0a 2f 2a 0a  , 57, 57.};../*.
17d40 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65  ** Return the le
17d50 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 61  ngth of the data
17d60 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
17d70 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 73  o the supplied s
17d80 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75  erial-type..*/.u
17d90 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
17da0 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20  rialTypeLen(u32 
17db0 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20  serial_type){.  
17dc0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
17dd0 3d 31 32 38 20 29 7b 0a 20 20 20 20 72 65 74 75  =128 ){.    retu
17de0 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d  rn (serial_type-
17df0 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a  12)/2;.  }else{.
17e00 20 20 20 20 61 73 73 65 72 74 28 20 73 65 72 69      assert( seri
17e10 61 6c 5f 74 79 70 65 3c 31 32 20 0a 20 20 20 20  al_type<12 .    
17e20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
17e30 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73  e3SmallTypeSizes
17e40 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3d 3d 28  [serial_type]==(
17e50 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32  serial_type - 12
17e60 29 2f 32 20 29 3b 0a 20 20 20 20 72 65 74 75 72  )/2 );.    retur
17e70 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79  n sqlite3SmallTy
17e80 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74  peSizes[serial_t
17e90 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 75 38 20 73  ype];.  }.}.u8 s
17ea0 71 6c 69 74 65 33 56 64 62 65 4f 6e 65 42 79 74  qlite3VdbeOneByt
17eb0 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75  eSerialTypeLen(u
17ec0 38 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a  8 serial_type){.
17ed0 20 20 61 73 73 65 72 74 28 20 73 65 72 69 61 6c    assert( serial
17ee0 5f 74 79 70 65 3c 31 32 38 20 29 3b 0a 20 20 72  _type<128 );.  r
17ef0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 6d 61  eturn sqlite3Sma
17f00 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69  llTypeSizes[seri
17f10 61 6c 5f 74 79 70 65 5d 3b 20 20 0a 7d 0a 0a 2f  al_type];  .}../
17f20 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f  *.** If we are o
17f30 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74 75 72  n an architectur
17f40 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64  e with mixed-end
17f50 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a  ian floating .**
17f60 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d   points (ex: ARM
17f70 37 29 20 74 68 65 6e 20 73 77 61 70 20 74 68 65  7) then swap the
17f80 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20 77   lower 4 bytes w
17f90 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65  ith the .** uppe
17fa0 72 20 34 20 62 79 74 65 73 2e 20 20 52 65 74 75  r 4 bytes.  Retu
17fb0 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  rn the result..*
17fc0 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72  *.** For most ar
17fd0 63 68 69 74 65 63 74 75 72 65 73 2c 20 74 68 69  chitectures, thi
17fe0 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s is a no-op..**
17ff0 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74  .** (later):  It
18000 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20   is reported to 
18010 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69 78 65  me that the mixe
18020 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d  d-endian problem
18030 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61  .** on ARM7 is a
18040 6e 20 69 73 73 75 65 20 77 69 74 68 20 47 43 43  n issue with GCC
18050 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41  , not with the A
18060 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73 65  RM7 chip.  It se
18070 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c  ems.** that earl
18080 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  y versions of GC
18090 43 20 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f  C stored the two
180a0 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62   words of a 64-b
180b0 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74  it.** float in t
180c0 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20  he wrong order. 
180d0 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20   And that error 
180e0 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61  has been propaga
180f0 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63  ted.** ever sinc
18100 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73  e.  The blame is
18110 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
18120 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67   with GCC, thoug
18130 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20  h..** GCC might 
18140 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e  have just copyin
18150 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72  g the problem fr
18160 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69  om a prior compi
18170 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73  ler..** I am als
18180 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65  o told that newe
18190 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  r versions of GC
181a0 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20  C that follow a 
181b0 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49  different.** ABI
181c0 20 67 65 74 20 74 68 65 20 62 79 74 65 20 6f 72   get the byte or
181d0 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a  der right..**.**
181e0 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e   Developers usin
181f0 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41  g SQLite on an A
18200 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69  RM7 should compi
18210 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72  le and run their
18220 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  .** application 
18230 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44  using -DSQLITE_D
18240 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20  EBUG=1 at least 
18250 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42 55  once.  With DEBU
18260 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f  G.** enabled, so
18270 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77  me asserts below
18280 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61   will ensure tha
18290 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72  t the byte order
182a0 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20   of.** floating 
182b0 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20  point values is 
182c0 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28  correct..**.** (
182d0 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61  2007-08-30)  Fra
182e0 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73 20  nk van Vugt has 
182f0 73 74 75 64 69 65 64 20 74 68 69 73 20 70 72 6f  studied this pro
18300 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20  blem closely.** 
18310 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69 73  and has send his
18320 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65   findings to the
18330 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65   SQLite develope
18340 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72  rs.  Frank.** wr
18350 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c  ites that some L
18360 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66  inux kernels off
18370 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  er floating poin
18380 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d  t hardware.** em
18390 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65  ulation that use
183a0 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61  s only 32-bit ma
183b0 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61 64 20  ntissas instead 
183c0 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38  of a full .** 48
183d0 2d 62 69 74 73 20 61 73 20 72 65 71 75 69 72 65  -bits as require
183e0 64 20 62 79 20 74 68 65 20 49 45 45 45 20 73 74  d by the IEEE st
183f0 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20 69  andard.  (This i
18400 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f  s the.** CONFIG_
18410 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69  FPE_FASTFPE opti
18420 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79  on.)  On such sy
18430 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20  stems, floating 
18440 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77  point.** byte sw
18450 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76  apping becomes v
18460 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e  ery complicated.
18470 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c    To avoid probl
18480 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65  ems,.** the nece
18490 73 73 61 72 79 20 62 79 74 65 20 73 77 61 70 70  ssary byte swapp
184a0 69 6e 67 20 69 73 20 63 61 72 72 69 65 64 20 6f  ing is carried o
184b0 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69  ut using a 64-bi
184c0 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74  t integer.** rat
184d0 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69  her than a 64-bi
184e0 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20  t float.  Frank 
184f0 61 73 73 75 72 65 73 20 75 73 20 74 68 61 74 20  assures us that 
18500 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a  the code here.**
18510 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20   works for him. 
18520 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70   We, the develop
18530 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79  ers, have no way
18540 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c   to independentl
18550 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73  y.** verify this
18560 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d  , but Frank seem
18570 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68  s to know what h
18580 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f  e is talking abo
18590 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73  ut.** so we trus
185a0 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66  t him..*/.#ifdef
185b0 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e   SQLITE_MIXED_EN
185c0 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54  DIAN_64BIT_FLOAT
185d0 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61  .static u64 floa
185e0 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20  tSwap(u64 in){. 
185f0 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34   union {.    u64
18600 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d   r;.    u32 i[2]
18610 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74  ;.  } u;.  u32 t
18620 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20  ;..  u.r = in;. 
18630 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75   t = u.i[0];.  u
18640 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a  .i[0] = u.i[1];.
18650 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20    u.i[1] = t;.  
18660 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20  return u.r;.}.# 
18670 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64  define swapMixed
18680 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20  EndianFloat(X)  
18690 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29  X = floatSwap(X)
186a0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
186b0 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
186c0 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a  loat(X).#endif..
186d0 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
186e0 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20  serialized data 
186f0 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c  blob for the val
18700 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65  ue stored in pMe
18710 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20  m into .** buf. 
18720 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
18730 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
18740 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66  s allocated suff
18750 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a  icient space..**
18760 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
18770 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74  er of bytes writ
18780 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20  ten..**.** nBuf 
18790 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  is the amount of
187a0 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62   space left in b
187b0 75 66 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c 65  uf[].  The calle
187c0 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
187d0 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69  .** for allocati
187e0 6e 67 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  ng enough space 
187f0 74 6f 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c 64  to buf[] to hold
18800 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c   the entire fiel
18810 64 2c 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  d, exclusive.** 
18820 6f 66 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e  of the pMem->u.n
18830 5a 65 72 6f 20 62 79 74 65 73 20 66 6f 72 20 61  Zero bytes for a
18840 20 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65 2e   MEM_Zero value.
18850 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
18860 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
18870 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74  s actually writt
18880 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20  en into buf[].  
18890 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  The number.** of
188a0 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65   bytes in the ze
188b0 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69  ro-filled tail i
188c0 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  s included in th
188d0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
188e0 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20  nly.** if those 
188f0 62 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65  bytes were zeroe
18900 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a  d in buf[]..*/ .
18910 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
18920 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66  erialPut(u8 *buf
18930 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33 32  , Mem *pMem, u32
18940 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20   serial_type){. 
18950 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20   u32 len;..  /* 
18960 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c  Integer and Real
18970 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
18980 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69  _type<=7 && seri
18990 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20  al_type>0 ){.   
189a0 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20   u64 v;.    u32 
189b0 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61  i;.    if( seria
189c0 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20  l_type==7 ){.   
189d0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
189e0 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65  f(v)==sizeof(pMe
189f0 6d 2d 3e 75 2e 72 29 20 29 3b 0a 20 20 20 20 20  m->u.r) );.     
18a00 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65   memcpy(&v, &pMe
18a10 6d 2d 3e 75 2e 72 2c 20 73 69 7a 65 6f 66 28 76  m->u.r, sizeof(v
18a20 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69  ));.      swapMi
18a30 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76  xedEndianFloat(v
18a40 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
18a50 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e      v = pMem->u.
18a60 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e  i;.    }.    len
18a70 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 53 6d   = i = sqlite3Sm
18a80 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72  allTypeSizes[ser
18a90 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 20 20 61  ial_type];.    a
18aa0 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20  ssert( i>0 );.  
18ab0 20 20 64 6f 7b 0a 20 20 20 20 20 20 62 75 66 5b    do{.      buf[
18ac0 2d 2d 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78  --i] = (u8)(v&0x
18ad0 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d  FF);.      v >>=
18ae0 20 38 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20   8;.    }while( 
18af0 69 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  i );.    return 
18b00 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  len;.  }..  /* S
18b10 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f  tring or blob */
18b20 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
18b30 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73  pe>=12 ){.    as
18b40 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20  sert( pMem->n + 
18b50 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ((pMem->flags & 
18b60 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e  MEM_Zero)?pMem->
18b70 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20  u.nZero:0).     
18b80 20 20 20 20 20 20 20 20 3d 3d 20 28 69 6e 74 29          == (int)
18b90 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
18ba0 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
18bb0 74 79 70 65 29 20 29 3b 0a 20 20 20 20 6c 65 6e  type) );.    len
18bc0 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20   = pMem->n;.    
18bd0 69 66 28 20 6c 65 6e 3e 30 20 29 20 6d 65 6d 63  if( len>0 ) memc
18be0 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c  py(buf, pMem->z,
18bf0 20 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72   len);.    retur
18c00 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  n len;.  }..  /*
18c10 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e   NULL or constan
18c20 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72  ts 0 or 1 */.  r
18c30 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49  eturn 0;.}../* I
18c40 6e 70 75 74 20 22 78 22 20 69 73 20 61 20 73 65  nput "x" is a se
18c50 71 75 65 6e 63 65 20 6f 66 20 75 6e 73 69 67 6e  quence of unsign
18c60 65 64 20 63 68 61 72 61 63 74 65 72 73 20 74 68  ed characters th
18c70 61 74 20 72 65 70 72 65 73 65 6e 74 20 61 0a 2a  at represent a.*
18c80 2a 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  * big-endian int
18c90 65 67 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68  eger.  Return th
18ca0 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6e 61 74  e equivalent nat
18cb0 69 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 23  ive integer.*/.#
18cc0 64 65 66 69 6e 65 20 4f 4e 45 5f 42 59 54 45 5f  define ONE_BYTE_
18cd0 49 4e 54 28 78 29 20 20 20 20 28 28 69 38 29 28  INT(x)    ((i8)(
18ce0 78 29 5b 30 5d 29 0a 23 64 65 66 69 6e 65 20 54  x)[0]).#define T
18cf0 57 4f 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20  WO_BYTE_INT(x)  
18d00 20 20 28 32 35 36 2a 28 69 38 29 28 28 78 29 5b    (256*(i8)((x)[
18d10 30 5d 29 7c 28 78 29 5b 31 5d 29 0a 23 64 65 66  0])|(x)[1]).#def
18d20 69 6e 65 20 54 48 52 45 45 5f 42 59 54 45 5f 49  ine THREE_BYTE_I
18d30 4e 54 28 78 29 20 20 28 36 35 35 33 36 2a 28 69  NT(x)  (65536*(i
18d40 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b  8)((x)[0])|((x)[
18d50 31 5d 3c 3c 38 29 7c 28 78 29 5b 32 5d 29 0a 23  1]<<8)|(x)[2]).#
18d60 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45  define FOUR_BYTE
18d70 5f 55 49 4e 54 28 78 29 20 20 28 28 28 75 33 32  _UINT(x)  (((u32
18d80 29 28 78 29 5b 30 5d 3c 3c 32 34 29 7c 28 28 78  )(x)[0]<<24)|((x
18d90 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32  )[1]<<16)|((x)[2
18da0 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 23 64  ]<<8)|(x)[3]).#d
18db0 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f  efine FOUR_BYTE_
18dc0 49 4e 54 28 78 29 20 28 31 36 37 37 37 32 31 36  INT(x) (16777216
18dd0 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28  *(i8)((x)[0])|((
18de0 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b  x)[1]<<16)|((x)[
18df0 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 0a  2]<<8)|(x)[3])..
18e00 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a  /*.** Deserializ
18e10 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20  e the data blob 
18e20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75  pointed to by bu
18e30 66 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65  f as serial type
18e40 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20   serial_type.** 
18e50 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
18e60 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52  sult in pMem.  R
18e70 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
18e80 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a   of bytes read..
18e90 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
18ea0 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
18eb0 65 64 20 61 73 20 74 77 6f 20 73 65 70 61 72 61  ed as two separa
18ec0 74 65 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20  te routines for 
18ed0 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20  performance..** 
18ee0 54 68 65 20 66 65 77 20 63 61 73 65 73 20 74 68  The few cases th
18ef0 61 74 20 72 65 71 75 69 72 65 20 6c 6f 63 61 6c  at require local
18f00 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 62   variables are b
18f10 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 61  roken out into a
18f20 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 72 6f 75   separate.** rou
18f30 74 69 6e 65 20 73 6f 20 74 68 61 74 20 69 6e 20  tine so that in 
18f40 6d 6f 73 74 20 63 61 73 65 73 20 74 68 65 20 6f  most cases the o
18f50 76 65 72 68 65 61 64 20 6f 66 20 6d 6f 76 69 6e  verhead of movin
18f60 67 20 74 68 65 20 73 74 61 63 6b 20 70 6f 69 6e  g the stack poin
18f70 74 65 72 0a 2a 2a 20 69 73 20 61 76 6f 69 64 65  ter.** is avoide
18f80 64 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 75 33  d..*/ .static u3
18f90 32 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  2 SQLITE_NOINLIN
18fa0 45 20 73 65 72 69 61 6c 47 65 74 28 0a 20 20 63  E serialGet(.  c
18fb0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
18fc0 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20  ar *buf,     /* 
18fd0 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69  Buffer to deseri
18fe0 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20  alize from */.  
18ff0 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  u32 serial_type,
19000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19010 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20   Serial type to 
19020 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20  deserialize */. 
19030 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20   Mem *pMem      
19040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19050 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f  * Memory cell to
19060 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74   write value int
19070 6f 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 78 20  o */.){.  u64 x 
19080 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
19090 28 62 75 66 29 3b 0a 20 20 75 33 32 20 79 20 3d  (buf);.  u32 y =
190a0 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
190b0 62 75 66 2b 34 29 3b 0a 20 20 78 20 3d 20 28 78  buf+4);.  x = (x
190c0 3c 3c 33 32 29 20 2b 20 79 3b 0a 20 20 69 66 28  <<32) + y;.  if(
190d0 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20   serial_type==6 
190e0 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  ){.    /* EVIDEN
190f0 43 45 2d 4f 46 3a 20 52 2d 32 39 38 35 31 2d 35  CE-OF: R-29851-5
19100 32 32 37 32 20 56 61 6c 75 65 20 69 73 20 61 20  2272 Value is a 
19110 62 69 67 2d 65 6e 64 69 61 6e 20 36 34 2d 62 69  big-endian 64-bi
19120 74 0a 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f  t.    ** twos-co
19130 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72  mplement integer
19140 2e 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  . */.    pMem->u
19150 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a  .i = *(i64*)&x;.
19160 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
19170 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 74  = MEM_Int;.    t
19180 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
19190 2e 69 3c 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  .i<0 );.  }else{
191a0 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
191b0 2d 4f 46 3a 20 52 2d 35 37 33 34 33 2d 34 39 31  -OF: R-57343-491
191c0 31 34 20 56 61 6c 75 65 20 69 73 20 61 20 62 69  14 Value is a bi
191d0 67 2d 65 6e 64 69 61 6e 20 49 45 45 45 20 37 35  g-endian IEEE 75
191e0 34 2d 32 30 30 38 20 36 34 2d 62 69 74 0a 20 20  4-2008 64-bit.  
191f0 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f    ** floating po
19200 69 6e 74 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 23  int number. */.#
19210 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
19220 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  UG) && !defined(
19230 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
19240 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20  TING_POINT).    
19250 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 69  /* Verify that i
19260 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61  ntegers and floa
19270 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
19280 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20  s use the same. 
19290 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72     ** byte order
192a0 2e 20 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53  .  Or, that if S
192b0 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49  QLITE_MIXED_ENDI
192c0 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69  AN_64BIT_FLOAT i
192d0 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64  s.    ** defined
192e0 20 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f   that 64-bit flo
192f0 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
19300 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69  es really are mi
19310 78 65 64 0a 20 20 20 20 2a 2a 20 65 6e 64 69 61  xed.    ** endia
19320 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  n..    */.    st
19330 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74  atic const u64 t
19340 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30  1 = ((u64)0x3ff0
19350 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 73  0000)<<32;.    s
19360 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 62  tatic const doub
19370 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20  le r1 = 1.0;.   
19380 20 75 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 20   u64 t2 = t1;.  
19390 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
193a0 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20 20  nFloat(t2);.    
193b0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72  assert( sizeof(r
193c0 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26  1)==sizeof(t2) &
193d0 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74  & memcmp(&r1, &t
193e0 32 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d  2, sizeof(r1))==
193f0 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  0 );.#endif.    
19400 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78  assert( sizeof(x
19410 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70  )==8 && sizeof(p
19420 4d 65 6d 2d 3e 75 2e 72 29 3d 3d 38 20 29 3b 0a  Mem->u.r)==8 );.
19430 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
19440 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20  ianFloat(x);.   
19450 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 75   memcpy(&pMem->u
19460 2e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78  .r, &x, sizeof(x
19470 29 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ));.    pMem->fl
19480 61 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e  ags = sqlite3IsN
19490 61 4e 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 3f 20  aN(pMem->u.r) ? 
194a0 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52  MEM_Null : MEM_R
194b0 65 61 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eal;.  }.  retur
194c0 6e 20 38 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74  n 8;.}.u32 sqlit
194d0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
194e0 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
194f0 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20  d char *buf,    
19500 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65   /* Buffer to de
19510 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a  serialize from *
19520 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74  /.  u32 serial_t
19530 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
19540 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
19550 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
19560 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20  */.  Mem *pMem  
19570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19580 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
19590 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65  l to write value
195a0 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77   into */.){.  sw
195b0 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70  itch( serial_typ
195c0 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30  e ){.    case 10
195d0 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20  :   /* Reserved 
195e0 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a  for future use *
195f0 2f 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 20  /.    case 11:  
19600 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72   /* Reserved for
19610 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20   future use */. 
19620 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a     case 0: {  /*
19630 20 4e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 2f   Null */.      /
19640 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
19650 2d 32 34 30 37 38 2d 30 39 33 37 35 20 56 61 6c  -24078-09375 Val
19660 75 65 20 69 73 20 61 20 4e 55 4c 4c 2e 20 2a 2f  ue is a NULL. */
19670 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
19680 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
19690 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
196a0 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 0a  }.    case 1: {.
196b0 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
196c0 45 2d 4f 46 3a 20 52 2d 34 34 38 38 35 2d 32 35  E-OF: R-44885-25
196d0 31 39 36 20 56 61 6c 75 65 20 69 73 20 61 6e 20  196 Value is an 
196e0 38 2d 62 69 74 20 74 77 6f 73 2d 63 6f 6d 70 6c  8-bit twos-compl
196f0 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 69  ement.      ** i
19700 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20  nteger. */.     
19710 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45   pMem->u.i = ONE
19720 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
19730 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
19740 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
19750 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
19760 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
19770 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
19780 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20  }.    case 2: { 
19790 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 2-byte signed
197a0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
197b0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
197c0 3a 20 52 2d 34 39 37 39 34 2d 33 35 30 32 36 20  : R-49794-35026 
197d0 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65  Value is a big-e
197e0 6e 64 69 61 6e 20 31 36 2d 62 69 74 0a 20 20 20  ndian 16-bit.   
197f0 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c     ** twos-compl
19800 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a  ement integer. *
19810 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
19820 69 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54  i = TWO_BYTE_INT
19830 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65  (buf);.      pMe
19840 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
19850 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  nt;.      testca
19860 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20  se( pMem->u.i<0 
19870 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
19880 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  2;.    }.    cas
19890 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65  e 3: { /* 3-byte
198a0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
198b0 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  */.      /* EVID
198c0 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 38 33 39  ENCE-OF: R-37839
198d0 2d 35 34 33 30 31 20 56 61 6c 75 65 20 69 73 20  -54301 Value is 
198e0 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 32 34 2d  a big-endian 24-
198f0 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f  bit.      ** two
19900 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74  s-complement int
19910 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70  eger. */.      p
19920 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 48 52 45 45  Mem->u.i = THREE
19930 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
19940 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
19950 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
19960 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
19970 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
19980 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20    return 3;.    
19990 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20  }.    case 4: { 
199a0 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 4-byte signed
199b0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
199c0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
199d0 3a 20 52 2d 30 31 38 34 39 2d 32 36 30 37 39 20  : R-01849-26079 
199e0 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65  Value is a big-e
199f0 6e 64 69 61 6e 20 33 32 2d 62 69 74 0a 20 20 20  ndian 32-bit.   
19a00 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c     ** twos-compl
19a10 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a  ement integer. *
19a20 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
19a30 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e  i = FOUR_BYTE_IN
19a40 54 28 62 75 66 29 3b 0a 23 69 66 64 65 66 20 5f  T(buf);.#ifdef _
19a50 5f 48 50 5f 63 63 20 0a 20 20 20 20 20 20 2f 2a  _HP_cc .      /*
19a60 20 57 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 73   Work around a s
19a70 69 67 6e 2d 65 78 74 65 6e 73 69 6f 6e 20 62 75  ign-extension bu
19a80 67 20 69 6e 20 74 68 65 20 48 50 20 63 6f 6d 70  g in the HP comp
19a90 69 6c 65 72 20 66 6f 72 20 48 50 2f 55 58 20 2a  iler for HP/UX *
19aa0 2f 0a 20 20 20 20 20 20 69 66 28 20 62 75 66 5b  /.      if( buf[
19ab0 30 5d 26 30 78 38 30 20 29 20 70 4d 65 6d 2d 3e  0]&0x80 ) pMem->
19ac0 75 2e 69 20 7c 3d 20 30 78 66 66 66 66 66 66 66  u.i |= 0xfffffff
19ad0 66 38 30 30 30 30 30 30 30 4c 4c 3b 0a 23 65 6e  f80000000LL;.#en
19ae0 64 69 66 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  dif.      pMem->
19af0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
19b00 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19b10 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
19b20 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a        return 4;.
19b30 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35      }.    case 5
19b40 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69  : { /* 6-byte si
19b50 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
19b60 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
19b70 45 2d 4f 46 3a 20 52 2d 35 30 33 38 35 2d 30 39  E-OF: R-50385-09
19b80 36 37 34 20 56 61 6c 75 65 20 69 73 20 61 20 62  674 Value is a b
19b90 69 67 2d 65 6e 64 69 61 6e 20 34 38 2d 62 69 74  ig-endian 48-bit
19ba0 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63  .      ** twos-c
19bb0 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65  omplement intege
19bc0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  r. */.      pMem
19bd0 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54  ->u.i = FOUR_BYT
19be0 45 5f 55 49 4e 54 28 62 75 66 2b 32 29 20 2b 20  E_UINT(buf+2) + 
19bf0 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54  (((i64)1)<<32)*T
19c00 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29  WO_BYTE_INT(buf)
19c10 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
19c20 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
19c30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
19c40 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20  Mem->u.i<0 );.  
19c50 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20      return 6;.  
19c60 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20    }.    case 6: 
19c70 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e    /* 8-byte sign
19c80 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
19c90 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49    case 7: { /* I
19ca0 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  EEE floating poi
19cb0 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 54  nt */.      /* T
19cc0 68 65 73 65 20 75 73 65 20 6c 6f 63 61 6c 20 76  hese use local v
19cd0 61 72 69 61 62 6c 65 73 2c 20 73 6f 20 64 6f 20  ariables, so do 
19ce0 74 68 65 6d 20 69 6e 20 61 20 73 65 70 61 72 61  them in a separa
19cf0 74 65 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 20  te routine.     
19d00 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 68 61 76   ** to avoid hav
19d10 69 6e 67 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  ing to move the 
19d20 66 72 61 6d 65 20 70 6f 69 6e 74 65 72 20 69 6e  frame pointer in
19d30 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
19d40 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
19d50 20 73 65 72 69 61 6c 47 65 74 28 62 75 66 2c 73   serialGet(buf,s
19d60 65 72 69 61 6c 5f 74 79 70 65 2c 70 4d 65 6d 29  erial_type,pMem)
19d70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
19d80 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65   8:    /* Intege
19d90 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  r 0 */.    case 
19da0 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72  9: {  /* Integer
19db0 20 31 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45   1 */.      /* E
19dc0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 32  VIDENCE-OF: R-12
19dd0 39 37 36 2d 32 32 38 39 33 20 56 61 6c 75 65 20  976-22893 Value 
19de0 69 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 30  is the integer 0
19df0 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  . */.      /* EV
19e00 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 31  IDENCE-OF: R-181
19e10 34 33 2d 31 32 31 32 31 20 56 61 6c 75 65 20 69  43-12121 Value i
19e20 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 31 2e  s the integer 1.
19e30 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
19e40 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70  u.i = serial_typ
19e50 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  e-8;.      pMem-
19e60 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
19e70 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
19e80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
19e90 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ult: {.      /* 
19ea0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
19eb0 34 36 30 36 2d 33 31 35 36 34 20 56 61 6c 75 65  4606-31564 Value
19ec0 20 69 73 20 61 20 42 4c 4f 42 20 74 68 61 74 20   is a BLOB that 
19ed0 69 73 20 28 4e 2d 31 32 29 2f 32 20 62 79 74 65  is (N-12)/2 byte
19ee0 73 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65  s in.      ** le
19ef0 6e 67 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20 45  ngth..      ** E
19f00 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38  VIDENCE-OF: R-28
19f10 34 30 31 2d 30 30 31 34 30 20 56 61 6c 75 65 20  401-00140 Value 
19f20 69 73 20 61 20 73 74 72 69 6e 67 20 69 6e 20 74  is a string in t
19f30 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  he text encoding
19f40 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 4e   and.      ** (N
19f50 2d 31 33 29 2f 32 20 62 79 74 65 73 20 69 6e 20  -13)/2 bytes in 
19f60 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 20 20 20  length. */.     
19f70 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31   static const u1
19f80 36 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45  6 aFlag[] = { ME
19f90 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d  M_Blob|MEM_Ephem
19fa0 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70  , MEM_Str|MEM_Ep
19fb0 68 65 6d 20 7d 3b 0a 20 20 20 20 20 20 70 4d 65  hem };.      pMe
19fc0 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62  m->z = (char *)b
19fd0 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  uf;.      pMem->
19fe0 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  n = (serial_type
19ff0 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d  -12)/2;.      pM
1a000 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61  em->flags = aFla
1a010 67 5b 73 65 72 69 61 6c 5f 74 79 70 65 26 31 5d  g[serial_type&1]
1a020 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
1a030 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20  Mem->n;.    }.  
1a040 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1a050 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1a060 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c  ne is used to al
1a070 6c 6f 63 61 74 65 20 73 75 66 66 69 63 69 65 6e  locate sufficien
1a080 74 20 73 70 61 63 65 20 66 6f 72 20 61 6e 20 55  t space for an U
1a090 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a  npackedRecord.**
1a0a0 20 73 74 72 75 63 74 75 72 65 20 6c 61 72 67 65   structure large
1a0b0 20 65 6e 6f 75 67 68 20 74 6f 20 62 65 20 75 73   enough to be us
1a0c0 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 56  ed with sqlite3V
1a0d0 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
1a0e0 29 20 69 66 0a 2a 2a 20 74 68 65 20 66 69 72 73  ) if.** the firs
1a0f0 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
1a100 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e  pointer to KeyIn
1a110 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 4b 65  fo structure pKe
1a120 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  yInfo..**.** The
1a130 20 73 70 61 63 65 20 69 73 20 65 69 74 68 65 72   space is either
1a140 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67   allocated using
1a150 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1a160 52 61 77 28 29 20 6f 72 20 66 72 6f 6d 20 77 69  Raw() or from wi
1a170 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c  thin.** the unal
1a180 69 67 6e 65 64 20 62 75 66 66 65 72 20 70 61 73  igned buffer pas
1a190 73 65 64 20 76 69 61 20 74 68 65 20 73 65 63 6f  sed via the seco
1a1a0 6e 64 20 61 6e 64 20 74 68 69 72 64 20 61 72 67  nd and third arg
1a1b0 75 6d 65 6e 74 73 20 28 70 72 65 73 75 6d 61 62  uments (presumab
1a1c0 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61 63  ly.** stack spac
1a1d0 65 29 2e 20 49 66 20 74 68 65 20 66 6f 72 6d 65  e). If the forme
1a1e0 72 2c 20 74 68 65 6e 20 2a 70 70 46 72 65 65 20  r, then *ppFree 
1a1f0 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 69 6e  is set to a poin
1a200 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64 0a  ter that should.
1a210 2a 2a 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79  ** be eventually
1a220 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
1a230 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74  ller using sqlit
1a240 65 33 44 62 46 72 65 65 28 29 2e 20 4f 72 2c 20  e3DbFree(). Or, 
1a250 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63  if the .** alloc
1a260 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d  ation comes from
1a270 20 74 68 65 20 70 53 70 61 63 65 2f 73 7a 53 70   the pSpace/szSp
1a280 61 63 65 20 62 75 66 66 65 72 2c 20 2a 70 70 46  ace buffer, *ppF
1a290 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55  ree is set to NU
1a2a0 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74  LL.** before ret
1a2b0 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
1a2c0 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63   an OOM error oc
1a2d0 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65  curs, NULL is re
1a2e0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63  turned..*/.Unpac
1a2f0 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74  kedRecord *sqlit
1a300 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63  e3VdbeAllocUnpac
1a310 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 4b 65 79  kedRecord(.  Key
1a320 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
1a330 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a340 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  Description of t
1a350 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63  he record */.  c
1a360 68 61 72 20 2a 70 53 70 61 63 65 2c 20 20 20 20  har *pSpace,    
1a370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a380 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73 70 61 63  * Unaligned spac
1a390 65 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20  e available */. 
1a3a0 20 69 6e 74 20 73 7a 53 70 61 63 65 2c 20 20 20   int szSpace,   
1a3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3c0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53 70 61   /* Size of pSpa
1a3d0 63 65 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f  ce[] in bytes */
1a3e0 0a 20 20 63 68 61 72 20 2a 2a 70 70 46 72 65 65  .  char **ppFree
1a3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a400 20 20 20 2f 2a 20 4f 55 54 3a 20 43 61 6c 6c 65     /* OUT: Calle
1a410 72 20 73 68 6f 75 6c 64 20 66 72 65 65 20 74 68  r should free th
1a420 69 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 29 7b  is pointer */.){
1a430 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
1a440 64 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  d *p;           
1a450 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72     /* Unpacked r
1a460 65 63 6f 72 64 20 74 6f 20 72 65 74 75 72 6e 20  ecord to return 
1a470 2a 2f 0a 20 20 69 6e 74 20 6e 4f 66 66 3b 20 20  */.  int nOff;  
1a480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a490 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e       /* Incremen
1a4a0 74 20 70 53 70 61 63 65 20 62 79 20 6e 4f 66 66  t pSpace by nOff
1a4b0 20 74 6f 20 61 6c 69 67 6e 20 69 74 20 2a 2f 0a   to align it */.
1a4c0 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
1a4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
1a4f0 79 74 65 73 20 72 65 71 75 69 72 65 64 20 66 6f  ytes required fo
1a500 72 20 2a 70 20 2a 2f 0a 0a 20 20 2f 2a 20 57 65  r *p */..  /* We
1a510 20 77 61 6e 74 20 74 6f 20 73 68 69 66 74 20 74   want to shift t
1a520 68 65 20 70 6f 69 6e 74 65 72 20 70 53 70 61 63  he pointer pSpac
1a530 65 20 75 70 20 73 75 63 68 20 74 68 61 74 20 69  e up such that i
1a540 74 20 69 73 20 38 2d 62 79 74 65 20 61 6c 69 67  t is 8-byte alig
1a550 6e 65 64 2e 0a 20 20 2a 2a 20 54 68 75 73 2c 20  ned..  ** Thus, 
1a560 77 65 20 6e 65 65 64 20 74 6f 20 63 61 6c 63 75  we need to calcu
1a570 6c 61 74 65 20 61 20 76 61 6c 75 65 2c 20 6e 4f  late a value, nO
1a580 66 66 2c 20 62 65 74 77 65 65 6e 20 30 20 61 6e  ff, between 0 an
1a590 64 20 37 2c 20 74 6f 20 73 68 69 66 74 20 0a 20  d 7, to shift . 
1a5a0 20 2a 2a 20 69 74 20 62 79 2e 20 20 49 66 20 70   ** it by.  If p
1a5b0 53 70 61 63 65 20 69 73 20 61 6c 72 65 61 64 79  Space is already
1a5c0 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2c   8-byte aligned,
1a5d0 20 6e 4f 66 66 20 73 68 6f 75 6c 64 20 62 65 20   nOff should be 
1a5e0 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66  zero..  */.  nOf
1a5f0 66 20 3d 20 28 38 20 2d 20 28 53 51 4c 49 54 45  f = (8 - (SQLITE
1a600 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 53 70 61  _PTR_TO_INT(pSpa
1a610 63 65 29 20 26 20 37 29 29 20 26 20 37 3b 0a 20  ce) & 7)) & 7;. 
1a620 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28   nByte = ROUND8(
1a630 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52  sizeof(UnpackedR
1a640 65 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f 66  ecord)) + sizeof
1a650 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d  (Mem)*(pKeyInfo-
1a660 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20 69 66  >nField+1);.  if
1a670 28 20 6e 42 79 74 65 3e 73 7a 53 70 61 63 65 2b  ( nByte>szSpace+
1a680 6e 4f 66 66 20 29 7b 0a 20 20 20 20 70 20 3d 20  nOff ){.    p = 
1a690 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20  (UnpackedRecord 
1a6a0 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
1a6b0 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64  cRaw(pKeyInfo->d
1a6c0 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 2a  b, nByte);.    *
1a6d0 70 70 46 72 65 65 20 3d 20 28 63 68 61 72 20 2a  ppFree = (char *
1a6e0 29 70 3b 0a 20 20 20 20 69 66 28 20 21 70 20 29  )p;.    if( !p )
1a6f0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
1a700 73 65 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70  se{.    p = (Unp
1a710 61 63 6b 65 64 52 65 63 6f 72 64 2a 29 26 70 53  ackedRecord*)&pS
1a720 70 61 63 65 5b 6e 4f 66 66 5d 3b 0a 20 20 20 20  pace[nOff];.    
1a730 2a 70 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d  *ppFree = 0;.  }
1a740 0a 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d  ..  p->aMem = (M
1a750 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70 29 5b  em*)&((char*)p)[
1a760 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e  ROUND8(sizeof(Un
1a770 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b  packedRecord))];
1a780 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49  .  assert( pKeyI
1a790 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21  nfo->aSortOrder!
1a7a0 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49  =0 );.  p->pKeyI
1a7b0 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
1a7c0 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b    p->nField = pK
1a7d0 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b  eyInfo->nField +
1a7e0 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a   1;.  return p;.
1a7f0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
1a800 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63  he nKey-byte enc
1a810 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72  oding of a recor
1a820 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70  d in pKey[], pop
1a830 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e  ulate the .** Un
1a840 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72  packedRecord str
1a850 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64  ucture indicated
1a860 20 62 79 20 74 68 65 20 66 6f 75 72 74 68 20 61   by the fourth a
1a870 72 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68 65  rgument with the
1a880 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
1a890 74 68 65 20 64 65 63 6f 64 65 64 20 72 65 63 6f  the decoded reco
1a8a0 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c  rd..*/ .void sql
1a8b0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
1a8c0 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20  pack(.  KeyInfo 
1a8d0 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f  *pKeyInfo,     /
1a8e0 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * Information ab
1a8f0 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 66  out the record f
1a900 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ormat */.  int n
1a910 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
1a920 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1a930 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a   binary record *
1a940 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
1a950 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68  pKey,      /* Th
1a960 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20  e binary record 
1a970 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
1a980 6f 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20 50  ord *p      /* P
1a990 6f 70 75 6c 61 74 65 20 74 68 69 73 20 73 74 72  opulate this str
1a9a0 75 63 74 75 72 65 20 62 65 66 6f 72 65 20 72 65  ucture before re
1a9b0 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20  turning. */.){. 
1a9c0 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1a9d0 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f  char *aKey = (co
1a9e0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1a9f0 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74 20  r *)pKey;.  int 
1aa00 64 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20 20  d; .  u32 idx;  
1aa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1aa30 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61  in aKey[] to rea
1aa40 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20  d from */.  u16 
1aa50 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
1aa60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1aa70 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
1aa80 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a  nter */.  u32 sz
1aa90 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  Hdr;.  Mem *pMem
1aaa0 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70   = p->aMem;..  p
1aab0 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30  ->default_rc = 0
1aac0 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
1aad0 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
1aae0 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20  (pMem) );.  idx 
1aaf0 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b  = getVarint32(aK
1ab00 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20  ey, szHdr);.  d 
1ab10 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30  = szHdr;.  u = 0
1ab20 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73  ;.  while( idx<s
1ab30 7a 48 64 72 20 26 26 20 64 3c 3d 6e 4b 65 79 20  zHdr && d<=nKey 
1ab40 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  ){.    u32 seria
1ab50 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78  l_type;..    idx
1ab60 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
1ab70 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69  &aKey[idx], seri
1ab80 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70 4d  al_type);.    pM
1ab90 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e  em->enc = pKeyIn
1aba0 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65  fo->enc;.    pMe
1abb0 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m->db = pKeyInfo
1abc0 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d 65  ->db;.    /* pMe
1abd0 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f 2f  m->flags = 0; //
1abe0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1abf0 61 6c 47 65 74 28 29 20 77 69 6c 6c 20 73 65 74  alGet() will set
1ac00 20 74 68 69 73 20 66 6f 72 20 75 73 20 2a 2f 0a   this for us */.
1ac10 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c      pMem->szMall
1ac20 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d  oc = 0;.    d +=
1ac30 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1ac40 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20  alGet(&aKey[d], 
1ac50 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65  serial_type, pMe
1ac60 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  m);.    pMem++;.
1ac70 20 20 20 20 69 66 28 20 28 2b 2b 75 29 3e 3d 70      if( (++u)>=p
1ac80 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72 65 61 6b  ->nField ) break
1ac90 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1aca0 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  u<=pKeyInfo->nFi
1acb0 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e  eld + 1 );.  p->
1acc0 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 23  nField = u;.}..#
1acd0 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  if SQLITE_DEBUG.
1ace0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1acf0 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 77 6f  ion compares two
1ad00 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
1ad10 72 65 63 6f 72 64 20 6b 65 79 73 20 69 6e 20 74  record keys in t
1ad20 68 65 20 73 61 6d 65 20 77 61 79 0a 2a 2a 20 61  he same way.** a
1ad30 73 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  s the sqlite3Vdb
1ad40 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
1ad50 20 72 6f 75 74 69 6e 65 2e 20 55 6e 6c 69 6b 65   routine. Unlike
1ad60 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   VdbeRecordCompa
1ad70 72 65 28 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75  re(),.** this fu
1ad80 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c 69  nction deseriali
1ad90 7a 65 73 20 61 6e 64 20 63 6f 6d 70 61 72 65 73  zes and compares
1ada0 20 76 61 6c 75 65 73 20 75 73 69 6e 67 20 74 68   values using th
1adb0 65 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  e.** sqlite3Vdbe
1adc0 53 65 72 69 61 6c 47 65 74 28 29 20 61 6e 64 20  SerialGet() and 
1add0 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
1ade0 65 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 49  e() functions. I
1adf0 74 20 69 73 20 75 73 65 64 0a 2a 2a 20 69 6e 20  t is used.** in 
1ae00 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
1ae10 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68  nts to ensure th
1ae20 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 64  at the optimized
1ae30 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 73 71 6c 69   code in.** sqli
1ae40 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1ae50 70 61 72 65 28 29 20 72 65 74 75 72 6e 73 20 72  pare() returns r
1ae60 65 73 75 6c 74 73 20 77 69 74 68 20 74 68 65 73  esults with thes
1ae70 65 20 74 77 6f 20 70 72 69 6d 69 74 69 76 65 73  e two primitives
1ae80 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
1ae90 72 75 65 20 69 66 20 74 68 65 20 72 65 73 75 6c  rue if the resul
1aea0 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  t of comparison 
1aeb0 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
1aec0 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 2e 0a   desiredResult..
1aed0 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  ** Return false 
1aee0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64 69  if there is a di
1aef0 73 61 67 72 65 65 6d 65 6e 74 2e 0a 2a 2f 0a 73  sagreement..*/.s
1af00 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65  tatic int vdbeRe
1af10 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
1af20 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
1af30 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
1af40 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f  , /* Left key */
1af50 0a 20 20 63 6f 6e 73 74 20 55 6e 70 61 63 6b 65  .  const Unpacke
1af60 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c  dRecord *pPKey2,
1af70 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
1af80 0a 20 20 69 6e 74 20 64 65 73 69 72 65 64 52 65  .  int desiredRe
1af90 73 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20  sult            
1afa0 20 2f 2a 20 43 6f 72 72 65 63 74 20 61 6e 73 77   /* Correct answ
1afb0 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64  er */.){.  u32 d
1afc0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
1afd0 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65   Offset into aKe
1afe0 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61  y[] of next data
1aff0 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33   element */.  u3
1b000 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20  2 idx1;         
1b010 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
1b020 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68  aKey[] of next h
1b030 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f  eader element */
1b040 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20  .  u32 szHdr1;  
1b050 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1b060 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64  of bytes in head
1b070 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  er */.  int i = 
1b080 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  0;.  int rc = 0;
1b090 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
1b0a0 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20  d char *aKey1 = 
1b0b0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
1b0c0 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20  char *)pKey1;.  
1b0d0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1b0e0 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a  o;.  Mem mem1;..
1b0f0 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b    pKeyInfo = pPK
1b100 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ey2->pKeyInfo;. 
1b110 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64   if( pKeyInfo->d
1b120 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  b==0 ) return 1;
1b130 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b  .  mem1.enc = pK
1b140 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d  eyInfo->enc;.  m
1b150 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66  em1.db = pKeyInf
1b160 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31  o->db;.  /* mem1
1b170 2e 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20  .flags = 0;  // 
1b180 57 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69  Will be initiali
1b190 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 56 64  zed by sqlite3Vd
1b1a0 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 2a 2f  beSerialGet() */
1b1b0 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d  .  VVA_ONLY( mem
1b1c0 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20  1.szMalloc = 0; 
1b1d0 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64  ) /* Only needed
1b1e0 20 62 79 20 61 73 73 65 72 74 28 29 20 73 74 61   by assert() sta
1b1f0 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a  tements */..  /*
1b200 20 43 6f 6d 70 69 6c 65 72 73 20 6d 61 79 20 63   Compilers may c
1b210 6f 6d 70 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d  omplain that mem
1b220 31 2e 75 2e 69 20 69 73 20 70 6f 74 65 6e 74 69  1.u.i is potenti
1b230 61 6c 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a  ally uninitializ
1b240 65 64 2e 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c  ed..  ** We coul
1b250 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c  d initialize it,
1b260 20 61 73 20 73 68 6f 77 6e 20 68 65 72 65 2c 20   as shown here, 
1b270 74 6f 20 73 69 6c 65 6e 63 65 20 74 68 6f 73 65  to silence those
1b280 20 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a   complaints..  *
1b290 2a 20 42 75 74 20 69 6e 20 66 61 63 74 2c 20 6d  * But in fact, m
1b2a0 65 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76  em1.u.i will nev
1b2b0 65 72 20 61 63 74 75 61 6c 6c 79 20 62 65 20 75  er actually be u
1b2c0 73 65 64 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  sed uninitialize
1b2d0 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20  d, and doing .  
1b2e0 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65 73 73 61  ** the unnecessa
1b2f0 72 79 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ry initializatio
1b300 6e 20 68 61 73 20 61 20 6d 65 61 73 75 72 61 62  n has a measurab
1b310 6c 65 20 6e 65 67 61 74 69 76 65 20 70 65 72 66  le negative perf
1b320 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70  ormance.  ** imp
1b330 61 63 74 2c 20 73 69 6e 63 65 20 74 68 69 73 20  act, since this 
1b340 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76 65 72  routine is a ver
1b350 79 20 68 69 67 68 20 72 75 6e 6e 65 72 2e 20 20  y high runner.  
1b360 41 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73  And so, we choos
1b370 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65  e.  ** to ignore
1b380 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 61   the compiler wa
1b390 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61 76 65  rnings and leave
1b3a0 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 75   this variable u
1b3b0 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20  ninitialized..  
1b3c0 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e  */.  /*  mem1.u.
1b3d0 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e  i = 0;  // not n
1b3e0 65 65 64 65 64 2c 20 68 65 72 65 20 74 6f 20 73  eeded, here to s
1b3f0 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20  ilence compiler 
1b400 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20  warning */.  .  
1b410 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74  idx1 = getVarint
1b420 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31  32(aKey1, szHdr1
1b430 29 3b 0a 20 20 69 66 28 20 73 7a 48 64 72 31 3e  );.  if( szHdr1>
1b440 39 38 33 30 37 20 29 20 72 65 74 75 72 6e 20 53  98307 ) return S
1b450 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
1b460 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20   d1 = szHdr1;.  
1b470 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
1b480 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e 66  ->nField+pKeyInf
1b490 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65  o->nXField>=pPKe
1b4a0 79 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20 43 4f  y2->nField || CO
1b4b0 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73  RRUPT_DB );.  as
1b4c0 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
1b4d0 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b  aSortOrder!=0 );
1b4e0 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49  .  assert( pKeyI
1b4f0 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b  nfo->nField>0 );
1b500 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3c  .  assert( idx1<
1b510 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55  =szHdr1 || CORRU
1b520 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20  PT_DB );.  do{. 
1b530 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79     u32 serial_ty
1b540 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  pe1;..    /* Rea
1b550 64 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70  d the serial typ
1b560 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  es for the next 
1b570 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20  element in each 
1b580 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31  key. */.    idx1
1b590 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
1b5a0 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72   aKey1+idx1, ser
1b5b0 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 0a 20 20  ial_type1 );..  
1b5c0 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
1b5d0 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68   there is enough
1b5e0 20 6b 65 79 20 73 70 61 63 65 20 72 65 6d 61 69   key space remai
1b5f0 6e 69 6e 67 20 74 6f 20 61 76 6f 69 64 0a 20 20  ning to avoid.  
1b600 20 20 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 76    ** a buffer ov
1b610 65 72 72 65 61 64 2e 20 20 54 68 65 20 22 64 31  erread.  The "d1
1b620 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 22  +serial_type1+2"
1b630 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 77   subexpression w
1b640 69 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79  ill.    ** alway
1b650 73 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  s be greater tha
1b660 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
1b670 65 20 61 6d 6f 75 6e 74 20 6f 66 20 72 65 71 75  e amount of requ
1b680 69 72 65 64 20 6b 65 79 20 73 70 61 63 65 2e 0a  ired key space..
1b690 20 20 20 20 2a 2a 20 55 73 65 20 74 68 61 74 20      ** Use that 
1b6a0 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 74 6f  approximation to
1b6b0 20 61 76 6f 69 64 20 74 68 65 20 6d 6f 72 65 20   avoid the more 
1b6c0 65 78 70 65 6e 73 69 76 65 20 63 61 6c 6c 20 74  expensive call t
1b6d0 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
1b6e0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
1b6f0 6e 28 29 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  n() in the commo
1b700 6e 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  n case..    */. 
1b710 20 20 20 69 66 28 20 64 31 2b 73 65 72 69 61 6c     if( d1+serial
1b720 5f 74 79 70 65 31 2b 32 3e 28 75 33 32 29 6e 4b  _type1+2>(u32)nK
1b730 65 79 31 0a 20 20 20 20 20 26 26 20 64 31 2b 73  ey1.     && d1+s
1b740 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1b750 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
1b760 79 70 65 31 29 3e 28 75 33 32 29 6e 4b 65 79 31  ype1)>(u32)nKey1
1b770 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62   .    ){.      b
1b780 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1b790 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20   /* Extract the 
1b7a0 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d  values to be com
1b7b0 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  pared..    */.  
1b7c0 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56    d1 += sqlite3V
1b7d0 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
1b7e0 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f  ey1[d1], serial_
1b7f0 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a  type1, &mem1);..
1b800 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f      /* Do the co
1b810 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a  mparison.    */.
1b820 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b830 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31  MemCompare(&mem1
1b840 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b  , &pPKey2->aMem[
1b850 69 5d 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  i], pKeyInfo->aC
1b860 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  oll[i]);.    if(
1b870 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
1b880 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d  assert( mem1.szM
1b890 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20  alloc==0 );  /* 
1b8a0 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f  See comment belo
1b8b0 77 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  w */.      if( p
1b8c0 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
1b8d0 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  der[i] ){.      
1b8e0 20 20 72 63 20 3d 20 2d 72 63 3b 20 20 2f 2a 20    rc = -rc;  /* 
1b8f0 49 6e 76 65 72 74 20 74 68 65 20 72 65 73 75 6c  Invert the resul
1b900 74 20 66 6f 72 20 44 45 53 43 20 73 6f 72 74 20  t for DESC sort 
1b910 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  order. */.      
1b920 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 62  }.      goto deb
1b930 75 67 43 6f 6d 70 61 72 65 45 6e 64 3b 0a 20 20  ugCompareEnd;.  
1b940 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d    }.    i++;.  }
1b950 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64  while( idx1<szHd
1b960 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e  r1 && i<pPKey2->
1b970 6e 46 69 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20  nField );..  /* 
1b980 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  No memory alloca
1b990 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65  tion is ever use
1b9a0 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76  d on mem1.  Prov
1b9b0 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a  e this using.  *
1b9c0 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
1b9d0 61 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68  assert().  If th
1b9e0 65 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73  e assert() fails
1b9f0 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61  , it indicates a
1ba00 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61  .  ** memory lea
1ba10 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20  k and a need to 
1ba20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65  call sqlite3Vdbe
1ba30 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31  MemRelease(&mem1
1ba40 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
1ba50 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d  ( mem1.szMalloc=
1ba60 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d  =0 );..  /* rc==
1ba70 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61  0 here means tha
1ba80 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79  t one of the key
1ba90 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65  s ran out of fie
1baa0 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c  lds and.  ** all
1bab0 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74   the fields up t
1bac0 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72  o that point wer
1bad0 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20  e equal. Return 
1bae0 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20  the default_rc. 
1baf0 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20   ** value.  */. 
1bb00 20 72 63 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65   rc = pPKey2->de
1bb10 66 61 75 6c 74 5f 72 63 3b 0a 0a 64 65 62 75 67  fault_rc;..debug
1bb20 43 6f 6d 70 61 72 65 45 6e 64 3a 0a 20 20 69 66  CompareEnd:.  if
1bb30 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3d  ( desiredResult=
1bb40 3d 30 20 26 26 20 72 63 3d 3d 30 20 29 20 72 65  =0 && rc==0 ) re
1bb50 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65  turn 1;.  if( de
1bb60 73 69 72 65 64 52 65 73 75 6c 74 3c 30 20 26 26  siredResult<0 &&
1bb70 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20 31   rc<0 ) return 1
1bb80 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52  ;.  if( desiredR
1bb90 65 73 75 6c 74 3e 30 20 26 26 20 72 63 3e 30 20  esult>0 && rc>0 
1bba0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
1bbb0 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72  ( CORRUPT_DB ) r
1bbc0 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70  eturn 1;.  if( p
1bbd0 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c  KeyInfo->db->mal
1bbe0 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
1bbf0 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
1bc00 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
1bc10 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
1bc20 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ** Count the num
1bc30 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 28 61  ber of fields (a
1bc40 2e 6b 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29 20 69  .k.a. columns) i
1bc50 6e 20 74 68 65 20 72 65 63 6f 72 64 20 67 69 76  n the record giv
1bc60 65 6e 20 62 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b  en by.** pKey,nK
1bc70 65 79 2e 20 20 54 68 65 20 76 65 72 69 66 79 20  ey.  The verify 
1bc80 74 68 61 74 20 74 68 69 73 20 63 6f 75 6e 74 20  that this count 
1bc90 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
1bca0 65 71 75 61 6c 20 74 6f 20 74 68 65 0a 2a 2a 20  equal to the.** 
1bcb0 6c 69 6d 69 74 20 67 69 76 65 6e 20 62 79 20 70  limit given by p
1bcc0 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
1bcd0 2b 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69  + pKeyInfo->nXFi
1bce0 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  eld..**.** If th
1bcf0 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  is constraint is
1bd00 20 6e 6f 74 20 73 61 74 69 73 66 69 65 64 2c 20   not satisfied, 
1bd10 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
1bd20 65 20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20  e high-speed.** 
1bd30 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1bd40 65 49 6e 74 28 29 20 61 6e 64 20 76 64 62 65 52  eInt() and vdbeR
1bd50 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69  ecordCompareStri
1bd60 6e 67 28 29 20 72 6f 75 74 69 6e 65 73 20 77 69  ng() routines wi
1bd70 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 63  ll.** not work c
1bd80 6f 72 72 65 63 74 6c 79 2e 20 20 49 66 20 74 68  orrectly.  If th
1bd90 69 73 20 61 73 73 65 72 74 28 29 20 65 76 65 72  is assert() ever
1bda0 20 66 69 72 65 73 2c 20 69 74 20 70 72 6f 62 61   fires, it proba
1bdb0 62 6c 79 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61  bly means.** tha
1bdc0 74 20 74 68 65 20 4b 65 79 49 6e 66 6f 2e 6e 46  t the KeyInfo.nF
1bdd0 69 65 6c 64 20 6f 72 20 4b 65 79 49 6e 66 6f 2e  ield or KeyInfo.
1bde0 6e 58 46 69 65 6c 64 20 76 61 6c 75 65 73 20 77  nXField values w
1bdf0 65 72 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20  ere computed.** 
1be00 69 6e 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a  incorrectly..*/.
1be10 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65  static void vdbe
1be20 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74  AssertFieldCount
1be30 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 0a 20 20  WithinLimits(.  
1be40 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20  int nKey, const 
1be50 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a  void *pKey,   /*
1be60 20 54 68 65 20 72 65 63 6f 72 64 20 74 6f 20 76   The record to v
1be70 65 72 69 66 79 20 2a 2f 20 0a 20 20 63 6f 6e 73  erify */ .  cons
1be80 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
1be90 6e 66 6f 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d  nfo       /* Com
1bea0 70 61 72 65 20 73 69 7a 65 20 77 69 74 68 20 74  pare size with t
1beb0 68 69 73 20 4b 65 79 49 6e 66 6f 20 2a 2f 0a 29  his KeyInfo */.)
1bec0 7b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 20 3d  {.  int nField =
1bed0 20 30 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b   0;.  u32 szHdr;
1bee0 0a 20 20 75 33 32 20 69 64 78 3b 0a 20 20 75 33  .  u32 idx;.  u3
1bef0 32 20 6e 6f 74 55 73 65 64 3b 0a 20 20 63 6f 6e  2 notUsed;.  con
1bf00 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1bf10 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20   *aKey = (const 
1bf20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
1bf30 4b 65 79 3b 0a 0a 20 20 69 66 28 20 43 4f 52 52  Key;..  if( CORR
1bf40 55 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 3b  UPT_DB ) return;
1bf50 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 72 69  .  idx = getVari
1bf60 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72  nt32(aKey, szHdr
1bf70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65  );.  assert( nKe
1bf80 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y>=0 );.  assert
1bf90 28 20 73 7a 48 64 72 3c 3d 28 75 33 32 29 6e 4b  ( szHdr<=(u32)nK
1bfa0 65 79 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 69  ey );.  while( i
1bfb0 64 78 3c 73 7a 48 64 72 20 29 7b 0a 20 20 20 20  dx<szHdr ){.    
1bfc0 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  idx += getVarint
1bfd0 33 32 28 61 4b 65 79 2b 69 64 78 2c 20 6e 6f 74  32(aKey+idx, not
1bfe0 55 73 65 64 29 3b 0a 20 20 20 20 6e 46 69 65 6c  Used);.    nFiel
1bff0 64 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  d++;.  }.  asser
1c000 74 28 20 6e 46 69 65 6c 64 20 3c 3d 20 70 4b 65  t( nField <= pKe
1c010 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b  yInfo->nField+pK
1c020 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 20  eyInfo->nXField 
1c030 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
1c040 69 6e 65 20 76 64 62 65 41 73 73 65 72 74 46 69  ine vdbeAssertFi
1c050 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69  eldCountWithinLi
1c060 6d 69 74 73 28 41 2c 42 2c 43 29 0a 23 65 6e 64  mits(A,B,C).#end
1c070 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a  if../*.** Both *
1c080 70 4d 65 6d 31 20 61 6e 64 20 2a 70 4d 65 6d 32  pMem1 and *pMem2
1c090 20 63 6f 6e 74 61 69 6e 20 73 74 72 69 6e 67 20   contain string 
1c0a0 76 61 6c 75 65 73 2e 20 43 6f 6d 70 61 72 65 20  values. Compare 
1c0b0 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a  the two values.*
1c0c0 2a 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c  * using the coll
1c0d0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70  ation sequence p
1c0e0 43 6f 6c 6c 2e 20 41 73 20 75 73 75 61 6c 2c 20  Coll. As usual, 
1c0f0 72 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76  return a negativ
1c100 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70  e , zero.** or p
1c110 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66  ositive value if
1c120 20 2a 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20   *pMem1 is less 
1c130 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f  than, equal to o
1c140 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 0a  r greater than .
1c150 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72 65 73 70 65  ** *pMem2, respe
1c160 63 74 69 76 65 6c 79 2e 20 53 69 6d 69 6c 61 72  ctively. Similar
1c170 20 69 6e 20 73 70 69 72 69 74 20 74 6f 20 22 72   in spirit to "r
1c180 63 20 3d 20 28 2a 70 4d 65 6d 31 29 20 2d 20 28  c = (*pMem1) - (
1c190 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74  *pMem2);"..*/.st
1c1a0 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d  atic int vdbeCom
1c1b0 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20  pareMemString(. 
1c1c0 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d   const Mem *pMem
1c1d0 31 2c 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a  1,.  const Mem *
1c1e0 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73 74 20 43  pMem2,.  const C
1c1f0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20  ollSeq *pColl,. 
1c200 20 75 38 20 2a 70 72 63 45 72 72 20 20 20 20 20   u8 *prcErr     
1c210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c220 20 2f 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63   /* If an OOM oc
1c230 63 75 72 73 2c 20 73 65 74 20 74 6f 20 53 51 4c  curs, set to SQL
1c240 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a  ITE_NOMEM */.){.
1c250 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 65 6e 63    if( pMem1->enc
1c260 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a  ==pColl->enc ){.
1c270 20 20 20 20 2f 2a 20 54 68 65 20 73 74 72 69 6e      /* The strin
1c280 67 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 69  gs are already i
1c290 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 65 6e  n the correct en
1c2a0 63 6f 64 69 6e 67 2e 20 20 43 61 6c 6c 20 74 68  coding.  Call th
1c2b0 65 0a 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72  e.     ** compar
1c2c0 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 64 69  ison function di
1c2d0 72 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20 72 65  rectly */.    re
1c2e0 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  turn pColl->xCmp
1c2f0 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d  (pColl->pUser,pM
1c300 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c  em1->n,pMem1->z,
1c310 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e  pMem2->n,pMem2->
1c320 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  z);.  }else{.   
1c330 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 63 6f 6e   int rc;.    con
1c340 73 74 20 76 6f 69 64 20 2a 76 31 2c 20 2a 76 32  st void *v1, *v2
1c350 3b 0a 20 20 20 20 69 6e 74 20 6e 31 2c 20 6e 32  ;.    int n1, n2
1c360 3b 0a 20 20 20 20 4d 65 6d 20 63 31 3b 0a 20 20  ;.    Mem c1;.  
1c370 20 20 4d 65 6d 20 63 32 3b 0a 20 20 20 20 73 71    Mem c2;.    sq
1c380 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74  lite3VdbeMemInit
1c390 28 26 63 31 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c  (&c1, pMem1->db,
1c3a0 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20   MEM_Null);.    
1c3b0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e  sqlite3VdbeMemIn
1c3c0 69 74 28 26 63 32 2c 20 70 4d 65 6d 31 2d 3e 64  it(&c2, pMem1->d
1c3d0 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20  b, MEM_Null);.  
1c3e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1c3f0 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 31 2c  ShallowCopy(&c1,
1c400 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70 68 65   pMem1, MEM_Ephe
1c410 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  m);.    sqlite3V
1c420 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70  dbeMemShallowCop
1c430 79 28 26 63 32 2c 20 70 4d 65 6d 32 2c 20 4d 45  y(&c2, pMem2, ME
1c440 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 76 31  M_Ephem);.    v1
1c450 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54   = sqlite3ValueT
1c460 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c  ext((sqlite3_val
1c470 75 65 2a 29 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e  ue*)&c1, pColl->
1c480 65 6e 63 29 3b 0a 20 20 20 20 6e 31 20 3d 20 76  enc);.    n1 = v
1c490 31 3d 3d 30 20 3f 20 30 20 3a 20 63 31 2e 6e 3b  1==0 ? 0 : c1.n;
1c4a0 0a 20 20 20 20 76 32 20 3d 20 73 71 6c 69 74 65  .    v2 = sqlite
1c4b0 33 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69  3ValueText((sqli
1c4c0 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 32 2c 20  te3_value*)&c2, 
1c4d0 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20  pColl->enc);.   
1c4e0 20 6e 32 20 3d 20 76 32 3d 3d 30 20 3f 20 30 20   n2 = v2==0 ? 0 
1c4f0 3a 20 63 32 2e 6e 3b 0a 20 20 20 20 72 63 20 3d  : c2.n;.    rc =
1c500 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f   pColl->xCmp(pCo
1c510 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e 31 2c 20 76  ll->pUser, n1, v
1c520 31 2c 20 6e 32 2c 20 76 32 29 3b 0a 20 20 20 20  1, n2, v2);.    
1c530 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
1c540 6c 65 61 73 65 28 26 63 31 29 3b 0a 20 20 20 20  lease(&c1);.    
1c550 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
1c560 6c 65 61 73 65 28 26 63 32 29 3b 0a 20 20 20 20  lease(&c2);.    
1c570 69 66 28 20 28 76 31 3d 3d 30 20 7c 7c 20 76 32  if( (v1==0 || v2
1c580 3d 3d 30 29 20 26 26 20 70 72 63 45 72 72 20 29  ==0) && prcErr )
1c590 20 2a 70 72 63 45 72 72 20 3d 20 53 51 4c 49 54   *prcErr = SQLIT
1c5a0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72 65 74  E_NOMEM;.    ret
1c5b0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f  urn rc;.  }.}../
1c5c0 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f  *.** Compare two
1c5d0 20 62 6c 6f 62 73 2e 20 20 52 65 74 75 72 6e 20   blobs.  Return 
1c5e0 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20  negative, zero, 
1c5f0 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 74  or positive if t
1c600 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 73 20 6c  he first.** is l
1c610 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
1c620 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74  to, or greater t
1c630 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c 20  han the second, 
1c640 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
1c650 20 49 66 20 6f 6e 65 20 62 6c 6f 62 20 69 73 20   If one blob is 
1c660 61 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20  a prefix of the 
1c670 6f 74 68 65 72 2c 20 74 68 65 6e 20 74 68 65 20  other, then the 
1c680 73 68 6f 72 74 65 72 20 69 73 20 74 68 65 20 6c  shorter is the l
1c690 65 73 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  essor..*/.static
1c6a0 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
1c6b0 20 69 6e 74 20 73 71 6c 69 74 65 33 42 6c 6f 62   int sqlite3Blob
1c6c0 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65  Compare(const Me
1c6d0 6d 20 2a 70 42 31 2c 20 63 6f 6e 73 74 20 4d 65  m *pB1, const Me
1c6e0 6d 20 2a 70 42 32 29 7b 0a 20 20 69 6e 74 20 63  m *pB2){.  int c
1c6f0 20 3d 20 6d 65 6d 63 6d 70 28 70 42 31 2d 3e 7a   = memcmp(pB1->z
1c700 2c 20 70 42 32 2d 3e 7a 2c 20 70 42 31 2d 3e 6e  , pB2->z, pB1->n
1c710 3e 70 42 32 2d 3e 6e 20 3f 20 70 42 32 2d 3e 6e  >pB2->n ? pB2->n
1c720 20 3a 20 70 42 31 2d 3e 6e 29 3b 0a 20 20 69 66   : pB1->n);.  if
1c730 28 20 63 20 29 20 72 65 74 75 72 6e 20 63 3b 0a  ( c ) return c;.
1c740 20 20 72 65 74 75 72 6e 20 70 42 31 2d 3e 6e 20    return pB1->n 
1c750 2d 20 70 42 32 2d 3e 6e 3b 0a 7d 0a 0a 2f 2a 0a  - pB2->n;.}../*.
1c760 2a 2a 20 44 6f 20 61 20 63 6f 6d 70 61 72 69 73  ** Do a comparis
1c770 6f 6e 20 62 65 74 77 65 65 6e 20 61 20 36 34 2d  on between a 64-
1c780 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67  bit signed integ
1c790 65 72 20 61 6e 64 20 61 20 36 34 2d 62 69 74 20  er and a 64-bit 
1c7a0 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 0a 2a  floating-point.*
1c7b0 2a 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72  * number.  Retur
1c7c0 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  n negative, zero
1c7d0 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  , or positive if
1c7e0 20 74 68 65 20 66 69 72 73 74 20 28 69 36 34 29   the first (i64)
1c7f0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 0a 2a   is less than,.*
1c800 2a 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67  * equal to, or g
1c810 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
1c820 73 65 63 6f 6e 64 20 28 64 6f 75 62 6c 65 29 2e  second (double).
1c830 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1c840 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f  qlite3IntFloatCo
1c850 6d 70 61 72 65 28 69 36 34 20 69 2c 20 64 6f 75  mpare(i64 i, dou
1c860 62 6c 65 20 72 29 7b 0a 20 20 69 66 28 20 73 69  ble r){.  if( si
1c870 7a 65 6f 66 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f  zeof(LONGDOUBLE_
1c880 54 59 50 45 29 3e 38 20 29 7b 0a 20 20 20 20 4c  TYPE)>8 ){.    L
1c890 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 20 78  ONGDOUBLE_TYPE x
1c8a0 20 3d 20 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54   = (LONGDOUBLE_T
1c8b0 59 50 45 29 69 3b 0a 20 20 20 20 69 66 28 20 78  YPE)i;.    if( x
1c8c0 3c 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  <r ) return -1;.
1c8d0 20 20 20 20 69 66 28 20 78 3e 72 20 29 20 72 65      if( x>r ) re
1c8e0 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 72 65 74  turn +1;.    ret
1c8f0 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 0;.  }else{.
1c900 20 20 20 20 69 36 34 20 79 3b 0a 20 20 20 20 64      i64 y;.    d
1c910 6f 75 62 6c 65 20 73 3b 0a 20 20 20 20 69 66 28  ouble s;.    if(
1c920 20 72 3c 2d 39 32 32 33 33 37 32 30 33 36 38 35   r<-922337203685
1c930 34 37 37 35 38 30 38 2e 30 20 29 20 72 65 74 75  4775808.0 ) retu
1c940 72 6e 20 2b 31 3b 0a 20 20 20 20 69 66 28 20 72  rn +1;.    if( r
1c950 3e 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37  >922337203685477
1c960 35 38 30 37 2e 30 20 29 20 72 65 74 75 72 6e 20  5807.0 ) return 
1c970 2d 31 3b 0a 20 20 20 20 79 20 3d 20 28 69 36 34  -1;.    y = (i64
1c980 29 72 3b 0a 20 20 20 20 69 66 28 20 69 3c 79 20  )r;.    if( i<y 
1c990 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
1c9a0 20 69 66 28 20 69 3e 79 20 29 7b 0a 20 20 20 20   if( i>y ){.    
1c9b0 20 20 69 66 28 20 79 3d 3d 53 4d 41 4c 4c 45 53    if( y==SMALLES
1c9c0 54 5f 49 4e 54 36 34 20 26 26 20 72 3e 30 2e 30  T_INT64 && r>0.0
1c9d0 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
1c9e0 20 20 20 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20      return +1;. 
1c9f0 20 20 20 7d 0a 20 20 20 20 73 20 3d 20 28 64 6f     }.    s = (do
1ca00 75 62 6c 65 29 69 3b 0a 20 20 20 20 69 66 28 20  uble)i;.    if( 
1ca10 73 3c 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  s<r ) return -1;
1ca20 0a 20 20 20 20 69 66 28 20 73 3e 72 20 29 20 72  .    if( s>r ) r
1ca30 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 72 65  eturn +1;.    re
1ca40 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  turn 0;.  }.}../
1ca50 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
1ca60 20 76 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e 65   values containe
1ca70 64 20 62 79 20 74 68 65 20 74 77 6f 20 6d 65 6d  d by the two mem
1ca80 6f 72 79 20 63 65 6c 6c 73 2c 20 72 65 74 75 72  ory cells, retur
1ca90 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61 74 69 76 65  ning.** negative
1caa0 2c 20 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74 69  , zero or positi
1cab0 76 65 20 69 66 20 70 4d 65 6d 31 20 69 73 20 6c  ve if pMem1 is l
1cac0 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
1cad0 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 0a 2a  to, or greater.*
1cae0 2a 20 74 68 61 6e 20 70 4d 65 6d 32 2e 20 53 6f  * than pMem2. So
1caf0 72 74 69 6e 67 20 6f 72 64 65 72 20 69 73 20 4e  rting order is N
1cb00 55 4c 4c 27 73 20 66 69 72 73 74 2c 20 66 6f 6c  ULL's first, fol
1cb10 6c 6f 77 65 64 20 62 79 20 6e 75 6d 62 65 72 73  lowed by numbers
1cb20 20 28 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 6e   (integers.** an
1cb30 64 20 72 65 61 6c 73 29 20 73 6f 72 74 65 64 20  d reals) sorted 
1cb40 6e 75 6d 65 72 69 63 61 6c 6c 79 2c 20 66 6f 6c  numerically, fol
1cb50 6c 6f 77 65 64 20 62 79 20 74 65 78 74 20 6f 72  lowed by text or
1cb60 64 65 72 65 64 20 62 79 20 74 68 65 20 63 6f 6c  dered by the col
1cb70 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e  lating.** sequen
1cb80 63 65 20 70 43 6f 6c 6c 20 61 6e 64 20 66 69 6e  ce pColl and fin
1cb90 61 6c 6c 79 20 62 6c 6f 62 27 73 20 6f 72 64 65  ally blob's orde
1cba0 72 65 64 20 62 79 20 6d 65 6d 63 6d 70 28 29 2e  red by memcmp().
1cbb0 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20  .**.** Two NULL 
1cbc0 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69  values are consi
1cbd0 64 65 72 65 64 20 65 71 75 61 6c 20 62 79 20 74  dered equal by t
1cbe0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
1cbf0 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d 43  .int sqlite3MemC
1cc00 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d  ompare(const Mem
1cc10 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73 74 20 4d   *pMem1, const M
1cc20 65 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73 74  em *pMem2, const
1cc30 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29   CollSeq *pColl)
1cc40 7b 0a 20 20 69 6e 74 20 66 31 2c 20 66 32 3b 0a  {.  int f1, f2;.
1cc50 20 20 69 6e 74 20 63 6f 6d 62 69 6e 65 64 5f 66    int combined_f
1cc60 6c 61 67 73 3b 0a 0a 20 20 66 31 20 3d 20 70 4d  lags;..  f1 = pM
1cc70 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 32  em1->flags;.  f2
1cc80 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b   = pMem2->flags;
1cc90 0a 20 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  .  combined_flag
1cca0 73 20 3d 20 66 31 7c 66 32 3b 0a 20 20 61 73 73  s = f1|f2;.  ass
1ccb0 65 72 74 28 20 28 63 6f 6d 62 69 6e 65 64 5f 66  ert( (combined_f
1ccc0 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65  lags & MEM_RowSe
1ccd0 74 29 3d 3d 30 20 29 3b 0a 20 0a 20 20 2f 2a 20  t)==0 );. .  /* 
1cce0 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20  If one value is 
1ccf0 4e 55 4c 4c 2c 20 69 74 20 69 73 20 6c 65 73 73  NULL, it is less
1cd00 20 74 68 61 6e 20 74 68 65 20 6f 74 68 65 72 2e   than the other.
1cd10 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73 0a   If both values.
1cd20 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c 20 72    ** are NULL, r
1cd30 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20  eturn 0..  */.  
1cd40 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  if( combined_fla
1cd50 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20  gs&MEM_Null ){. 
1cd60 20 20 20 72 65 74 75 72 6e 20 28 66 32 26 4d 45     return (f2&ME
1cd70 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66 31 26 4d 45  M_Null) - (f1&ME
1cd80 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20  M_Null);.  }..  
1cd90 2f 2a 20 41 74 20 6c 65 61 73 74 20 6f 6e 65 20  /* At least one 
1cda0 6f 66 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65  of the two value
1cdb0 73 20 69 73 20 61 20 6e 75 6d 62 65 72 0a 20 20  s is a number.  
1cdc0 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65  */.  if( combine
1cdd0 64 5f 66 6c 61 67 73 26 28 4d 45 4d 5f 49 6e 74  d_flags&(MEM_Int
1cde0 7c 4d 45 4d 5f 52 65 61 6c 29 20 29 7b 0a 20 20  |MEM_Real) ){.  
1cdf0 20 20 69 66 28 20 28 66 31 20 26 20 66 32 20 26    if( (f1 & f2 &
1ce00 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a   MEM_Int)!=0 ){.
1ce10 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d        if( pMem1-
1ce20 3e 75 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e  >u.i < pMem2->u.
1ce30 69 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  i ) return -1;. 
1ce40 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e       if( pMem1->
1ce50 75 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69  u.i > pMem2->u.i
1ce60 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20   ) return +1;.  
1ce70 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1ce80 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31 20    }.    if( (f1 
1ce90 26 20 66 32 20 26 20 4d 45 4d 5f 52 65 61 6c 29  & f2 & MEM_Real)
1cea0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
1ceb0 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3c 20 70 4d   pMem1->u.r < pM
1cec0 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74 75 72  em2->u.r ) retur
1ced0 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20  n -1;.      if( 
1cee0 70 4d 65 6d 31 2d 3e 75 2e 72 20 3e 20 70 4d 65  pMem1->u.r > pMe
1cef0 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74 75 72 6e  m2->u.r ) return
1cf00 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   +1;.      retur
1cf10 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 0;.    }.    i
1cf20 66 28 20 28 66 31 26 4d 45 4d 5f 49 6e 74 29 21  f( (f1&MEM_Int)!
1cf30 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1cf40 28 66 32 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30  (f2&MEM_Real)!=0
1cf50 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1cf60 72 6e 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f  rn sqlite3IntFlo
1cf70 61 74 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2d  atCompare(pMem1-
1cf80 3e 75 2e 69 2c 20 70 4d 65 6d 32 2d 3e 75 2e 72  >u.i, pMem2->u.r
1cf90 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1cfa0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d          return -
1cfb0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
1cfc0 0a 20 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d  .    if( (f1&MEM
1cfd0 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20  _Real)!=0 ){.   
1cfe0 20 20 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 49     if( (f2&MEM_I
1cff0 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  nt)!=0 ){.      
1d000 20 20 72 65 74 75 72 6e 20 2d 73 71 6c 69 74 65    return -sqlite
1d010 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65  3IntFloatCompare
1d020 28 70 4d 65 6d 32 2d 3e 75 2e 69 2c 20 70 4d 65  (pMem2->u.i, pMe
1d030 6d 31 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20  m1->u.r);.      
1d040 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
1d050 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
1d060 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  }.    }.    retu
1d070 72 6e 20 2b 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn +1;.  }..  /*
1d080 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73   If one value is
1d090 20 61 20 73 74 72 69 6e 67 20 61 6e 64 20 74 68   a string and th
1d0a0 65 20 6f 74 68 65 72 20 69 73 20 61 20 62 6c 6f  e other is a blo
1d0b0 62 2c 20 74 68 65 20 73 74 72 69 6e 67 20 69 73  b, the string is
1d0c0 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62   less..  ** If b
1d0d0 6f 74 68 20 61 72 65 20 73 74 72 69 6e 67 73 2c  oth are strings,
1d0e0 20 63 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 74   compare using t
1d0f0 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  he collating fun
1d100 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ctions..  */.  i
1d110 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  f( combined_flag
1d120 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20  s&MEM_Str ){.   
1d130 20 69 66 28 20 28 66 31 20 26 20 4d 45 4d 5f 53   if( (f1 & MEM_S
1d140 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tr)==0 ){.      
1d150 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
1d160 20 20 20 20 69 66 28 20 28 66 32 20 26 20 4d 45      if( (f2 & ME
1d170 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20  M_Str)==0 ){.   
1d180 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
1d190 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
1d1a0 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65   pMem1->enc==pMe
1d1b0 6d 32 2d 3e 65 6e 63 20 7c 7c 20 70 4d 65 6d 31  m2->enc || pMem1
1d1c0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1d1d0 65 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ed );.    assert
1d1e0 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51  ( pMem1->enc==SQ
1d1f0 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 0a 20 20  LITE_UTF8 || .  
1d200 20 20 20 20 20 20 20 20 20 20 70 4d 65 6d 31 2d            pMem1-
1d210 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  >enc==SQLITE_UTF
1d220 31 36 4c 45 20 7c 7c 20 70 4d 65 6d 31 2d 3e 65  16LE || pMem1->e
1d230 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  nc==SQLITE_UTF16
1d240 42 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  BE );..    /* Th
1d250 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
1d260 65 6e 63 65 20 6d 75 73 74 20 62 65 20 64 65 66  ence must be def
1d270 69 6e 65 64 20 61 74 20 74 68 69 73 20 70 6f 69  ined at this poi
1d280 6e 74 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20  nt, even if.    
1d290 2a 2a 20 74 68 65 20 75 73 65 72 20 64 65 6c 65  ** the user dele
1d2a0 74 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  tes the collatio
1d2b0 6e 20 73 65 71 75 65 6e 63 65 20 61 66 74 65 72  n sequence after
1d2c0 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61   the vdbe progra
1d2d0 6d 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6d 70  m is.    ** comp
1d2e0 69 6c 65 64 20 28 74 68 69 73 20 77 61 73 20 6e  iled (this was n
1d2f0 6f 74 20 61 6c 77 61 79 73 20 74 68 65 20 63 61  ot always the ca
1d300 73 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  se)..    */.    
1d310 61 73 73 65 72 74 28 20 21 70 43 6f 6c 6c 20 7c  assert( !pColl |
1d320 7c 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b  | pColl->xCmp );
1d330 0a 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ..    if( pColl 
1d340 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1d350 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74  vdbeCompareMemSt
1d360 72 69 6e 67 28 70 4d 65 6d 31 2c 20 70 4d 65 6d  ring(pMem1, pMem
1d370 32 2c 20 70 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20  2, pColl, 0);.  
1d380 20 20 7d 0a 20 20 20 20 2f 2a 20 49 66 20 61 20    }.    /* If a 
1d390 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 77 61 73  NULL pointer was
1d3a0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 63   passed as the c
1d3b0 6f 6c 6c 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c  ollate function,
1d3c0 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a 20 20   fall through.  
1d3d0 20 20 2a 2a 20 74 6f 20 74 68 65 20 62 6c 6f 62    ** to the blob
1d3e0 20 63 61 73 65 20 61 6e 64 20 75 73 65 20 6d 65   case and use me
1d3f0 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 7d 0a  mcmp().  */.  }.
1d400 20 0a 20 20 2f 2a 20 42 6f 74 68 20 76 61 6c 75   .  /* Both valu
1d410 65 73 20 6d 75 73 74 20 62 65 20 62 6c 6f 62 73  es must be blobs
1d420 2e 20 20 43 6f 6d 70 61 72 65 20 75 73 69 6e 67  .  Compare using
1d430 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20   memcmp().  */. 
1d440 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42   return sqlite3B
1d450 6c 6f 62 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31  lobCompare(pMem1
1d460 2c 20 70 4d 65 6d 32 29 3b 0a 7d 0a 0a 0a 2f 2a  , pMem2);.}.../*
1d470 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
1d480 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
1d490 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1d4a0 73 20 61 20 73 65 72 69 61 6c 2d 74 79 70 65 20  s a serial-type 
1d4b0 74 68 61 74 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  that.** correspo
1d4c0 6e 64 73 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  nds to an intege
1d4d0 72 20 2d 20 61 6c 6c 20 76 61 6c 75 65 73 20 62  r - all values b
1d4e0 65 74 77 65 65 6e 20 31 20 61 6e 64 20 39 20 69  etween 1 and 9 i
1d4f0 6e 63 6c 75 73 69 76 65 20 0a 2a 2a 20 65 78 63  nclusive .** exc
1d500 65 70 74 20 37 2e 20 54 68 65 20 73 65 63 6f 6e  ept 7. The secon
1d510 64 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75  d points to a bu
1d520 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
1d530 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  an integer value
1d540 0a 2a 2a 20 73 65 72 69 61 6c 69 7a 65 64 20 61  .** serialized a
1d550 63 63 6f 72 64 69 6e 67 20 74 6f 20 73 65 72 69  ccording to seri
1d560 61 6c 5f 74 79 70 65 2e 20 54 68 69 73 20 66 75  al_type. This fu
1d570 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c 69  nction deseriali
1d580 7a 65 73 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72  zes.** and retur
1d590 6e 73 20 74 68 65 20 76 61 6c 75 65 2e 0a 2a 2f  ns the value..*/
1d5a0 0a 73 74 61 74 69 63 20 69 36 34 20 76 64 62 65  .static i64 vdbe
1d5b0 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28  RecordDecodeInt(
1d5c0 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  u32 serial_type,
1d5d0 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 29   const u8 *aKey)
1d5e0 7b 0a 20 20 75 33 32 20 79 3b 0a 20 20 61 73 73  {.  u32 y;.  ass
1d5f0 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
1d600 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65 3e  || (serial_type>
1d610 3d 31 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70  =1 && serial_typ
1d620 65 3c 3d 39 20 26 26 20 73 65 72 69 61 6c 5f 74  e<=9 && serial_t
1d630 79 70 65 21 3d 37 29 20 29 3b 0a 20 20 73 77 69  ype!=7) );.  swi
1d640 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65  tch( serial_type
1d650 20 29 7b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a   ){.    case 0:.
1d660 20 20 20 20 63 61 73 65 20 31 3a 0a 20 20 20 20      case 1:.    
1d670 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1d680 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1d690 20 20 72 65 74 75 72 6e 20 4f 4e 45 5f 42 59 54    return ONE_BYT
1d6a0 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1d6b0 20 63 61 73 65 20 32 3a 0a 20 20 20 20 20 20 74   case 2:.      t
1d6c0 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d  estcase( aKey[0]
1d6d0 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72  &0x80 );.      r
1d6e0 65 74 75 72 6e 20 54 57 4f 5f 42 59 54 45 5f 49  eturn TWO_BYTE_I
1d6f0 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61  NT(aKey);.    ca
1d700 73 65 20 33 3a 0a 20 20 20 20 20 20 74 65 73 74  se 3:.      test
1d710 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78  case( aKey[0]&0x
1d720 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  80 );.      retu
1d730 72 6e 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e  rn THREE_BYTE_IN
1d740 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73  T(aKey);.    cas
1d750 65 20 34 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  e 4: {.      tes
1d760 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30  tcase( aKey[0]&0
1d770 78 38 30 20 29 3b 0a 20 20 20 20 20 20 79 20 3d  x80 );.      y =
1d780 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1d790 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 72 65 74  aKey);.      ret
1d7a0 75 72 6e 20 28 69 36 34 29 2a 28 69 6e 74 2a 29  urn (i64)*(int*)
1d7b0 26 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  &y;.    }.    ca
1d7c0 73 65 20 35 3a 20 7b 0a 20 20 20 20 20 20 74 65  se 5: {.      te
1d7d0 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26  stcase( aKey[0]&
1d7e0 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65  0x80 );.      re
1d7f0 74 75 72 6e 20 46 4f 55 52 5f 42 59 54 45 5f 55  turn FOUR_BYTE_U
1d800 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20 28 28  INT(aKey+2) + ((
1d810 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f  (i64)1)<<32)*TWO
1d820 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
1d830 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1d840 36 3a 20 7b 0a 20 20 20 20 20 20 75 36 34 20 78  6: {.      u64 x
1d850 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   = FOUR_BYTE_UIN
1d860 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74  T(aKey);.      t
1d870 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d  estcase( aKey[0]
1d880 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 78  &0x80 );.      x
1d890 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55   = (x<<32) | FOU
1d8a0 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
1d8b0 2b 34 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  +4);.      retur
1d8c0 6e 20 28 69 36 34 29 2a 28 69 36 34 2a 29 26 78  n (i64)*(i64*)&x
1d8d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
1d8e0 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79  eturn (serial_ty
1d8f0 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pe - 8);.}../*.*
1d900 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1d910 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f  compares the two
1d920 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69   table rows or i
1d930 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20  ndex records.** 
1d940 73 70 65 63 69 66 69 65 64 20 62 79 20 7b 6e 4b  specified by {nK
1d950 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20  ey1, pKey1} and 
1d960 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65 74 75  pPKey2.  It retu
1d970 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65 2c 20  rns a negative, 
1d980 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74  zero.** or posit
1d990 69 76 65 20 69 6e 74 65 67 65 72 20 69 66 20 6b  ive integer if k
1d9a0 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ey1 is less than
1d9b0 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a  , equal to or .*
1d9c0 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6b  * greater than k
1d9d0 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31  ey2.  The {nKey1
1d9e0 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73  , pKey1} key mus
1d9f0 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63  t be a blob.** c
1da00 72 65 61 74 65 64 20 62 79 20 74 68 65 20 4f 50  reated by the OP
1da10 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
1da20 64 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20  de of the VDBE. 
1da30 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b   The pPKey2.** k
1da40 65 79 20 6d 75 73 74 20 62 65 20 61 20 70 61 72  ey must be a par
1da50 73 65 64 20 6b 65 79 20 73 75 63 68 20 61 73 20  sed key such as 
1da60 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
1da70 20 73 71 6c 69 74 65 33 56 64 62 65 50 61 72 73   sqlite3VdbePars
1da80 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49  eRecord..**.** I
1da90 66 20 61 72 67 75 6d 65 6e 74 20 62 53 6b 69 70  f argument bSkip
1daa0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74   is non-zero, it
1dab0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
1dac0 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
1dad0 61 6c 72 65 61 64 79 0a 2a 2a 20 64 65 74 65 72  already.** deter
1dae0 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65 20 66  mined that the f
1daf0 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74  irst fields of t
1db00 68 65 20 6b 65 79 73 20 61 72 65 20 65 71 75 61  he keys are equa
1db10 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e  l..**.** Key1 an
1db20 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68 61  d Key2 do not ha
1db30 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ve to contain th
1db40 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
1db50 20 66 69 65 6c 64 73 2e 20 49 66 20 61 6c 6c 20   fields. If all 
1db60 0a 2a 2a 20 66 69 65 6c 64 73 20 74 68 61 74 20  .** fields that 
1db70 61 70 70 65 61 72 20 69 6e 20 62 6f 74 68 20 6b  appear in both k
1db80 65 79 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74  eys are equal, t
1db90 68 65 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  hen pPKey2->defa
1dba0 75 6c 74 5f 72 63 20 69 73 20 0a 2a 2a 20 72 65  ult_rc is .** re
1dbb0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
1dbc0 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
1dbd0 74 69 6f 6e 20 69 73 20 64 69 73 63 6f 76 65 72  tion is discover
1dbe0 65 64 2c 20 73 65 74 20 70 50 4b 65 79 32 2d 3e  ed, set pPKey2->
1dbf0 65 72 72 43 6f 64 65 20 74 6f 20 0a 2a 2a 20 53  errCode to .** S
1dc00 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 61 6e  QLITE_CORRUPT an
1dc10 64 20 72 65 74 75 72 6e 20 30 2e 20 49 66 20 61  d return 0. If a
1dc20 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65  n OOM error is e
1dc30 6e 63 6f 75 6e 74 65 72 65 64 2c 20 0a 2a 2a 20  ncountered, .** 
1dc40 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20  pPKey2->errCode 
1dc50 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
1dc60 5f 4e 4f 4d 45 4d 20 61 6e 64 2c 20 69 66 20 69  _NOMEM and, if i
1dc70 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  t is not NULL, t
1dc80 68 65 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d 66 61 69  he.** malloc-fai
1dc90 6c 65 64 20 66 6c 61 67 20 73 65 74 20 6f 6e 20  led flag set on 
1dca0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
1dcb0 28 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66  (pPKey2->pKeyInf
1dcc0 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73  o->db)..*/.int s
1dcd0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1dce0 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28  CompareWithSkip(
1dcf0 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
1dd00 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
1dd10 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a     /* Left key *
1dd20 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
1dd30 72 64 20 2a 70 50 4b 65 79 32 2c 20 20 20 20 20  rd *pPKey2,     
1dd40 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79      /* Right key
1dd50 20 2a 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70 20   */.  int bSkip 
1dd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd70 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
1dd80 2c 20 73 6b 69 70 20 74 68 65 20 66 69 72 73 74  , skip the first
1dd90 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 75   field */.){.  u
1dda0 33 32 20 64 31 3b 20 20 20 20 20 20 20 20 20 20  32 d1;          
1ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ddc0 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b  * Offset into aK
1ddd0 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74  ey[] of next dat
1dde0 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  a element */.  i
1ddf0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
1de00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1de10 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20  * Index of next 
1de20 66 69 65 6c 64 20 74 6f 20 63 6f 6d 70 61 72 65  field to compare
1de30 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31   */.  u32 szHdr1
1de40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1de50 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1de60 20 72 65 63 6f 72 64 20 68 65 61 64 65 72 20 69   record header i
1de70 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
1de80 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20 20   idx1;          
1de90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dea0 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20  Offset of first 
1deb0 74 79 70 65 20 69 6e 20 68 65 61 64 65 72 20 2a  type in header *
1dec0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20  /.  int rc = 0; 
1ded0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dee0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
1def0 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52  lue */.  Mem *pR
1df00 68 73 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65  hs = pPKey2->aMe
1df10 6d 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74  m;       /* Next
1df20 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32   field of pPKey2
1df30 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20   to compare */. 
1df40 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1df50 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65  fo = pPKey2->pKe
1df60 79 49 6e 66 6f 3b 0a 20 20 63 6f 6e 73 74 20 75  yInfo;.  const u
1df70 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
1df80 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73  ey1 = (const uns
1df90 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65  igned char *)pKe
1dfa0 79 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a  y1;.  Mem mem1;.
1dfb0 0a 20 20 2f 2a 20 49 66 20 62 53 6b 69 70 20 69  .  /* If bSkip i
1dfc0 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
1dfd0 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65   caller has alre
1dfe0 61 64 79 20 64 65 74 65 72 6d 69 6e 65 64 20 74  ady determined t
1dff0 68 61 74 20 74 68 65 20 66 69 72 73 74 0a 20 20  hat the first.  
1e000 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20  ** two elements 
1e010 69 6e 20 74 68 65 20 6b 65 79 73 20 61 72 65 20  in the keys are 
1e020 65 71 75 61 6c 2e 20 46 69 78 20 74 68 65 20 76  equal. Fix the v
1e030 61 72 69 6f 75 73 20 73 74 61 63 6b 20 76 61 72  arious stack var
1e040 69 61 62 6c 65 73 20 73 6f 0a 20 20 2a 2a 20 74  iables so.  ** t
1e050 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hat this routine
1e060 20 62 65 67 69 6e 73 20 63 6f 6d 70 61 72 69 6e   begins comparin
1e070 67 20 61 74 20 74 68 65 20 73 65 63 6f 6e 64 20  g at the second 
1e080 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 69 66 28 20  field. */.  if( 
1e090 62 53 6b 69 70 20 29 7b 0a 20 20 20 20 75 33 32  bSkip ){.    u32
1e0a0 20 73 31 3b 0a 20 20 20 20 69 64 78 31 20 3d 20   s1;.    idx1 = 
1e0b0 31 20 2b 20 67 65 74 56 61 72 69 6e 74 33 32 28  1 + getVarint32(
1e0c0 26 61 4b 65 79 31 5b 31 5d 2c 20 73 31 29 3b 0a  &aKey1[1], s1);.
1e0d0 20 20 20 20 73 7a 48 64 72 31 20 3d 20 61 4b 65      szHdr1 = aKe
1e0e0 79 31 5b 30 5d 3b 0a 20 20 20 20 64 31 20 3d 20  y1[0];.    d1 = 
1e0f0 73 7a 48 64 72 31 20 2b 20 73 71 6c 69 74 65 33  szHdr1 + sqlite3
1e100 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
1e110 6e 28 73 31 29 3b 0a 20 20 20 20 69 20 3d 20 31  n(s1);.    i = 1
1e120 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20  ;.    pRhs++;.  
1e130 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 31 20  }else{.    idx1 
1e140 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b  = getVarint32(aK
1e150 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20  ey1, szHdr1);.  
1e160 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20    d1 = szHdr1;. 
1e170 20 20 20 69 66 28 20 64 31 3e 28 75 6e 73 69 67     if( d1>(unsig
1e180 6e 65 64 29 6e 4b 65 79 31 20 29 7b 20 0a 20 20  ned)nKey1 ){ .  
1e190 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43      pPKey2->errC
1e1a0 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45  ode = (u8)SQLITE
1e1b0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1e1c0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1e1d0 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  /* Corruption */
1e1e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 30  .    }.    i = 0
1e1f0 3b 0a 20 20 7d 0a 0a 20 20 56 56 41 5f 4f 4e 4c  ;.  }..  VVA_ONL
1e200 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63  Y( mem1.szMalloc
1e210 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20   = 0; ) /* Only 
1e220 6e 65 65 64 65 64 20 62 79 20 61 73 73 65 72 74  needed by assert
1e230 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  () statements */
1e240 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79  .  assert( pPKey
1e250 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  2->pKeyInfo->nFi
1e260 65 6c 64 2b 70 50 4b 65 79 32 2d 3e 70 4b 65 79  eld+pPKey2->pKey
1e270 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70  Info->nXField>=p
1e280 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 0a 20  PKey2->nField . 
1e290 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54        || CORRUPT
1e2a0 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
1e2b0 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1e2c0 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30  o->aSortOrder!=0
1e2d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1e2e0 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
1e2f0 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73  nField>0 );.  as
1e300 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64  sert( idx1<=szHd
1e310 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  r1 || CORRUPT_DB
1e320 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33   );.  do{.    u3
1e330 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a  2 serial_type;..
1e340 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 6e      /* RHS is an
1e350 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1e360 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20  if( pRhs->flags 
1e370 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20  & MEM_Int ){.   
1e380 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d     serial_type =
1e390 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20   aKey1[idx1];.  
1e3a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65      testcase( se
1e3b0 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b  rial_type==12 );
1e3c0 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
1e3d0 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20  l_type>=10 ){.  
1e3e0 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20        rc = +1;. 
1e3f0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
1e400 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b  erial_type==0 ){
1e410 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31  .        rc = -1
1e420 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1e430 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37  ( serial_type==7
1e440 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1e450 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1e460 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72  (&aKey1[d1], ser
1e470 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29  ial_type, &mem1)
1e480 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  ;.        rc = -
1e490 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43  sqlite3IntFloatC
1e4a0 6f 6d 70 61 72 65 28 70 52 68 73 2d 3e 75 2e 69  ompare(pRhs->u.i
1e4b0 2c 20 6d 65 6d 31 2e 75 2e 72 29 3b 0a 20 20 20  , mem1.u.r);.   
1e4c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e4d0 20 20 69 36 34 20 6c 68 73 20 3d 20 76 64 62 65    i64 lhs = vdbe
1e4e0 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28  RecordDecodeInt(
1e4f0 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 61 4b  serial_type, &aK
1e500 65 79 31 5b 64 31 5d 29 3b 0a 20 20 20 20 20 20  ey1[d1]);.      
1e510 20 20 69 36 34 20 72 68 73 20 3d 20 70 52 68 73    i64 rhs = pRhs
1e520 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 69  ->u.i;.        i
1e530 66 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20  f( lhs<rhs ){.  
1e540 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
1e550 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1e560 66 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20  f( lhs>rhs ){.  
1e570 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b          rc = +1;
1e580 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1e590 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1e5a0 20 52 48 53 20 69 73 20 72 65 61 6c 20 2a 2f 0a   RHS is real */.
1e5b0 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68      else if( pRh
1e5c0 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  s->flags & MEM_R
1e5d0 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 65 72  eal ){.      ser
1e5e0 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31  ial_type = aKey1
1e5f0 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 69 66  [idx1];.      if
1e600 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
1e610 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
1e620 53 65 72 69 61 6c 20 74 79 70 65 73 20 31 32 20  Serial types 12 
1e630 6f 72 20 67 72 65 61 74 65 72 20 61 72 65 20 73  or greater are s
1e640 74 72 69 6e 67 73 20 61 6e 64 20 62 6c 6f 62 73  trings and blobs
1e650 20 28 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20   (greater than. 
1e660 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
1e670 73 29 2e 20 54 79 70 65 73 20 31 30 20 61 6e 64  s). Types 10 and
1e680 20 31 31 20 61 72 65 20 63 75 72 72 65 6e 74 6c   11 are currentl
1e690 79 20 22 72 65 73 65 72 76 65 64 20 66 6f 72 20  y "reserved for 
1e6a0 66 75 74 75 72 65 20 0a 20 20 20 20 20 20 20 20  future .        
1e6b0 2a 2a 20 75 73 65 22 2c 20 73 6f 20 69 74 20 64  ** use", so it d
1e6c0 6f 65 73 6e 27 74 20 72 65 61 6c 6c 79 20 6d 61  oesn't really ma
1e6d0 74 74 65 72 20 77 68 61 74 20 74 68 65 20 72 65  tter what the re
1e6e0 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70 61 72 69  sults of compari
1e6f0 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ng.        ** th
1e700 65 6d 20 74 6f 20 6e 75 6d 62 65 72 69 63 20 76  em to numberic v
1e710 61 6c 75 65 73 20 61 72 65 2e 20 20 2a 2f 0a 20  alues are.  */. 
1e720 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a         rc = +1;.
1e730 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1e740 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29  serial_type==0 )
1e750 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
1e760 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
1e770 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1e780 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
1e790 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f  ey1[d1], serial_
1e7a0 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20  type, &mem1);.  
1e7b0 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
1e7c0 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20  _type==7 ){.    
1e7d0 20 20 20 20 20 20 69 66 28 20 6d 65 6d 31 2e 75        if( mem1.u
1e7e0 2e 72 3c 70 52 68 73 2d 3e 75 2e 72 20 29 7b 0a  .r<pRhs->u.r ){.
1e7f0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1e800 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   -1;.          }
1e810 65 6c 73 65 20 69 66 28 20 6d 65 6d 31 2e 75 2e  else if( mem1.u.
1e820 72 3e 70 52 68 73 2d 3e 75 2e 72 20 29 7b 0a 20  r>pRhs->u.r ){. 
1e830 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1e840 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  +1;.          }.
1e850 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1e860 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1e870 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d  lite3IntFloatCom
1e880 70 61 72 65 28 6d 65 6d 31 2e 75 2e 69 2c 20 70  pare(mem1.u.i, p
1e890 52 68 73 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20  Rhs->u.r);.     
1e8a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1e8b0 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69   }..    /* RHS i
1e8c0 73 20 61 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  s a string */.  
1e8d0 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d    else if( pRhs-
1e8e0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72  >flags & MEM_Str
1e8f0 20 29 7b 0a 20 20 20 20 20 20 67 65 74 56 61 72   ){.      getVar
1e900 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78  int32(&aKey1[idx
1e910 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29  1], serial_type)
1e920 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e930 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31  ( serial_type==1
1e940 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  2 );.      if( s
1e950 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b  erial_type<12 ){
1e960 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31  .        rc = -1
1e970 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1e980 28 20 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20  ( !(serial_type 
1e990 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20  & 0x01) ){.     
1e9a0 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20     rc = +1;.    
1e9b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e9c0 20 6d 65 6d 31 2e 6e 20 3d 20 28 73 65 72 69 61   mem1.n = (seria
1e9d0 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32  l_type - 12) / 2
1e9e0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1e9f0 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 3d  se( (d1+mem1.n)=
1ea00 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
1ea10 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
1ea20 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e  case( (d1+mem1.n
1ea30 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e  +1)==(unsigned)n
1ea40 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20  Key1 );.        
1ea50 69 66 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 20  if( (d1+mem1.n) 
1ea60 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  > (unsigned)nKey
1ea70 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  1 ){.          p
1ea80 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d  PKey2->errCode =
1ea90 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52   (u8)SQLITE_CORR
1eaa0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1eab0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1eac0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ead0 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  Corruption */.  
1eae0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1eaf0 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
1eb00 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i] ){.          
1eb10 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49  mem1.enc = pKeyI
1eb20 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20  nfo->enc;.      
1eb30 20 20 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b      mem1.db = pK
1eb40 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20  eyInfo->db;.    
1eb50 20 20 20 20 20 20 6d 65 6d 31 2e 66 6c 61 67 73        mem1.flags
1eb60 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 20 20   = MEM_Str;.    
1eb70 20 20 20 20 20 20 6d 65 6d 31 2e 7a 20 3d 20 28        mem1.z = (
1eb80 63 68 61 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d  char*)&aKey1[d1]
1eb90 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1eba0 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53   vdbeCompareMemS
1ebb0 74 72 69 6e 67 28 0a 20 20 20 20 20 20 20 20 20  tring(.         
1ebc0 20 20 20 20 20 26 6d 65 6d 31 2c 20 70 52 68 73       &mem1, pRhs
1ebd0 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  , pKeyInfo->aCol
1ebe0 6c 5b 69 5d 2c 20 26 70 50 4b 65 79 32 2d 3e 65  l[i], &pPKey2->e
1ebf0 72 72 43 6f 64 65 0a 20 20 20 20 20 20 20 20 20  rrCode.         
1ec00 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   );.        }els
1ec10 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e{.          int
1ec20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d 65 6d 31   nCmp = MIN(mem1
1ec30 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20  .n, pRhs->n);.  
1ec40 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d          rc = mem
1ec50 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  cmp(&aKey1[d1], 
1ec60 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a  pRhs->z, nCmp);.
1ec70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1ec80 3d 3d 30 20 29 20 72 63 20 3d 20 6d 65 6d 31 2e  ==0 ) rc = mem1.
1ec90 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a 20 20  n - pRhs->n; .  
1eca0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1ecb0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48      }..    /* RH
1ecc0 53 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20  S is a blob */. 
1ecd0 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73     else if( pRhs
1ece0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c  ->flags & MEM_Bl
1ecf0 6f 62 20 29 7b 0a 20 20 20 20 20 20 67 65 74 56  ob ){.      getV
1ed00 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69  arint32(&aKey1[i
1ed10 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  dx1], serial_typ
1ed20 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
1ed30 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  se( serial_type=
1ed40 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28  =12 );.      if(
1ed50 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20   serial_type<12 
1ed60 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20  || (serial_type 
1ed70 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20  & 0x01) ){.     
1ed80 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
1ed90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1eda0 20 69 6e 74 20 6e 53 74 72 20 3d 20 28 73 65 72   int nStr = (ser
1edb0 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f  ial_type - 12) /
1edc0 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   2;.        test
1edd0 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72 29 3d  case( (d1+nStr)=
1ede0 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
1edf0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
1ee00 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72 2b 31  case( (d1+nStr+1
1ee10 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  )==(unsigned)nKe
1ee20 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  y1 );.        if
1ee30 28 20 28 64 31 2b 6e 53 74 72 29 20 3e 20 28 75  ( (d1+nStr) > (u
1ee40 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b  nsigned)nKey1 ){
1ee50 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79  .          pPKey
1ee60 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38  2->errCode = (u8
1ee70 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f  )SQLITE_CORRUPT_
1ee80 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
1ee90 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1eea0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72           /* Corr
1eeb0 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uption */.      
1eec0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1eed0 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49     int nCmp = MI
1eee0 4e 28 6e 53 74 72 2c 20 70 52 68 73 2d 3e 6e 29  N(nStr, pRhs->n)
1eef0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1ef00 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64   memcmp(&aKey1[d
1ef10 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d  1], pRhs->z, nCm
1ef20 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  p);.          if
1ef30 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6e  ( rc==0 ) rc = n
1ef40 53 74 72 20 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20  Str - pRhs->n;. 
1ef50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1ef60 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
1ef70 48 53 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20  HS is null */.  
1ef80 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 65    else{.      se
1ef90 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79  rial_type = aKey
1efa0 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 72  1[idx1];.      r
1efb0 63 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  c = (serial_type
1efc0 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  !=0);.    }..   
1efd0 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
1efe0 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
1eff0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
1f000 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1f010 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -rc;.      }.   
1f020 20 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52     assert( vdbeR
1f030 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75  ecordCompareDebu
1f040 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  g(nKey1, pKey1, 
1f050 70 50 4b 65 79 32 2c 20 72 63 29 20 29 3b 0a 20  pPKey2, rc) );. 
1f060 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d       assert( mem
1f070 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  1.szMalloc==0 );
1f080 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74    /* See comment
1f090 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20   below */.      
1f0a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1f0b0 0a 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 70  ..    i++;.    p
1f0c0 52 68 73 2b 2b 3b 0a 20 20 20 20 64 31 20 2b 3d  Rhs++;.    d1 +=
1f0d0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1f0e0 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
1f0f0 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 64 78 31  _type);.    idx1
1f100 20 2b 3d 20 73 71 6c 69 74 65 33 56 61 72 69 6e   += sqlite3Varin
1f110 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  tLen(serial_type
1f120 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78  );.  }while( idx
1f130 31 3c 28 75 6e 73 69 67 6e 65 64 29 73 7a 48 64  1<(unsigned)szHd
1f140 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e  r1 && i<pPKey2->
1f150 6e 46 69 65 6c 64 20 26 26 20 64 31 3c 3d 28 75  nField && d1<=(u
1f160 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b  nsigned)nKey1 );
1f170 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79  ..  /* No memory
1f180 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65   allocation is e
1f190 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31  ver used on mem1
1f1a0 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73  .  Prove this us
1f1b0 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c  ing.  ** the fol
1f1c0 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e  lowing assert().
1f1d0 20 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28    If the assert(
1f1e0 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69  ) fails, it indi
1f1f0 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d  cates a.  ** mem
1f200 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e  ory leak and a n
1f210 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69  eed to call sqli
1f220 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
1f230 65 28 26 6d 65 6d 31 29 2e 20 20 2a 2f 0a 20 20  e(&mem1).  */.  
1f240 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d  assert( mem1.szM
1f250 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f  alloc==0 );..  /
1f260 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61  * rc==0 here mea
1f270 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 72 20 62  ns that one or b
1f280 6f 74 68 20 6f 66 20 74 68 65 20 6b 65 79 73 20  oth of the keys 
1f290 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64  ran out of field
1f2a0 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74  s and.  ** all t
1f2b0 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20  he fields up to 
1f2c0 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20  that point were 
1f2d0 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68  equal. Return th
1f2e0 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a  e default_rc.  *
1f2f0 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 61  * value.  */.  a
1f300 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
1f310 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 76 64 62  B .       || vdb
1f320 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65  eRecordCompareDe
1f330 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  bug(nKey1, pKey1
1f340 2c 20 70 50 4b 65 79 32 2c 20 70 50 4b 65 79 32  , pPKey2, pPKey2
1f350 2d 3e 64 65 66 61 75 6c 74 5f 72 63 29 20 0a 20  ->default_rc) . 
1f360 20 20 20 20 20 20 7c 7c 20 70 4b 65 79 49 6e 66        || pKeyInf
1f370 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  o->db->mallocFai
1f380 6c 65 64 0a 20 20 29 3b 0a 20 20 70 50 4b 65 79  led.  );.  pPKey
1f390 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20  2->eqSeen = 1;. 
1f3a0 20 72 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e   return pPKey2->
1f3b0 64 65 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a 69 6e  default_rc;.}.in
1f3c0 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  t sqlite3VdbeRec
1f3d0 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e  ordCompare(.  in
1f3e0 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
1f3f0 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a  oid *pKey1,   /*
1f400 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55   Left key */.  U
1f410 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1f420 50 4b 65 79 32 20 20 20 20 20 20 20 20 20 20 2f  PKey2          /
1f430 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29  * Right key */.)
1f440 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
1f450 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1f460 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79  areWithSkip(nKey
1f470 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1f480 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  , 0);.}.../*.** 
1f490 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1f4a0 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65   an optimized ve
1f4b0 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33  rsion of sqlite3
1f4c0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1f4d0 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29  e() .** that (a)
1f4e0 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
1f4f0 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61 6e   of pPKey2 is an
1f500 20 69 6e 74 65 67 65 72 2c 20 61 6e 64 20 28 62   integer, and (b
1f510 29 20 74 68 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f  ) the .** size-o
1f520 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20  f-header varint 
1f530 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
1f540 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69  (pKey1/nKey1) fi
1f550 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 0a 2a  ts in a single.*
1f560 2a 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20  * byte (i.e. is 
1f570 6c 65 73 73 20 74 68 61 6e 20 31 32 38 29 2e 0a  less than 128)..
1f580 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 63  **.** To avoid c
1f590 6f 6e 63 65 72 6e 73 20 61 62 6f 75 74 20 62 75  oncerns about bu
1f5a0 66 66 65 72 20 6f 76 65 72 72 65 61 64 73 2c 20  ffer overreads, 
1f5b0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1f5c0 6f 6e 6c 79 20 75 73 65 64 0a 2a 2a 20 6f 6e 20  only used.** on 
1f5d0 73 63 68 65 6d 61 73 20 77 68 65 72 65 20 74 68  schemas where th
1f5e0 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 69 64 20  e maximum valid 
1f5f0 68 65 61 64 65 72 20 73 69 7a 65 20 69 73 20 36  header size is 6
1f600 33 20 62 79 74 65 73 20 6f 72 20 6c 65 73 73 2e  3 bytes or less.
1f610 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
1f620 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1f630 49 6e 74 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31  Int(.  int nKey1
1f640 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
1f650 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79  ey1, /* Left key
1f660 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
1f670 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20  cord *pPKey2    
1f680 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79      /* Right key
1f690 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75   */.){.  const u
1f6a0 38 20 2a 61 4b 65 79 20 3d 20 26 28 28 63 6f 6e  8 *aKey = &((con
1f6b0 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 2a 28  st u8*)pKey1)[*(
1f6c0 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 20  const u8*)pKey1 
1f6d0 26 20 30 78 33 46 5d 3b 0a 20 20 69 6e 74 20 73  & 0x3F];.  int s
1f6e0 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 28 28 63  erial_type = ((c
1f6f0 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b  onst u8*)pKey1)[
1f700 31 5d 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  1];.  int res;. 
1f710 20 75 33 32 20 79 3b 0a 20 20 75 36 34 20 78 3b   u32 y;.  u64 x;
1f720 0a 20 20 69 36 34 20 76 20 3d 20 70 50 4b 65 79  .  i64 v = pPKey
1f730 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a  2->aMem[0].u.i;.
1f740 20 20 69 36 34 20 6c 68 73 3b 0a 0a 20 20 76 64    i64 lhs;..  vd
1f750 62 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75  beAssertFieldCou
1f760 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e  ntWithinLimits(n
1f770 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
1f780 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a  ey2->pKeyInfo);.
1f790 20 20 61 73 73 65 72 74 28 20 28 2a 28 75 38 2a    assert( (*(u8*
1f7a0 29 70 4b 65 79 31 29 3c 3d 30 78 33 46 20 7c 7c  )pKey1)<=0x3F ||
1f7b0 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
1f7c0 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f   switch( serial_
1f7d0 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
1f7e0 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20   1: { /* 1-byte 
1f7f0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1f800 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 4f 4e  /.      lhs = ON
1f810 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  E_BYTE_INT(aKey)
1f820 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f830 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
1f840 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1f850 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32    case 2: { /* 2
1f860 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1f870 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68  eger */.      lh
1f880 73 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54  s = TWO_BYTE_INT
1f890 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65  (aKey);.      te
1f8a0 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
1f8b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1f8c0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20    }.    case 3: 
1f8d0 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e  { /* 3-byte sign
1f8e0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1f8f0 20 20 20 20 6c 68 73 20 3d 20 54 48 52 45 45 5f      lhs = THREE_
1f900 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1f910 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f920 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
1f930 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1f940 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62  case 4: { /* 4-b
1f950 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1f960 65 72 20 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20  er */.      y = 
1f970 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
1f980 4b 65 79 29 3b 0a 20 20 20 20 20 20 6c 68 73 20  Key);.      lhs 
1f990 3d 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79  = (i64)*(int*)&y
1f9a0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f9b0 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
1f9c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1f9d0 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36    case 5: { /* 6
1f9e0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1f9f0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68  eger */.      lh
1fa00 73 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  s = FOUR_BYTE_UI
1fa10 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28  NT(aKey+2) + (((
1fa20 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f  i64)1)<<32)*TWO_
1fa30 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1fa40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fa50 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
1fa60 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1fa70 63 61 73 65 20 36 3a 20 7b 20 2f 2a 20 38 2d 62  case 6: { /* 8-b
1fa80 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1fa90 65 72 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20  er */.      x = 
1faa0 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
1fab0 4b 65 79 29 3b 0a 20 20 20 20 20 20 78 20 3d 20  Key);.      x = 
1fac0 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42  (x<<32) | FOUR_B
1fad0 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29  YTE_UINT(aKey+4)
1fae0 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 2a 28  ;.      lhs = *(
1faf0 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 74  i64*)&x;.      t
1fb00 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
1fb10 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1fb20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a     }.    case 8:
1fb30 20 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 30 3b   .      lhs = 0;
1fb40 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1fb50 20 20 63 61 73 65 20 39 3a 0a 20 20 20 20 20 20    case 9:.      
1fb60 6c 68 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 62  lhs = 1;.      b
1fb70 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  reak;..    /* Th
1fb80 69 73 20 63 61 73 65 20 63 6f 75 6c 64 20 62 65  is case could be
1fb90 20 72 65 6d 6f 76 65 64 20 77 69 74 68 6f 75 74   removed without
1fba0 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 72 65   changing the re
1fbb0 73 75 6c 74 73 20 6f 66 20 72 75 6e 6e 69 6e 67  sults of running
1fbc0 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64  .    ** this cod
1fbd0 65 2e 20 49 6e 63 6c 75 64 69 6e 67 20 69 74 20  e. Including it 
1fbe0 63 61 75 73 65 73 20 67 63 63 20 74 6f 20 67 65  causes gcc to ge
1fbf0 6e 65 72 61 74 65 20 61 20 66 61 73 74 65 72 20  nerate a faster 
1fc00 73 77 69 74 63 68 20 0a 20 20 20 20 2a 2a 20 73  switch .    ** s
1fc10 74 61 74 65 6d 65 6e 74 20 28 73 69 6e 63 65 20  tatement (since 
1fc20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 73 77 69  the range of swi
1fc30 74 63 68 20 74 61 72 67 65 74 73 20 6e 6f 77 20  tch targets now 
1fc40 73 74 61 72 74 73 20 61 74 20 7a 65 72 6f 20 61  starts at zero a
1fc50 6e 64 0a 20 20 20 20 2a 2a 20 69 73 20 63 6f 6e  nd.    ** is con
1fc60 74 69 67 75 6f 75 73 29 20 62 75 74 20 64 6f 65  tiguous) but doe
1fc70 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20  s not cause any 
1fc80 64 75 70 6c 69 63 61 74 65 20 63 6f 64 65 20 74  duplicate code t
1fc90 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 0a 20  o be generated. 
1fca0 20 20 20 2a 2a 20 28 61 73 20 67 63 63 20 69 73     ** (as gcc is
1fcb0 20 63 6c 65 76 65 72 20 65 6e 6f 75 67 68 20 74   clever enough t
1fcc0 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 74 77  o combine the tw
1fcd0 6f 20 6c 69 6b 65 20 63 61 73 65 73 29 2e 20 4f  o like cases). O
1fce0 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6d  ther .    ** com
1fcf0 70 69 6c 65 72 73 20 6d 69 67 68 74 20 62 65 20  pilers might be 
1fd00 73 69 6d 69 6c 61 72 2e 20 20 2a 2f 20 0a 20 20  similar.  */ .  
1fd10 20 20 63 61 73 65 20 30 3a 20 63 61 73 65 20 37    case 0: case 7
1fd20 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  :.      return s
1fd30 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1fd40 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70  Compare(nKey1, p
1fd50 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 0a  Key1, pPKey2);..
1fd60 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
1fd70 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
1fd80 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1fd90 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  re(nKey1, pKey1,
1fda0 20 70 50 4b 65 79 32 29 3b 0a 20 20 7d 0a 0a 20   pPKey2);.  }.. 
1fdb0 20 69 66 28 20 76 3e 6c 68 73 20 29 7b 0a 20 20   if( v>lhs ){.  
1fdc0 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
1fdd0 72 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  r1;.  }else if( 
1fde0 76 3c 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73  v<lhs ){.    res
1fdf0 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20   = pPKey2->r2;. 
1fe00 20 7d 65 6c 73 65 20 69 66 28 20 70 50 4b 65 79   }else if( pPKey
1fe10 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20  2->nField>1 ){. 
1fe20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
1fe30 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77  fields of the tw
1fe40 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c  o keys are equal
1fe50 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74 72  . Compare the tr
1fe60 61 69 6c 69 6e 67 20 0a 20 20 20 20 2a 2a 20 66  ailing .    ** f
1fe70 69 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 20 20 72  ields.  */.    r
1fe80 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  es = sqlite3Vdbe
1fe90 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74  RecordCompareWit
1fea0 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65  hSkip(nKey1, pKe
1feb0 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a  y1, pPKey2, 1);.
1fec0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1fed0 54 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73  The first fields
1fee0 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73   of the two keys
1fef0 20 61 72 65 20 65 71 75 61 6c 20 61 6e 64 20 74   are equal and t
1ff00 68 65 72 65 20 61 72 65 20 6e 6f 20 74 72 61 69  here are no trai
1ff10 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 66 69 65 6c  ling.    ** fiel
1ff20 64 73 2e 20 52 65 74 75 72 6e 20 70 50 4b 65 79  ds. Return pPKey
1ff30 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 6e  2->default_rc in
1ff40 20 74 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20   this case. */. 
1ff50 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
1ff60 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20  >default_rc;.   
1ff70 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20   pPKey2->eqSeen 
1ff80 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  = 1;.  }..  asse
1ff90 72 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f  rt( vdbeRecordCo
1ffa0 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31  mpareDebug(nKey1
1ffb0 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
1ffc0 20 72 65 73 29 20 29 3b 0a 20 20 72 65 74 75 72   res) );.  retur
1ffd0 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
1ffe0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1fff0 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65   an optimized ve
20000 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33  rsion of sqlite3
20010 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
20020 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29  e() .** that (a)
20030 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
20040 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61 20   of pPKey2 is a 
20050 73 74 72 69 6e 67 2c 20 74 68 61 74 20 28 62 29  string, that (b)
20060 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
20070 0a 2a 2a 20 75 73 65 73 20 74 68 65 20 63 6f 6c  .** uses the col
20080 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
20090 42 49 4e 41 52 59 20 61 6e 64 20 28 63 29 20 74  BINARY and (c) t
200a0 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d  hat the size-of-
200b0 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 0a 2a  header varint .*
200c0 2a 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  * at the start o
200d0 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20  f (pKey1/nKey1) 
200e0 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65  fits in a single
200f0 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   byte..*/.static
20100 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43   int vdbeRecordC
20110 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 0a 20 20  ompareString(.  
20120 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
20130 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a   void *pKey1, /*
20140 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55   Left key */.  U
20150 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
20160 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20  PKey2        /* 
20170 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a  Right key */.){.
20180 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79    const u8 *aKey
20190 31 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29 70  1 = (const u8*)p
201a0 4b 65 79 31 3b 0a 20 20 69 6e 74 20 73 65 72 69  Key1;.  int seri
201b0 61 6c 5f 74 79 70 65 3b 0a 20 20 69 6e 74 20 72  al_type;.  int r
201c0 65 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  es;..  assert( p
201d0 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 66  PKey2->aMem[0].f
201e0 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
201f0 3b 0a 20 20 76 64 62 65 41 73 73 65 72 74 46 69  ;.  vdbeAssertFi
20200 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69  eldCountWithinLi
20210 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79  mits(nKey1, pKey
20220 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  1, pPKey2->pKeyI
20230 6e 66 6f 29 3b 0a 20 20 67 65 74 56 61 72 69 6e  nfo);.  getVarin
20240 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73  t32(&aKey1[1], s
20250 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 69  erial_type);.  i
20260 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31  f( serial_type<1
20270 32 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70  2 ){.    res = p
20280 50 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20 20 20  PKey2->r1;      
20290 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29  /* (pKey1/nKey1)
202a0 20 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 72 20   is a number or 
202b0 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73  a null */.  }els
202c0 65 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74  e if( !(serial_t
202d0 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 20 0a  ype & 0x01) ){ .
202e0 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
202f0 2d 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20 28 70  ->r2;      /* (p
20300 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61  Key1/nKey1) is a
20310 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73 65   blob */.  }else
20320 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a  {.    int nCmp;.
20330 20 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a 20 20      int nStr;.  
20340 20 20 69 6e 74 20 73 7a 48 64 72 20 3d 20 61 4b    int szHdr = aK
20350 65 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53 74  ey1[0];..    nSt
20360 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  r = (serial_type
20370 2d 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 69 66  -12) / 2;.    if
20380 28 20 28 73 7a 48 64 72 20 2b 20 6e 53 74 72 29  ( (szHdr + nStr)
20390 20 3e 20 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20   > nKey1 ){.    
203a0 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64    pPKey2->errCod
203b0 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43  e = (u8)SQLITE_C
203c0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
203d0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
203e0 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  /* Corruption */
203f0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6d 70 20  .    }.    nCmp 
20400 3d 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d 3e 61  = MIN( pPKey2->a
20410 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20 29  Mem[0].n, nStr )
20420 3b 0a 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63  ;.    res = memc
20430 6d 70 28 26 61 4b 65 79 31 5b 73 7a 48 64 72 5d  mp(&aKey1[szHdr]
20440 2c 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30  , pPKey2->aMem[0
20450 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20 20  ].z, nCmp);..   
20460 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
20470 20 20 20 20 20 72 65 73 20 3d 20 6e 53 74 72 20       res = nStr 
20480 2d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30  - pPKey2->aMem[0
20490 5d 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ].n;.      if( r
204a0 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  es==0 ){.       
204b0 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69   if( pPKey2->nFi
204c0 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 20  eld>1 ){.       
204d0 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33     res = sqlite3
204e0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
204f0 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c  eWithSkip(nKey1,
20500 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
20510 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1);.        }els
20520 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73  e{.          res
20530 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75   = pPKey2->defau
20540 6c 74 5f 72 63 3b 0a 20 20 20 20 20 20 20 20 20  lt_rc;.         
20550 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20   pPKey2->eqSeen 
20560 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
20570 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
20580 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  es>0 ){.        
20590 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32  res = pPKey2->r2
205a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
205b0 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b         res = pPK
205c0 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 20 20 7d  ey2->r1;.      }
205d0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
205e0 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 65  es>0 ){.      re
205f0 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a  s = pPKey2->r2;.
20600 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20610 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
20620 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
20630 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f  assert( vdbeReco
20640 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
20650 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
20660 65 79 32 2c 20 72 65 73 29 0a 20 20 20 20 20 20  ey2, res).      
20670 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 0a 20   || CORRUPT_DB. 
20680 20 20 20 20 20 20 7c 7c 20 70 50 4b 65 79 32 2d        || pPKey2-
20690 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d  >pKeyInfo->db->m
206a0 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b  allocFailed.  );
206b0 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
206c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
206d0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
206e0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
206f0 43 6f 6d 70 61 72 65 28 29 20 63 6f 6d 70 61 74  Compare() compat
20700 69 62 6c 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ible function.**
20710 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 63 6f   suitable for co
20720 6d 70 61 72 69 6e 67 20 73 65 72 69 61 6c 69 7a  mparing serializ
20730 65 64 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68  ed records to th
20740 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72  e unpacked recor
20750 64 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  d passed.** as t
20760 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
20770 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f 6d 70 61  ..*/.RecordCompa
20780 72 65 20 73 71 6c 69 74 65 33 56 64 62 65 46 69  re sqlite3VdbeFi
20790 6e 64 43 6f 6d 70 61 72 65 28 55 6e 70 61 63 6b  ndCompare(Unpack
207a0 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20  edRecord *p){.  
207b0 2f 2a 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43  /* varintRecordC
207c0 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64 20  ompareInt() and 
207d0 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70  varintRecordComp
207e0 61 72 65 53 74 72 69 6e 67 28 29 20 62 6f 74 68  areString() both
207f0 20 61 73 73 75 6d 65 0a 20 20 2a 2a 20 74 68 61   assume.  ** tha
20800 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65  t the size-of-he
20810 61 64 65 72 20 76 61 72 69 6e 74 20 74 68 61 74  ader varint that
20820 20 6f 63 63 75 72 73 20 61 74 20 74 68 65 20 73   occurs at the s
20830 74 61 72 74 20 6f 66 20 65 61 63 68 20 72 65 63  tart of each rec
20840 6f 72 64 0a 20 20 2a 2a 20 66 69 74 73 20 69 6e  ord.  ** fits in
20850 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 28   a single byte (
20860 69 2e 65 2e 20 69 73 20 31 32 37 20 6f 72 20 6c  i.e. is 127 or l
20870 65 73 73 29 2e 20 76 61 72 69 6e 74 52 65 63 6f  ess). varintReco
20880 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 0a 20  rdCompareInt(). 
20890 20 2a 2a 20 61 6c 73 6f 20 61 73 73 75 6d 65 73   ** also assumes
208a0 20 74 68 61 74 20 69 74 20 69 73 20 73 61 66 65   that it is safe
208b0 20 74 6f 20 6f 76 65 72 72 65 61 64 20 61 20 62   to overread a b
208c0 75 66 66 65 72 20 62 79 20 61 74 20 6c 65 61 73  uffer by at leas
208d0 74 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61 78 69  t the .  ** maxi
208e0 6d 75 6d 20 70 6f 73 73 69 62 6c 65 20 6c 65 67  mum possible leg
208f0 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 70  al header size p
20900 6c 75 73 20 38 20 62 79 74 65 73 2e 20 42 65 63  lus 8 bytes. Bec
20910 61 75 73 65 20 74 68 65 72 65 20 69 73 0a 20 20  ause there is.  
20920 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  ** guaranteed to
20930 20 62 65 20 61 74 20 6c 65 61 73 74 20 37 34 20   be at least 74 
20940 28 62 75 74 20 6e 6f 74 20 31 33 36 29 20 62 79  (but not 136) by
20950 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20 66  tes of padding f
20960 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 0a 20 20  ollowing each.  
20970 2a 2a 20 62 75 66 66 65 72 20 70 61 73 73 65 64  ** buffer passed
20980 20 74 6f 20 76 61 72 69 6e 74 52 65 63 6f 72 64   to varintRecord
20990 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 74 68 69  CompareInt() thi
209a0 73 20 6d 61 6b 65 73 20 69 74 20 63 6f 6e 76 65  s makes it conve
209b0 6e 69 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 6c 69  nient to.  ** li
209c0 6d 69 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  mit the size of 
209d0 74 68 65 20 68 65 61 64 65 72 20 74 6f 20 36 34  the header to 64
209e0 20 62 79 74 65 73 20 69 6e 20 63 61 73 65 73 20   bytes in cases 
209f0 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74 20  where the first 
20a00 66 69 65 6c 64 0a 20 20 2a 2a 20 69 73 20 61 6e  field.  ** is an
20a10 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 0a 20   integer..  **. 
20a20 20 2a 2a 20 54 68 65 20 65 61 73 69 65 73 74 20   ** The easiest 
20a30 77 61 79 20 74 6f 20 65 6e 66 6f 72 63 65 20 74  way to enforce t
20a40 68 69 73 20 6c 69 6d 69 74 20 69 73 20 74 6f 20  his limit is to 
20a50 63 6f 6e 73 69 64 65 72 20 6f 6e 6c 79 20 72 65  consider only re
20a60 63 6f 72 64 73 20 77 69 74 68 0a 20 20 2a 2a 20  cords with.  ** 
20a70 31 33 20 66 69 65 6c 64 73 20 6f 72 20 6c 65 73  13 fields or les
20a80 73 2e 20 49 66 20 74 68 65 20 66 69 72 73 74 20  s. If the first 
20a90 66 69 65 6c 64 20 69 73 20 61 6e 20 69 6e 74 65  field is an inte
20aa0 67 65 72 2c 20 74 68 65 20 6d 61 78 69 6d 75 6d  ger, the maximum
20ab0 20 6c 65 67 61 6c 0a 20 20 2a 2a 20 68 65 61 64   legal.  ** head
20ac0 65 72 20 73 69 7a 65 20 69 73 20 28 31 32 2a 35  er size is (12*5
20ad0 20 2b 20 31 20 2b 20 31 29 20 62 79 74 65 73 2e   + 1 + 1) bytes.
20ae0 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 70    */.  if( (p->p
20af0 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
20b00 2b 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e  + p->pKeyInfo->n
20b10 58 46 69 65 6c 64 29 3c 3d 31 33 20 29 7b 0a 20  XField)<=13 ){. 
20b20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70     int flags = p
20b30 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 3b  ->aMem[0].flags;
20b40 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4b 65 79  .    if( p->pKey
20b50 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
20b60 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  [0] ){.      p->
20b70 72 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d  r1 = 1;.      p-
20b80 3e 72 32 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65  >r2 = -1;.    }e
20b90 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31  lse{.      p->r1
20ba0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e   = -1;.      p->
20bb0 72 32 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  r2 = 1;.    }.  
20bc0 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 4d    if( (flags & M
20bd0 45 4d 5f 49 6e 74 29 20 29 7b 0a 20 20 20 20 20  EM_Int) ){.     
20be0 20 72 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f   return vdbeReco
20bf0 72 64 43 6f 6d 70 61 72 65 49 6e 74 3b 0a 20 20  rdCompareInt;.  
20c00 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65    }.    testcase
20c10 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ( flags & MEM_Re
20c20 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
20c30 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  se( flags & MEM_
20c40 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 74 65 73 74  Null );.    test
20c50 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45  case( flags & ME
20c60 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 69 66  M_Blob );.    if
20c70 28 20 28 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f  ( (flags & (MEM_
20c80 52 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45  Real|MEM_Null|ME
20c90 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 26 26 20 70  M_Blob))==0 && p
20ca0 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  ->pKeyInfo->aCol
20cb0 6c 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  l[0]==0 ){.     
20cc0 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 20 26   assert( flags &
20cd0 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 20 20   MEM_Str );.    
20ce0 20 20 72 65 74 75 72 6e 20 76 64 62 65 52 65 63    return vdbeRec
20cf0 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67  ordCompareString
20d00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
20d10 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
20d20 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a  eRecordCompare;.
20d30 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f  }../*.** pCur po
20d40 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78  ints at an index
20d50 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20 75   entry created u
20d60 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65  sing the OP_Make
20d70 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a  Record opcode..*
20d80 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 69 64  * Read the rowid
20d90 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64   (the last field
20da0 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20   in the record) 
20db0 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20  and store it in 
20dc0 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72  *rowid..** Retur
20dd0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
20de0 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c  verything works,
20df0 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
20e00 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  e otherwise..**.
20e10 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20 62 65  ** pCur might be
20e20 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78   pointing to tex
20e30 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  t obtained from 
20e40 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
20e50 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74  se file..** So t
20e60 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f  he content canno
20e70 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 20 44  t be trusted.  D
20e80 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 68  o appropriate ch
20e90 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ecks on the cont
20ea0 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
20eb0 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28  te3VdbeIdxRowid(
20ec0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43  sqlite3 *db, BtC
20ed0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34  ursor *pCur, i64
20ee0 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20   *rowid){.  i64 
20ef0 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
20f00 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a  int rc;.  u32 sz
20f10 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  Hdr;        /* S
20f20 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
20f30 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52  r */.  u32 typeR
20f40 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69  owid;    /* Seri
20f50 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72  al type of the r
20f60 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65  owid */.  u32 le
20f70 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53  nRowid;     /* S
20f80 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ize of the rowid
20f90 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a   */.  Mem m, v;.
20fa0 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69  .  /* Get the si
20fb0 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ze of the index 
20fc0 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64  entry.  Only ind
20fd0 69 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20  ices entries of 
20fe0 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32  less.  ** than 2
20ff0 47 69 42 20 61 72 65 20 73 75 70 70 6f 72 74 20  GiB are support 
21000 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65  - anything large
21010 20 6d 75 73 74 20 62 65 20 64 61 74 61 62 61 73   must be databas
21020 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
21030 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f  ** Any corruptio
21040 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 69 6e  n is detected in
21050 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
21060 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f  seCellPtr(), tho
21070 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69  ugh, so.  ** thi
21080 73 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c  s code can safel
21090 79 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43  y assume that nC
210a0 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74  ellKey is 32-bit
210b0 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  s  .  */.  asser
210c0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
210d0 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75  ursorIsValid(pCu
210e0 72 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59  r) );.  VVA_ONLY
210f0 28 72 63 20 3d 29 20 73 71 6c 69 74 65 33 42 74  (rc =) sqlite3Bt
21100 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c  reeKeySize(pCur,
21110 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61   &nCellKey);.  a
21120 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
21130 45 5f 4f 4b 20 29 3b 20 20 20 20 20 2f 2a 20 70  E_OK );     /* p
21140 43 75 72 20 69 73 20 61 6c 77 61 79 73 20 76 61  Cur is always va
21150 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 63  lid so KeySize c
21160 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20  annot fail */.  
21170 61 73 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65  assert( (nCellKe
21180 79 20 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55  y & SQLITE_MAX_U
21190 33 32 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b  32)==(u64)nCellK
211a0 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  ey );..  /* Read
211b0 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65   in the complete
211c0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
211d0 69 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20  index entry */. 
211e0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
211f0 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b 0a  nit(&m, db, 0);.
21200 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
21210 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
21220 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65  Cur, 0, (u32)nCe
21230 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20  llKey, 1, &m);. 
21240 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
21250 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
21260 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65 6e   /* The index en
21270 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20 77  try must begin w
21280 69 74 68 20 61 20 68 65 61 64 65 72 20 73 69 7a  ith a header siz
21290 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74  e */.  (void)get
212a0 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e  Varint32((u8*)m.
212b0 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65 73  z, szHdr);.  tes
212c0 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33 20  tcase( szHdr==3 
212d0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
212e0 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69  zHdr==m.n );.  i
212f0 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48 64  f( unlikely(szHd
21300 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48 64  r<3 || (int)szHd
21310 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f  r>m.n) ){.    go
21320 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  to idx_rowid_cor
21330 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20  ruption;.  }..  
21340 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65 6c  /* The last fiel
21350 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 73  d of the index s
21360 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65  hould be an inte
21370 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44 2e  ger - the ROWID.
21380 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68 61  .  ** Verify tha
21390 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
213a0 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e   really is an in
213b0 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69  teger. */.  (voi
213c0 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75  d)getVarint32((u
213d0 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d  8*)&m.z[szHdr-1]
213e0 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20  , typeRowid);.  
213f0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
21400 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74  wid==1 );.  test
21410 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
21420 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =2 );.  testcase
21430 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20 29  ( typeRowid==3 )
21440 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
21450 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20  peRowid==4 );.  
21460 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
21470 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74  wid==5 );.  test
21480 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
21490 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =6 );.  testcase
214a0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20 29  ( typeRowid==8 )
214b0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
214c0 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20  peRowid==9 );.  
214d0 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70  if( unlikely(typ
214e0 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70 65  eRowid<1 || type
214f0 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65 52  Rowid>9 || typeR
21500 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20  owid==7) ){.    
21510 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
21520 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20  orruption;.  }. 
21530 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69   lenRowid = sqli
21540 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65  te3SmallTypeSize
21550 73 5b 74 79 70 65 52 6f 77 69 64 5d 3b 0a 20 20  s[typeRowid];.  
21560 74 65 73 74 63 61 73 65 28 20 28 75 33 32 29 6d  testcase( (u32)m
21570 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77  .n==szHdr+lenRow
21580 69 64 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  id );.  if( unli
21590 6b 65 6c 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a  kely((u32)m.n<sz
215a0 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b  Hdr+lenRowid) ){
215b0 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f  .    goto idx_ro
215c0 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a  wid_corruption;.
215d0 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20    }..  /* Fetch 
215e0 74 68 65 20 69 6e 74 65 67 65 72 20 6f 66 66 20  the integer off 
215f0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
21600 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20  ndex record */. 
21610 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
21620 61 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b  alGet((u8*)&m.z[
21630 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74  m.n-lenRowid], t
21640 79 70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20  ypeRowid, &v);. 
21650 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b   *rowid = v.u.i;
21660 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
21670 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20  mRelease(&m);.  
21680 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
21690 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
216a0 65 20 69 66 20 64 61 74 61 62 61 73 65 20 63 6f  e if database co
216b0 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65  rruption is dete
216c0 63 74 65 64 20 61 66 74 65 72 20 6d 20 68 61 73  cted after m has
216d0 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63   been.  ** alloc
216e0 61 74 65 64 2e 20 20 46 72 65 65 20 74 68 65 20  ated.  Free the 
216f0 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74  m object and ret
21700 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
21710 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64  PT. */.idx_rowid
21720 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74  _corruption:.  t
21730 65 73 74 63 61 73 65 28 20 6d 2e 73 7a 4d 61 6c  estcase( m.szMal
21740 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  loc!=0 );.  sqli
21750 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
21760 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(&m);.  return 
21770 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
21780 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  KPT;.}../*.** Co
21790 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66  mpare the key of
217a0 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
217b0 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 20   that cursor pC 
217c0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
217d0 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65  gainst.** the ke
217e0 79 20 73 74 72 69 6e 67 20 69 6e 20 70 55 6e 70  y string in pUnp
217f0 61 63 6b 65 64 2e 20 20 57 72 69 74 65 20 69 6e  acked.  Write in
21800 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65  to *pRes a numbe
21810 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67  r.** that is neg
21820 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20  ative, zero, or 
21830 70 6f 73 69 74 69 76 65 20 69 66 20 70 43 20 69  positive if pC i
21840 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
21850 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65  al to,.** or gre
21860 61 74 65 72 20 74 68 61 6e 20 70 55 6e 70 61 63  ater than pUnpac
21870 6b 65 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ked.  Return SQL
21880 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
21890 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b  s..**.** pUnpack
218a0 65 64 20 69 73 20 65 69 74 68 65 72 20 63 72 65  ed is either cre
218b0 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 20 72  ated without a r
218c0 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63  owid or is trunc
218d0 61 74 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a  ated so that it.
218e0 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77  ** omits the row
218f0 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20  id at the end.  
21900 54 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65  The rowid at the
21910 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
21920 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67  x entry.** is ig
21930 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 20 20  nored as well.  
21940 48 65 6e 63 65 2c 20 74 68 69 73 20 72 6f 75 74  Hence, this rout
21950 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65  ine only compare
21960 73 20 74 68 65 20 70 72 65 66 69 78 65 73 20 0a  s the prefixes .
21970 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79 73 20 70  ** of the keys p
21980 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69 6e 61  rior to the fina
21990 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65  l rowid, not the
219a0 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a   entire key..*/.
219b0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49  int sqlite3VdbeI
219c0 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20  dxKeyCompare(.  
219d0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
219e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219f0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
21a00 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62  nection */.  Vdb
21a10 65 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20  eCursor *pC,    
21a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21a30 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63   The cursor to c
21a40 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a  ompare against *
21a50 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
21a60 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20  rd *pUnpacked,  
21a70 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64       /* Unpacked
21a80 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20   version of key 
21a90 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20  */.  int *res   
21aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ab0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
21ac0 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65  he comparison re
21ad0 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  sult here */.){.
21ae0 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d    i64 nCellKey =
21af0 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
21b00 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
21b10 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65    Mem m;..  asse
21b20 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
21b30 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
21b40 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 43 2d 3e  );.  pCur = pC->
21b50 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20 61 73  uc.pCursor;.  as
21b60 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
21b70 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
21b80 70 43 75 72 29 20 29 3b 0a 20 20 56 56 41 5f 4f  pCur) );.  VVA_O
21b90 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74 65  NLY(rc =) sqlite
21ba0 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43  3BtreeKeySize(pC
21bb0 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  ur, &nCellKey);.
21bc0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
21bd0 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a  LITE_OK );    /*
21be0 20 70 43 75 72 20 69 73 20 61 6c 77 61 79 73 20   pCur is always 
21bf0 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65  valid so KeySize
21c00 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a   cannot fail */.
21c10 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69    /* nCellKey wi
21c20 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65 74  ll always be bet
21c30 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66  ween 0 and 0xfff
21c40 66 66 66 66 66 20 62 65 63 61 75 73 65 20 6f 66  fffff because of
21c50 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 74 68   the way.  ** th
21c60 61 74 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  at btreeParseCel
21c70 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74  lPtr() and sqlit
21c80 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 29 20  e3GetVarint32() 
21c90 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  are implemented 
21ca0 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65  */.  if( nCellKe
21cb0 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79  y<=0 || nCellKey
21cc0 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20  >0x7fffffff ){. 
21cd0 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20     *res = 0;.   
21ce0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
21cf0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
21d00 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
21d10 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29  mInit(&m, db, 0)
21d20 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
21d30 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
21d40 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e  (pCur, 0, (u32)n
21d50 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b  CellKey, 1, &m);
21d60 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
21d70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
21d80 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33    *res = sqlite3
21d90 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
21da0 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70  e(m.n, m.z, pUnp
21db0 61 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74 65  acked);.  sqlite
21dc0 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
21dd0 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
21de0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
21df0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
21e00 65 74 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f  ets the value to
21e10 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
21e20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
21e30 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63   to.** sqlite3_c
21e40 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20  hanges() on the 
21e50 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
21e60 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  'db'. .*/.void s
21e70 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
21e80 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
21e90 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a  , int nChange){.
21ea0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
21eb0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
21ec0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d  >mutex) );.  db-
21ed0 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e  >nChange = nChan
21ee0 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c  ge;.  db->nTotal
21ef0 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67  Change += nChang
21f00 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  e;.}../*.** Set 
21f10 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64  a flag in the vd
21f20 62 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  be to update the
21f30 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
21f40 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c  when it is final
21f50 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74  ised.** or reset
21f60 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
21f70 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65  3VdbeCountChange
21f80 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d  s(Vdbe *v){.  v-
21f90 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31  >changeCntOn = 1
21fa0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
21fb0 65 76 65 72 79 20 70 72 65 70 61 72 65 64 20 73  every prepared s
21fc0 74 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61  tatement associa
21fd0 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
21fe0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
21ff0 2a 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a  * as expired..**
22000 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73  .** An expired s
22010 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74  tatement means t
22020 68 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f  hat recompilatio
22030 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  n of the stateme
22040 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65  nt is.** recomme
22050 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20  nd.  Statements 
22060 65 78 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e  expire when thin
22070 67 73 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d  gs happen that m
22080 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f  ake their.** pro
22090 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20  grams obsolete. 
220a0 20 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64   Removing user-d
220b0 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  efined functions
220c0 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a   or collating.**
220d0 20 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63   sequences, or c
220e0 68 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f  hanging an autho
220f0 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  rization functio
22100 6e 20 61 72 65 20 74 68 65 20 74 79 70 65 73 20  n are the types 
22110 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61  of.** things tha
22120 74 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20  t make prepared 
22130 73 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c  statements obsol
22140 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ete..*/.void sql
22150 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
22160 65 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c  edStatements(sql
22170 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62  ite3 *db){.  Vdb
22180 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20  e *p;.  for(p = 
22190 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d  db->pVdbe; p; p=
221a0 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  p->pNext){.    p
221b0 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20  ->expired = 1;. 
221c0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
221d0 72 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  rn the database 
221e0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
221f0 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c  the Vdbe..*/.sql
22200 69 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62  ite3 *sqlite3Vdb
22210 65 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  eDb(Vdbe *v){.  
22220 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a  return v->db;.}.
22230 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
22240 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
22250 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75  lite3_value stru
22260 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67  cture containing
22270 20 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64   the value bound
22280 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56  .** parameter iV
22290 61 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65  ar of VM v. Exce
222a0 70 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65  pt, if the value
222b0 20 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c   is an SQL NULL,
222c0 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e   return .** 0 in
222d0 73 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74  stead. Unless it
222e0 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20   is NULL, apply 
222f0 61 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e  affinity aff (on
22300 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f  e of the SQLITE_
22310 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e  AFF_*.** constan
22320 74 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ts) to the value
22330 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
22340 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  g it..**.** The 
22350 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d  returned value m
22360 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
22370 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67  the caller using
22380 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
22390 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  e()..*/.sqlite3_
223a0 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64  value *sqlite3Vd
223b0 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28  beGetBoundValue(
223c0 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61  Vdbe *v, int iVa
223d0 72 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73  r, u8 aff){.  as
223e0 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a  sert( iVar>0 );.
223f0 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d    if( v ){.    M
22400 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61  em *pMem = &v->a
22410 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20  Var[iVar-1];.   
22420 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66   if( 0==(pMem->f
22430 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29  lags & MEM_Null)
22440 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
22450 33 5f 76 61 6c 75 65 20 2a 70 52 65 74 20 3d 20  3_value *pRet = 
22460 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
22470 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66  v->db);.      if
22480 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20  ( pRet ){.      
22490 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
224a0 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52 65 74  Copy((Mem *)pRet
224b0 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  , pMem);.       
224c0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70   sqlite3ValueApp
224d0 6c 79 41 66 66 69 6e 69 74 79 28 70 52 65 74 2c  lyAffinity(pRet,
224e0 20 61 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46   aff, SQLITE_UTF
224f0 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  8);.      }.    
22500 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 20    return pRet;. 
22510 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
22520 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  n 0;.}../*.** Co
22530 6e 66 69 67 75 72 65 20 53 51 4c 20 76 61 72 69  nfigure SQL vari
22540 61 62 6c 65 20 69 56 61 72 20 73 6f 20 74 68 61  able iVar so tha
22550 74 20 62 69 6e 64 69 6e 67 20 61 20 6e 65 77 20  t binding a new 
22560 76 61 6c 75 65 20 74 6f 20 69 74 20 73 69 67 6e  value to it sign
22570 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  als.** to sqlite
22580 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29 20 74  3_reoptimize() t
22590 68 61 74 20 72 65 2d 70 72 65 70 61 72 69 6e 67  hat re-preparing
225a0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6d   the statement m
225b0 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20  ay result.** in 
225c0 61 20 62 65 74 74 65 72 20 71 75 65 72 79 20 70  a better query p
225d0 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  lan..*/.void sql
225e0 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61  ite3VdbeSetVarma
225f0 73 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  sk(Vdbe *v, int 
22600 69 56 61 72 29 7b 0a 20 20 61 73 73 65 72 74 28  iVar){.  assert(
22610 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28   iVar>0 );.  if(
22620 20 69 56 61 72 3e 33 32 20 29 7b 0a 20 20 20 20   iVar>32 ){.    
22630 76 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 78 66  v->expmask = 0xf
22640 66 66 66 66 66 66 66 3b 0a 20 20 7d 65 6c 73 65  fffffff;.  }else
22650 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b  {.    v->expmask
22660 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c 20 28   |= ((u32)1 << (
22670 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a  iVar-1));.  }.}.
22680 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22690 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
226a0 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72  E./*.** Transfer
226b0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
226c0 65 78 74 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69  ext from an sqli
226d0 74 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67  te3_vtab.zErrMsg
226e0 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a   (text stored.**
226f0 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
22700 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
22710 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20  _malloc) into a 
22720 56 64 62 65 2e 7a 45 72 72 4d 73 67 20 28 74 65  Vdbe.zErrMsg (te
22730 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  xt stored.** in 
22740 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
22750 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61  from sqlite3DbMa
22760 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  lloc)..*/.void s
22770 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74  qlite3VtabImport
22780 45 72 72 6d 73 67 28 56 64 62 65 20 2a 70 2c 20  Errmsg(Vdbe *p, 
22790 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
227a0 74 61 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  tab){.  sqlite3 
227b0 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 73  *db = p->db;.  s
227c0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
227d0 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
227e0 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c  p->zErrMsg = sql
227f0 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
22800 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29   pVtab->zErrMsg)
22810 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
22820 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29  (pVtab->zErrMsg)
22830 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  ;.  pVtab->zErrM
22840 73 67 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  sg = 0;.}.#endif
22850 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
22860 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.