/ Hex Artifact Content
Login

Artifact c7854a476860496fd74d9785e571eb2fca964561:


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 20 28 65 78 63 65 70 74  re space (except
4610: 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20 75   when compiled u
4620: 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 54  sing.** SQLITE_T
4630: 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45  EST_REALLOC_STRE
4640: 53 53 29 2e 20 20 54 68 69 73 20 69 6e 74 65 72  SS).  This inter
4650: 66 61 63 65 20 69 73 20 75 73 65 64 20 64 75 72  face is used dur
4660: 69 6e 67 20 74 65 73 74 69 6e 67 0a 2a 2a 20 74  ing testing.** t
4670: 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 63 65  o verify that ce
4680: 72 74 61 69 6e 20 63 61 6c 6c 73 20 74 6f 20 73  rtain calls to s
4690: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
46a0: 69 73 74 28 29 20 63 61 6e 20 6e 65 76 65 72 0a  ist() can never.
46b0: 2a 2a 20 66 61 69 6c 20 64 75 65 20 74 6f 20 61  ** fail due to a
46c0: 20 4f 4f 4d 20 66 61 75 6c 74 20 61 6e 64 20 68   OOM fault and h
46d0: 65 6e 63 65 20 74 68 61 74 20 74 68 65 20 72 65  ence that the re
46e0: 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 0a  turn value from.
46f0: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  ** sqlite3VdbeAd
4700: 64 4f 70 4c 69 73 74 28 29 20 77 69 6c 6c 20 61  dOpList() will a
4710: 6c 77 61 79 73 20 62 65 20 6e 6f 6e 2d 4e 55 4c  lways be non-NUL
4720: 4c 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  L..*/.#if define
4730: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
4740: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
4750: 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f  TE_TEST_REALLOC_
4760: 53 54 52 45 53 53 29 0a 76 6f 69 64 20 73 71 6c  STRESS).void sql
4770: 69 74 65 33 56 64 62 65 56 65 72 69 66 79 4e 6f  ite3VdbeVerifyNo
4780: 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65 64 28 56  MallocRequired(V
4790: 64 62 65 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  dbe *p, int N){.
47a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
47b0: 20 2b 20 4e 20 3c 3d 20 70 2d 3e 70 50 61 72 73   + N <= p->pPars
47c0: 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29 3b 0a 7d  e->nOpAlloc );.}
47d0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
47e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
47f0: 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
4800: 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f  o the array of o
4810: 70 63 6f 64 65 73 20 61 73 73 6f 63 69 61 74 65  pcodes associate
4820: 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 56 64  d with.** the Vd
4830: 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  be passed as the
4840: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
4850: 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65   It is the calle
4860: 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  rs responsibilit
4870: 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65 20  y.** to arrange 
4880: 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e 65 64  for the returned
4890: 20 61 72 72 61 79 20 74 6f 20 62 65 20 65 76 65   array to be eve
48a0: 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73  ntually freed us
48b0: 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76 64 62 65  ing the .** vdbe
48c0: 46 72 65 65 4f 70 41 72 72 61 79 28 29 20 66 75  FreeOpArray() fu
48d0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65  nction..**.** Be
48e0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
48f0: 2a 70 6e 4f 70 20 69 73 20 73 65 74 20 74 6f 20  *pnOp is set to 
4900: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
4910: 74 72 69 65 73 20 69 6e 20 74 68 65 20 72 65 74  tries in the ret
4920: 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e 20  urned.** array. 
4930: 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67 20  Also, *pnMaxArg 
4940: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6c 61  is set to the la
4950: 72 67 65 72 20 6f 66 20 69 74 73 20 63 75 72 72  rger of its curr
4960: 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20 0a 2a  ent value and .*
4970: 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
4980: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 56  entries in the V
4990: 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61  dbe.apArg[] arra
49a0: 79 20 72 65 71 75 69 72 65 64 20 74 6f 20 65 78  y required to ex
49b0: 65 63 75 74 65 20 74 68 65 20 0a 2a 2a 20 72 65  ecute the .** re
49c0: 74 75 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e 0a  turned program..
49d0: 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74  */.VdbeOp *sqlit
49e0: 65 33 56 64 62 65 54 61 6b 65 4f 70 41 72 72 61  e3VdbeTakeOpArra
49f0: 79 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a  y(Vdbe *p, int *
4a00: 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78  pnOp, int *pnMax
4a10: 41 72 67 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a  Arg){.  VdbeOp *
4a20: 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20  aOp = p->aOp;.  
4a30: 61 73 73 65 72 74 28 20 61 4f 70 20 26 26 20 21  assert( aOp && !
4a40: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
4a50: 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  led );..  /* Che
4a60: 63 6b 20 74 68 61 74 20 73 71 6c 69 74 65 33 56  ck that sqlite3V
4a70: 64 62 65 55 73 65 73 42 74 72 65 65 28 29 20 77  dbeUsesBtree() w
4a80: 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f 6e  as not called on
4a90: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61 73   this VM */.  as
4aa0: 73 65 72 74 28 20 44 62 4d 61 73 6b 41 6c 6c 5a  sert( DbMaskAllZ
4ab0: 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  ero(p->btreeMask
4ac0: 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50  ) );..  resolveP
4ad0: 32 56 61 6c 75 65 73 28 70 2c 20 70 6e 4d 61 78  2Values(p, pnMax
4ae0: 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20  Arg);.  *pnOp = 
4af0: 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70  p->nOp;.  p->aOp
4b00: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 61   = 0;.  return a
4b10: 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  Op;.}../*.** Add
4b20: 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66   a whole list of
4b30: 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 74   operations to t
4b40: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74 61  he operation sta
4b50: 63 6b 2e 20 20 52 65 74 75 72 6e 20 61 0a 2a 2a  ck.  Return a.**
4b60: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
4b70: 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20  first operation 
4b80: 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 56 64 62  inserted..*/.Vdb
4b90: 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65  eOp *sqlite3Vdbe
4ba0: 41 64 64 4f 70 4c 69 73 74 28 0a 20 20 56 64 62  AddOpList(.  Vdb
4bb0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
4bc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
4bd0: 20 6f 70 63 6f 64 65 73 20 74 6f 20 74 68 65 20   opcodes to the 
4be0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
4bf0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 70 2c  nt */.  int nOp,
4c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c10: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4c20: 66 20 6f 70 63 6f 64 65 73 20 74 6f 20 61 64 64  f opcodes to add
4c30: 20 2a 2f 0a 20 20 56 64 62 65 4f 70 4c 69 73 74   */.  VdbeOpList
4c40: 20 63 6f 6e 73 74 20 2a 61 4f 70 2c 20 20 20 20   const *aOp,    
4c50: 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65     /* The opcode
4c60: 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f  s to be added */
4c70: 0a 20 20 69 6e 74 20 69 4c 69 6e 65 6e 6f 20 20  .  int iLineno  
4c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c90: 2f 2a 20 53 6f 75 72 63 65 2d 66 69 6c 65 20 6c  /* Source-file l
4ca0: 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69  ine number of fi
4cb0: 72 73 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 29 7b  rst opcode */.){
4cc0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65  .  int i;.  Vdbe
4cd0: 4f 70 20 2a 70 4f 75 74 2c 20 2a 70 46 69 72 73  Op *pOut, *pFirs
4ce0: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 70  t;.  assert( nOp
4cf0: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
4d00: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
4d10: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
4d20: 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20  f( p->nOp + nOp 
4d30: 3e 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70  > p->pParse->nOp
4d40: 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41  Alloc && growOpA
4d50: 72 72 61 79 28 70 2c 20 6e 4f 70 29 20 29 7b 0a  rray(p, nOp) ){.
4d60: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4d70: 7d 0a 20 20 70 46 69 72 73 74 20 3d 20 70 4f 75  }.  pFirst = pOu
4d80: 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  t = &p->aOp[p->n
4d90: 4f 70 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  Op];.  for(i=0; 
4da0: 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 61 4f 70 2b  i<nOp; i++, aOp+
4db0: 2b 2c 20 70 4f 75 74 2b 2b 29 7b 0a 20 20 20 20  +, pOut++){.    
4dc0: 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 61  pOut->opcode = a
4dd0: 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20  Op->opcode;.    
4de0: 70 4f 75 74 2d 3e 70 31 20 3d 20 61 4f 70 2d 3e  pOut->p1 = aOp->
4df0: 70 31 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 32  p1;.    pOut->p2
4e00: 20 3d 20 61 4f 70 2d 3e 70 32 3b 0a 20 20 20 20   = aOp->p2;.    
4e10: 61 73 73 65 72 74 28 20 61 4f 70 2d 3e 70 32 3e  assert( aOp->p2>
4e20: 3d 30 20 29 3b 0a 20 20 20 20 70 4f 75 74 2d 3e  =0 );.    pOut->
4e30: 70 33 20 3d 20 61 4f 70 2d 3e 70 33 3b 0a 20 20  p3 = aOp->p3;.  
4e40: 20 20 70 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d    pOut->p4type =
4e50: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20   P4_NOTUSED;.   
4e60: 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30 3b   pOut->p4.p = 0;
4e70: 0a 20 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20  .    pOut->p5 = 
4e80: 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
4e90: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
4ea0: 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 70 4f 75  COMMENTS.    pOu
4eb0: 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b  t->zComment = 0;
4ec0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
4ed0: 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52  QLITE_VDBE_COVER
4ee0: 41 47 45 0a 20 20 20 20 70 4f 75 74 2d 3e 69 53  AGE.    pOut->iS
4ef0: 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 6e 6f  rcLine = iLineno
4f00: 2b 69 3b 0a 23 65 6c 73 65 0a 20 20 20 20 28 76  +i;.#else.    (v
4f10: 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b 0a 23 65 6e  oid)iLineno;.#en
4f20: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
4f30: 45 5f 44 45 42 55 47 0a 20 20 20 20 69 66 28 20  E_DEBUG.    if( 
4f40: 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  p->db->flags & S
4f50: 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
4f60: 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73 71  race ){.      sq
4f70: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
4f80: 28 30 2c 20 69 2b 70 2d 3e 6e 4f 70 2c 20 26 70  (0, i+p->nOp, &p
4f90: 2d 3e 61 4f 70 5b 69 2b 70 2d 3e 6e 4f 70 5d 29  ->aOp[i+p->nOp])
4fa0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
4fb0: 20 7d 0a 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e   }.  p->nOp += n
4fc0: 4f 70 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 69  Op;.  return pFi
4fd0: 72 73 74 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69  rst;.}..#if defi
4fe0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
4ff0: 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
5000: 53 29 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  S)./*.** Add an 
5010: 65 6e 74 72 79 20 74 6f 20 74 68 65 20 61 72 72  entry to the arr
5020: 61 79 20 6f 66 20 63 6f 75 6e 74 65 72 73 20 6d  ay of counters m
5030: 61 6e 61 67 65 64 20 62 79 20 73 71 6c 69 74 65  anaged by sqlite
5040: 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75  3_stmt_scanstatu
5050: 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  s()..*/.void sql
5060: 69 74 65 33 56 64 62 65 53 63 61 6e 53 74 61 74  ite3VdbeScanStat
5070: 75 73 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  us(.  Vdbe *p,  
5080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5090: 20 20 20 20 20 20 2f 2a 20 56 4d 20 74 6f 20 61        /* VM to a
50a0: 64 64 20 73 63 61 6e 73 74 61 74 75 73 28 29 20  dd scanstatus() 
50b0: 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  to */.  int addr
50c0: 45 78 70 6c 61 69 6e 2c 20 20 20 20 20 20 20 20  Explain,        
50d0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
50e0: 73 73 20 6f 66 20 4f 50 5f 45 78 70 6c 61 69 6e  ss of OP_Explain
50f0: 20 28 6f 72 20 30 29 20 2a 2f 0a 20 20 69 6e 74   (or 0) */.  int
5100: 20 61 64 64 72 4c 6f 6f 70 2c 20 20 20 20 20 20   addrLoop,      
5110: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5120: 41 64 64 72 65 73 73 20 6f 66 20 6c 6f 6f 70 20  Address of loop 
5130: 63 6f 75 6e 74 65 72 20 2a 2f 20 0a 20 20 69 6e  counter */ .  in
5140: 74 20 61 64 64 72 56 69 73 69 74 2c 20 20 20 20  t addrVisit,    
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5160: 20 41 64 64 72 65 73 73 20 6f 66 20 72 6f 77 73   Address of rows
5170: 20 76 69 73 69 74 65 64 20 63 6f 75 6e 74 65 72   visited counter
5180: 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 45 73   */.  LogEst nEs
5190: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
51a0: 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74        /* Estimat
51b0: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  ed number of out
51c0: 70 75 74 20 72 6f 77 73 20 2a 2f 0a 20 20 63 6f  put rows */.  co
51d0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
51e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
51f0: 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 6f   Name of table o
5200: 72 20 69 6e 64 65 78 20 62 65 69 6e 67 20 73 63  r index being sc
5210: 61 6e 6e 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  anned */.){.  in
5220: 74 20 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53  t nByte = (p->nS
5230: 63 61 6e 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28  can+1) * sizeof(
5240: 53 63 61 6e 53 74 61 74 75 73 29 3b 0a 20 20 53  ScanStatus);.  S
5250: 63 61 6e 53 74 61 74 75 73 20 2a 61 4e 65 77 3b  canStatus *aNew;
5260: 0a 20 20 61 4e 65 77 20 3d 20 28 53 63 61 6e 53  .  aNew = (ScanS
5270: 74 61 74 75 73 2a 29 73 71 6c 69 74 65 33 44 62  tatus*)sqlite3Db
5280: 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70  Realloc(p->db, p
5290: 2d 3e 61 53 63 61 6e 2c 20 6e 42 79 74 65 29 3b  ->aScan, nByte);
52a0: 0a 20 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20  .  if( aNew ){. 
52b0: 20 20 20 53 63 61 6e 53 74 61 74 75 73 20 2a 70     ScanStatus *p
52c0: 4e 65 77 20 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e  New = &aNew[p->n
52d0: 53 63 61 6e 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65  Scan++];.    pNe
52e0: 77 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 20 3d  w->addrExplain =
52f0: 20 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20   addrExplain;.  
5300: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4c 6f 6f 70    pNew->addrLoop
5310: 20 3d 20 61 64 64 72 4c 6f 6f 70 3b 0a 20 20 20   = addrLoop;.   
5320: 20 70 4e 65 77 2d 3e 61 64 64 72 56 69 73 69 74   pNew->addrVisit
5330: 20 3d 20 61 64 64 72 56 69 73 69 74 3b 0a 20 20   = addrVisit;.  
5340: 20 20 70 4e 65 77 2d 3e 6e 45 73 74 20 3d 20 6e    pNew->nEst = n
5350: 45 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 7a  Est;.    pNew->z
5360: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
5370: 53 74 72 44 75 70 28 70 2d 3e 64 62 2c 20 7a 4e  StrDup(p->db, zN
5380: 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 61 53 63  ame);.    p->aSc
5390: 61 6e 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d  an = aNew;.  }.}
53a0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
53b0: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
53c0: 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 2c 20   of the opcode, 
53d0: 6f 72 20 50 31 2c 20 50 32 2c 20 50 33 2c 20 6f  or P1, P2, P3, o
53e0: 72 20 50 35 20 6f 70 65 72 61 6e 64 73 0a 2a 2a  r P5 operands.**
53f0: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20   for a specific 
5400: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
5410: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
5420: 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 56 64 62  ChangeOpcode(Vdb
5430: 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20  e *p, u32 addr, 
5440: 75 38 20 69 4e 65 77 4f 70 63 6f 64 65 29 7b 0a  u8 iNewOpcode){.
5450: 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74    sqlite3VdbeGet
5460: 4f 70 28 70 2c 61 64 64 72 29 2d 3e 6f 70 63 6f  Op(p,addr)->opco
5470: 64 65 20 3d 20 69 4e 65 77 4f 70 63 6f 64 65 3b  de = iNewOpcode;
5480: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
5490: 64 62 65 43 68 61 6e 67 65 50 31 28 56 64 62 65  dbeChangeP1(Vdbe
54a0: 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69   *p, u32 addr, i
54b0: 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74  nt val){.  sqlit
54c0: 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64  e3VdbeGetOp(p,ad
54d0: 64 72 29 2d 3e 70 31 20 3d 20 76 61 6c 3b 0a 7d  dr)->p1 = val;.}
54e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
54f0: 65 43 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a  eChangeP2(Vdbe *
5500: 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74  p, u32 addr, int
5510: 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33   val){.  sqlite3
5520: 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72  VdbeGetOp(p,addr
5530: 29 2d 3e 70 32 20 3d 20 76 61 6c 3b 0a 7d 0a 76  )->p2 = val;.}.v
5540: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
5550: 68 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c  hangeP3(Vdbe *p,
5560: 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76   u32 addr, int v
5570: 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  al){.  sqlite3Vd
5580: 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d  beGetOp(p,addr)-
5590: 3e 70 33 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69  >p3 = val;.}.voi
55a0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
55b0: 6e 67 65 50 35 28 56 64 62 65 20 2a 70 2c 20 75  ngeP5(Vdbe *p, u
55c0: 38 20 70 35 29 7b 0a 20 20 69 66 28 20 21 70 2d  8 p5){.  if( !p-
55d0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
55e0: 64 20 29 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f  d ) p->aOp[p->nO
55f0: 70 2d 31 5d 2e 70 35 20 3d 20 70 35 3b 0a 7d 0a  p-1].p5 = p5;.}.
5600: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
5610: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20  e P2 operand of 
5620: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72  instruction addr
5630: 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
5640: 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64  ts to.** the add
5650: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
5660: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
5670: 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69  be coded..*/.voi
5680: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  d sqlite3VdbeJum
5690: 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69  pHere(Vdbe *p, i
56a0: 6e 74 20 61 64 64 72 29 7b 0a 20 20 70 2d 3e 70  nt addr){.  p->p
56b0: 50 61 72 73 65 2d 3e 69 46 69 78 65 64 4f 70 20  Parse->iFixedOp 
56c0: 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20  = p->nOp - 1;.  
56d0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
56e0: 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e  eP2(p, addr, p->
56f0: 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  nOp);.}.../*.** 
5700: 49 66 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e  If the input Fun
5710: 63 44 65 66 20 73 74 72 75 63 74 75 72 65 20 69  cDef structure i
5720: 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65  s ephemeral, the
5730: 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a  n free it.  If.*
5740: 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20 69 73  * the FuncDef is
5750: 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74   not ephermal, t
5760: 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a  hen do nothing..
5770: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
5780: 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63  reeEphemeralFunc
5790: 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  tion(sqlite3 *db
57a0: 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29  , FuncDef *pDef)
57b0: 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  {.  if( ALWAYS(p
57c0: 44 65 66 29 20 26 26 20 28 70 44 65 66 2d 3e 66  Def) && (pDef->f
57d0: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
57e0: 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30  E_FUNC_EPHEM)!=0
57f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
5800: 62 46 72 65 65 28 64 62 2c 20 70 44 65 66 29 3b  bFree(db, pDef);
5810: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
5820: 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72  oid vdbeFreeOpAr
5830: 72 61 79 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f  ray(sqlite3 *, O
5840: 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a  p *, int);../*.*
5850: 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20 76 61  * Delete a P4 va
5860: 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  lue if necessary
5870: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5880: 20 66 72 65 65 50 34 28 73 71 6c 69 74 65 33 20   freeP4(sqlite3 
5890: 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c  *db, int p4type,
58a0: 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20 69 66   void *p4){.  if
58b0: 28 20 70 34 20 29 7b 0a 20 20 20 20 61 73 73 65  ( p4 ){.    asse
58c0: 72 74 28 20 64 62 20 29 3b 0a 20 20 20 20 73 77  rt( db );.    sw
58d0: 69 74 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a  itch( p4type ){.
58e0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 46 55        case P4_FU
58f0: 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20 20 20 20  NCCTX: {.       
5900: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
5910: 6e 63 74 69 6f 6e 28 64 62 2c 20 28 28 73 71 6c  nction(db, ((sql
5920: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 70 34  ite3_context*)p4
5930: 29 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 20 20 20  )->pFunc);.     
5940: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
5950: 67 68 20 69 6e 74 6f 20 74 68 65 20 6e 65 78 74  gh into the next
5960: 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 7d   case */.      }
5970: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 52  .      case P4_R
5980: 45 41 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20  EAL:.      case 
5990: 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20 20  P4_INT64:.      
59a0: 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a  case P4_DYNAMIC:
59b0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 49  .      case P4_I
59c0: 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20  NTARRAY: {.     
59d0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
59e0: 28 64 62 2c 20 70 34 29 3b 0a 20 20 20 20 20 20  (db, p4);.      
59f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
5a00: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b  .      case P4_K
5a10: 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20  EYINFO: {.      
5a20: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
5a30: 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69  sFreed==0 ) sqli
5a40: 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
5a50: 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a 20  (KeyInfo*)p4);. 
5a60: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5a70: 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
5a80: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
5a90: 52 5f 48 49 4e 54 53 0a 20 20 20 20 20 20 63 61  R_HINTS.      ca
5aa0: 73 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20  se P4_EXPR: {.  
5ab0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
5ac0: 72 44 65 6c 65 74 65 28 64 62 2c 20 28 45 78 70  rDelete(db, (Exp
5ad0: 72 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20  r*)p4);.        
5ae0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  break;.      }.#
5af0: 65 6e 64 69 66 0a 20 20 20 20 20 20 63 61 73 65  endif.      case
5b00: 20 50 34 5f 4d 50 52 49 4e 54 46 3a 20 7b 0a 20   P4_MPRINTF: {. 
5b10: 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70         if( db->p
5b20: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29  nBytesFreed==0 )
5b30: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 34   sqlite3_free(p4
5b40: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
5b50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5b60: 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a  case P4_FUNCDEF:
5b70: 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 45   {.        freeE
5b80: 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e  phemeralFunction
5b90: 28 64 62 2c 20 28 46 75 6e 63 44 65 66 2a 29 70  (db, (FuncDef*)p
5ba0: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  4);.        brea
5bb0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
5bc0: 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a   case P4_MEM: {.
5bd0: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
5be0: 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20  pnBytesFreed==0 
5bf0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
5c00: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 28 73  ite3ValueFree((s
5c10: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 34  qlite3_value*)p4
5c20: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
5c30: 7b 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 20  {.          Mem 
5c40: 2a 70 20 3d 20 28 4d 65 6d 2a 29 70 34 3b 0a 20  *p = (Mem*)p4;. 
5c50: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
5c60: 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74  szMalloc ) sqlit
5c70: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
5c80: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  zMalloc);.      
5c90: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
5ca0: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  e(db, p);.      
5cb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
5cc0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
5cd0: 20 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a 20   case P4_VTAB : 
5ce0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
5cf0: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
5d00: 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55  0 ) sqlite3VtabU
5d10: 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  nlock((VTable *)
5d20: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
5d30: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
5d40: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  }.  }.}../*.** F
5d50: 72 65 65 20 74 68 65 20 73 70 61 63 65 20 61 6c  ree the space al
5d60: 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70 20  located for aOp 
5d70: 61 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75 65  and any p4 value
5d80: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
5d90: 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63  the.** opcodes c
5da0: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 2e  ontained within.
5db0: 20 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e   If aOp is not N
5dc0: 55 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ULL it is assume
5dd0: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a  d to contain .**
5de0: 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a   nOp entries. .*
5df0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
5e00: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71  beFreeOpArray(sq
5e10: 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61  lite3 *db, Op *a
5e20: 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20  Op, int nOp){.  
5e30: 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f  if( aOp ){.    O
5e40: 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28  p *pOp;.    for(
5e50: 70 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61 4f  pOp=aOp; pOp<&aO
5e60: 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a  p[nOp]; pOp++){.
5e70: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
5e80: 34 74 79 70 65 20 29 20 66 72 65 65 50 34 28 64  4type ) freeP4(d
5e90: 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20  b, pOp->p4type, 
5ea0: 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64  pOp->p4.p);.#ifd
5eb0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
5ec0: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
5ed0: 53 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  S.      sqlite3D
5ee0: 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a  bFree(db, pOp->z
5ef0: 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66  Comment);.#endif
5f00: 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a       .    }.  }.
5f10: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5f20: 64 62 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a  db, aOp);.}../*.
5f30: 2a 2a 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50  ** Link the SubP
5f40: 72 6f 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61  rogram object pa
5f50: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
5f60: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f  nd argument into
5f70: 20 74 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c   the linked.** l
5f80: 69 73 74 20 61 74 20 56 64 62 65 2e 70 53 75 62  ist at Vdbe.pSub
5f90: 50 72 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69  Program. This li
5fa0: 73 74 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  st is used to de
5fb0: 6c 65 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f  lete all sub-pro
5fc0: 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  gram.** objects 
5fd0: 77 68 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e  when the VM is n
5fe0: 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65  o longer require
5ff0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
6000: 65 33 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f  e3VdbeLinkSubPro
6010: 67 72 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65  gram(Vdbe *pVdbe
6020: 2c 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29  , SubProgram *p)
6030: 7b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  {.  p->pNext = p
6040: 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a  Vdbe->pProgram;.
6050: 20 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61    pVdbe->pProgra
6060: 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  m = p;.}../*.** 
6070: 43 68 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64  Change the opcod
6080: 65 20 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f  e at addr into O
6090: 50 5f 4e 6f 6f 70 0a 2a 2f 0a 69 6e 74 20 73 71  P_Noop.*/.int sq
60a0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
60b0: 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69  oNoop(Vdbe *p, i
60c0: 6e 74 20 61 64 64 72 29 7b 0a 20 20 56 64 62 65  nt addr){.  Vdbe
60d0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 70  Op *pOp;.  if( p
60e0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
60f0: 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ed ) return 0;. 
6100: 20 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30   assert( addr>=0
6110: 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20   && addr<p->nOp 
6120: 29 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61  );.  pOp = &p->a
6130: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65 65  Op[addr];.  free
6140: 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70  P4(p->db, pOp->p
6150: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
6160: 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  );.  pOp->p4type
6170: 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20   = P4_NOTUSED;. 
6180: 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 30 3b 0a   pOp->p4.z = 0;.
6190: 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
61a0: 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 72 65 74 75 72  OP_Noop;.  retur
61b0: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  n 1;.}../*.** If
61c0: 20 74 68 65 20 6c 61 73 74 20 6f 70 63 6f 64 65   the last opcode
61d0: 20 69 73 20 22 6f 70 22 20 61 6e 64 20 69 74 20   is "op" and it 
61e0: 69 73 20 6e 6f 74 20 61 20 6a 75 6d 70 20 64 65  is not a jump de
61f0: 73 74 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68  stination,.** th
6200: 65 6e 20 72 65 6d 6f 76 65 20 69 74 2e 20 20 52  en remove it.  R
6210: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e  eturn true if an
6220: 64 20 6f 6e 6c 79 20 69 66 20 61 6e 20 6f 70 63  d only if an opc
6230: 6f 64 65 20 77 61 73 20 72 65 6d 6f 76 65 64 2e  ode was removed.
6240: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
6250: 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f 70  dbeDeletePriorOp
6260: 63 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75 38  code(Vdbe *p, u8
6270: 20 6f 70 29 7b 0a 20 20 69 66 28 20 28 70 2d 3e   op){.  if( (p->
6280: 6e 4f 70 2d 31 29 3e 28 70 2d 3e 70 50 61 72 73  nOp-1)>(p->pPars
6290: 65 2d 3e 69 46 69 78 65 64 4f 70 29 20 26 26 20  e->iFixedOp) && 
62a0: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
62b0: 2e 6f 70 63 6f 64 65 3d 3d 6f 70 20 29 7b 0a 20  .opcode==op ){. 
62c0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
62d0: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
62e0: 70 28 70 2c 20 70 2d 3e 6e 4f 70 2d 31 29 3b 0a  p(p, p->nOp-1);.
62f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
6300: 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 0;.  }.}../*
6310: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
6320: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f  alue of the P4 o
6330: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
6340: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
6350: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
6360: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65  ne is useful whe
6370: 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61  n a large progra
6380: 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d  m is loaded from
6390: 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72   a.** static arr
63a0: 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ay using sqlite3
63b0: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75  VdbeAddOpList bu
63c0: 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b  t we want to mak
63d0: 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72  e a.** few minor
63e0: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
63f0: 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49  program..**.** I
6400: 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20  f n>=0 then the 
6410: 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79  P4 operand is dy
6420: 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74  namic, meaning t
6430: 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a  hat a copy of.**
6440: 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d   the string is m
6450: 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ade into memory 
6460: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
6470: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
6480: 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d  ** A value of n=
6490: 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79  =0 means copy by
64a0: 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f  tes of zP4 up to
64b0: 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74   and including t
64c0: 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c  he.** first null
64d0: 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74   byte.  If n>0 t
64e0: 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74  hen copy n+1 byt
64f0: 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 20 0a 2a  es of zP4..** .*
6500: 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f  * Other values o
6510: 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20  f n (P4_STATIC, 
6520: 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29  P4_COLLSEQ etc.)
6530: 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a   indicate that z
6540: 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20  P4 points.** to 
6550: 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75  a string or stru
6560: 63 74 75 72 65 20 74 68 61 74 20 69 73 20 67 75  cture that is gu
6570: 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73  aranteed to exis
6580: 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69  t for the lifeti
6590: 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62  me of.** the Vdb
65a0: 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65  e. In these case
65b0: 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f  s we can just co
65c0: 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a  py the pointer..
65d0: 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20  **.** If addr<0 
65e0: 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f  then change P4 o
65f0: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
6600: 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73  tly inserted ins
6610: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  truction..*/.sta
6620: 74 69 63 20 76 6f 69 64 20 53 51 4c 49 54 45 5f  tic void SQLITE_
6630: 4e 4f 49 4e 4c 49 4e 45 20 76 64 62 65 43 68 61  NOINLINE vdbeCha
6640: 6e 67 65 50 34 46 75 6c 6c 28 0a 20 20 56 64 62  ngeP4Full(.  Vdb
6650: 65 20 2a 70 2c 0a 20 20 4f 70 20 2a 70 4f 70 2c  e *p,.  Op *pOp,
6660: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6670: 50 34 2c 0a 20 20 69 6e 74 20 6e 0a 29 7b 0a 20  P4,.  int n.){. 
6680: 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65   if( pOp->p4type
6690: 20 29 7b 0a 20 20 20 20 66 72 65 65 50 34 28 70   ){.    freeP4(p
66a0: 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70  ->db, pOp->p4typ
66b0: 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20  e, pOp->p4.p);. 
66c0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
66d0: 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   0;.    pOp->p4.
66e0: 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  p = 0;.  }.  if(
66f0: 20 6e 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69   n<0 ){.    sqli
6700: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
6710: 70 2c 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 70  p, (int)(pOp - p
6720: 2d 3e 61 4f 70 29 2c 20 7a 50 34 2c 20 6e 29 3b  ->aOp), zP4, n);
6730: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
6740: 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c  ( n==0 ) n = sql
6750: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 34  ite3Strlen30(zP4
6760: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a  );.    pOp->p4.z
6770: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
6780: 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20  Dup(p->db, zP4, 
6790: 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  n);.    pOp->p4t
67a0: 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43  ype = P4_DYNAMIC
67b0: 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  ;.  }.}.void sql
67c0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
67d0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
67e0: 64 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  dr, const char *
67f0: 7a 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f  zP4, int n){.  O
6800: 70 20 2a 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65  p *pOp;.  sqlite
6810: 33 20 2a 64 62 3b 0a 20 20 61 73 73 65 72 74 28  3 *db;.  assert(
6820: 20 70 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20   p!=0 );.  db = 
6830: 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
6840: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
6850: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
6860: 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 21 3d  assert( p->aOp!=
6870: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
6880: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64  ailed );.  if( d
6890: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
68a0: 29 7b 0a 20 20 20 20 69 66 28 20 6e 21 3d 50 34  ){.    if( n!=P4
68b0: 5f 56 54 41 42 20 29 20 66 72 65 65 50 34 28 64  _VTAB ) freeP4(d
68c0: 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63  b, n, (void*)*(c
68d0: 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20  har**)&zP4);.   
68e0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
68f0: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
6900: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64 64  );.  assert( add
6910: 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66  r<p->nOp );.  if
6920: 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20  ( addr<0 ){.    
6930: 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20  addr = p->nOp - 
6940: 31 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26  1;.  }.  pOp = &
6950: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
6960: 69 66 28 20 6e 3e 3d 30 20 7c 7c 20 70 4f 70 2d  if( n>=0 || pOp-
6970: 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 76  >p4type ){.    v
6980: 64 62 65 43 68 61 6e 67 65 50 34 46 75 6c 6c 28  dbeChangeP4Full(
6990: 70 2c 20 70 4f 70 2c 20 7a 50 34 2c 20 6e 29 3b  p, pOp, zP4, n);
69a0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
69b0: 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54  .  if( n==P4_INT
69c0: 33 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74  32 ){.    /* Not
69d0: 65 3a 20 74 68 69 73 20 63 61 73 74 20 69 73 20  e: this cast is 
69e0: 73 61 66 65 2c 20 62 65 63 61 75 73 65 20 74 68  safe, because th
69f0: 65 20 6f 72 69 67 69 6e 20 64 61 74 61 20 70 6f  e origin data po
6a00: 69 6e 74 20 77 61 73 20 61 6e 20 69 6e 74 0a 20  int was an int. 
6a10: 20 20 20 2a 2a 20 74 68 61 74 20 77 61 73 20 63     ** that was c
6a20: 61 73 74 20 74 6f 20 61 20 28 63 6f 6e 73 74 20  ast to a (const 
6a30: 63 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20  char *). */.    
6a40: 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49  pOp->p4.i = SQLI
6a50: 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50  TE_PTR_TO_INT(zP
6a60: 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  4);.    pOp->p4t
6a70: 79 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a  ype = P4_INT32;.
6a80: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 34 21    }else if( zP4!
6a90: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
6aa0: 28 20 6e 3c 30 20 29 3b 0a 20 20 20 20 70 4f 70  ( n<0 );.    pOp
6ab0: 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29  ->p4.p = (void*)
6ac0: 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  zP4;.    pOp->p4
6ad0: 74 79 70 65 20 3d 20 28 73 69 67 6e 65 64 20 63  type = (signed c
6ae0: 68 61 72 29 6e 3b 0a 20 20 20 20 69 66 28 20 6e  har)n;.    if( n
6af0: 3d 3d 50 34 5f 56 54 41 42 20 29 20 73 71 6c 69  ==P4_VTAB ) sqli
6b00: 74 65 33 56 74 61 62 4c 6f 63 6b 28 28 56 54 61  te3VtabLock((VTa
6b10: 62 6c 65 2a 29 7a 50 34 29 3b 0a 20 20 7d 0a 7d  ble*)zP4);.  }.}
6b20: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
6b30: 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  P4 on the most r
6b40: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 6f 70  ecently added op
6b50: 63 6f 64 65 20 74 6f 20 74 68 65 20 4b 65 79 49  code to the KeyI
6b60: 6e 66 6f 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69  nfo for the.** i
6b70: 6e 64 65 78 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76  ndex given..*/.v
6b80: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
6b90: 65 74 50 34 4b 65 79 49 6e 66 6f 28 50 61 72 73  etP4KeyInfo(Pars
6ba0: 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78  e *pParse, Index
6bb0: 20 2a 70 49 64 78 29 7b 0a 20 20 56 64 62 65 20   *pIdx){.  Vdbe 
6bc0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
6bd0: 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  be;.  assert( v!
6be0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
6bf0: 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 73 71 6c  pIdx!=0 );.  sql
6c00: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
6c10: 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 73  (v, -1, (char*)s
6c20: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49  qlite3KeyInfoOfI
6c30: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 64  ndex(pParse, pId
6c40: 78 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  x),.            
6c50: 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59            P4_KEY
6c60: 49 4e 46 4f 29 3b 0a 7d 0a 0a 23 69 66 64 65 66  INFO);.}..#ifdef
6c70: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45   SQLITE_ENABLE_E
6c80: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a  XPLAIN_COMMENTS.
6c90: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
6ca0: 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20   comment on the 
6cb0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f  most recently co
6cc0: 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ded instruction.
6cd0: 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20 61    Or.** insert a
6ce0: 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20 74   No-op and add t
6cf0: 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74 68  he comment to th
6d00: 61 74 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69  at new instructi
6d10: 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61 6b  on.  This.** mak
6d20: 65 73 20 74 68 65 20 63 6f 64 65 20 65 61 73 69  es the code easi
6d30: 65 72 20 74 6f 20 72 65 61 64 20 64 75 72 69 6e  er to read durin
6d40: 67 20 64 65 62 75 67 67 69 6e 67 2e 20 20 4e 6f  g debugging.  No
6d50: 6e 65 20 6f 66 20 74 68 69 73 20 68 61 70 70 65  ne of this happe
6d60: 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64 75  ns.** in a produ
6d70: 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a  ction build..*/.
6d80: 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65  static void vdbe
6d90: 56 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70  VComment(Vdbe *p
6da0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
6db0: 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20 61  ormat, va_list a
6dc0: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
6dd0: 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70  >nOp>0 || p->aOp
6de0: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
6df0: 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d   p->aOp==0 || p-
6e00: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
6e10: 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d  Comment==0 || p-
6e20: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
6e30: 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f  d );.  if( p->nO
6e40: 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  p ){.    assert(
6e50: 20 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20 20 73   p->aOp );.    s
6e60: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
6e70: 64 62 2c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f  db, p->aOp[p->nO
6e80: 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a  p-1].zComment);.
6e90: 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f      p->aOp[p->nO
6ea0: 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 20 3d 20  p-1].zComment = 
6eb0: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
6ec0: 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20  p->db, zFormat, 
6ed0: 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20  ap);.  }.}.void 
6ee0: 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d 65  sqlite3VdbeComme
6ef0: 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  nt(Vdbe *p, cons
6f00: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
6f10: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
6f20: 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a   ap;.  if( p ){.
6f30: 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c      va_start(ap,
6f40: 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76   zFormat);.    v
6f50: 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a  dbeVComment(p, z
6f60: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20  Format, ap);.   
6f70: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d   va_end(ap);.  }
6f80: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
6f90: 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56  dbeNoopComment(V
6fa0: 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  dbe *p, const ch
6fb0: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e  ar *zFormat, ...
6fc0: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
6fd0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
6fe0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6ff0: 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20  0(p, OP_Noop);. 
7000: 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20     va_start(ap, 
7010: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64  zFormat);.    vd
7020: 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46  beVComment(p, zF
7030: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20  ormat, ap);.    
7040: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a  va_end(ap);.  }.
7050: 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45  }.#endif  /* NDE
7060: 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  BUG */..#ifdef S
7070: 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52  QLITE_VDBE_COVER
7080: 41 47 45 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  AGE./*.** Set th
7090: 65 20 76 61 6c 75 65 20 69 66 20 74 68 65 20 69  e value if the i
70a0: 53 72 63 4c 69 6e 65 20 66 69 65 6c 64 20 66 6f  SrcLine field fo
70b0: 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79  r the previously
70c0: 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69   coded instructi
70d0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
70e0: 74 65 33 56 64 62 65 53 65 74 4c 69 6e 65 4e 75  te3VdbeSetLineNu
70f0: 6d 62 65 72 28 56 64 62 65 20 2a 76 2c 20 69 6e  mber(Vdbe *v, in
7100: 74 20 69 4c 69 6e 65 29 7b 0a 20 20 73 71 6c 69  t iLine){.  sqli
7110: 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 2d  te3VdbeGetOp(v,-
7120: 31 29 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69  1)->iSrcLine = i
7130: 4c 69 6e 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  Line;.}.#endif /
7140: 2a 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f  * SQLITE_VDBE_CO
7150: 56 45 52 41 47 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  VERAGE */../*.**
7160: 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70 63 6f   Return the opco
7170: 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e 20 61  de for a given a
7180: 64 64 72 65 73 73 2e 20 20 49 66 20 74 68 65 20  ddress.  If the 
7190: 61 64 64 72 65 73 73 20 69 73 20 2d 31 2c 20 74  address is -1, t
71a0: 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68  hen.** return th
71b0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
71c0: 69 6e 73 65 72 74 65 64 20 6f 70 63 6f 64 65 2e  inserted opcode.
71d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
71e0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
71f0: 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
7200: 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 63 61   prior to the ca
7210: 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73 0a 2a 2a  lling of this.**
7220: 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20 61   routine, then a
7230: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 64 75   pointer to a du
7240: 6d 6d 79 20 56 64 62 65 4f 70 20 77 69 6c 6c 20  mmy VdbeOp will 
7250: 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68  be returned.  Th
7260: 61 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20  at opcode.** is 
7270: 72 65 61 64 61 62 6c 65 20 62 75 74 20 6e 6f 74  readable but not
7280: 20 77 72 69 74 61 62 6c 65 2c 20 74 68 6f 75 67   writable, thoug
7290: 68 20 69 74 20 69 73 20 63 61 73 74 20 74 6f 20  h it is cast to 
72a0: 61 20 77 72 69 74 61 62 6c 65 20 76 61 6c 75 65  a writable value
72b0: 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
72c0: 6f 66 20 61 20 64 75 6d 6d 79 20 6f 70 63 6f 64  of a dummy opcod
72d0: 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 61 6c  e allows the cal
72e0: 6c 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 66 75  l to continue fu
72f0: 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61 66 74  nctioning.** aft
7300: 65 72 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20  er an OOM fault 
7310: 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
7320: 6f 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  o check to see i
7330: 66 20 74 68 65 20 72 65 74 75 72 6e 20 66 72 6f  f the return fro
7340: 6d 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  m .** this routi
7350: 6e 65 20 69 73 20 61 20 76 61 6c 69 64 20 70 6f  ne is a valid po
7360: 69 6e 74 65 72 2e 20 20 42 75 74 20 62 65 63 61  inter.  But beca
7370: 75 73 65 20 74 68 65 20 64 75 6d 6d 79 2e 6f 70  use the dummy.op
7380: 63 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20 64 75  code is 0,.** du
7390: 6d 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  mmy will never b
73a0: 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 20 54  e written to.  T
73b0: 68 69 73 20 69 73 20 76 65 72 69 66 69 65 64 20  his is verified 
73c0: 62 79 20 63 6f 64 65 20 69 6e 73 70 65 63 74 69  by code inspecti
73d0: 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72 75 6e  on and.** by run
73e0: 6e 69 6e 67 20 77 69 74 68 20 56 61 6c 67 72 69  ning with Valgri
73f0: 6e 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73  nd..*/.VdbeOp *s
7400: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
7410: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
7420: 72 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73 70 65  r){.  /* C89 spe
7430: 63 69 66 69 65 73 20 74 68 61 74 20 74 68 65 20  cifies that the 
7440: 63 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d 79 22  constant "dummy"
7450: 20 77 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c   will be initial
7460: 69 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20 2a 2a  ized to all.  **
7470: 20 7a 65 72 6f 73 2c 20 77 68 69 63 68 20 69 73   zeros, which is
7480: 20 63 6f 72 72 65 63 74 2e 20 20 4d 53 56 43 20   correct.  MSVC 
7490: 67 65 6e 65 72 61 74 65 73 20 61 20 77 61 72 6e  generates a warn
74a0: 69 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c 65 73  ing, nevertheles
74b0: 73 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 56  s. */.  static V
74c0: 64 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20 2f 2a  dbeOp dummy;  /*
74d0: 20 49 67 6e 6f 72 65 20 74 68 65 20 4d 53 56 43   Ignore the MSVC
74e0: 20 77 61 72 6e 69 6e 67 20 61 62 6f 75 74 20 6e   warning about n
74f0: 6f 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 2a 2f  o initializer */
7500: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
7510: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
7520: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 61 64  INIT );.  if( ad
7530: 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72  dr<0 ){.    addr
7540: 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20   = p->nOp - 1;. 
7550: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 61 64   }.  assert( (ad
7560: 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d  dr>=0 && addr<p-
7570: 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e  >nOp) || p->db->
7580: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
7590: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
75a0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
75b0: 20 72 65 74 75 72 6e 20 28 56 64 62 65 4f 70 2a   return (VdbeOp*
75c0: 29 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73 65  )&dummy;.  }else
75d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d  {.    return &p-
75e0: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 7d 0a  >aOp[addr];.  }.
75f0: 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
7600: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50  QLITE_ENABLE_EXP
7610: 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 29 0a 2f  LAIN_COMMENTS)./
7620: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 69  *.** Return an i
7630: 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72  nteger value for
7640: 20 6f 6e 65 20 6f 66 20 74 68 65 20 70 61 72 61   one of the para
7650: 6d 65 74 65 72 73 20 74 6f 20 74 68 65 20 6f 70  meters to the op
7660: 63 6f 64 65 20 70 4f 70 0a 2a 2a 20 64 65 74 65  code pOp.** dete
7670: 72 6d 69 6e 65 64 20 62 79 20 63 68 61 72 61 63  rmined by charac
7680: 74 65 72 20 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  ter c..*/.static
7690: 20 69 6e 74 20 74 72 61 6e 73 6c 61 74 65 50 28   int translateP(
76a0: 63 68 61 72 20 63 2c 20 63 6f 6e 73 74 20 4f 70  char c, const Op
76b0: 20 2a 70 4f 70 29 7b 0a 20 20 69 66 28 20 63 3d   *pOp){.  if( c=
76c0: 3d 27 31 27 20 29 20 72 65 74 75 72 6e 20 70 4f  ='1' ) return pO
76d0: 70 2d 3e 70 31 3b 0a 20 20 69 66 28 20 63 3d 3d  p->p1;.  if( c==
76e0: 27 32 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70  '2' ) return pOp
76f0: 2d 3e 70 32 3b 0a 20 20 69 66 28 20 63 3d 3d 27  ->p2;.  if( c=='
7700: 33 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d  3' ) return pOp-
7710: 3e 70 33 3b 0a 20 20 69 66 28 20 63 3d 3d 27 34  >p3;.  if( c=='4
7720: 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e  ' ) return pOp->
7730: 70 34 2e 69 3b 0a 20 20 72 65 74 75 72 6e 20 70  p4.i;.  return p
7740: 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Op->p5;.}../*.**
7750: 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e   Compute a strin
7760: 67 20 66 6f 72 20 74 68 65 20 22 63 6f 6d 6d 65  g for the "comme
7770: 6e 74 22 20 66 69 65 6c 64 20 6f 66 20 61 20 56  nt" field of a V
7780: 44 42 45 20 6f 70 63 6f 64 65 20 6c 69 73 74 69  DBE opcode listi
7790: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 79  ng..**.** The Sy
77a0: 6e 6f 70 73 69 73 3a 20 66 69 65 6c 64 20 69 6e  nopsis: field in
77b0: 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65   comments in the
77c0: 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20 66   vdbe.c source f
77d0: 69 6c 65 20 67 65 74 73 20 63 6f 6e 76 65 72 74  ile gets convert
77e0: 65 64 0a 2a 2a 20 74 6f 20 61 6e 20 65 78 74 72  ed.** to an extr
77f0: 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73  a string that is
7800: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
7810: 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61   sqlite3OpcodeNa
7820: 6d 65 28 29 2e 20 20 49 6e 20 74 68 65 0a 2a 2a  me().  In the.**
7830: 20 61 62 73 65 6e 63 65 20 6f 66 20 6f 74 68 65   absence of othe
7840: 72 20 63 6f 6d 6d 65 6e 74 73 2c 20 74 68 69 73  r comments, this
7850: 20 73 79 6e 6f 70 73 69 73 20 62 65 63 6f 6d 65   synopsis become
7860: 73 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e  s the comment on
7870: 20 74 68 65 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20   the opcode..** 
7880: 53 6f 6d 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e  Some translation
7890: 20 6f 63 63 75 72 73 3a 0a 2a 2a 0a 2a 2a 20 20   occurs:.**.**  
78a0: 20 20 20 20 20 22 50 58 22 20 20 20 20 20 20 2d       "PX"      -
78b0: 3e 20 20 22 72 5b 58 5d 22 0a 2a 2a 20 20 20 20  >  "r[X]".**    
78c0: 20 20 20 22 50 58 40 50 59 22 20 20 20 2d 3e 20     "PX@PY"   -> 
78d0: 20 22 72 5b 58 2e 2e 58 2b 59 2d 31 5d 22 20 20   "r[X..X+Y-1]"  
78e0: 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 20 69  or "r[x]" if y i
78f0: 73 20 30 20 6f 72 20 31 0a 2a 2a 20 20 20 20 20  s 0 or 1.**     
7900: 20 20 22 50 58 40 50 59 2b 31 22 20 2d 3e 20 20    "PX@PY+1" ->  
7910: 22 72 5b 58 2e 2e 58 2b 59 5d 22 20 20 20 20 6f  "r[X..X+Y]"    o
7920: 72 20 22 72 5b 78 5d 22 20 69 66 20 79 20 69 73  r "r[x]" if y is
7930: 20 30 0a 2a 2a 20 20 20 20 20 20 20 22 50 59 2e   0.**       "PY.
7940: 2e 50 59 22 20 20 2d 3e 20 20 22 72 5b 58 2e 2e  .PY"  ->  "r[X..
7950: 59 5d 22 20 20 20 20 20 20 6f 72 20 22 72 5b 78  Y]"      or "r[x
7960: 5d 22 20 69 66 20 79 3c 3d 78 0a 2a 2f 0a 73 74  ]" if y<=x.*/.st
7970: 61 74 69 63 20 69 6e 74 20 64 69 73 70 6c 61 79  atic int display
7980: 43 6f 6d 6d 65 6e 74 28 0a 20 20 63 6f 6e 73 74  Comment(.  const
7990: 20 4f 70 20 2a 70 4f 70 2c 20 20 20 20 20 2f 2a   Op *pOp,     /*
79a0: 20 54 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 62   The opcode to b
79b0: 65 20 63 6f 6d 6d 65 6e 74 65 64 20 2a 2f 0a 20  e commented */. 
79c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34   const char *zP4
79d0: 2c 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 6c  ,   /* Previousl
79e0: 79 20 6f 62 74 61 69 6e 65 64 20 76 61 6c 75 65  y obtained value
79f0: 20 66 6f 72 20 50 34 20 2a 2f 0a 20 20 63 68 61   for P4 */.  cha
7a00: 72 20 2a 7a 54 65 6d 70 2c 20 20 20 20 20 20 20  r *zTemp,       
7a10: 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74 20  /* Write result 
7a20: 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  here */.  int nT
7a30: 65 6d 70 20 20 20 20 20 20 20 20 20 20 2f 2a 20  emp          /* 
7a40: 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  Space available 
7a50: 69 6e 20 7a 54 65 6d 70 5b 5d 20 2a 2f 0a 29 7b  in zTemp[] */.){
7a60: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7a70: 4f 70 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20  OpName;.  const 
7a80: 63 68 61 72 20 2a 7a 53 79 6e 6f 70 73 69 73 3b  char *zSynopsis;
7a90: 0a 20 20 69 6e 74 20 6e 4f 70 4e 61 6d 65 3b 0a  .  int nOpName;.
7aa0: 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20 20    int ii, jj;.  
7ab0: 7a 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  zOpName = sqlite
7ac0: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d  3OpcodeName(pOp-
7ad0: 3e 6f 70 63 6f 64 65 29 3b 0a 20 20 6e 4f 70 4e  >opcode);.  nOpN
7ae0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
7af0: 6c 65 6e 33 30 28 7a 4f 70 4e 61 6d 65 29 3b 0a  len30(zOpName);.
7b00: 20 20 69 66 28 20 7a 4f 70 4e 61 6d 65 5b 6e 4f    if( zOpName[nO
7b10: 70 4e 61 6d 65 2b 31 5d 20 29 7b 0a 20 20 20 20  pName+1] ){.    
7b20: 69 6e 74 20 73 65 65 6e 43 6f 6d 20 3d 20 30 3b  int seenCom = 0;
7b30: 0a 20 20 20 20 63 68 61 72 20 63 3b 0a 20 20 20  .    char c;.   
7b40: 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a 4f 70   zSynopsis = zOp
7b50: 4e 61 6d 65 20 2b 3d 20 6e 4f 70 4e 61 6d 65 20  Name += nOpName 
7b60: 2b 20 31 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d  + 1;.    for(ii=
7b70: 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65 6d 70 2d 31  jj=0; jj<nTemp-1
7b80: 20 26 26 20 28 63 20 3d 20 7a 53 79 6e 6f 70 73   && (c = zSynops
7b90: 69 73 5b 69 69 5d 29 21 3d 30 3b 20 69 69 2b 2b  is[ii])!=0; ii++
7ba0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  ){.      if( c==
7bb0: 27 50 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63  'P' ){.        c
7bc0: 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 2b 2b 69   = zSynopsis[++i
7bd0: 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
7be0: 63 3d 3d 27 34 27 20 29 7b 0a 20 20 20 20 20 20  c=='4' ){.      
7bf0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7c00: 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a  intf(nTemp-jj, z
7c10: 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 7a  Temp+jj, "%s", z
7c20: 50 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  P4);.        }el
7c30: 73 65 20 69 66 28 20 63 3d 3d 27 58 27 20 29 7b  se if( c=='X' ){
7c40: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
7c50: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
7c60: 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20  p-jj, zTemp+jj, 
7c70: 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  "%s", pOp->zComm
7c80: 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ent);.          
7c90: 73 65 65 6e 43 6f 6d 20 3d 20 31 3b 0a 20 20 20  seenCom = 1;.   
7ca0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7cb0: 20 20 20 20 20 20 69 6e 74 20 76 31 20 3d 20 74        int v1 = t
7cc0: 72 61 6e 73 6c 61 74 65 50 28 63 2c 20 70 4f 70  ranslateP(c, pOp
7cd0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
7ce0: 20 76 32 3b 0a 20 20 20 20 20 20 20 20 20 20 73   v2;.          s
7cf0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
7d00: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
7d10: 6a 6a 2c 20 22 25 64 22 2c 20 76 31 29 3b 0a 20  jj, "%d", v1);. 
7d20: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72           if( str
7d30: 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69  ncmp(zSynopsis+i
7d40: 69 2b 31 2c 20 22 40 50 22 2c 20 32 29 3d 3d 30  i+1, "@P", 2)==0
7d50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7d60: 69 69 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 20  ii += 3;.       
7d70: 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74       jj += sqlit
7d80: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
7d90: 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  +jj);.          
7da0: 20 20 76 32 20 3d 20 74 72 61 6e 73 6c 61 74 65    v2 = translate
7db0: 50 28 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 2c  P(zSynopsis[ii],
7dc0: 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20   pOp);.         
7dd0: 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a     if( strncmp(z
7de0: 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 22 2b  Synopsis+ii+1,"+
7df0: 31 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  1",2)==0 ){.    
7e00: 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20            ii += 
7e10: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2;.             
7e20: 20 76 32 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20   v2++;.         
7e30: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
7e40: 20 69 66 28 20 76 32 3e 31 20 29 7b 0a 20 20 20   if( v2>1 ){.   
7e50: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
7e60: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
7e70: 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20  p-jj, zTemp+jj, 
7e80: 22 2e 2e 25 64 22 2c 20 76 31 2b 76 32 2d 31 29  "..%d", v1+v2-1)
7e90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
7ea0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
7eb0: 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e  if( strncmp(zSyn
7ec0: 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 2e 2e 50  opsis+ii+1, "..P
7ed0: 33 22 2c 20 34 29 3d 3d 30 20 26 26 20 70 4f 70  3", 4)==0 && pOp
7ee0: 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ->p3==0 ){.     
7ef0: 20 20 20 20 20 20 20 69 69 20 2b 3d 20 34 3b 0a         ii += 4;.
7f00: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7f10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6a 6a      }.        jj
7f20: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
7f30: 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20  n30(zTemp+jj);. 
7f40: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7f50: 20 20 20 20 7a 54 65 6d 70 5b 6a 6a 2b 2b 5d 20      zTemp[jj++] 
7f60: 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = c;.      }.   
7f70: 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e   }.    if( !seen
7f80: 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54 65 6d 70 2d  Com && jj<nTemp-
7f90: 35 20 26 26 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  5 && pOp->zComme
7fa0: 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  nt ){.      sqli
7fb0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
7fc0: 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c  mp-jj, zTemp+jj,
7fd0: 20 22 3b 20 25 73 22 2c 20 70 4f 70 2d 3e 7a 43   "; %s", pOp->zC
7fe0: 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 6a  omment);.      j
7ff0: 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  j += sqlite3Strl
8000: 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a  en30(zTemp+jj);.
8010: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 6a      }.    if( jj
8020: 3c 6e 54 65 6d 70 20 29 20 7a 54 65 6d 70 5b 6a  <nTemp ) zTemp[j
8030: 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  j] = 0;.  }else 
8040: 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  if( pOp->zCommen
8050: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
8060: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
8070: 20 7a 54 65 6d 70 2c 20 22 25 73 22 2c 20 70 4f   zTemp, "%s", pO
8080: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20  p->zComment);.  
8090: 20 20 6a 6a 20 3d 20 73 71 6c 69 74 65 33 53 74    jj = sqlite3St
80a0: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20  rlen30(zTemp);. 
80b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 54 65 6d   }else{.    zTem
80c0: 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 6a 6a  p[0] = 0;.    jj
80d0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
80e0: 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn jj;.}.#endif 
80f0: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
8100: 2a 2f 0a 0a 23 69 66 20 56 44 42 45 5f 44 49 53  */..#if VDBE_DIS
8110: 50 4c 41 59 5f 50 34 20 26 26 20 64 65 66 69 6e  PLAY_P4 && defin
8120: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
8130: 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 29 0a 2f  _CURSOR_HINTS)./
8140: 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 74  *.** Translate t
8150: 68 65 20 50 34 2e 70 45 78 70 72 20 76 61 6c 75  he P4.pExpr valu
8160: 65 20 66 6f 72 20 61 6e 20 4f 50 5f 43 75 72 73  e for an OP_Curs
8170: 6f 72 48 69 6e 74 20 6f 70 63 6f 64 65 20 69 6e  orHint opcode in
8180: 74 6f 20 74 65 78 74 0a 2a 2a 20 74 68 61 74 20  to text.** that 
8190: 63 61 6e 20 62 65 20 64 69 73 70 6c 61 79 65 64  can be displayed
81a0: 20 69 6e 20 74 68 65 20 50 34 20 63 6f 6c 75 6d   in the P4 colum
81b0: 6e 20 6f 66 20 45 58 50 4c 41 49 4e 20 6f 75 74  n of EXPLAIN out
81c0: 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  put..*/.static i
81d0: 6e 74 20 64 69 73 70 6c 61 79 50 34 45 78 70 72  nt displayP4Expr
81e0: 28 69 6e 74 20 6e 54 65 6d 70 2c 20 63 68 61 72  (int nTemp, char
81f0: 20 2a 7a 54 65 6d 70 2c 20 45 78 70 72 20 2a 70   *zTemp, Expr *p
8200: 45 78 70 72 29 7b 0a 20 20 63 6f 6e 73 74 20 63  Expr){.  const c
8210: 68 61 72 20 2a 7a 4f 70 20 3d 20 30 3b 0a 20 20  har *zOp = 0;.  
8220: 69 6e 74 20 6e 3b 0a 20 20 73 77 69 74 63 68 28  int n;.  switch(
8230: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
8240: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
8250: 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  :.      sqlite3_
8260: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
8270: 7a 54 65 6d 70 2c 20 22 25 51 22 2c 20 70 45 78  zTemp, "%Q", pEx
8280: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
8290: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
82a0: 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
82b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
82c0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
82d0: 54 65 6d 70 2c 20 22 25 64 22 2c 20 70 45 78 70  Temp, "%d", pExp
82e0: 72 2d 3e 75 2e 69 56 61 6c 75 65 29 3b 0a 20 20  r->u.iValue);.  
82f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
8300: 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20  ase TK_NULL:.   
8310: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
8320: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
8330: 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20  , "NULL");.     
8340: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8350: 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a   TK_REGISTER: {.
8360: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
8370: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
8380: 65 6d 70 2c 20 22 72 5b 25 64 5d 22 2c 20 70 45  emp, "r[%d]", pE
8390: 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  xpr->iTable);.  
83a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
83b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
83c0: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  UMN: {.      if(
83d0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
83e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
83f0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
8400: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 72 6f 77  emp, zTemp, "row
8410: 69 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  id");.      }els
8420: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
8430: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
8440: 70 2c 20 7a 54 65 6d 70 2c 20 22 63 25 64 22 2c  p, zTemp, "c%d",
8450: 20 28 69 6e 74 29 70 45 78 70 72 2d 3e 69 43 6f   (int)pExpr->iCo
8460: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lumn);.      }. 
8470: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8480: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  }.    case TK_LT
8490: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c 54  :      zOp = "LT
84a0: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
84b0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20     case TK_LE:  
84c0: 20 20 20 20 7a 4f 70 20 3d 20 22 4c 45 22 3b 20      zOp = "LE"; 
84d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
84e0: 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20  case TK_GT:     
84f0: 20 7a 4f 70 20 3d 20 22 47 54 22 3b 20 20 20 20   zOp = "GT";    
8500: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8510: 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 7a 4f  e TK_GE:      zO
8520: 70 20 3d 20 22 47 45 22 3b 20 20 20 20 20 20 62  p = "GE";      b
8530: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8540: 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_NE:      zOp =
8550: 20 22 4e 45 22 3b 20 20 20 20 20 20 62 72 65 61   "NE";      brea
8560: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  k;.    case TK_E
8570: 51 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 45  Q:      zOp = "E
8580: 51 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  Q";      break;.
8590: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 20      case TK_IS: 
85a0: 20 20 20 20 20 7a 4f 70 20 3d 20 22 49 53 22 3b       zOp = "IS";
85b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
85c0: 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20   case TK_ISNOT: 
85d0: 20 20 7a 4f 70 20 3d 20 22 49 53 4e 4f 54 22 3b    zOp = "ISNOT";
85e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
85f0: 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20 7a  se TK_AND:     z
8600: 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20 20 20 20  Op = "AND";     
8610: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8620: 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a 4f 70 20  TK_OR:      zOp 
8630: 3d 20 22 4f 52 22 3b 20 20 20 20 20 20 62 72 65  = "OR";      bre
8640: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8650: 50 4c 55 53 3a 20 20 20 20 7a 4f 70 20 3d 20 22  PLUS:    zOp = "
8660: 41 44 44 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  ADD";     break;
8670: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41  .    case TK_STA
8680: 52 3a 20 20 20 20 7a 4f 70 20 3d 20 22 4d 55 4c  R:    zOp = "MUL
8690: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
86a0: 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a    case TK_MINUS:
86b0: 20 20 20 7a 4f 70 20 3d 20 22 53 55 42 22 3b 20     zOp = "SUB"; 
86c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
86d0: 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20 20  ase TK_REM:     
86e0: 7a 4f 70 20 3d 20 22 52 45 4d 22 3b 20 20 20 20  zOp = "REM";    
86f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8700: 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20 7a 4f 70   TK_BITAND:  zOp
8710: 20 3d 20 22 42 49 54 41 4e 44 22 3b 20 20 62 72   = "BITAND";  br
8720: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8730: 5f 42 49 54 4f 52 3a 20 20 20 7a 4f 70 20 3d 20  _BITOR:   zOp = 
8740: 22 42 49 54 4f 52 22 3b 20 20 20 62 72 65 61 6b  "BITOR";   break
8750: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c  ;.    case TK_SL
8760: 41 53 48 3a 20 20 20 7a 4f 70 20 3d 20 22 44 49  ASH:   zOp = "DI
8770: 56 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  V";     break;. 
8780: 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46     case TK_LSHIF
8790: 54 3a 20 20 7a 4f 70 20 3d 20 22 4c 53 48 49 46  T:  zOp = "LSHIF
87a0: 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  T";  break;.    
87b0: 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20  case TK_RSHIFT: 
87c0: 20 7a 4f 70 20 3d 20 22 52 53 48 49 46 54 22 3b   zOp = "RSHIFT";
87d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
87e0: 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a 4f  e TK_CONCAT:  zO
87f0: 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b 20 20 62  p = "CONCAT";  b
8800: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8810: 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 4f 70 20 3d  K_UMINUS:  zOp =
8820: 20 22 4d 49 4e 55 53 22 3b 20 20 20 62 72 65 61   "MINUS";   brea
8830: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  k;.    case TK_U
8840: 50 4c 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22 50  PLUS:   zOp = "P
8850: 4c 55 53 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  LUS";    break;.
8860: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e      case TK_BITN
8870: 4f 54 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54 4e  OT:  zOp = "BITN
8880: 4f 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  OT";  break;.   
8890: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20   case TK_NOT:   
88a0: 20 20 7a 4f 70 20 3d 20 22 4e 4f 54 22 3b 20 20    zOp = "NOT";  
88b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
88c0: 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 7a  se TK_ISNULL:  z
88d0: 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22 3b 20 20  Op = "ISNULL";  
88e0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
88f0: 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4f 70 20  TK_NOTNULL: zOp 
8900: 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20 62 72 65  = "NOTNULL"; bre
8910: 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74  ak;..    default
8920: 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  :.      sqlite3_
8930: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
8940: 7a 54 65 6d 70 2c 20 22 25 73 22 2c 20 22 65 78  zTemp, "%s", "ex
8950: 70 72 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  pr");.      brea
8960: 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a 4f  k;.  }..  if( zO
8970: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
8980: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
8990: 20 7a 54 65 6d 70 2c 20 22 25 73 28 22 2c 20 7a   zTemp, "%s(", z
89a0: 4f 70 29 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c  Op);.    n = sql
89b0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
89c0: 6d 70 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 64 69  mp);.    n += di
89d0: 73 70 6c 61 79 50 34 45 78 70 72 28 6e 54 65 6d  splayP4Expr(nTem
89e0: 70 2d 6e 2c 20 7a 54 65 6d 70 2b 6e 2c 20 70 45  p-n, zTemp+n, pE
89f0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
8a00: 20 69 66 28 20 6e 3c 6e 54 65 6d 70 2d 31 20 26   if( n<nTemp-1 &
8a10: 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  & pExpr->pRight 
8a20: 29 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 6e  ){.      zTemp[n
8a30: 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20  ++] = ',';.     
8a40: 20 6e 20 2b 3d 20 64 69 73 70 6c 61 79 50 34 45   n += displayP4E
8a50: 78 70 72 28 6e 54 65 6d 70 2d 6e 2c 20 7a 54 65  xpr(nTemp-n, zTe
8a60: 6d 70 2b 6e 2c 20 70 45 78 70 72 2d 3e 70 52 69  mp+n, pExpr->pRi
8a70: 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ght);.    }.    
8a80: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
8a90: 28 6e 54 65 6d 70 2d 6e 2c 20 7a 54 65 6d 70 2b  (nTemp-n, zTemp+
8aa0: 6e 2c 20 22 29 22 29 3b 0a 20 20 7d 0a 20 20 72  n, ")");.  }.  r
8ab0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 74 72  eturn sqlite3Str
8ac0: 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 7d 0a  len30(zTemp);.}.
8ad0: 23 65 6e 64 69 66 20 2f 2a 20 56 44 42 45 5f 44  #endif /* VDBE_D
8ae0: 49 53 50 4c 41 59 5f 50 34 20 26 26 20 64 65 66  ISPLAY_P4 && def
8af0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
8b00: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 29  LE_CURSOR_HINTS)
8b10: 20 2a 2f 0a 0a 0a 23 69 66 20 56 44 42 45 5f 44   */...#if VDBE_D
8b20: 49 53 50 4c 41 59 5f 50 34 0a 2f 2a 0a 2a 2a 20  ISPLAY_P4./*.** 
8b30: 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67  Compute a string
8b40: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
8b50: 74 68 65 20 50 34 20 70 61 72 61 6d 65 74 65 72  the P4 parameter
8b60: 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a   for an opcode..
8b70: 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72  ** Use zTemp for
8b80: 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 74 65   any required te
8b90: 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 73  mporary buffer s
8ba0: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
8bb0: 63 68 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28  char *displayP4(
8bc0: 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a  Op *pOp, char *z
8bd0: 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29  Temp, int nTemp)
8be0: 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20  {.  char *zP4 = 
8bf0: 7a 54 65 6d 70 3b 0a 20 20 61 73 73 65 72 74 28  zTemp;.  assert(
8c00: 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20   nTemp>=20 );.  
8c10: 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70 34 74  switch( pOp->p4t
8c20: 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
8c30: 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20  P4_KEYINFO: {.  
8c40: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
8c50: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
8c60: 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e  yInfo = pOp->p4.
8c70: 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pKeyInfo;.      
8c80: 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
8c90: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20  ->aSortOrder!=0 
8ca0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8cb0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
8cc0: 20 7a 54 65 6d 70 2c 20 22 6b 28 25 64 22 2c 20   zTemp, "k(%d", 
8cd0: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
8ce0: 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 73 71 6c  );.      i = sql
8cf0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
8d00: 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  mp);.      for(j
8d10: 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e  =0; j<pKeyInfo->
8d20: 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20  nField; j++){.  
8d30: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
8d40: 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  Coll = pKeyInfo-
8d50: 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  >aColl[j];.     
8d60: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
8d70: 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 20 3f 20 70  Coll = pColl ? p
8d80: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 6e  Coll->zName : "n
8d90: 69 6c 22 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  il";.        int
8da0: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
8db0: 65 6e 33 30 28 7a 43 6f 6c 6c 29 3b 0a 20 20 20  en30(zColl);.   
8dc0: 20 20 20 20 20 69 66 28 20 6e 3d 3d 36 20 26 26       if( n==6 &&
8dd0: 20 6d 65 6d 63 6d 70 28 7a 43 6f 6c 6c 2c 22 42   memcmp(zColl,"B
8de0: 49 4e 41 52 59 22 2c 36 29 3d 3d 30 20 29 7b 0a  INARY",6)==0 ){.
8df0: 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20            zColl 
8e00: 3d 20 22 42 22 3b 0a 20 20 20 20 20 20 20 20 20  = "B";.         
8e10: 20 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20   n = 1;.        
8e20: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 2b  }.        if( i+
8e30: 6e 3e 6e 54 65 6d 70 2d 37 20 29 7b 0a 20 20 20  n>nTemp-7 ){.   
8e40: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a         memcpy(&z
8e50: 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34  Temp[i],",...",4
8e60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b  );.          i +
8e70: 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 4;.          b
8e80: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
8e90: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b          zTemp[i+
8ea0: 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20  +] = ',';.      
8eb0: 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e    if( pKeyInfo->
8ec0: 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29 7b  aSortOrder[j] ){
8ed0: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70  .          zTemp
8ee0: 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20  [i++] = '-';.   
8ef0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d       }.        m
8f00: 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c  emcpy(&zTemp[i],
8f10: 20 7a 43 6f 6c 6c 2c 20 6e 2b 31 29 3b 0a 20 20   zColl, n+1);.  
8f20: 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20        i += n;.  
8f30: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d      }.      zTem
8f40: 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20  p[i++] = ')';.  
8f50: 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d 20 30      zTemp[i] = 0
8f60: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8f70: 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20 20 20  i<nTemp );.     
8f80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
8f90: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
8fa0: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
8fb0: 20 20 20 20 63 61 73 65 20 50 34 5f 45 58 50 52      case P4_EXPR
8fc0: 3a 20 7b 0a 20 20 20 20 20 20 64 69 73 70 6c 61  : {.      displa
8fd0: 79 50 34 45 78 70 72 28 6e 54 65 6d 70 2c 20 7a  yP4Expr(nTemp, z
8fe0: 54 65 6d 70 2c 20 70 4f 70 2d 3e 70 34 2e 70 45  Temp, pOp->p4.pE
8ff0: 78 70 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  xpr);.      brea
9000: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
9010: 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c      case P4_COLL
9020: 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c  SEQ: {.      Col
9030: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f  lSeq *pColl = pO
9040: 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20  p->p4.pColl;.   
9050: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
9060: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
9070: 2c 20 22 28 25 2e 32 30 73 29 22 2c 20 70 43 6f  , "(%.20s)", pCo
9080: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
9090: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
90a0: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44     case P4_FUNCD
90b0: 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63  EF: {.      Func
90c0: 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d  Def *pDef = pOp-
90d0: 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20  >p4.pFunc;.     
90e0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
90f0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
9100: 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e  "%s(%d)", pDef->
9110: 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72  zName, pDef->nAr
9120: 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
9130: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
9140: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 63  LITE_DEBUG.    c
9150: 61 73 65 20 50 34 5f 46 55 4e 43 43 54 58 3a 20  ase P4_FUNCCTX: 
9160: 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  {.      FuncDef 
9170: 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e  *pDef = pOp->p4.
9180: 70 43 74 78 2d 3e 70 46 75 6e 63 3b 0a 20 20 20  pCtx->pFunc;.   
9190: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
91a0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
91b0: 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44 65 66  , "%s(%d)", pDef
91c0: 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e  ->zName, pDef->n
91d0: 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Arg);.      brea
91e0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
91f0: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36      case P4_INT6
9200: 34 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  4: {.      sqlit
9210: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
9220: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22  p, zTemp, "%lld"
9230: 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29  , *pOp->p4.pI64)
9240: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9250: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
9260: 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20  _INT32: {.      
9270: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
9280: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
9290: 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b  %d", pOp->p4.i);
92a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
92b0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
92c0: 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  REAL: {.      sq
92d0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
92e0: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e  Temp, zTemp, "%.
92f0: 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70  16g", *pOp->p4.p
9300: 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Real);.      bre
9310: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
9320: 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20  se P4_MEM: {.   
9330: 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70     Mem *pMem = p
9340: 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20  Op->p4.pMem;.   
9350: 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61     if( pMem->fla
9360: 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a  gs & MEM_Str ){.
9370: 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d          zP4 = pM
9380: 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c  em->z;.      }el
9390: 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61  se if( pMem->fla
93a0: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a  gs & MEM_Int ){.
93b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
93c0: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
93d0: 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 70  zTemp, "%lld", p
93e0: 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20  Mem->u.i);.     
93f0: 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d   }else if( pMem-
9400: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61  >flags & MEM_Rea
9410: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
9420: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
9430: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31  emp, zTemp, "%.1
9440: 36 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e 72 29 3b  6g", pMem->u.r);
9450: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
9460: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
9470: 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  EM_Null ){.     
9480: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
9490: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
94a0: 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20  , "NULL");.     
94b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
94c0: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c  assert( pMem->fl
94d0: 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
94e0: 3b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  ;.        zP4 = 
94f0: 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20  "(blob)";.      
9500: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
9510: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
9520: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
9530: 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50  TABLE.    case P
9540: 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20  4_VTAB: {.      
9550: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
9560: 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56  tab = pOp->p4.pV
9570: 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20  tab->pVtab;.    
9580: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
9590: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
95a0: 20 22 76 74 61 62 3a 25 70 22 2c 20 70 56 74 61   "vtab:%p", pVta
95b0: 62 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  b);.      break;
95c0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
95d0: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52    case P4_INTARR
95e0: 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AY: {.      sqli
95f0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
9600: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 69 6e 74 61  mp, zTemp, "inta
9610: 72 72 61 79 22 29 3b 0a 20 20 20 20 20 20 62 72  rray");.      br
9620: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
9630: 61 73 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41  ase P4_SUBPROGRA
9640: 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  M: {.      sqlit
9650: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
9660: 70 2c 20 7a 54 65 6d 70 2c 20 22 70 72 6f 67 72  p, zTemp, "progr
9670: 61 6d 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  am");.      brea
9680: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
9690: 65 20 50 34 5f 41 44 56 41 4e 43 45 3a 20 7b 0a  e P4_ADVANCE: {.
96a0: 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d        zTemp[0] =
96b0: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
96c0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
96d0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20  lt: {.      zP4 
96e0: 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20  = pOp->p4.z;.   
96f0: 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b     if( zP4==0 ){
9700: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a  .        zP4 = z
9710: 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54  Temp;.        zT
9720: 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[0] = 0;.    
9730: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
9740: 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30 20 29  assert( zP4!=0 )
9750: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a  ;.  return zP4;.
9760: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56 44 42 45  }.#endif /* VDBE
9770: 5f 44 49 53 50 4c 41 59 5f 50 34 20 2a 2f 0a 0a  _DISPLAY_P4 */..
9780: 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f  /*.** Declare to
9790: 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20 74   the Vdbe that t
97a0: 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74 20  he BTree object 
97b0: 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73  at db->aDb[i] is
97c0: 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   used..**.** The
97d0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
97e0: 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f  ents need to kno
97f0: 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74 68 65  w in advance the
9800: 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20 6f 66   complete set of
9810: 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74  .** attached dat
9820: 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c  abases that will
9830: 20 62 65 20 75 73 65 2e 20 20 41 20 6d 61 73 6b   be use.  A mask
9840: 20 6f 66 20 74 68 65 73 65 20 64 61 74 61 62 61   of these databa
9850: 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e 74 61  ses.** is mainta
9860: 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72 65 65  ined in p->btree
9870: 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e 6c 6f  Mask.  The p->lo
9880: 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69 73 20  ckMask value is 
9890: 74 68 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a  the subset of.**
98a0: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 6f 66   p->btreeMask of
98b0: 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
98c0: 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6c  will require a l
98d0: 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ock..*/.void sql
98e0: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
98f0: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  e(Vdbe *p, int i
9900: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d  ){.  assert( i>=
9910: 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44  0 && i<p->db->nD
9920: 62 20 26 26 20 69 3c 28 69 6e 74 29 73 69 7a 65  b && i<(int)size
9930: 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20 29 3b  of(yDbMask)*8 );
9940: 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28 69 6e  .  assert( i<(in
9950: 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65  t)sizeof(p->btre
9960: 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 44 62  eMask)*8 );.  Db
9970: 4d 61 73 6b 53 65 74 28 70 2d 3e 62 74 72 65 65  MaskSet(p->btree
9980: 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 69 66 28 20  Mask, i);.  if( 
9990: 69 21 3d 31 20 26 26 20 73 71 6c 69 74 65 33 42  i!=1 && sqlite3B
99a0: 74 72 65 65 53 68 61 72 61 62 6c 65 28 70 2d 3e  treeSharable(p->
99b0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20  db->aDb[i].pBt) 
99c0: 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74  ){.    DbMaskSet
99d0: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 20 69 29  (p->lockMask, i)
99e0: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65  ;.  }.}..#if !de
99f0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
9a00: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 0a  T_SHARED_CACHE).
9a10: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20  /*.** If SQLite 
9a20: 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20 73  is compiled to s
9a30: 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61  upport shared-ca
9a40: 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74 6f 20  che mode and to 
9a50: 62 65 20 74 68 72 65 61 64 73 61 66 65 2c 0a 2a  be threadsafe,.*
9a60: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  * this routine o
9a70: 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74 65 78  btains the mutex
9a80: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
9a90: 20 65 61 63 68 20 42 74 53 68 61 72 65 64 20 73   each BtShared s
9aa0: 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68 61 74  tructure.** that
9ab0: 20 6d 61 79 20 62 65 20 61 63 63 65 73 73 65 64   may be accessed
9ac0: 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73 65   by the VM passe
9ad0: 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
9ae0: 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20 69 74  . In doing so it
9af0: 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73 20 74 68   also.** sets th
9b00: 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 6d 65  e BtShared.db me
9b10: 6d 62 65 72 20 6f 66 20 65 61 63 68 20 6f 66 20  mber of each of 
9b20: 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72  the BtShared str
9b30: 75 63 74 75 72 65 73 2c 20 65 6e 73 75 72 69 6e  uctures, ensurin
9b40: 67 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 6f  g.** that the co
9b50: 72 72 65 63 74 20 62 75 73 79 2d 68 61 6e 64 6c  rrect busy-handl
9b60: 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69  er callback is i
9b70: 6e 76 6f 6b 65 64 20 69 66 20 72 65 71 75 69 72  nvoked if requir
9b80: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  ed..**.** If SQL
9b90: 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61  ite is not threa
9ba0: 64 73 61 66 65 20 62 75 74 20 64 6f 65 73 20 73  dsafe but does s
9bb0: 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61  upport shared-ca
9bc0: 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a  che mode, then.*
9bd0: 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e  * sqlite3BtreeEn
9be0: 74 65 72 28 29 20 69 73 20 69 6e 76 6f 6b 65 64  ter() is invoked
9bf0: 20 74 6f 20 73 65 74 20 74 68 65 20 42 74 53 68   to set the BtSh
9c00: 61 72 65 64 2e 64 62 20 76 61 72 69 61 62 6c 65  ared.db variable
9c10: 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 42  s.** of all of B
9c20: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
9c30: 65 73 20 61 63 63 65 73 73 69 62 6c 65 20 76 69  es accessible vi
9c40: 61 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  a the database h
9c50: 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63 69  andle .** associ
9c60: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d  ated with the VM
9c70: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74  ..**.** If SQLit
9c80: 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73  e is not threads
9c90: 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  afe and does not
9ca0: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d   support shared-
9cb0: 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 69 73  cache mode, this
9cc0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
9cd0: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
9ce0: 68 65 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20  he p->btreeMask 
9cf0: 66 69 65 6c 64 20 69 73 20 61 20 62 69 74 6d 61  field is a bitma
9d00: 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72 65 65 73  sk of all btrees
9d10: 20 74 68 61 74 20 74 68 65 20 70 72 65 70 61 72   that the prepar
9d20: 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ed .** statement
9d30: 20 70 20 77 69 6c 6c 20 65 76 65 72 20 75 73 65   p will ever use
9d40: 2e 20 20 4c 65 74 20 4e 20 62 65 20 74 68 65 20  .  Let N be the 
9d50: 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20 69  number of bits i
9d60: 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 0a 2a  n p->btreeMask.*
9d70: 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
9d80: 74 6f 20 62 74 72 65 65 73 20 74 68 61 74 20 75  to btrees that u
9d90: 73 65 20 73 68 61 72 65 64 20 63 61 63 68 65 2e  se shared cache.
9da0: 20 20 54 68 65 6e 20 74 68 65 20 72 75 6e 74 69    Then the runti
9db0: 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20 72 6f  me of.** this ro
9dc0: 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e 20 20 42  utine is N*N.  B
9dd0: 75 74 20 61 73 20 4e 20 69 73 20 72 61 72 65 6c  ut as N is rarel
9de0: 79 20 6d 6f 72 65 20 74 68 61 6e 20 31 2c 20 74  y more than 1, t
9df0: 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a  his should not.*
9e00: 2a 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a  * be a problem..
9e10: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
9e20: 64 62 65 45 6e 74 65 72 28 56 64 62 65 20 2a 70  dbeEnter(Vdbe *p
9e30: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
9e40: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20  lite3 *db;.  Db 
9e50: 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b  *aDb;.  int nDb;
9e60: 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c  .  if( DbMaskAll
9e70: 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  Zero(p->lockMask
9e80: 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  ) ) return;  /* 
9e90: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
9ea0: 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  */.  db = p->db;
9eb0: 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62  .  aDb = db->aDb
9ec0: 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44  ;.  nDb = db->nD
9ed0: 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  b;.  for(i=0; i<
9ee0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
9ef0: 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d 61 73  f( i!=1 && DbMas
9f00: 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73  kTest(p->lockMas
9f10: 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53 28 61  k,i) && ALWAYS(a
9f20: 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b  Db[i].pBt!=0) ){
9f30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
9f40: 72 65 65 45 6e 74 65 72 28 61 44 62 5b 69 5d 2e  reeEnter(aDb[i].
9f50: 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pBt);.    }.  }.
9f60: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  }.#endif..#if !d
9f70: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
9f80: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
9f90: 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41   && SQLITE_THREA
9fa0: 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e  DSAFE>0./*.** Un
9fb0: 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65 20  lock all of the 
9fc0: 62 74 72 65 65 73 20 70 72 65 76 69 6f 75 73 6c  btrees previousl
9fd0: 79 20 6c 6f 63 6b 65 64 20 62 79 20 61 20 63 61  y locked by a ca
9fe0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
9ff0: 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a 73 74 61  eEnter()..*/.sta
a000: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
a010: 49 4e 45 20 76 6f 69 64 20 76 64 62 65 4c 65 61  INE void vdbeLea
a020: 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ve(Vdbe *p){.  i
a030: 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt i;.  sqlite3 
a040: 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a  *db;.  Db *aDb;.
a050: 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 64 62 20    int nDb;.  db 
a060: 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d  = p->db;.  aDb =
a070: 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20   db->aDb;.  nDb 
a080: 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72  = db->nDb;.  for
a090: 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b  (i=0; i<nDb; i++
a0a0: 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20  ){.    if( i!=1 
a0b0: 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d  && DbMaskTest(p-
a0c0: 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20  >lockMask,i) && 
a0d0: 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42  ALWAYS(aDb[i].pB
a0e0: 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73  t!=0) ){.      s
a0f0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
a100: 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20  (aDb[i].pBt);.  
a110: 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73    }.  }.}.void s
a120: 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28  qlite3VdbeLeave(
a130: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20  Vdbe *p){.  if( 
a140: 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d  DbMaskAllZero(p-
a150: 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65 74  >lockMask) ) ret
a160: 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d  urn;  /* The com
a170: 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 76 64  mon case */.  vd
a180: 62 65 4c 65 61 76 65 28 70 29 3b 0a 7d 0a 23 65  beLeave(p);.}.#e
a190: 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
a1a0: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20  d(VDBE_PROFILE) 
a1b0: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
a1c0: 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50  E_DEBUG)./*.** P
a1d0: 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70  rint a single op
a1e0: 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74  code.  This rout
a1f0: 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
a200: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
a210: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
a220: 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20  dbePrintOp(FILE 
a230: 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f  *pOut, int pc, O
a240: 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20  p *pOp){.  char 
a250: 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74  *zP4;.  char zPt
a260: 72 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20 7a 43  r[50];.  char zC
a270: 6f 6d 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74 69  om[100];.  stati
a280: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  c const char *zF
a290: 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d  ormat1 = "%4d %-
a2a0: 31 33 73 20 25 34 64 20 25 34 64 20 25 34 64 20  13s %4d %4d %4d 
a2b0: 25 2d 31 33 73 20 25 2e 32 58 20 25 73 5c 6e 22  %-13s %.2X %s\n"
a2c0: 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20  ;.  if( pOut==0 
a2d0: 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b  ) pOut = stdout;
a2e0: 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79  .  zP4 = display
a2f0: 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69  P4(pOp, zPtr, si
a300: 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 23 69 66  zeof(zPtr));.#if
a310: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
a320: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
a330: 54 53 0a 20 20 64 69 73 70 6c 61 79 43 6f 6d 6d  TS.  displayComm
a340: 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 7a 43  ent(pOp, zP4, zC
a350: 6f 6d 2c 20 73 69 7a 65 6f 66 28 7a 43 6f 6d 29  om, sizeof(zCom)
a360: 29 3b 0a 23 65 6c 73 65 0a 20 20 7a 43 6f 6d 5b  );.#else.  zCom[
a370: 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  0] = 0;.#endif. 
a380: 20 2f 2a 20 4e 42 3a 20 20 54 68 65 20 73 71 6c   /* NB:  The sql
a390: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29  ite3OpcodeName()
a3a0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70   function is imp
a3b0: 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 6f 64 65  lemented by code
a3c0: 20 63 72 65 61 74 65 64 0a 20 20 2a 2a 20 62 79   created.  ** by
a3d0: 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61   the mkopcodeh.a
a3e0: 77 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f 64 65 63  wk and mkopcodec
a3f0: 2e 61 77 6b 20 73 63 72 69 70 74 73 20 77 68 69  .awk scripts whi
a400: 63 68 20 65 78 74 72 61 63 74 20 74 68 65 0a 20  ch extract the. 
a410: 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   ** information 
a420: 66 72 6f 6d 20 74 68 65 20 76 64 62 65 2e 63 20  from the vdbe.c 
a430: 73 6f 75 72 63 65 20 74 65 78 74 20 2a 2f 0a 20  source text */. 
a440: 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a   fprintf(pOut, z
a450: 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20  Format1, pc, .  
a460: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f 64      sqlite3Opcod
a470: 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64  eName(pOp->opcod
a480: 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70  e), pOp->p1, pOp
a490: 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a  ->p2, pOp->p3, z
a4a0: 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20 20 20  P4, pOp->p5,.   
a4b0: 20 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20 66     zCom.  );.  f
a4c0: 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23  flush(pOut);.}.#
a4d0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  endif../*.** Rel
a4e0: 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66  ease an array of
a4f0: 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a   N Mem elements.
a500: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
a510: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d  eleaseMemArray(M
a520: 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20  em *p, int N){. 
a530: 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a 20   if( p && N ){. 
a540: 20 20 20 4d 65 6d 20 2a 70 45 6e 64 20 3d 20 26     Mem *pEnd = &
a550: 70 5b 4e 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  p[N];.    sqlite
a560: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
a570: 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f 66 61 69     u8 malloc_fai
a580: 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63  led = db->malloc
a590: 46 61 69 6c 65 64 3b 0a 20 20 20 20 69 66 28 20  Failed;.    if( 
a5a0: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
a5b0: 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20   ){.      do{.  
a5c0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d        if( p->szM
a5d0: 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 44  alloc ) sqlite3D
a5e0: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61  bFree(db, p->zMa
a5f0: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d 77 68  lloc);.      }wh
a600: 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20  ile( (++p)<pEnd 
a610: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
a620: 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20  .    }.    do{. 
a630: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 26 70       assert( (&p
a640: 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b  [1])==pEnd || p[
a650: 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29  0].db==p[1].db )
a660: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a670: 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
a680: 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 70 29  MemInvariants(p)
a690: 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68   );..      /* Th
a6a0: 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c  is block is real
a6b0: 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65  ly an inlined ve
a6c0: 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33  rsion of sqlite3
a6d0: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29  VdbeMemRelease()
a6e0: 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74  .      ** that t
a6f0: 61 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20 6f  akes advantage o
a700: 66 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  f the fact that 
a710: 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
a720: 76 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20 20  value is .      
a730: 2a 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20  ** being set to 
a740: 4e 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65 61  NULL after relea
a750: 73 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69 63  sing any dynamic
a760: 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 20   resources..    
a770: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
a780: 65 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 20  e justification 
a790: 66 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67 20  for duplicating 
a7a0: 63 6f 64 65 20 69 73 20 74 68 61 74 20 61 63 63  code is that acc
a7b0: 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 20  ording to .     
a7c0: 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74   ** callgrind, t
a7d0: 68 69 73 20 63 61 75 73 65 73 20 61 20 63 65 72  his causes a cer
a7e0: 74 61 69 6e 20 74 65 73 74 20 63 61 73 65 20 74  tain test case t
a7f0: 6f 20 68 69 74 20 74 68 65 20 43 50 55 20 34 2e  o hit the CPU 4.
a800: 37 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 63  7 .      ** perc
a810: 65 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c 69  ent less (x86 li
a820: 6e 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f 6e  nux, gcc version
a830: 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61   4.1.2, -O6) tha
a840: 6e 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20 73  n if .      ** s
a850: 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73 65  qlite3MemRelease
a860: 28 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20 66  () were called f
a870: 72 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20 2d  rom here. With -
a880: 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a 20  O2, this jumps. 
a890: 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70       ** to 6.6 p
a8a0: 65 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73 74  ercent. The test
a8b0: 20 63 61 73 65 20 69 73 20 69 6e 73 65 72 74 69   case is inserti
a8c0: 6e 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e 74  ng 1000 rows int
a8d0: 6f 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20 20  o a table .     
a8e0: 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64 65   ** with no inde
a8f0: 78 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e 67  xes using a sing
a900: 6c 65 20 70 72 65 70 61 72 65 64 20 49 4e 53 45  le prepared INSE
a910: 52 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 69  RT statement, bi
a920: 6e 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 61  nd() .      ** a
a930: 6e 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73 65  nd reset(). Inse
a940: 72 74 73 20 61 72 65 20 67 72 6f 75 70 65 64 20  rts are grouped 
a950: 69 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74 69  into a transacti
a960: 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
a970: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
a980: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 41 67 67 20  flags & MEM_Agg 
a990: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
a9a0: 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45  e( p->flags & ME
a9b0: 4d 5f 44 79 6e 20 29 3b 0a 20 20 20 20 20 20 74  M_Dyn );.      t
a9c0: 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67  estcase( p->flag
a9d0: 73 20 26 20 4d 45 4d 5f 46 72 61 6d 65 20 29 3b  s & MEM_Frame );
a9e0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
a9f0: 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f   p->flags & MEM_
aa00: 52 6f 77 53 65 74 20 29 3b 0a 20 20 20 20 20 20  RowSet );.      
aa10: 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45  if( p->flags&(ME
aa20: 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45  M_Agg|MEM_Dyn|ME
aa30: 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77 53  M_Frame|MEM_RowS
aa40: 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  et) ){.        s
aa50: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
aa60: 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20 7d  ease(p);.      }
aa70: 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 7a 4d 61  else if( p->szMa
aa80: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20  lloc ){.        
aa90: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
aaa0: 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20  , p->zMalloc);. 
aab0: 20 20 20 20 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c         p->szMall
aac0: 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  oc = 0;.      }.
aad0: 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  .      p->flags 
aae0: 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b  = MEM_Undefined;
aaf0: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b  .    }while( (++
ab00: 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20 64  p)<pEnd );.    d
ab10: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
ab20: 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 3b  = malloc_failed;
ab30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
ab40: 6c 65 74 65 20 61 20 56 64 62 65 46 72 61 6d 65  lete a VdbeFrame
ab50: 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74 73 20   object and its 
ab60: 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65 46 72  contents. VdbeFr
ab70: 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72 65 0a  ame objects are.
ab80: 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ** allocated by 
ab90: 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f  the OP_Program o
aba0: 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74 65 33  pcode in sqlite3
abb0: 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a 76  VdbeExec()..*/.v
abc0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46  oid sqlite3VdbeF
abd0: 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62 65 46  rameDelete(VdbeF
abe0: 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  rame *p){.  int 
abf0: 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d  i;.  Mem *aMem =
ac00: 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 29   VdbeFrameMem(p)
ac10: 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  ;.  VdbeCursor *
ac20: 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65 43 75  *apCsr = (VdbeCu
ac30: 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d  rsor **)&aMem[p-
ac40: 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20 66  >nChildMem];.  f
ac50: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68  or(i=0; i<p->nCh
ac60: 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20 20  ildCsr; i++){.  
ac70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65    sqlite3VdbeFre
ac80: 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61 70  eCursor(p->v, ap
ac90: 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72  Csr[i]);.  }.  r
aca0: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 61  eleaseMemArray(a
acb0: 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d 65  Mem, p->nChildMe
acc0: 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  m);.  sqlite3DbF
acd0: 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70 29  ree(p->v->db, p)
ace0: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
acf0: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
ad00: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69  ./*.** Give a li
ad10: 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f  sting of the pro
ad20: 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74  gram in the virt
ad30: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a  ual machine..**.
ad40: 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63 65  ** The interface
ad50: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
ad60: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
ad70: 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64 20  ).  But instead 
ad80: 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68  of.** running th
ad90: 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b  e code, it invok
ada0: 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  es the callback 
adb0: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e  once for each in
adc0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
add0: 69 73 20 66 65 61 74 75 72 65 20 69 73 20 75 73  is feature is us
ade0: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
adf0: 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a  "EXPLAIN"..**.**
ae00: 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e   When p->explain
ae10: 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72 75  ==1, each instru
ae20: 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e  ction is listed.
ae30: 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70    When.** p->exp
ae40: 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50  lain==2, only OP
ae50: 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63  _Explain instruc
ae60: 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65 64  tions are listed
ae70: 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61 72   and these.** ar
ae80: 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69 66  e shown in a dif
ae90: 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20  ferent format.  
aea0: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73  p->explain==2 is
aeb0: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
aec0: 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55  nt.** EXPLAIN QU
aed0: 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a 20  ERY PLAN..**.** 
aee0: 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  When p->explain=
aef0: 3d 31 2c 20 66 69 72 73 74 20 74 68 65 20 6d 61  =1, first the ma
af00: 69 6e 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 69  in program is li
af10: 73 74 65 64 2c 20 74 68 65 6e 20 65 61 63 68 20  sted, then each 
af20: 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69 67 67 65  of.** the trigge
af30: 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72  r subprograms ar
af40: 65 20 6c 69 73 74 65 64 20 6f 6e 65 20 62 79 20  e listed one by 
af50: 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  one..*/.int sqli
af60: 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56  te3VdbeList(.  V
af70: 64 62 65 20 2a 70 20 20 20 20 20 20 20 20 20 20  dbe *p          
af80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
af90: 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  VDBE */.){.  int
afa0: 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20   nRow;          
afb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afc0: 20 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20 72    /* Stop when r
afd0: 6f 77 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73  ow count reaches
afe0: 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e   this */.  int n
aff0: 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sub = 0;        
b000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b010: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62  /* Number of sub
b020: 2d 76 64 62 65 73 20 73 65 65 6e 20 73 6f 20 66  -vdbes seen so f
b030: 61 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72  ar */.  SubProgr
b040: 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b 20  am **apSub = 0; 
b050: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b060: 41 72 72 61 79 20 6f 66 20 73 75 62 2d 76 64 62  Array of sub-vdb
b070: 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 75  es */.  Mem *pSu
b080: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
b090: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b0a0: 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c 64  Memory cell hold
b0b0: 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f   array of subpro
b0c0: 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  gs */.  sqlite3 
b0d0: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20  *db = p->db;    
b0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b0f0: 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
b100: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
b110: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
b120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b130: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
b140: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  r */.  int rc = 
b150: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
b160: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
b170: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
b180: 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e  Mem *pMem = &p->
b190: 61 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20 20  aMem[1];        
b1a0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
b1b0: 6d 20 6f 66 20 72 65 73 75 6c 74 20 73 65 74 20  m of result set 
b1c0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  */..  assert( p-
b1d0: 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61 73  >explain );.  as
b1e0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
b1f0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29  VDBE_MAGIC_RUN )
b200: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ;.  assert( p->r
b210: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
b220: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  p->rc==SQLITE_BU
b230: 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  SY || p->rc==SQL
b240: 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20  ITE_NOMEM );..  
b250: 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74  /* Even though t
b260: 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20  his opcode does 
b270: 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63 20  not use dynamic 
b280: 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a  strings for.  **
b290: 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65 73   the result, res
b2a0: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20  ult columns may 
b2b0: 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69  become dynamic i
b2c0: 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73  f the user calls
b2d0: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f  .  ** sqlite3_co
b2e0: 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63  lumn_text16(), c
b2f0: 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61  ausing a transla
b300: 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65  tion to UTF-16 e
b310: 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  ncoding..  */.  
b320: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
b330: 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e 70  pMem, 8);.  p->p
b340: 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 0a  ResultSet = 0;..
b350: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
b360: 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
b370: 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73   /* This happens
b380: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69   if a malloc() i
b390: 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20  nside a call to 
b3a0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
b3b0: 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20  ext() or.    ** 
b3c0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
b3d0: 65 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20  ext16() failed. 
b3e0: 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c   */.    db->mall
b3f0: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
b400: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b410: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
b420: 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   When the number
b430: 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
b440: 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20 74 68  reaches nRow, th
b450: 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20 20 2a  at means the.  *
b460: 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20 66 69  * listing has fi
b470: 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c 69 74  nished and sqlit
b480: 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75 6c 64  e3_step() should
b490: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
b4a0: 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20 69  ONE..  ** nRow i
b4b0: 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
b4c0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
b4d0: 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  in the main prog
b4e0: 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20 74  ram, plus.  ** t
b4f0: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75  he sum of the nu
b500: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
b510: 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75 62 70  all trigger subp
b520: 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74 65  rograms encounte
b530: 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72 2e  red.  ** so far.
b540: 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75 65    The nRow value
b550: 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 61   will increase a
b560: 73 20 6e 65 77 20 74 72 69 67 67 65 72 20 73 75  s new trigger su
b570: 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a 20 20  bprograms are.  
b580: 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  ** encountered, 
b590: 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20 65  but p->pc will e
b5a0: 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63 68 20  ventually catch 
b5b0: 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a 2f  up to nRow..  */
b5c0: 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70  .  nRow = p->nOp
b5d0: 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61  ;.  if( p->expla
b5e0: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20  in==1 ){.    /* 
b5f0: 54 68 65 20 66 69 72 73 74 20 38 20 6d 65 6d 6f  The first 8 memo
b600: 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75 73 65  ry cells are use
b610: 64 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74  d for the result
b620: 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77 69 6c   set.  So we wil
b630: 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64  l.    ** command
b640: 65 65 72 20 74 68 65 20 39 74 68 20 63 65 6c 6c  eer the 9th cell
b650: 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f 72 61   to use as stora
b660: 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61 79 20  ge for an array 
b670: 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20 20 20  of pointers.    
b680: 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20 73 75  ** to trigger su
b690: 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68 65 20  bprograms.  The 
b6a0: 56 44 42 45 20 69 73 20 67 75 61 72 61 6e 74 65  VDBE is guarante
b6b0: 65 64 20 74 6f 20 68 61 76 65 20 61 74 20 6c 65  ed to have at le
b6c0: 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63 65 6c  ast 9.    ** cel
b6d0: 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  ls.  */.    asse
b6e0: 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29 3b  rt( p->nMem>9 );
b6f0: 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d 3e  .    pSub = &p->
b700: 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66 28  aMem[9];.    if(
b710: 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45 4d   pSub->flags&MEM
b720: 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 2f  _Blob ){.      /
b730: 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 63  * On the first c
b740: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73  all to sqlite3_s
b750: 74 65 70 28 29 2c 20 70 53 75 62 20 77 69 6c 6c  tep(), pSub will
b760: 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20 49   hold a NULL.  I
b770: 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e  t is.      ** in
b780: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 42  itialized to a B
b790: 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f 53 55  LOB by the P4_SU
b7a0: 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65 73 73  BPROGRAM process
b7b0: 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20  ing logic below 
b7c0: 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20 3d 20  */.      nSub = 
b7d0: 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56  pSub->n/sizeof(V
b7e0: 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70 53  dbe*);.      apS
b7f0: 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d  ub = (SubProgram
b800: 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20   **)pSub->z;.   
b810: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
b820: 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20 20  i<nSub; i++){.  
b830: 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53 75      nRow += apSu
b840: 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d  b[i]->nOp;.    }
b850: 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20  .  }..  do{.    
b860: 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d  i = p->pc++;.  }
b870: 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26 26  while( i<nRow &&
b880: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26   p->explain==2 &
b890: 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f  & p->aOp[i].opco
b8a0: 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29  de!=OP_Explain )
b8b0: 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20  ;.  if( i>=nRow 
b8c0: 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
b8d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63  QLITE_OK;.    rc
b8e0: 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
b8f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e    }else if( db->
b900: 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64  u1.isInterrupted
b910: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
b920: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
b930: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
b940: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c  E_ERROR;.    sql
b950: 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c  ite3VdbeError(p,
b960: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 70   sqlite3ErrStr(p
b970: 2d 3e 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  ->rc));.  }else{
b980: 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a  .    char *zP4;.
b990: 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20      Op *pOp;.   
b9a0: 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b   if( i<p->nOp ){
b9b0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 75  .      /* The ou
b9c0: 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72  tput line number
b9d0: 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
b9e0: 20 74 68 61 74 20 77 65 20 61 72 65 20 73 74 69   that we are sti
b9f0: 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ll in the.      
ba00: 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e  ** main program.
ba10: 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70 20 3d 20   */.      pOp = 
ba20: 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20  &p->aOp[i];.    
ba30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
ba40: 57 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  We are currently
ba50: 20 6c 69 73 74 69 6e 67 20 73 75 62 70 72 6f 67   listing subprog
ba60: 72 61 6d 73 2e 20 20 46 69 67 75 72 65 20 6f 75  rams.  Figure ou
ba70: 74 20 77 68 69 63 68 20 6f 6e 65 20 61 6e 64 0a  t which one and.
ba80: 20 20 20 20 20 20 2a 2a 20 70 69 63 6b 20 75 70        ** pick up
ba90: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
baa0: 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20   opcode. */.    
bab0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69    int j;.      i
bac0: 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20   -= p->nOp;.    
bad0: 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 70    for(j=0; i>=ap
bae0: 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b  Sub[j]->nOp; j++
baf0: 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2d 3d 20  ){.        i -= 
bb00: 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20  apSub[j]->nOp;. 
bb10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70       }.      pOp
bb20: 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f   = &apSub[j]->aO
bb30: 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  p[i];.    }.    
bb40: 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  if( p->explain==
bb50: 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  1 ){.      pMem-
bb60: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
bb70: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  ;.      pMem->u.
bb80: 69 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20  i = i;          
bb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bba0: 20 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d        /* Program
bbb0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
bbc0: 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20    pMem++;.  .   
bbd0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
bbe0: 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f   MEM_Static|MEM_
bbf0: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
bc00: 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63      pMem->z = (c
bc10: 68 61 72 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f  har*)sqlite3Opco
bc20: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
bc30: 64 65 29 3b 20 2f 2a 20 4f 70 63 6f 64 65 20 2a  de); /* Opcode *
bc40: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
bc50: 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20  pMem->z!=0 );.  
bc60: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71      pMem->n = sq
bc70: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d  lite3Strlen30(pM
bc80: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d  em->z);.      pM
bc90: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
bca0: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65  _UTF8;.      pMe
bcb0: 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  m++;..      /* W
bcc0: 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61  hen an OP_Progra
bcd0: 6d 20 6f 70 63 6f 64 65 20 69 73 20 65 6e 63 6f  m opcode is enco
bce0: 75 6e 74 65 72 20 28 74 68 65 20 6f 6e 6c 79 20  unter (the only 
bcf0: 6f 70 63 6f 64 65 20 74 68 61 74 20 68 61 73 0a  opcode that has.
bd00: 20 20 20 20 20 20 2a 2a 20 61 20 50 34 5f 53 55        ** a P4_SU
bd10: 42 50 52 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e  BPROGRAM argumen
bd20: 74 29 2c 20 65 78 70 61 6e 64 20 74 68 65 20 73  t), expand the s
bd30: 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  ize of the array
bd40: 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d 73 0a   of subprograms.
bd50: 20 20 20 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e        ** kept in
bd60: 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f   p->aMem[9].z to
bd70: 20 68 6f 6c 64 20 74 68 65 20 6e 65 77 20 70 72   hold the new pr
bd80: 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67  ogram - assuming
bd90: 20 74 68 69 73 20 73 75 62 70 72 6f 67 72 61 6d   this subprogram
bda0: 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f  .      ** has no
bdb0: 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  t already been s
bdc0: 65 65 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  een..      */.  
bdd0: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74      if( pOp->p4t
bde0: 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52  ype==P4_SUBPROGR
bdf0: 41 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  AM ){.        in
be00: 74 20 6e 42 79 74 65 20 3d 20 28 6e 53 75 62 2b  t nByte = (nSub+
be10: 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f  1)*sizeof(SubPro
be20: 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20  gram*);.        
be30: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66  int j;.        f
be40: 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20  or(j=0; j<nSub; 
be50: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
be60: 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f  if( apSub[j]==pO
be70: 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29  p->p4.pProgram )
be80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
be90: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d  }.        if( j=
bea0: 3d 6e 53 75 62 20 26 26 20 53 51 4c 49 54 45 5f  =nSub && SQLITE_
beb0: 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 4d  OK==sqlite3VdbeM
bec0: 65 6d 47 72 6f 77 28 70 53 75 62 2c 20 6e 42 79  emGrow(pSub, nBy
bed0: 74 65 2c 20 6e 53 75 62 21 3d 30 29 20 29 7b 0a  te, nSub!=0) ){.
bee0: 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62 20            apSub 
bef0: 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a  = (SubProgram **
bf00: 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 20 20  )pSub->z;.      
bf10: 20 20 20 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b      apSub[nSub++
bf20: 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f  ] = pOp->p4.pPro
bf30: 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  gram;.          
bf40: 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d  pSub->flags |= M
bf50: 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20  EM_Blob;.       
bf60: 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75     pSub->n = nSu
bf70: 62 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67  b*sizeof(SubProg
bf80: 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 7d  ram*);.        }
bf90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
bfa0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
bfb0: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
bfc0: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
bfd0: 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p1;             
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bff0: 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b  P1 */.    pMem++
c000: 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  ;..    pMem->fla
c010: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
c020: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
c030: 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20 20  p->p2;          
c040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c050: 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65  /* P2 */.    pMe
c060: 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e  m++;..    pMem->
c070: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
c080: 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  .    pMem->u.i =
c090: 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20 20   pOp->p3;       
c0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0b0: 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20     /* P3 */.    
c0c0: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28  pMem++;..    if(
c0d0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
c0e0: 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d  learAndResize(pM
c0f0: 65 6d 2c 20 31 30 30 29 20 29 7b 20 2f 2a 20 50  em, 100) ){ /* P
c100: 34 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  4 */.      asser
c110: 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  t( p->db->malloc
c120: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
c130: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
c140: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
c150: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
c160: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
c170: 20 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79     zP4 = display
c180: 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c  P4(pOp, pMem->z,
c190: 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 29   pMem->szMalloc)
c1a0: 3b 0a 20 20 20 20 69 66 28 20 7a 50 34 21 3d 70  ;.    if( zP4!=p
c1b0: 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20  Mem->z ){.      
c1c0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
c1d0: 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50 34 2c 20  tStr(pMem, zP4, 
c1e0: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
c1f0: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
c200: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
c210: 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20  em->z!=0 );.    
c220: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69    pMem->n = sqli
c230: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d  te3Strlen30(pMem
c240: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  ->z);.      pMem
c250: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
c260: 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  TF8;.    }.    p
c270: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20  Mem++;..    if( 
c280: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
c290: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
c2a0: 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e  e3VdbeMemClearAn
c2b0: 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 34 29  dResize(pMem, 4)
c2c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
c2d0: 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  rt( p->db->mallo
c2e0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
c2f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c300: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
c310: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
c320: 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  s = MEM_Str|MEM_
c330: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  Term;.      pMem
c340: 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20 73  ->n = 2;.      s
c350: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
c360: 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32  3, pMem->z, "%.2
c370: 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20  x", pOp->p5);   
c380: 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 70  /* P5 */.      p
c390: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
c3a0: 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d  E_UTF8;.      pM
c3b0: 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20  em++;.  .#ifdef 
c3c0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
c3d0: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20  PLAIN_COMMENTS. 
c3e0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
c3f0: 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52  VdbeMemClearAndR
c400: 65 73 69 7a 65 28 70 4d 65 6d 2c 20 35 30 30 29  esize(pMem, 500)
c410: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
c420: 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  rt( p->db->mallo
c430: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
c440: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c450: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
c460: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
c470: 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  s = MEM_Str|MEM_
c480: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  Term;.      pMem
c490: 2d 3e 6e 20 3d 20 64 69 73 70 6c 61 79 43 6f 6d  ->n = displayCom
c4a0: 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 70  ment(pOp, zP4, p
c4b0: 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20 20  Mem->z, 500);.  
c4c0: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
c4d0: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6c  SQLITE_UTF8;.#el
c4e0: 73 65 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  se.      pMem->f
c4f0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
c500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c510: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e         /* Commen
c520: 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20  t */.#endif.    
c530: 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f  }..    p->nResCo
c540: 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d  lumn = 8 - 4*(p-
c550: 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20  >explain-1);.   
c560: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
c570: 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20   &p->aMem[1];.  
c580: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
c590: 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  _OK;.    rc = SQ
c5a0: 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20  LITE_ROW;.  }.  
c5b0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
c5c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
c5d0: 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23  IT_EXPLAIN */..#
c5e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
c5f0: 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  UG./*.** Print t
c600: 68 65 20 53 51 4c 20 74 68 61 74 20 77 61 73 20  he SQL that was 
c610: 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65  used to generate
c620: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e   a VDBE program.
c630: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
c640: 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62  VdbePrintSql(Vdb
c650: 65 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63  e *p){.  const c
c660: 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 66  har *z = 0;.  if
c670: 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20  ( p->zSql ){.   
c680: 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c 3b 0a 20 20   z = p->zSql;.  
c690: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4f 70  }else if( p->nOp
c6a0: 3e 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  >=1 ){.    const
c6b0: 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26   VdbeOp *pOp = &
c6c0: 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 20 20 69  p->aOp[0];.    i
c6d0: 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
c6e0: 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e  OP_Init && pOp->
c6f0: 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20  p4.z!=0 ){.     
c700: 20 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a   z = pOp->p4.z;.
c710: 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c        while( sql
c720: 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a 29 20  ite3Isspace(*z) 
c730: 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ) z++;.    }.  }
c740: 0a 20 20 69 66 28 20 7a 20 29 20 70 72 69 6e 74  .  if( z ) print
c750: 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c  f("SQL: [%s]\n",
c760: 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23   z);.}.#endif..#
c770: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
c780: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26  TE_OMIT_TRACE) &
c790: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
c7a0: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29  _ENABLE_IOTRACE)
c7b0: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20  ./*.** Print an 
c7c0: 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67 65 20  IOTRACE message 
c7d0: 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74  showing SQL cont
c7e0: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
c7f0: 69 74 65 33 56 64 62 65 49 4f 54 72 61 63 65 53  ite3VdbeIOTraceS
c800: 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ql(Vdbe *p){.  i
c810: 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b  nt nOp = p->nOp;
c820: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
c830: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54    if( sqlite3IoT
c840: 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  race==0 ) return
c850: 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20  ;.  if( nOp<1 ) 
c860: 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20  return;.  pOp = 
c870: 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66  &p->aOp[0];.  if
c880: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
c890: 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70  P_Init && pOp->p
c8a0: 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  4.z!=0 ){.    in
c8b0: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72  t i, j;.    char
c8c0: 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71   z[1000];.    sq
c8d0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
c8e0: 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73  izeof(z), z, "%s
c8f0: 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20  ", pOp->p4.z);. 
c900: 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69     for(i=0; sqli
c910: 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29  te3Isspace(z[i])
c920: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72  ; i++){}.    for
c930: 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29  (j=0; z[i]; i++)
c940: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
c950: 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29  te3Isspace(z[i])
c960: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
c970: 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20  z[i-1]!=' ' ){. 
c980: 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20           z[j++] 
c990: 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d  = ' ';.        }
c9a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
c9b0: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a        z[j++] = z
c9c0: 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [i];.      }.   
c9d0: 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b   }.    z[j] = 0;
c9e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72  .    sqlite3IoTr
c9f0: 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20  ace("SQL %s\n", 
ca00: 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  z);.  }.}.#endif
ca10: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
ca20: 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49 54 45  _TRACE && SQLITE
ca30: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20  _ENABLE_IOTRACE 
ca40: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  */../*.** Alloca
ca50: 74 65 20 73 70 61 63 65 20 66 72 6f 6d 20 61 20  te space from a 
ca60: 66 69 78 65 64 20 73 69 7a 65 20 62 75 66 66 65  fixed size buffe
ca70: 72 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  r and return a p
ca80: 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61  ointer to.** tha
ca90: 74 20 73 70 61 63 65 2e 20 20 49 66 20 69 6e 73  t space.  If ins
caa0: 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
cab0: 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65  is available, re
cac0: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  turn NULL..**.**
cad0: 20 54 68 65 20 70 42 75 66 20 70 61 72 61 6d 65   The pBuf parame
cae0: 74 65 72 20 69 73 20 74 68 65 20 69 6e 69 74 69  ter is the initi
caf0: 61 6c 20 76 61 6c 75 65 20 6f 66 20 61 20 70 6f  al value of a po
cb00: 69 6e 74 65 72 20 77 68 69 63 68 20 77 69 6c 6c  inter which will
cb10: 0a 2a 2a 20 72 65 63 65 69 76 65 20 74 68 65 20  .** receive the 
cb20: 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 70 42 75  new memory.  pBu
cb30: 66 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 4e 55  f is normally NU
cb40: 4c 4c 2e 20 20 49 66 20 70 42 75 66 20 69 73 20  LL.  If pBuf is 
cb50: 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74 20  not.** NULL, it 
cb60: 6d 65 61 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72  means that memor
cb70: 79 20 73 70 61 63 65 20 68 61 73 20 61 6c 72 65  y space has alre
cb80: 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
cb90: 65 64 20 61 6e 64 20 74 68 61 74 0a 2a 2a 20 74  ed and that.** t
cba0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
cbb0: 6c 64 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20  ld not allocate 
cbc0: 61 6e 79 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20  any new memory. 
cbd0: 20 57 68 65 6e 20 70 42 75 66 20 69 73 20 6e 6f   When pBuf is no
cbe0: 74 0a 2a 2a 20 4e 55 4c 4c 20 73 69 6d 70 6c 79  t.** NULL simply
cbf0: 20 72 65 74 75 72 6e 20 70 42 75 66 2e 20 20 4f   return pBuf.  O
cc00: 6e 6c 79 20 61 6c 6c 6f 63 61 74 65 20 6e 65 77  nly allocate new
cc10: 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 77 68   memory space wh
cc20: 65 6e 20 70 42 75 66 0a 2a 2a 20 69 73 20 4e 55  en pBuf.** is NU
cc30: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65 20  LL..**.** nByte 
cc40: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
cc50: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
cc60: 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 70 46  needed..**.** pF
cc70: 72 6f 6d 20 70 6f 69 6e 74 73 20 74 6f 20 2a 70  rom points to *p
cc80: 6e 46 72 6f 6d 20 62 79 74 65 73 20 6f 66 20 61  nFrom bytes of a
cc90: 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65 2e 20  vailable space. 
cca0: 20 4e 65 77 20 73 70 61 63 65 20 69 73 20 61 6c   New space is al
ccb0: 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 72 6f 6d 20  located.** from 
ccc0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
ccd0: 46 72 6f 6d 20 62 75 66 66 65 72 20 61 6e 64 20  From buffer and 
cce0: 2a 70 6e 46 72 6f 6d 20 69 73 20 64 65 63 72 65  *pnFrom is decre
ccf0: 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70  mented..**.** *p
cd00: 6e 4e 65 65 64 65 64 20 69 73 20 61 20 63 6f 75  nNeeded is a cou
cd10: 6e 74 65 72 20 6f 66 20 74 68 65 20 6e 75 6d 62  nter of the numb
cd20: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
cd30: 70 61 63 65 20 74 68 61 74 20 68 61 76 65 20 66  pace that have f
cd40: 61 69 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c 6f  ailed.** to allo
cd50: 63 61 74 65 2e 20 20 49 66 20 74 68 65 72 65 20  cate.  If there 
cd60: 69 73 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20  is insufficient 
cd70: 73 70 61 63 65 20 69 6e 20 70 46 72 6f 6d 20 74  space in pFrom t
cd80: 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a  o satisfy the.**
cd90: 20 72 65 71 75 65 73 74 2c 20 74 68 65 6e 20 69   request, then i
cda0: 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 4e 65 65 64  ncrement *pnNeed
cdb0: 65 64 20 62 79 20 74 68 65 20 61 6d 6f 75 6e 74  ed by the amount
cdc0: 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 2e   of the request.
cdd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
cde0: 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20 76  *allocSpace(.  v
cdf0: 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
ce00: 20 20 20 20 2f 2a 20 57 68 65 72 65 20 72 65 74      /* Where ret
ce10: 75 72 6e 20 70 6f 69 6e 74 65 72 20 77 69 6c 6c  urn pointer will
ce20: 20 62 65 20 73 74 6f 72 65 64 20 2a 2f 0a 20 20   be stored */.  
ce30: 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20  int nByte,      
ce40: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ce50: 66 20 62 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  f bytes to alloc
ce60: 61 74 65 20 2a 2f 0a 20 20 75 38 20 2a 70 46 72  ate */.  u8 *pFr
ce70: 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  om,           /*
ce80: 20 4d 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c   Memory availabl
ce90: 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e  e for allocation
cea0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 46 72 6f   */.  int *pnFro
ceb0: 6d 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e  m,         /* IN
cec0: 2f 4f 55 54 3a 20 53 70 61 63 65 20 61 76 61 69  /OUT: Space avai
ced0: 6c 61 62 6c 65 20 61 74 20 70 46 72 6f 6d 20 2a  lable at pFrom *
cee0: 2f 0a 20 20 69 6e 74 20 2a 70 6e 4e 65 65 64 65  /.  int *pnNeede
cef0: 64 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61  d        /* If a
cf00: 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 6e 6f 74  llocation cannot
cf10: 20 62 65 20 6d 61 64 65 2c 20 69 6e 63 72 65 6d   be made, increm
cf20: 65 6e 74 20 2a 70 6e 42 79 74 65 20 2a 2f 0a 29  ent *pnByte */.)
cf30: 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  {.  assert( EIGH
cf40: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
cf50: 28 70 46 72 6f 6d 29 20 29 3b 0a 20 20 69 66 28  (pFrom) );.  if(
cf60: 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20   pBuf==0 ){.    
cf70: 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e  nByte = ROUND8(n
cf80: 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 6e  Byte);.    if( n
cf90: 42 79 74 65 20 3c 3d 20 2a 70 6e 46 72 6f 6d 20  Byte <= *pnFrom 
cfa0: 29 7b 0a 20 20 20 20 20 20 2a 70 6e 46 72 6f 6d  ){.      *pnFrom
cfb0: 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20   -= nByte;.     
cfc0: 20 70 42 75 66 20 3d 20 26 70 46 72 6f 6d 5b 2a   pBuf = &pFrom[*
cfd0: 70 6e 46 72 6f 6d 5d 3b 0a 20 20 20 20 7d 65 6c  pnFrom];.    }el
cfe0: 73 65 7b 0a 20 20 20 20 20 20 2a 70 6e 4e 65 65  se{.      *pnNee
cff0: 64 65 64 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20  ded += nByte;.  
d000: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
d010: 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
d020: 47 4e 4d 45 4e 54 28 70 42 75 66 29 20 29 3b 0a  GNMENT(pBuf) );.
d030: 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d    return pBuf;.}
d040: 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 74  ../*.** Rewind t
d050: 68 65 20 56 44 42 45 20 62 61 63 6b 20 74 6f 20  he VDBE back to 
d060: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 69 6e  the beginning in
d070: 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72   preparation for
d080: 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 74 2e 0a  .** running it..
d090: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
d0a0: 64 62 65 52 65 77 69 6e 64 28 56 64 62 65 20 2a  dbeRewind(Vdbe *
d0b0: 70 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  p){.#if defined(
d0c0: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c  SQLITE_DEBUG) ||
d0d0: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
d0e0: 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a  OFILE).  int i;.
d0f0: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
d100: 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   p!=0 );.  asser
d110: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
d120: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
d130: 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75  .  /* There shou
d140: 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  ld be at least o
d150: 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a  ne opcode..  */.
d160: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
d170: 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  >0 );..  /* Set 
d180: 74 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42  the magic to VDB
d190: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e  E_MAGIC_RUN soon
d1a0: 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c  er rather than l
d1b0: 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61  ater. */.  p->ma
d1c0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
d1d0: 5f 52 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51  _RUN;..#ifdef SQ
d1e0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72  LITE_DEBUG.  for
d1f0: 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b  (i=1; i<p->nMem;
d200: 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
d210: 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62  t( p->aMem[i].db
d220: 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23  ==p->db );.  }.#
d230: 65 6e 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20  endif.  p->pc = 
d240: 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  -1;.  p->rc = SQ
d250: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72  LITE_OK;.  p->er
d260: 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41  rorAction = OE_A
d270: 62 6f 72 74 3b 0a 20 20 70 2d 3e 6d 61 67 69 63  bort;.  p->magic
d280: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55   = VDBE_MAGIC_RU
d290: 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20  N;.  p->nChange 
d2a0: 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43  = 0;.  p->cacheC
d2b0: 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e  tr = 1;.  p->min
d2c0: 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20  WriteFileFormat 
d2d0: 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61  = 255;.  p->iSta
d2e0: 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d  tement = 0;.  p-
d2f0: 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d  >nFkConstraint =
d300: 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f   0;.#ifdef VDBE_
d310: 50 52 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69 3d  PROFILE.  for(i=
d320: 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
d330: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d  ){.    p->aOp[i]
d340: 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d  .cnt = 0;.    p-
d350: 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d  >aOp[i].cycles =
d360: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d   0;.  }.#endif.}
d370: 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20  ../*.** Prepare 
d380: 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  a virtual machin
d390: 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 20  e for execution 
d3a0: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 69  for the first ti
d3b0: 6d 65 20 61 66 74 65 72 0a 2a 2a 20 63 72 65 61  me after.** crea
d3c0: 74 69 6e 67 20 74 68 65 20 76 69 72 74 75 61 6c  ting the virtual
d3d0: 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 69 73 20   machine.  This 
d3e0: 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20  involves things 
d3f0: 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63  such.** as alloc
d400: 61 74 69 6e 67 20 72 65 67 69 73 74 65 72 73 20  ating registers 
d410: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  and initializing
d420: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75   the program cou
d430: 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74  nter..** After t
d440: 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20 70  he VDBE has be p
d450: 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62  repped, it can b
d460: 65 20 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e  e executed by on
d470: 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c  e or more.** cal
d480: 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ls to sqlite3Vdb
d490: 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a  eExec().  .**.**
d4a0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
d4b0: 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65 78 61  ay be called exa
d4c0: 63 74 6c 79 20 6f 6e 63 65 20 6f 6e 20 65 61 63  ctly once on eac
d4d0: 68 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  h virtual machin
d4e0: 65 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73  e..** After this
d4f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
d500: 65 64 20 74 68 65 20 56 4d 20 68 61 73 20 62 65  ed the VM has be
d510: 65 6e 20 22 70 61 63 6b 61 67 65 64 22 20 61 6e  en "packaged" an
d520: 64 20 69 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f  d is ready.** to
d530: 20 72 75 6e 2e 20 20 41 66 74 65 72 20 74 68 69   run.  After thi
d540: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
d550: 6c 65 64 2c 20 66 75 72 74 68 65 72 20 63 61 6c  led, further cal
d560: 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65  ls to .** sqlite
d570: 33 56 64 62 65 41 64 64 4f 70 28 29 20 66 75 6e  3VdbeAddOp() fun
d580: 63 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 68 69  ctions are prohi
d590: 62 69 74 65 64 2e 20 20 54 68 69 73 20 72 6f 75  bited.  This rou
d5a0: 74 69 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74 73  tine disconnects
d5b0: 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 66 72 6f  .** the Vdbe fro
d5c0: 6d 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  m the Parse obje
d5d0: 63 74 20 74 68 61 74 20 68 65 6c 70 65 64 20 67  ct that helped g
d5e0: 65 6e 65 72 61 74 65 20 69 74 20 73 6f 20 74 68  enerate it so th
d5f0: 61 74 20 74 68 65 0a 2a 2a 20 74 68 65 20 56 64  at the.** the Vd
d600: 62 65 20 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e  be becomes an in
d610: 64 65 70 65 6e 64 65 6e 74 20 65 6e 74 69 74 79  dependent entity
d620: 20 61 6e 64 20 74 68 65 20 50 61 72 73 65 20 6f   and the Parse o
d630: 62 6a 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20  bject can be.** 
d640: 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a  destroyed..**.**
d650: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
d660: 56 64 62 65 52 65 77 69 6e 64 28 29 20 70 72 6f  VdbeRewind() pro
d670: 63 65 64 75 72 65 20 74 6f 20 72 65 73 74 6f 72  cedure to restor
d680: 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68  e a virtual mach
d690: 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69  ine back.** to i
d6a0: 74 73 20 69 6e 69 74 69 61 6c 20 73 74 61 74 65  ts initial state
d6b0: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 62 65   after it has be
d6c0: 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  en run..*/.void 
d6d0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
d6e0: 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c  eady(.  Vdbe *p,
d6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d700: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
d710: 42 45 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  BE */.  Parse *p
d720: 50 61 72 73 65 20 20 20 20 20 20 20 20 20 20 20  Parse           
d730: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
d740: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a  g context */.){.
d750: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
d760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d770: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
d780: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
d790: 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20   int nVar;      
d7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72  /* Number of par
d7c0: 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ameters */.  int
d7d0: 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20   nMem;          
d7e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
d7f0: 75 6d 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f  umber of VM memo
d800: 72 79 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  ry registers */.
d810: 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20    int nCursor;  
d820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d830: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75   /* Number of cu
d840: 72 73 6f 72 73 20 72 65 71 75 69 72 65 64 20 2a  rsors required *
d850: 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20  /.  int nArg;   
d860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d870: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
d880: 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 73 75 62  arguments in sub
d890: 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e  programs */.  in
d8a0: 74 20 6e 4f 6e 63 65 3b 20 20 20 20 20 20 20 20  t nOnce;        
d8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d8c0: 4e 75 6d 62 65 72 20 6f 66 20 4f 50 5f 4f 6e 63  Number of OP_Onc
d8d0: 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a  e instructions *
d8e0: 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
d8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d900: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
d910: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65  er */.  int nFre
d920: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
d930: 20 20 20 20 20 20 20 2f 2a 20 41 76 61 69 6c 61         /* Availa
d940: 62 6c 65 20 66 72 65 65 20 73 70 61 63 65 20 2a  ble free space *
d950: 2f 0a 20 20 75 38 20 2a 7a 43 73 72 3b 20 20 20  /.  u8 *zCsr;   
d960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d970: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61     /* Memory ava
d980: 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63  ilable for alloc
d990: 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  ation */.  int n
d9a0: 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
d9b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77            /* How
d9c0: 20 6d 75 63 68 20 65 78 74 72 61 20 6d 65 6d 6f   much extra memo
d9d0: 72 79 20 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a  ry is needed */.
d9e0: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
d9f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
da00: 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  nOp>0 );.  asser
da10: 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a  t( pParse!=0 );.
da20: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
da30: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
da40: 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NIT );.  assert(
da50: 20 70 50 61 72 73 65 3d 3d 70 2d 3e 70 50 61 72   pParse==p->pPar
da60: 73 65 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  se );.  db = p->
da70: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  db;.  assert( db
da80: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
da90: 30 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50  0 );.  nVar = pP
daa0: 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d  arse->nVar;.  nM
dab0: 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
dac0: 6d 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20 70  m;.  nCursor = p
dad0: 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e  Parse->nTab;.  n
dae0: 41 72 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Arg = pParse->nM
daf0: 61 78 41 72 67 3b 0a 20 20 6e 4f 6e 63 65 20 3d  axArg;.  nOnce =
db00: 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 3b 0a   pParse->nOnce;.
db10: 20 20 69 66 28 20 6e 4f 6e 63 65 3d 3d 30 20 29    if( nOnce==0 )
db20: 20 6e 4f 6e 63 65 20 3d 20 31 3b 20 2f 2a 20 45   nOnce = 1; /* E
db30: 6e 73 75 72 65 20 61 74 20 6c 65 61 73 74 20 6f  nsure at least o
db40: 6e 65 20 62 79 74 65 20 69 6e 20 70 2d 3e 61 4f  ne byte in p->aO
db50: 6e 63 65 46 6c 61 67 5b 5d 20 2a 2f 0a 20 20 0a  nceFlag[] */.  .
db60: 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 63 75    /* For each cu
db70: 72 73 6f 72 20 72 65 71 75 69 72 65 64 2c 20 61  rsor required, a
db80: 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d  lso allocate a m
db90: 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f  emory cell. Memo
dba0: 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e  ry.  ** cells (n
dbb0: 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e  Mem+1-nCursor)..
dbc0: 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c  nMem, inclusive,
dbd0: 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75   will never be u
dbe0: 73 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20  sed by.  ** the 
dbf0: 76 64 62 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e  vdbe program. In
dc00: 73 74 65 61 64 20 74 68 65 79 20 61 72 65 20 75  stead they are u
dc10: 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  sed to allocate 
dc20: 73 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 56  space for.  ** V
dc30: 64 62 65 43 75 72 73 6f 72 2f 42 74 43 75 72 73  dbeCursor/BtCurs
dc40: 6f 72 20 73 74 72 75 63 74 75 72 65 73 2e 20 54  or structures. T
dc50: 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72  he blob of memor
dc60: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
dc70: 68 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 30  h .  ** cursor 0
dc80: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65   is stored in me
dc90: 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20  mory cell nMem. 
dca0: 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65  Memory cell (nMe
dcb0: 6d 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73  m-1).  ** stores
dcc0: 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d   the blob of mem
dcd0: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
dce0: 69 74 68 20 63 75 72 73 6f 72 20 31 2c 20 65 74  ith cursor 1, et
dcf0: 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65  c..  **.  ** See
dd00: 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43   also: allocateC
dd10: 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  ursor()..  */.  
dd20: 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b  nMem += nCursor;
dd30: 0a 0a 20 20 2f 2a 20 7a 43 73 72 20 77 69 6c 6c  ..  /* zCsr will
dd40: 20 69 6e 69 74 69 61 6c 6c 79 20 70 6f 69 6e 74   initially point
dd50: 20 74 6f 20 6e 46 72 65 65 20 62 79 74 65 73 20   to nFree bytes 
dd60: 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20  of unused space 
dd70: 61 74 20 74 68 65 0a 20 20 2a 2a 20 65 6e 64 20  at the.  ** end 
dd80: 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72  of the opcode ar
dd90: 72 61 79 2c 20 70 2d 3e 61 4f 70 2e 20 20 54 68  ray, p->aOp.  Th
dda0: 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 6f 66  e computation of
ddb0: 20 6e 46 72 65 65 20 69 73 0a 20 20 2a 2a 20 63   nFree is.  ** c
ddc0: 6f 6e 73 65 72 76 61 74 69 76 65 20 2d 20 69 74  onservative - it
ddd0: 20 6d 69 67 68 74 20 62 65 20 73 6d 61 6c 6c 65   might be smalle
dde0: 72 20 74 68 61 6e 20 74 68 65 20 74 72 75 65 20  r than the true 
ddf0: 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 0a 20  number of free. 
de00: 20 2a 2a 20 62 79 74 65 73 2c 20 62 75 74 20 6e   ** bytes, but n
de10: 65 76 65 72 20 6c 61 72 67 65 72 2e 20 20 6e 46  ever larger.  nF
de20: 72 65 65 20 6d 75 73 74 20 62 65 20 61 20 6d 75  ree must be a mu
de30: 6c 74 69 70 6c 65 20 6f 66 20 38 20 2d 20 69 74  ltiple of 8 - it
de40: 20 69 73 0a 20 20 2a 2a 20 72 6f 75 6e 64 65 64   is.  ** rounded
de50: 20 64 6f 77 6e 20 69 66 20 69 73 20 6e 6f 74 2e   down if is not.
de60: 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 52 4f 55 4e  .  */.  n = ROUN
de70: 44 38 28 73 69 7a 65 6f 66 28 4f 70 29 2a 70 2d  D8(sizeof(Op)*p-
de80: 3e 6e 4f 70 29 3b 20 20 20 20 20 20 20 20 20 20  >nOp);          
de90: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
dea0: 6f 70 63 6f 64 65 20 73 70 61 63 65 20 75 73 65  opcode space use
deb0: 64 20 2a 2f 0a 20 20 7a 43 73 72 20 3d 20 26 28  d */.  zCsr = &(
dec0: 28 75 38 2a 29 70 2d 3e 61 4f 70 29 5b 6e 5d 3b  (u8*)p->aOp)[n];
ded0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dee0: 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 6f 70 63     /* Unused opc
def0: 6f 64 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 61  ode space */.  a
df00: 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
df10: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 7a 43 73 72  E_ALIGNMENT(zCsr
df20: 29 20 29 3b 0a 20 20 6e 46 72 65 65 20 3d 20 52  ) );.  nFree = R
df30: 4f 55 4e 44 44 4f 57 4e 38 28 70 50 61 72 73 65  OUNDDOWN8(pParse
df40: 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 20 2d 20 6e 29  ->szOpAlloc - n)
df50: 3b 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 75  ;  /* Bytes of u
df60: 6e 75 73 65 64 20 73 70 61 63 65 20 2a 2f 0a 20  nused space */. 
df70: 20 61 73 73 65 72 74 28 20 6e 46 72 65 65 3e 3d   assert( nFree>=
df80: 30 20 29 3b 0a 20 20 69 66 28 20 6e 46 72 65 65  0 );.  if( nFree
df90: 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  >0 ){.    memset
dfa0: 28 7a 43 73 72 2c 20 30 2c 20 6e 46 72 65 65 29  (zCsr, 0, nFree)
dfb0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 45 49  ;.    assert( EI
dfc0: 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
dfd0: 4e 54 28 26 7a 43 73 72 5b 6e 46 72 65 65 5d 29  NT(&zCsr[nFree])
dfe0: 20 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 73 6f 6c   );.  }..  resol
dff0: 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e  veP2Values(p, &n
e000: 41 72 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53  Arg);.  p->usesS
e010: 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38  tmtJournal = (u8
e020: 29 28 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74  )(pParse->isMult
e030: 69 57 72 69 74 65 20 26 26 20 70 50 61 72 73 65  iWrite && pParse
e040: 2d 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20 69  ->mayAbort);.  i
e050: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
e060: 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b  in && nMem<10 ){
e070: 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a  .    nMem = 10;.
e080: 20 20 7d 0a 20 20 70 2d 3e 65 78 70 69 72 65 64    }.  p->expired
e090: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f   = 0;..  /* Memo
e0a0: 72 79 20 66 6f 72 20 72 65 67 69 73 74 65 72 73  ry for registers
e0b0: 2c 20 70 61 72 61 6d 65 74 65 72 73 2c 20 63 75  , parameters, cu
e0c0: 72 73 6f 72 2c 20 65 74 63 2c 20 69 73 20 61 6c  rsor, etc, is al
e0d0: 6c 6f 63 61 74 65 64 20 69 6e 20 74 77 6f 0a 20  located in two. 
e0e0: 20 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f 6e 20   ** passes.  On 
e0f0: 74 68 65 20 66 69 72 73 74 20 70 61 73 73 2c 20  the first pass, 
e100: 77 65 20 74 72 79 20 74 6f 20 72 65 75 73 65 20  we try to reuse 
e110: 75 6e 75 73 65 64 20 73 70 61 63 65 20 61 74 20  unused space at 
e120: 74 68 65 20 0a 20 20 2a 2a 20 65 6e 64 20 6f 66  the .  ** end of
e130: 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61   the opcode arra
e140: 79 2e 20 20 49 66 20 77 65 20 61 72 65 20 75 6e  y.  If we are un
e150: 61 62 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20  able to satisfy 
e160: 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20  all memory.  ** 
e170: 72 65 71 75 69 72 65 6d 65 6e 74 73 20 62 79 20  requirements by 
e180: 72 65 75 73 69 6e 67 20 74 68 65 20 6f 70 63 6f  reusing the opco
e190: 64 65 20 61 72 72 61 79 20 74 61 69 6c 2c 20 74  de array tail, t
e1a0: 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 20  hen the second. 
e1b0: 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20 66 69   ** pass will fi
e1c0: 6c 6c 20 69 6e 20 74 68 65 20 72 65 73 74 20 75  ll in the rest u
e1d0: 73 69 6e 67 20 61 20 66 72 65 73 68 20 61 6c 6c  sing a fresh all
e1e0: 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a  ocation.  .  **.
e1f0: 20 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70 61    ** This two-pa
e200: 73 73 20 61 70 70 72 6f 61 63 68 20 74 68 61 74  ss approach that
e210: 20 72 65 75 73 65 73 20 61 73 20 6d 75 63 68 20   reuses as much 
e220: 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62  memory as possib
e230: 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65  le from.  ** the
e240: 20 6c 65 66 74 6f 76 65 72 20 73 70 61 63 65 20   leftover space 
e250: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
e260: 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20 63  e opcode array c
e270: 61 6e 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79  an significantly
e280: 0a 20 20 2a 2a 20 72 65 64 75 63 65 20 74 68 65  .  ** reduce the
e290: 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72   amount of memor
e2a0: 79 20 68 65 6c 64 20 62 79 20 61 20 70 72 65 70  y held by a prep
e2b0: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
e2c0: 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20 20 20    */.  do {.    
e2d0: 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 70  nByte = 0;.    p
e2e0: 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70  ->aMem = allocSp
e2f0: 61 63 65 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65  ace(p->aMem, nMe
e300: 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 7a  m*sizeof(Mem), z
e310: 43 73 72 2c 20 26 6e 46 72 65 65 2c 20 26 6e 42  Csr, &nFree, &nB
e320: 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 56 61  yte);.    p->aVa
e330: 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  r = allocSpace(p
e340: 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a  ->aVar, nVar*siz
e350: 65 6f 66 28 4d 65 6d 29 2c 20 7a 43 73 72 2c 20  eof(Mem), zCsr, 
e360: 26 6e 46 72 65 65 2c 20 26 6e 42 79 74 65 29 3b  &nFree, &nByte);
e370: 0a 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d 20  .    p->apArg = 
e380: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70  allocSpace(p->ap
e390: 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66  Arg, nArg*sizeof
e3a0: 28 4d 65 6d 2a 29 2c 20 7a 43 73 72 2c 20 26 6e  (Mem*), zCsr, &n
e3b0: 46 72 65 65 2c 20 26 6e 42 79 74 65 29 3b 0a 20  Free, &nByte);. 
e3c0: 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c     p->apCsr = al
e3d0: 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70 43 73  locSpace(p->apCs
e3e0: 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f  r, nCursor*sizeo
e3f0: 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29 2c 0a  f(VdbeCursor*),.
e400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e410: 20 20 20 20 20 20 20 20 20 20 7a 43 73 72 2c 20            zCsr, 
e420: 26 6e 46 72 65 65 2c 20 26 6e 42 79 74 65 29 3b  &nFree, &nByte);
e430: 0a 20 20 20 20 70 2d 3e 61 4f 6e 63 65 46 6c 61  .    p->aOnceFla
e440: 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  g = allocSpace(p
e450: 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 6e 4f 6e  ->aOnceFlag, nOn
e460: 63 65 2c 20 7a 43 73 72 2c 20 26 6e 46 72 65 65  ce, zCsr, &nFree
e470: 2c 20 26 6e 42 79 74 65 29 3b 0a 23 69 66 64 65  , &nByte);.#ifde
e480: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
e490: 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
e4a0: 20 20 20 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20      p->anExec = 
e4b0: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 6e  allocSpace(p->an
e4c0: 45 78 65 63 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a  Exec, p->nOp*siz
e4d0: 65 6f 66 28 69 36 34 29 2c 20 7a 43 73 72 2c 20  eof(i64), zCsr, 
e4e0: 26 6e 46 72 65 65 2c 20 26 6e 42 79 74 65 29 3b  &nFree, &nByte);
e4f0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
e500: 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 70  nByte ){.      p
e510: 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65  ->pFree = sqlite
e520: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
e530: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a  , nByte);.    }.
e540: 20 20 20 20 7a 43 73 72 20 3d 20 70 2d 3e 70 46      zCsr = p->pF
e550: 72 65 65 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d  ree;.    nFree =
e560: 20 6e 42 79 74 65 3b 0a 20 20 7d 77 68 69 6c 65   nByte;.  }while
e570: 28 20 6e 42 79 74 65 20 26 26 20 21 64 62 2d 3e  ( nByte && !db->
e580: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
e590: 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20  .  p->nCursor = 
e5a0: 6e 43 75 72 73 6f 72 3b 0a 20 20 70 2d 3e 6e 4f  nCursor;.  p->nO
e5b0: 6e 63 65 46 6c 61 67 20 3d 20 6e 4f 6e 63 65 3b  nceFlag = nOnce;
e5c0: 0a 20 20 69 66 28 20 70 2d 3e 61 56 61 72 20 29  .  if( p->aVar )
e5d0: 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20  {.    p->nVar = 
e5e0: 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20 20  (ynVar)nVar;.   
e5f0: 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72   for(n=0; n<nVar
e600: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d  ; n++){.      p-
e610: 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d  >aVar[n].flags =
e620: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20   MEM_Null;.     
e630: 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d   p->aVar[n].db =
e640: 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   db;.    }.  }. 
e650: 20 70 2d 3e 6e 7a 56 61 72 20 3d 20 70 50 61 72   p->nzVar = pPar
e660: 73 65 2d 3e 6e 7a 56 61 72 3b 0a 20 20 70 2d 3e  se->nzVar;.  p->
e670: 61 7a 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e  azVar = pParse->
e680: 61 7a 56 61 72 3b 0a 20 20 70 50 61 72 73 65 2d  azVar;.  pParse-
e690: 3e 6e 7a 56 61 72 20 3d 20 20 30 3b 0a 20 20 70  >nzVar =  0;.  p
e6a0: 50 61 72 73 65 2d 3e 61 7a 56 61 72 20 3d 20 30  Parse->azVar = 0
e6b0: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20  ;.  if( p->aMem 
e6c0: 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d  ){.    p->aMem--
e6d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e6e0: 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d         /* aMem[]
e6f0: 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d   goes from 1..nM
e700: 65 6d 20 2a 2f 0a 20 20 20 20 70 2d 3e 6e 4d 65  em */.    p->nMe
e710: 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20  m = nMem;       
e720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20            /*    
e730: 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e     not from 0..n
e740: 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 66 6f 72  Mem-1 */.    for
e750: 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e  (n=1; n<=nMem; n
e760: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d  ++){.      p->aM
e770: 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45  em[n].flags = ME
e780: 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20  M_Undefined;.   
e790: 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62     p->aMem[n].db
e7a0: 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d   = db;.    }.  }
e7b0: 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20  .  p->explain = 
e7c0: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b  pParse->explain;
e7d0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
e7e0: 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  wind(p);.}../*.*
e7f0: 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63  * Close a VDBE c
e800: 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73  ursor and releas
e810: 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72  e all the resour
e820: 63 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20  ces that cursor 
e830: 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68  .** happens to h
e840: 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  old..*/.void sql
e850: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
e860: 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65  or(Vdbe *p, Vdbe
e870: 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20  Cursor *pCx){.  
e880: 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20  if( pCx==0 ){.  
e890: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
e8a0: 61 73 73 65 72 74 28 20 70 43 78 2d 3e 70 42 74  assert( pCx->pBt
e8b0: 3d 3d 30 20 7c 7c 20 70 43 78 2d 3e 65 43 75 72  ==0 || pCx->eCur
e8c0: 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
e8d0: 52 45 45 20 29 3b 0a 20 20 73 77 69 74 63 68 28  REE );.  switch(
e8e0: 20 70 43 78 2d 3e 65 43 75 72 54 79 70 65 20 29   pCx->eCurType )
e8f0: 7b 0a 20 20 20 20 63 61 73 65 20 43 55 52 54 59  {.    case CURTY
e900: 50 45 5f 53 4f 52 54 45 52 3a 20 7b 0a 20 20 20  PE_SORTER: {.   
e910: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f     sqlite3VdbeSo
e920: 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c  rterClose(p->db,
e930: 20 70 43 78 29 3b 0a 20 20 20 20 20 20 62 72 65   pCx);.      bre
e940: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
e950: 73 65 20 43 55 52 54 59 50 45 5f 42 54 52 45 45  se CURTYPE_BTREE
e960: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43  : {.      if( pC
e970: 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  x->pBt ){.      
e980: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
e990: 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20  ose(pCx->pBt);. 
e9a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 43         /* The pC
e9b0: 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c 20  x->pCursor will 
e9c0: 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74  be close automat
e9d0: 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65 78  ically, if it ex
e9e0: 69 73 74 73 2c 20 62 79 0a 20 20 20 20 20 20 20  ists, by.       
e9f0: 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f   ** the call abo
ea00: 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  ve. */.      }el
ea10: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
ea20: 72 74 28 20 70 43 78 2d 3e 75 63 2e 70 43 75 72  rt( pCx->uc.pCur
ea30: 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  sor!=0 );.      
ea40: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
ea50: 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 75  oseCursor(pCx->u
ea60: 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  c.pCursor);.    
ea70: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
ea80: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
ea90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
eaa0: 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65  ALTABLE.    case
eab0: 20 43 55 52 54 59 50 45 5f 56 54 41 42 3a 20 7b   CURTYPE_VTAB: {
eac0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
ead0: 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 43 75  tab_cursor *pVCu
eae0: 72 20 3d 20 70 43 78 2d 3e 75 63 2e 70 56 43 75  r = pCx->uc.pVCu
eaf0: 72 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 73  r;.      const s
eb00: 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70  qlite3_module *p
eb10: 4d 6f 64 75 6c 65 20 3d 20 70 56 43 75 72 2d 3e  Module = pVCur->
eb20: 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a  pVtab->pModule;.
eb30: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 56        assert( pV
eb40: 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66  Cur->pVtab->nRef
eb50: 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 56 43 75  >0 );.      pVCu
eb60: 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 2d 2d  r->pVtab->nRef--
eb70: 3b 0a 20 20 20 20 20 20 70 4d 6f 64 75 6c 65 2d  ;.      pModule-
eb80: 3e 78 43 6c 6f 73 65 28 70 56 43 75 72 29 3b 0a  >xClose(pVCur);.
eb90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
eba0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a   }.#endif.  }.}.
ebb0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
ebc0: 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20   cursors in the 
ebd0: 63 75 72 72 65 6e 74 20 66 72 61 6d 65 2e 0a 2a  current frame..*
ebe0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
ebf0: 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d  oseCursorsInFram
ec00: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66  e(Vdbe *p){.  if
ec10: 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20  ( p->apCsr ){.  
ec20: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
ec30: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73  (i=0; i<p->nCurs
ec40: 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  or; i++){.      
ec50: 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 20 3d  VdbeCursor *pC =
ec60: 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20   p->apCsr[i];.  
ec70: 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a 20 20      if( pC ){.  
ec80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ec90: 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70  eFreeCursor(p, p
eca0: 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  C);.        p->a
ecb0: 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pCsr[i] = 0;.   
ecc0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
ecd0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65  ../*.** Copy the
ece0: 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69   values stored i
ecf0: 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d 65 20  n the VdbeFrame 
ed00: 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73  structure to its
ed10: 20 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69   Vdbe. This.** i
ed20: 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d  s used, for exam
ed30: 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 72 69 67  ple, when a trig
ed40: 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20  ger sub-program 
ed50: 69 73 20 68 61 6c 74 65 64 20 74 6f 20 72 65 73  is halted to res
ed60: 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20  tore.** control 
ed70: 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  to the main prog
ed80: 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ram..*/.int sqli
ed90: 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74  te3VdbeFrameRest
eda0: 6f 72 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70  ore(VdbeFrame *p
edb0: 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a  Frame){.  Vdbe *
edc0: 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20  v = pFrame->v;. 
edd0: 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46   closeCursorsInF
ede0: 72 61 6d 65 28 76 29 3b 0a 23 69 66 64 65 66 20  rame(v);.#ifdef 
edf0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
ee00: 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20  MT_SCANSTATUS.  
ee10: 76 2d 3e 61 6e 45 78 65 63 20 3d 20 70 46 72 61  v->anExec = pFra
ee20: 6d 65 2d 3e 61 6e 45 78 65 63 3b 0a 23 65 6e 64  me->anExec;.#end
ee30: 69 66 0a 20 20 76 2d 3e 61 4f 6e 63 65 46 6c 61  if.  v->aOnceFla
ee40: 67 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 6e 63  g = pFrame->aOnc
ee50: 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 6e 4f 6e 63  eFlag;.  v->nOnc
ee60: 65 46 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e  eFlag = pFrame->
ee70: 6e 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e  nOnceFlag;.  v->
ee80: 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f  aOp = pFrame->aO
ee90: 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46  p;.  v->nOp = pF
eea0: 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e  rame->nOp;.  v->
eeb0: 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61  aMem = pFrame->a
eec0: 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d  Mem;.  v->nMem =
eed0: 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20   pFrame->nMem;. 
eee0: 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61   v->apCsr = pFra
eef0: 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e  me->apCsr;.  v->
ef00: 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65  nCursor = pFrame
ef10: 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e  ->nCursor;.  v->
ef20: 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20  db->lastRowid = 
ef30: 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69  pFrame->lastRowi
ef40: 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20  d;.  v->nChange 
ef50: 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67  = pFrame->nChang
ef60: 65 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6e 43 68 61  e;.  v->db->nCha
ef70: 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 44  nge = pFrame->nD
ef80: 62 43 68 61 6e 67 65 3b 0a 20 20 72 65 74 75 72  bChange;.  retur
ef90: 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a  n pFrame->pc;.}.
efa0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
efb0: 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20   cursors..**.** 
efc0: 41 6c 73 6f 20 72 65 6c 65 61 73 65 20 61 6e 79  Also release any
efd0: 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20   dynamic memory 
efe0: 68 65 6c 64 20 62 79 20 74 68 65 20 56 4d 20 69  held by the VM i
eff0: 6e 20 74 68 65 20 56 64 62 65 2e 61 4d 65 6d 20  n the Vdbe.aMem 
f000: 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20  memory .** cell 
f010: 61 72 72 61 79 2e 20 54 68 69 73 20 69 73 20 6e  array. This is n
f020: 65 63 65 73 73 61 72 79 20 61 73 20 74 68 65 20  ecessary as the 
f030: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 61  memory cell arra
f040: 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a  y may contain.**
f050: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 62   pointers to Vdb
f060: 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20  eFrame objects, 
f070: 77 68 69 63 68 20 6d 61 79 20 69 6e 20 74 75 72  which may in tur
f080: 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65  n contain pointe
f090: 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75  rs to.** open cu
f0a0: 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  rsors..*/.static
f0b0: 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75   void closeAllCu
f0c0: 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a  rsors(Vdbe *p){.
f0d0: 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20    if( p->pFrame 
f0e0: 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65  ){.    VdbeFrame
f0f0: 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f   *pFrame;.    fo
f100: 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61  r(pFrame=p->pFra
f110: 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72  me; pFrame->pPar
f120: 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61  ent; pFrame=pFra
f130: 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20  me->pParent);.  
f140: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61    sqlite3VdbeFra
f150: 6d 65 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65  meRestore(pFrame
f160: 29 3b 0a 20 20 20 20 70 2d 3e 70 46 72 61 6d 65  );.    p->pFrame
f170: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 46 72   = 0;.    p->nFr
f180: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  ame = 0;.  }.  a
f190: 73 73 65 72 74 28 20 70 2d 3e 6e 46 72 61 6d 65  ssert( p->nFrame
f1a0: 3d 3d 30 20 29 3b 0a 20 20 63 6c 6f 73 65 43 75  ==0 );.  closeCu
f1b0: 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 70 29 3b  rsorsInFrame(p);
f1c0: 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29  .  if( p->aMem )
f1d0: 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d  {.    releaseMem
f1e0: 41 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31  Array(&p->aMem[1
f1f0: 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d  ], p->nMem);.  }
f200: 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65  .  while( p->pDe
f210: 6c 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64  lFrame ){.    Vd
f220: 62 65 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20  beFrame *pDel = 
f230: 70 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20  p->pDelFrame;.  
f240: 20 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d    p->pDelFrame =
f250: 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a   pDel->pParent;.
f260: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
f270: 72 61 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29  rameDelete(pDel)
f280: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65  ;.  }..  /* Dele
f290: 74 65 20 61 6e 79 20 61 75 78 64 61 74 61 20 61  te any auxdata a
f2a0: 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20  llocations made 
f2b0: 62 79 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20 69  by the VM */.  i
f2c0: 66 28 20 70 2d 3e 70 41 75 78 44 61 74 61 20 29  f( p->pAuxData )
f2d0: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
f2e0: 74 65 41 75 78 44 61 74 61 28 70 2c 20 2d 31 2c  teAuxData(p, -1,
f2f0: 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70   0);.  assert( p
f300: 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30 20 29 3b  ->pAuxData==0 );
f310: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  .}../*.** Clean 
f320: 75 70 20 74 68 65 20 56 4d 20 61 66 74 65 72 20  up the VM after 
f330: 61 20 73 69 6e 67 6c 65 20 72 75 6e 2e 0a 2a 2f  a single run..*/
f340: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65  .static void Cle
f350: 61 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20  anup(Vdbe *p){. 
f360: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
f370: 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66 20 53 51  ->db;..#ifdef SQ
f380: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
f390: 45 78 65 63 75 74 65 20 61 73 73 65 72 74 28 29  Execute assert()
f3a0: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65   statements to e
f3b0: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 56  nsure that the V
f3c0: 64 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20  dbe.apCsr[] and 
f3d0: 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b  .  ** Vdbe.aMem[
f3e0: 5d 20 61 72 72 61 79 73 20 68 61 76 65 20 61 6c  ] arrays have al
f3f0: 72 65 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e  ready been clean
f400: 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74  ed up.  */.  int
f410: 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43   i;.  if( p->apC
f420: 73 72 20 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c  sr ) for(i=0; i<
f430: 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29  p->nCursor; i++)
f440: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73   assert( p->apCs
f450: 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28  r[i]==0 );.  if(
f460: 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20   p->aMem ){.    
f470: 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e  for(i=1; i<=p->n
f480: 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72 74  Mem; i++) assert
f490: 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61  ( p->aMem[i].fla
f4a0: 67 73 3d 3d 4d 45 4d 5f 55 6e 64 65 66 69 6e 65  gs==MEM_Undefine
f4b0: 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  d );.  }.#endif.
f4c0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
f4d0: 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
f4e0: 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d  ;.  p->zErrMsg =
f4f0: 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74   0;.  p->pResult
f500: 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Set = 0;.}../*.*
f510: 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72  * Set the number
f520: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
f530: 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ns that will be 
f540: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
f550: 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   SQL.** statemen
f560: 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73  t. This is now s
f570: 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  et at compile ti
f580: 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20  me, rather than 
f590: 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74  during.** execut
f5a0: 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20  ion of the vdbe 
f5b0: 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20  program so that 
f5c0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
f5d0: 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65  ount() can.** be
f5e0: 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51   called on an SQ
f5f0: 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f  L statement befo
f600: 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  re sqlite3_step(
f610: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
f620: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
f630: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52  (Vdbe *p, int nR
f640: 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d  esColumn){.  Mem
f650: 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e   *pColName;.  in
f660: 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  t n;.  sqlite3 *
f670: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72  db = p->db;..  r
f680: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
f690: 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e  ->aColName, p->n
f6a0: 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
f6b0: 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  E_N);.  sqlite3D
f6c0: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f  bFree(db, p->aCo
f6d0: 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52  lName);.  n = nR
f6e0: 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
f6f0: 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c  _N;.  p->nResCol
f700: 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73 43  umn = (u16)nResC
f710: 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c  olumn;.  p->aCol
f720: 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20  Name = pColName 
f730: 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44  = (Mem*)sqlite3D
f740: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
f750: 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b  sizeof(Mem)*n );
f760: 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61  .  if( p->aColNa
f770: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
f780: 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30    while( n-- > 0
f790: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65   ){.    pColName
f7a0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
f7b0: 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65  ll;.    pColName
f7c0: 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
f7d0: 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20    pColName++;.  
f7e0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
f7f0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
f800: 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20  dx'th column to 
f810: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
f820: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
f830: 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20  ..** zName must 
f840: 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  be a pointer to 
f850: 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64  a nul terminated
f860: 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54   string..**.** T
f870: 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65  his call must be
f880: 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63 61   made after a ca
f890: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
f8a0: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a  eSetNumCols()..*
f8b0: 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70  *.** The final p
f8c0: 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20  arameter, xDel, 
f8d0: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53  must be one of S
f8e0: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53  QLITE_DYNAMIC, S
f8f0: 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20  QLITE_STATIC.** 
f900: 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  or SQLITE_TRANSI
f910: 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53 51  ENT. If it is SQ
f920: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68  LITE_DYNAMIC, th
f930: 65 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  en the buffer po
f940: 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a  inted.** to by z
f950: 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65  Name will be fre
f960: 65 64 20 62 79 20 73 71 6c 69 74 65 33 44 62 46  ed by sqlite3DbF
f970: 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20 76  ree() when the v
f980: 64 62 65 20 69 73 20 64 65 73 74 72 6f 79 65 64  dbe is destroyed
f990: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f9a0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a  VdbeSetColName(.
f9b0: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
f9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9d0: 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67     /* Vdbe being
f9e0: 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20   configured */. 
f9f0: 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20   int idx,       
fa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa10: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
fa20: 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69  lumn zName appli
fa30: 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76  es to */.  int v
fa40: 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ar,             
fa50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
fa60: 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d  ne of the COLNAM
fa70: 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f  E_* constants */
fa80: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
fa90: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Name,           
faa0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
fab0: 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  o buffer contain
fac0: 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f  ing name */.  vo
fad0: 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a  id (*xDel)(void*
fae0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  )              /
faf0: 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d  * Memory managem
fb00: 65 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f 72  ent strategy for
fb10: 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69   zName */.){.  i
fb20: 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43  nt rc;.  Mem *pC
fb30: 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74  olName;.  assert
fb40: 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c  ( idx<p->nResCol
fb50: 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  umn );.  assert(
fb60: 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29   var<COLNAME_N )
fb70: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
fb80: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
fb90: 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d     assert( !zNam
fba0: 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54  e || xDel!=SQLIT
fbb0: 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20  E_DYNAMIC );.   
fbc0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
fbd0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65  OMEM;.  }.  asse
fbe0: 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21  rt( p->aColName!
fbf0: 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65  =0 );.  pColName
fc00: 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65   = &(p->aColName
fc10: 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73  [idx+var*p->nRes
fc20: 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d  Column]);.  rc =
fc30: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
fc40: 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20  etStr(pColName, 
fc50: 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54  zName, -1, SQLIT
fc60: 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20  E_UTF8, xDel);. 
fc70: 20 61 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c   assert( rc!=0 |
fc80: 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f  | !zName || (pCo
fc90: 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d  lName->flags&MEM
fca0: 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72  _Term)!=0 );.  r
fcb0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
fcc0: 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72 69  ** A read or wri
fcd0: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te transaction m
fce0: 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
fcf0: 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62   active on datab
fd00: 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
fd10: 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
fd20: 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f  on is active, co
fd30: 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65 72  mmit it. If ther
fd40: 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d  e is a.** write-
fd50: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e  transaction span
fd60: 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ning more than o
fd70: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
fd80: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  , this routine.*
fd90: 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20  * takes care of 
fda0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
fdb0: 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a  al trickery..*/.
fdc0: 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43  static int vdbeC
fdd0: 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  ommit(sqlite3 *d
fde0: 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  b, Vdbe *p){.  i
fdf0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61  nt i;.  int nTra
fe00: 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62  ns = 0;  /* Numb
fe10: 65 72 20 6f 66 20 64 61 74 61 62 61 73 65 73 20  er of databases 
fe20: 77 69 74 68 20 61 6e 20 61 63 74 69 76 65 20 77  with an active w
fe30: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
fe40: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
fe50: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
fe60: 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b  needXcommit = 0;
fe70: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
fe80: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
fe90: 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 68 69 73  E.  /* With this
fea0: 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33   option, sqlite3
feb0: 56 74 61 62 53 79 6e 63 28 29 20 69 73 20 64 65  VtabSync() is de
fec0: 66 69 6e 65 64 20 74 6f 20 62 65 20 73 69 6d 70  fined to be simp
fed0: 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  ly .  ** SQLITE_
fee0: 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74 20 75  OK so p is not u
fef0: 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55  sed. .  */.  UNU
ff00: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
ff10: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42  ;.#endif..  /* B
ff20: 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74  efore doing anyt
ff30: 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20  hing else, call 
ff40: 74 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c  the xSync() call
ff50: 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a  back for any.  *
ff60: 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65  * virtual module
ff70: 20 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20   tables written 
ff80: 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
ff90: 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f  ion. This has to
ffa0: 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65  .  ** be done be
ffb0: 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67  fore determining
ffc0: 20 77 68 65 74 68 65 72 20 61 20 6d 61 73 74 65   whether a maste
ffd0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
ffe0: 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64  s .  ** required
fff0: 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20  , as an xSync() 
10000 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64  callback may add
10010 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61 74   an attached dat
10020 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68  abase.  ** to th
10030 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
10040 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
10050 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20 70  e3VtabSync(db, p
10060 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  );..  /* This lo
10070 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28 61  op determines (a
10080 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20  ) if the commit 
10090 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20 69  hook should be i
100a0 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20  nvoked and.  ** 
100b0 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61 74  (b) how many dat
100c0 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 76 65  abase files have
100d0 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
100e0 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20  sactions, not . 
100f0 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68   ** including th
10100 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e  e temp database.
10110 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61 6e   (b) is importan
10120 74 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f 72  t because if mor
10130 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65  e than .  ** one
10140 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
10150 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  as an open write
10160 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20   transaction, a 
10170 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20  master journal. 
10180 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71 75   ** file is requ
10190 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d  ired for an atom
101a0 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20  ic commit..  */ 
101b0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
101c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
101d0 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
101e0 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
101f0 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
10200 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
10210 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
10220 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64  t) ){.      need
10230 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  Xcommit = 1;.   
10240 20 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54     if( i!=1 ) nT
10250 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 72 63  rans++;.      rc
10260 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 45   = sqlite3BtreeE
10270 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 42 74  xclusiveLock(pBt
10280 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  );.    }.  }..#i
10290 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
102a0 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20 69  T_CONCURRENT.  i
102b0 66 28 20 64 62 2d 3e 62 43 6f 6e 63 75 72 72 65  f( db->bConcurre
102c0 6e 74 20 26 26 20 28 72 63 20 26 20 30 78 46 46  nt && (rc & 0xFF
102d0 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  )==SQLITE_BUSY )
102e0 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 49  {.    /* An SQLI
102f0 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49 54  TE_BUSY or SQLIT
10300 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 20  E_BUSY_SNAPSHOT 
10310 77 61 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  was encountered 
10320 77 68 69 6c 65 20 0a 20 20 20 20 2a 2a 20 61 74  while .    ** at
10330 74 65 6d 70 74 69 6e 67 20 74 6f 20 74 61 6b 65  tempting to take
10340 20 74 68 65 20 57 52 49 54 45 52 20 6c 6f 63 6b   the WRITER lock
10350 20 6f 6e 20 61 20 77 61 6c 20 66 69 6c 65 2e 20   on a wal file. 
10360 52 65 6c 65 61 73 65 20 74 68 65 0a 20 20 20 20  Release the.    
10370 2a 2a 20 57 52 49 54 45 52 20 6c 6f 63 6b 73 20  ** WRITER locks 
10380 6f 6e 20 61 6c 6c 20 77 61 6c 20 66 69 6c 65 73  on all wal files
10390 20 61 6e 64 20 72 65 74 75 72 6e 20 65 61 72 6c   and return earl
103a0 79 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  y.  */.    for(i
103b0 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
103c0 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
103d0 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
103e0 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
103f0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
10400 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
10410 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
10420 74 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b 0a  treeEnter(pBt);.
10430 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
10440 61 67 65 72 44 72 6f 70 45 78 63 6c 75 73 69 76  agerDropExclusiv
10450 65 4c 6f 63 6b 28 73 71 6c 69 74 65 33 42 74 72  eLock(sqlite3Btr
10460 65 65 50 61 67 65 72 28 70 42 74 29 29 3b 0a 20  eePager(pBt));. 
10470 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
10480 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a 20  reeLeave(pBt);. 
10490 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
104a0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 72  .#endif..  if( r
104b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
104c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
104d0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
104e0 65 20 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d  e are any write-
104f0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20  transactions at 
10500 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20  all, invoke the 
10510 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20  commit hook */. 
10520 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74   if( needXcommit
10530 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43   && db->xCommitC
10540 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 72  allback ){.    r
10550 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43  c = db->xCommitC
10560 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d  allback(db->pCom
10570 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66 28  mitArg);.    if(
10580 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
10590 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  urn SQLITE_CONST
105a0 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b  RAINT_COMMITHOOK
105b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
105c0 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73  * The simple cas
105d0 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e  e - no more than
105e0 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
105f0 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67  le (not counting
10600 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64   the.  ** TEMP d
10610 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20 74  atabase) has a t
10620 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
10630 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f  e.   There is no
10640 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20   need for the.  
10650 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  ** master-journa
10660 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  l..  **.  ** If 
10670 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
10680 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
10690 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73  GetFilename() is
106a0 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20   a zero length. 
106b0 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d   ** string, it m
106c0 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61  eans the main da
106d0 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72  tabase is :memor
106e0 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69 6c  y: or a temp fil
106f0 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61  e.  In .  ** tha
10700 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f 74  t case we do not
10710 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20   support atomic 
10720 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69  multi-file commi
10730 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20 0a  ts, so use the .
10740 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73 65    ** simple case
10750 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a   then too..  */.
10760 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
10770 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33  Strlen30(sqlite3
10780 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
10790 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
107a0 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d  ).   || nTrans<=
107b0 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  1.  ){.    for(i
107c0 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
107d0 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
107e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
107f0 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
10800 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
10810 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
10820 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
10830 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
10840 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20  e(pBt, 0);.     
10850 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
10860 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f   Do the commit o
10870 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62  nly if all datab
10880 61 73 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c  ases successfull
10890 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65  y complete phase
108a0 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f   1. .    ** If o
108b0 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65 65 43  ne of the BtreeC
108c0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
108d0 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69  calls fails, thi
108e0 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20  s indicates an. 
108f0 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77     ** IO error w
10900 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72  hile deleting or
10910 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f   truncating a jo
10920 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69  urnal file. It i
10930 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20  s unlikely,.    
10940 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70  ** but could hap
10950 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  pen. In this cas
10960 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73  e abandon proces
10970 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20  sing and return 
10980 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a  the error..    *
10990 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  /.    for(i=0; r
109a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
109b0 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
109c0 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
109d0 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
109e0 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
109f0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
10a00 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
10a10 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
10a20 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
10a30 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
10a40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10a50 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f     sqlite3VtabCo
10a60 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a  mmit(db);.    }.
10a70 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f    }..  /* The co
10a80 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65  mplex case - The
10a90 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69  re is a multi-fi
10aa0 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  le write-transac
10ab0 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a  tion active..  *
10ac0 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20  * This requires 
10ad0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
10ae0 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20   file to ensure 
10af0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
10b00 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65  is.  ** committe
10b10 64 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20  d atomically..  
10b20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
10b30 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20  E_OMIT_DISKIO.  
10b40 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
10b50 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64 62  3_vfs *pVfs = db
10b60 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20  ->pVfs;.    int 
10b70 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
10b80 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
10b90 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e  = 0;   /* File-n
10ba0 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74  ame for the mast
10bb0 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  er journal */.  
10bc0 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d    char const *zM
10bd0 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  ainFile = sqlite
10be0 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
10bf0 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
10c00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
10c10 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30  ile *pMaster = 0
10c20 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  ;.    i64 offset
10c30 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65   = 0;.    int re
10c40 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 72 79  s;.    int retry
10c50 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69  Count = 0;.    i
10c60 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20  nt nMainFile;.. 
10c70 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d     /* Select a m
10c80 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10c90 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e  le name */.    n
10ca0 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74  MainFile = sqlit
10cb0 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69 6e  e3Strlen30(zMain
10cc0 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73 74  File);.    zMast
10cd0 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  er = sqlite3MPri
10ce0 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58 58  ntf(db, "%s-mjXX
10cf0 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69 6e  XXXX9XXz", zMain
10d00 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  File);.    if( z
10d10 4d 61 73 74 65 72 3d 3d 30 20 29 20 72 65 74 75  Master==0 ) retu
10d20 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
10d30 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
10d40 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20  u32 iRandom;.   
10d50 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e     if( retryCoun
10d60 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
10d70 20 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 30 20   retryCount>100 
10d80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
10d90 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
10da0 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65  FULL, "MJ delete
10db0 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b  : %s", zMaster);
10dc0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10dd0 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
10de0 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
10df0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
10e00 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
10e10 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29   retryCount==1 )
10e20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
10e30 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46  te3_log(SQLITE_F
10e40 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65  ULL, "MJ collide
10e50 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b  : %s", zMaster);
10e60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10e70 20 7d 0a 20 20 20 20 20 20 72 65 74 72 79 43 6f   }.      retryCo
10e80 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  unt++;.      sql
10e90 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
10ea0 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c  sizeof(iRandom),
10eb0 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20   &iRandom);.    
10ec0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
10ed0 74 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b  tf(13, &zMaster[
10ee0 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a  nMainFile], "-mj
10ef0 25 30 36 58 39 25 30 32 58 22 2c 0a 20 20 20 20  %06X9%02X",.    
10f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f10 20 20 20 20 20 20 20 20 20 20 20 28 69 52 61 6e             (iRan
10f20 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 66 66  dom>>8)&0xffffff
10f30 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b  , iRandom&0xff);
10f40 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 6e  .      /* The an
10f50 74 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 63 68  tipenultimate ch
10f60 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 6d  aracter of the m
10f70 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
10f80 6d 65 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a  me must.      **
10f90 20 62 65 20 22 39 22 20 74 6f 20 61 76 6f 69 64   be "9" to avoid
10fa0 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73   name collisions
10fb0 20 77 68 65 6e 20 75 73 69 6e 67 20 38 2b 33 20   when using 8+3 
10fc0 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20  filenames. */.  
10fd0 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d 61 73      assert( zMas
10fe0 74 65 72 5b 73 71 6c 69 74 65 33 53 74 72 6c 65  ter[sqlite3Strle
10ff0 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d  n30(zMaster)-3]=
11000 3d 27 39 27 20 29 3b 0a 20 20 20 20 20 20 73 71  ='9' );.      sq
11010 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
11020 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73  (zMainFile, zMas
11030 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ter);.      rc =
11040 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
11050 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
11060 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
11070 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20  ISTS, &res);.   
11080 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
11090 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b  ITE_OK && res );
110a0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
110b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
110c0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74  /* Open the mast
110d0 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  er journal. */. 
110e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
110f0 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56  3OsOpenMalloc(pV
11100 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d  fs, zMaster, &pM
11110 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20  aster, .        
11120 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
11130 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
11140 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20  PEN_CREATE|.    
11150 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
11160 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49  N_EXCLUSIVE|SQLI
11170 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
11180 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20  OURNAL, 0.      
11190 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
111a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
111b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
111c0 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
111d0 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
111e0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20   rc;.    }. .   
111f0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61   /* Write the na
11200 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62  me of each datab
11210 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ase file in the 
11220 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f  transaction into
11230 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20   the new.    ** 
11240 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
11250 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ile. If an error
11260 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20   occurs at this 
11270 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20  point close.    
11280 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ** and delete th
11290 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
112a0 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69   file. All the i
112b0 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
112c0 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73  l files.    ** s
112d0 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27  till have 'null'
112e0 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a   as the master j
112f0 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20  ournal pointer, 
11300 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c  so they will rol
11310 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e  l.    ** back in
11320 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61  dependently if a
11330 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e   failure occurs.
11340 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
11350 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
11360 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
11370 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
11380 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
11390 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
113a0 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
113b0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f  .        char co
113c0 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c  nst *zFile = sql
113d0 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72  ite3BtreeGetJour
113e0 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20  nalname(pBt);.  
113f0 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d        if( zFile=
11400 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11410 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67  continue;  /* Ig
11420 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d  nore TEMP and :m
11430 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73  emory: databases
11440 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
11450 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 46        assert( zF
11460 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20  ile[0]!=0 );.   
11470 20 20 20 20 20 69 66 28 20 21 6e 65 65 64 53 79       if( !needSy
11480 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33 42 74  nc && !sqlite3Bt
11490 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28  reeSyncDisabled(
114a0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
114b0 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a    needSync = 1;.
114c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
114d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
114e0 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a  Write(pMaster, z
114f0 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53 74 72  File, sqlite3Str
11500 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20  len30(zFile)+1, 
11510 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  offset);.       
11520 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c 69 74   offset += sqlit
11530 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
11540 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28  )+1;.        if(
11550 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11560 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
11570 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
11580 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
11590 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
115a0 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
115b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
115c0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
115d0 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
115e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
115f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11600 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
11610 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72   Sync the master
11620 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
11630 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55  f the IOCAP_SEQU
11640 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20  ENTIAL device.  
11650 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74    ** flag is set
11660 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   this is not req
11670 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
11680 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20 0a    if( needSync .
11690 20 20 20 20 20 26 26 20 30 3d 3d 28 73 71 6c 69       && 0==(sqli
116a0 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
116b0 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73 74  cteristics(pMast
116c0 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  er)&SQLITE_IOCAP
116d0 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 20  _SEQUENTIAL).   
116e0 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    && SQLITE_OK!=
116f0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  (rc = sqlite3OsS
11700 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c  ync(pMaster, SQL
11710 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
11720 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73  ).    ){.      s
11730 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
11740 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
11750 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
11760 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
11770 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
11780 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
11790 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
117a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
117b0 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74     /* Sync all t
117c0 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f  he db files invo
117d0 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e  lved in the tran
117e0 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d  saction. The sam
117f0 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65  e call.    ** se
11800 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ts the master jo
11810 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e  urnal pointer in
11820 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c   each individual
11830 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
11840 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
11850 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74  urs here, do not
11860 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
11870 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
11880 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
11890 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75  f the error occu
118a0 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66 69  rs during the fi
118b0 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  rst call to.    
118c0 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
118d0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c  ommitPhaseOne(),
118e0 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   then there is a
118f0 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
11900 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a  .    ** master j
11910 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c  ournal file will
11920 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75   be orphaned. Bu
11930 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65  t we cannot dele
11940 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e  te it,.    ** in
11950 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65 72   case the master
11960 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
11970 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69  me was written i
11980 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  nto the journal.
11990 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f      ** file befo
119a0 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f  re the failure o
119b0 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  ccurred..    */.
119c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
119d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
119e0 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
119f0 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
11a00 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
11a10 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
11a20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
11a30 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
11a40 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c  mitPhaseOne(pBt,
11a50 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
11a60 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
11a70 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
11a80 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73  pMaster);.    as
11a90 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
11aa0 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66 28  _BUSY );.    if(
11ab0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11ac0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
11ad0 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
11ae0 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
11af0 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
11b00 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61  /* Delete the ma
11b10 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
11b20 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20  e. This commits 
11b30 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
11b40 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f   After.    ** do
11b50 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69 72  ing this the dir
11b60 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64  ectory is synced
11b70 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e   again before an
11b80 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20  y individual.   
11b90 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
11ba0 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65  files are delete
11bb0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  d..    */.    rc
11bc0 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
11bd0 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
11be0 2c 20 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20  , needSync);.   
11bf0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
11c00 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
11c10 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
11c20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
11c30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
11c40 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66   }..    /* All f
11c50 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f  iles and directo
11c60 72 69 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ries have alread
11c70 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73  y been synced, s
11c80 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  o the following.
11c90 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20      ** calls to 
11ca0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
11cb0 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 72 65  itPhaseTwo() are
11cc0 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69   only closing fi
11cd0 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64  les and.    ** d
11ce0 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63  eleting or trunc
11cf0 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20  ating journals. 
11d00 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  If something goe
11d10 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20  s wrong while.  
11d20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70    ** this is hap
11d30 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 20  pening we don't 
11d40 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65  really care. The
11d50 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68   integrity of th
11d60 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
11d70 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20  tion is already 
11d80 67 75 61 72 61 6e 74 65 65 64 2c 20 62 75 74 20  guaranteed, but 
11d90 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64  some stray 'cold
11da0 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a  ' journals.    *
11db0 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61  * may be lying a
11dc0 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67  round. Returning
11dd0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77   an error code w
11de0 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72  on't help matter
11df0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 69  s..    */.    di
11e00 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
11e10 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20  io_errors();.   
11e20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
11e30 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
11e40 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
11e50 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
11e60 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
11e70 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
11e80 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
11e90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
11ea0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
11eb0 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20 20 20  wo(pBt, 1);.    
11ec0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
11ed0 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
11ee0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62  lloc();.    enab
11ef0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
11f00 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73  errors();..    s
11f10 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74  qlite3VtabCommit
11f20 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
11f30 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
11f40 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ../* .** This ro
11f50 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61  utine checks tha
11f60 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e 6e 56  t the sqlite3.nV
11f70 64 62 65 41 63 74 69 76 65 20 63 6f 75 6e 74 20  dbeActive count 
11f80 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63  variable.** matc
11f90 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hes the number o
11fa0 66 20 76 64 62 65 27 73 20 69 6e 20 74 68 65 20  f vdbe's in the 
11fb0 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56 64  list sqlite3.pVd
11fc0 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63  be that are.** c
11fd0 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 2e  urrently active.
11fe0 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61   An assertion fa
11ff0 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20 63  ils if the two c
12000 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74  ounts do not mat
12010 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ch..** This is a
12020 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d  n internal self-
12030 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20  check only - it 
12040 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74  is not an essent
12050 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a  ial processing.*
12060 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  * step..**.** Th
12070 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  is is a no-op if
12080 20 4e 44 45 42 55 47 20 69 73 20 64 65 66 69 6e   NDEBUG is defin
12090 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ed..*/.#ifndef N
120a0 44 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69  DEBUG.static voi
120b0 64 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62  d checkActiveVdb
120c0 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62  eCnt(sqlite3 *db
120d0 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
120e0 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69  int cnt = 0;.  i
120f0 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20  nt nWrite = 0;. 
12100 20 69 6e 74 20 6e 52 65 61 64 20 3d 20 30 3b 0a   int nRead = 0;.
12110 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b    p = db->pVdbe;
12120 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
12130 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
12140 74 6d 74 5f 62 75 73 79 28 28 73 71 6c 69 74 65  tmt_busy((sqlite
12150 33 5f 73 74 6d 74 2a 29 70 29 20 29 7b 0a 20 20  3_stmt*)p) ){.  
12160 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20      cnt++;.     
12170 20 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79   if( p->readOnly
12180 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a  ==0 ) nWrite++;.
12190 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73        if( p->bIs
121a0 52 65 61 64 65 72 20 29 20 6e 52 65 61 64 2b 2b  Reader ) nRead++
121b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20  ;.    }.    p = 
121c0 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
121d0 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d  assert( cnt==db-
121e0 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 3b 0a  >nVdbeActive );.
121f0 20 20 61 73 73 65 72 74 28 20 6e 57 72 69 74 65    assert( nWrite
12200 3d 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  ==db->nVdbeWrite
12210 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52   );.  assert( nR
12220 65 61 64 3d 3d 64 62 2d 3e 6e 56 64 62 65 52 65  ead==db->nVdbeRe
12230 61 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64  ad );.}.#else.#d
12240 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76  efine checkActiv
12250 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64  eVdbeCnt(x).#end
12260 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
12270 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
12280 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
12290 6e 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74  nt opened a stat
122a0 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f  ement-transactio
122b0 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e  n,.** close it n
122c0 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f 70  ow. Argument eOp
122d0 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
122e0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
122f0 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49  CK or.** SAVEPOI
12300 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 69  NT_RELEASE. If i
12310 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  t is SAVEPOINT_R
12320 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 68  OLLBACK, then th
12330 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74  e statement.** t
12340 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
12350 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65 4f  lled back. If eO
12360 70 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  p is SAVEPOINT_R
12370 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68 65  ELEASE, then the
12380 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74   .** statement t
12390 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
123a0 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  mmitted..**.** I
123b0 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
123c0 63 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f  curs, an SQLITE_
123d0 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20  IOERR_XXX error 
123e0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
123f0 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  . .** Otherwise 
12400 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
12410 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  t sqlite3VdbeClo
12420 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65  seStatement(Vdbe
12430 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20   *p, int eOp){. 
12440 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20   sqlite3 *const 
12450 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e  db = p->db;.  in
12460 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12470 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 2d 3e 69 53  ;..  /* If p->iS
12480 74 61 74 65 6d 65 6e 74 20 69 73 20 67 72 65 61  tatement is grea
12490 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ter than zero, t
124a0 68 65 6e 20 74 68 69 73 20 56 64 62 65 20 6f 70  hen this Vdbe op
124b0 65 6e 65 64 20 61 20 0a 20 20 2a 2a 20 73 74 61  ened a .  ** sta
124c0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
124d0 6f 6e 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  on that should b
124e0 65 20 63 6c 6f 73 65 64 20 68 65 72 65 2e 20 54  e closed here. T
124f0 68 65 20 6f 6e 6c 79 20 65 78 63 65 70 74 69 6f  he only exceptio
12500 6e 0a 20 20 2a 2a 20 69 73 20 74 68 61 74 20 61  n.  ** is that a
12510 6e 20 49 4f 20 65 72 72 6f 72 20 6d 61 79 20 68  n IO error may h
12520 61 76 65 20 6f 63 63 75 72 72 65 64 2c 20 63 61  ave occurred, ca
12530 75 73 69 6e 67 20 61 6e 20 65 6d 65 72 67 65 6e  using an emergen
12540 63 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a  cy rollback..  *
12550 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 28  * In this case (
12560 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d  db->nStatement==
12570 30 29 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73  0), and there is
12580 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e 0a   nothing to do..
12590 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e    */.  if( db->n
125a0 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e  Statement && p->
125b0 69 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20  iStatement ){.  
125c0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e    int i;.    con
125d0 73 74 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  st int iSavepoin
125e0 74 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e  t = p->iStatemen
125f0 74 2d 31 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  t-1;..    assert
12600 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  ( eOp==SAVEPOINT
12610 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70  _ROLLBACK || eOp
12620 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
12630 41 53 45 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ASE);.    assert
12640 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  ( db->nStatement
12650 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
12660 28 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d  ( p->iStatement=
12670 3d 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  =(db->nStatement
12680 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29  +db->nSavepoint)
12690 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30   );..    for(i=0
126a0 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
126b0 29 7b 20 0a 20 20 20 20 20 20 69 6e 74 20 72 63  ){ .      int rc
126c0 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  2 = SQLITE_OK;. 
126d0 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
126e0 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
126f0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
12700 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  ){.        if( e
12710 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op==SAVEPOINT_RO
12720 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
12730 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
12740 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
12750 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  pBt, SAVEPOINT_R
12760 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f  OLLBACK, iSavepo
12770 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  int);.        }.
12780 20 20 20 20 20 20 20 20 69 66 28 20 72 63 32 3d          if( rc2=
12790 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
127a0 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71          rc2 = sq
127b0 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
127c0 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49  int(pBt, SAVEPOI
127d0 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76  NT_RELEASE, iSav
127e0 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  epoint);.       
127f0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
12800 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
12810 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 72            rc = r
12820 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  c2;.        }.  
12830 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
12840 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d  db->nStatement--
12850 3b 0a 20 20 20 20 70 2d 3e 69 53 74 61 74 65 6d  ;.    p->iStatem
12860 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  ent = 0;..    if
12870 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
12880 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 4f 70  ){.      if( eOp
12890 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
128a0 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  BACK ){.        
128b0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
128c0 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41  Savepoint(db, SA
128d0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
128e0 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
128f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
12900 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
12910 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
12920 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f  qlite3VtabSavepo
12930 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e  int(db, SAVEPOIN
12940 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65  T_RELEASE, iSave
12950 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a  point);.      }.
12960 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
12970 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
12980 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65  ransaction is be
12990 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c  ing rolled back,
129a0 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74 68   also restore th
129b0 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  e .    ** databa
129c0 73 65 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72  se handles defer
129d0 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  red constraint c
129e0 6f 75 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61  ounter to the va
129f0 6c 75 65 20 69 74 20 68 61 64 20 77 68 65 6e 20  lue it had when 
12a00 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74  .    ** the stat
12a10 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
12a20 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a  n was opened.  *
12a30 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53  /.    if( eOp==S
12a40 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
12a50 4b 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6e  K ){.      db->n
12a60 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70  DeferredCons = p
12a70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a  ->nStmtDefCons;.
12a80 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72        db->nDefer
12a90 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e  redImmCons = p->
12aa0 6e 53 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 3b  nStmtDefImmCons;
12ab0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
12ac0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
12ad0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
12ae0 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
12af0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
12b00 65 64 20 62 79 20 74 68 65 20 64 61 74 61 62 61  ed by the databa
12b10 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73  se .** handle as
12b20 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
12b30 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61  e VM passed as a
12b40 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62  n argument is ab
12b50 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f  out to be .** co
12b60 6d 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65 72  mmitted. If ther
12b70 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
12b80 67 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  g deferred forei
12b90 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
12ba0 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c  t.** violations,
12bb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
12bc0 52 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65 2c  RROR. Otherwise,
12bd0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
12be0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
12bf0 75 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76 69  utstanding FK vi
12c00 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68 69  olations and thi
12c10 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
12c20 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52  ns .** SQLITE_ER
12c30 52 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65 73  ROR, set the res
12c40 75 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74 6f  ult of the VM to
12c50 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
12c60 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a  NT_FOREIGNKEY.**
12c70 20 61 6e 64 20 77 72 69 74 65 20 61 6e 20 65 72   and write an er
12c80 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69  ror message to i
12c90 74 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53  t. Then return S
12ca0 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a  QLITE_ERROR..*/.
12cb0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12cc0 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
12cd0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
12ce0 68 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20  heckFk(Vdbe *p, 
12cf0 69 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20  int deferred){. 
12d00 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
12d10 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66  ->db;.  if( (def
12d20 65 72 72 65 64 20 26 26 20 28 64 62 2d 3e 6e 44  erred && (db->nD
12d30 65 66 65 72 72 65 64 43 6f 6e 73 2b 64 62 2d 3e  eferredCons+db->
12d40 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
12d50 29 3e 30 29 20 0a 20 20 20 7c 7c 20 28 21 64 65  )>0) .   || (!de
12d60 66 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b  ferred && p->nFk
12d70 43 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 0a 20  Constraint>0) . 
12d80 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
12d90 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
12da0 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20  T_FOREIGNKEY;.  
12db0 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e    p->errorAction
12dc0 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20   = OE_Abort;.   
12dd0 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f   sqlite3VdbeErro
12de0 72 28 70 2c 20 22 46 4f 52 45 49 47 4e 20 4b 45  r(p, "FOREIGN KE
12df0 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  Y constraint fai
12e00 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72  led");.    retur
12e10 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
12e20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
12e30 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
12e40 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
12e50 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
12e60 68 65 20 77 68 65 6e 20 61 20 56 44 42 45 20 74  he when a VDBE t
12e70 72 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49  ries to halt.  I
12e80 66 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61  f the VDBE.** ha
12e90 73 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61  s made changes a
12ea0 6e 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d  nd is in autocom
12eb0 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63  mit mode, then c
12ec0 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63  ommit those.** c
12ed0 68 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f  hanges.  If a ro
12ee0 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64  llback is needed
12ef0 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f  , then do the ro
12f00 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  llback..**.** Th
12f10 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
12f20 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f  e only way to mo
12f30 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ve the state of 
12f40 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c  a VM from.** SQL
12f50 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f  ITE_MAGIC_RUN to
12f60 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41   SQLITE_MAGIC_HA
12f70 4c 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c  LT.  It is harml
12f80 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74  ess to.** call t
12f90 68 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74  his on a VM that
12fa0 20 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54   is in the SQLIT
12fb0 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61  E_MAGIC_HALT sta
12fc0 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  te..**.** Return
12fd0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20   an error code. 
12fe0 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63   If the commit c
12ff0 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  ould not complet
13000 65 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20  e because of.** 
13010 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c  lock contention,
13020 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
13030 55 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f  USY.  If SQLITE_
13040 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
13050 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  , it.** means th
13060 65 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20  e close did not 
13070 68 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73  happen and needs
13080 20 74 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e   to be repeated.
13090 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
130a0 64 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29  dbeHalt(Vdbe *p)
130b0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
130c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130d0 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73      /* Used to s
130e0 74 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72  tore transient r
130f0 65 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20  eturn codes */. 
13100 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
13110 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  ->db;..  /* This
13120 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69   function contai
13130 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61  ns the logic tha
13140 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20  t determines if 
13150 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20  a statement or. 
13160 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
13170 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65  will be committe
13180 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
13190 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
131a0 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69  the.  ** executi
131b0 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74 75  on of this virtu
131c0 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a  al machine. .  *
131d0 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66  *.  ** If any of
131e0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
131f0 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a  rrors occur:.  *
13200 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  *.  **     SQLIT
13210 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20  E_NOMEM.  **    
13220 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20   SQLITE_IOERR.  
13230 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55  **     SQLITE_FU
13240 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  LL.  **     SQLI
13250 54 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a  TE_INTERRUPT.  *
13260 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20  *.  ** Then the 
13270 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d  internal cache m
13280 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c  ight have been l
13290 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73  eft in an incons
132a0 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74  istent.  ** stat
132b0 65 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72  e.  We need to r
132c0 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74  ollback the stat
132d0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
132e0 6e 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a 20  n, if there is. 
132f0 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20   ** one, or the 
13300 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63  complete transac
13310 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73  tion if there is
13320 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72   no statement tr
13330 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
13340 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
13350 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
13360 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
13370 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
13380 28 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 29  ( p->aOnceFlag )
13390 20 6d 65 6d 73 65 74 28 70 2d 3e 61 4f 6e 63 65   memset(p->aOnce
133a0 46 6c 61 67 2c 20 30 2c 20 70 2d 3e 6e 4f 6e 63  Flag, 0, p->nOnc
133b0 65 46 6c 61 67 29 3b 0a 20 20 63 6c 6f 73 65 41  eFlag);.  closeA
133c0 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20  llCursors(p);.  
133d0 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44  if( p->magic!=VD
133e0 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a  BE_MAGIC_RUN ){.
133f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13400 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63  E_OK;.  }.  chec
13410 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64  kActiveVdbeCnt(d
13420 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d  b);..  /* No com
13430 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
13440 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 70 72  needed if the pr
13450 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72  ogram never star
13460 74 65 64 20 6f 72 20 69 66 20 74 68 65 0a 20 20  ted or if the.  
13470 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
13480 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 64 20 6f   does not read o
13490 72 20 77 72 69 74 65 20 61 20 64 61 74 61 62 61  r write a databa
134a0 73 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 69  se file.  */.  i
134b0 66 28 20 70 2d 3e 70 63 3e 3d 30 20 26 26 20 70  f( p->pc>=0 && p
134c0 2d 3e 62 49 73 52 65 61 64 65 72 20 29 7b 0a 20  ->bIsReader ){. 
134d0 20 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a     int mrc;   /*
134e0 20 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63   Primary error c
134f0 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a  ode from p->rc *
13500 2f 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65  /.    int eState
13510 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20  mentOp = 0;.    
13520 69 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72 72  int isSpecialErr
13530 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  or;            /
13540 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66  * Set to true if
13550 20 61 20 27 73 70 65 63 69 61 6c 27 20 65 72 72   a 'special' err
13560 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f  or */..    /* Lo
13570 63 6b 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73  ck all btrees us
13580 65 64 20 62 79 20 74 68 65 20 73 74 61 74 65 6d  ed by the statem
13590 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ent */.    sqlit
135a0 65 33 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a  e3VdbeEnter(p);.
135b0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  .    /* Check fo
135c0 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65  r one of the spe
135d0 63 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20  cial errors */. 
135e0 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26     mrc = p->rc &
135f0 20 30 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65   0xff;.    isSpe
13600 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d  cialError = mrc=
13610 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
13620 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   mrc==SQLITE_IOE
13630 52 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RR.             
13640 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d          || mrc==
13650 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
13660 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
13670 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73  FULL;.    if( is
13680 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a  SpecialError ){.
13690 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
136a0 71 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f  query was read-o
136b0 6e 6c 79 20 61 6e 64 20 74 68 65 20 65 72 72 6f  nly and the erro
136c0 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45  r code is SQLITE
136d0 5f 49 4e 54 45 52 52 55 50 54 2c 20 0a 20 20 20  _INTERRUPT, .   
136e0 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63     ** no rollbac
136f0 6b 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20  k is necessary. 
13700 4f 74 68 65 72 77 69 73 65 2c 20 61 74 20 6c 65  Otherwise, at le
13710 61 73 74 20 61 20 73 61 76 65 70 6f 69 6e 74 20  ast a savepoint 
13720 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  .      ** transa
13730 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f  ction must be ro
13740 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 72 65 73  lled back to res
13750 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
13760 65 20 74 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a  e to a .      **
13770 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74   consistent stat
13780 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
13790 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65    ** Even if the
137a0 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65   statement is re
137b0 61 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69  ad-only, it is i
137c0 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 65 72 66  mportant to perf
137d0 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20 73  orm.      ** a s
137e0 74 61 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e  tatement or tran
137f0 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b  saction rollback
13800 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74   operation. If t
13810 68 65 20 65 72 72 6f 72 20 0a 20 20 20 20 20 20  he error .      
13820 2a 2a 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  ** occurred whil
13830 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
13840 20 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f   journal, sub-jo
13850 75 72 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73  urnal or databas
13860 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20  e.      ** file 
13870 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66  as part of an ef
13880 66 6f 72 74 20 74 6f 20 66 72 65 65 20 75 70 20  fort to free up 
13890 63 61 63 68 65 20 73 70 61 63 65 20 28 73 65 65  cache space (see
138a0 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20   function.      
138b0 2a 2a 20 70 61 67 65 72 53 74 72 65 73 73 28 29  ** pagerStress()
138c0 20 69 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68   in pager.c), th
138d0 65 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65  e rollback is re
138e0 71 75 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72  quired to restor
138f0 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  e .      ** the 
13900 70 61 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69  pager to a consi
13910 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20  stent state..   
13920 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
13930 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20  !p->readOnly || 
13940 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45  mrc!=SQLITE_INTE
13950 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20  RRUPT ){.       
13960 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54   if( (mrc==SQLIT
13970 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d  E_NOMEM || mrc==
13980 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20  SQLITE_FULL) && 
13990 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e  p->usesStmtJourn
139a0 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  al ){.          
139b0 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53  eStatementOp = S
139c0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
139d0 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  K;.        }else
139e0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
139f0 65 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20  e are forced to 
13a00 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63  roll back the ac
13a10 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
13a20 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20  . Before doing. 
13a30 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20           ** so, 
13a40 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20  abort any other 
13a50 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20  statements this 
13a60 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79  handle currently
13a70 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20   has active..   
13a80 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
13a90 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
13aa0 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
13ab0 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
13ac0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
13ad0 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
13ae0 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
13af0 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
13b00 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  t = 1;.         
13b10 20 64 62 2d 3e 62 43 6f 6e 63 75 72 72 65 6e 74   db->bConcurrent
13b20 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
13b30 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
13b40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13b50 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
13b60 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69  Check for immedi
13b70 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
13b80 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20  violations. */. 
13b90 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
13ba0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13bb0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
13bc0 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d  kFk(p, 0);.    }
13bd0 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
13be0 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
13bf0 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
13c00 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61  is is the only a
13c10 63 74 69 76 65 20 77 72 69 74 65 72 20 0a 20 20  ctive writer .  
13c20 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65    ** VM, then we
13c30 20 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d   do either a com
13c40 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
13c50 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  of the current t
13c60 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20  ransaction. .   
13c70 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a   **.    ** Note:
13c80 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f   This block also
13c90 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20   runs if one of 
13ca0 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f  the special erro
13cb0 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20  rs handled .    
13cc0 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63  ** above has occ
13cd0 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20  urred. .    */. 
13ce0 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56     if( !sqlite3V
13cf0 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20  tabInSync(db) . 
13d00 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43      && db->autoC
13d10 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64  ommit .     && d
13d20 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d 28  b->nVdbeWrite==(
13d30 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20  p->readOnly==0) 
13d40 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66  .    ){.      if
13d50 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
13d60 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41  OK || (p->errorA
13d70 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26  ction==OE_Fail &
13d80 26 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f  & !isSpecialErro
13d90 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  r) ){.        rc
13da0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68   = sqlite3VdbeCh
13db0 65 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20  eckFk(p, 1);.   
13dc0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
13dd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
13de0 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d      if( NEVER(p-
13df0 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20  >readOnly) ){.  
13e00 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13e10 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
13e20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
13e30 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
13e40 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
13e50 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
13e60 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
13e70 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20  EIGNKEY;.       
13e80 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20   }else{ .       
13e90 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63     /* The auto-c
13ea0 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72  ommit flag is tr
13eb0 75 65 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f  ue, the vdbe pro
13ec0 67 72 61 6d 20 77 61 73 20 73 75 63 63 65 73 73  gram was success
13ed0 66 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ful .          *
13ee0 2a 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20  * or hit an 'OR 
13ef0 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74  FAIL' constraint
13f00 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e   and there are n
13f10 6f 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  o deferred forei
13f20 67 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  gn.          ** 
13f30 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  key constraints 
13f40 74 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74  to hold up the t
13f50 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73  ransaction. This
13f60 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20   means a commit 
13f70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73  .          ** is
13f80 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
13f90 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62          rc = vdb
13fa0 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a  eCommit(db, p);.
13fb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13fc0 20 20 69 66 28 20 28 72 63 20 26 20 30 78 46 46    if( (rc & 0xFF
13fd0 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  )==SQLITE_BUSY &
13fe0 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  & p->readOnly ){
13ff0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
14000 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a  e3VdbeLeave(p);.
14010 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
14020 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   rc;.        }el
14030 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  se if( rc!=SQLIT
14040 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
14050 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
14060 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
14070 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
14080 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20  QLITE_OK);.     
14090 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
140a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
140b0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62  se{.          db
140c0 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20  ->nDeferredCons 
140d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64  = 0;.          d
140e0 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
140f0 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ons = 0;.       
14100 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20     db->flags &= 
14110 7e 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73  ~SQLITE_DeferFKs
14120 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
14130 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  te3CommitInterna
14140 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20  lChanges(db);.  
14150 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
14160 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
14170 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
14180 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  db, SQLITE_OK);.
14190 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e          p->nChan
141a0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ge = 0;.      }.
141b0 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65        db->nState
141c0 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  ment = 0;.    }e
141d0 6c 73 65 20 69 66 28 20 65 53 74 61 74 65 6d 65  lse if( eStateme
141e0 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ntOp==0 ){.     
141f0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
14200 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f  TE_OK || p->erro
14210 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c  rAction==OE_Fail
14220 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61   ){.        eSta
14230 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50  tementOp = SAVEP
14240 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20  OINT_RELEASE;.  
14250 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
14260 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
14270 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  _Abort ){.      
14280 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d    eStatementOp =
14290 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
142a0 41 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ACK;.      }else
142b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
142c0 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
142d0 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
142e0 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20  LLBACK);.       
142f0 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
14300 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
14310 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
14320 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
14330 20 64 62 2d 3e 62 43 6f 6e 63 75 72 72 65 6e 74   db->bConcurrent
14340 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 0;.        p-
14350 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
14360 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
14370 20 20 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d     /* If eStatem
14380 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  entOp is non-zer
14390 6f 2c 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d  o, then a statem
143a0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
143b0 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20  needs to.    ** 
143c0 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20  be committed or 
143d0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c  rolled back. Cal
143e0 6c 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  l sqlite3VdbeClo
143f0 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f  seStatement() to
14400 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49  .    ** do so. I
14410 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
14420 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
14430 72 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  r, and the curre
14440 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  nt statement.   
14450 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69   ** error code i
14460 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53  s SQLITE_OK or S
14470 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
14480 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74  , then promote t
14490 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  he.    ** curren
144a0 74 20 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f  t statement erro
144b0 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20  r code..    */. 
144c0 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e     if( eStatemen
144d0 74 4f 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20  tOp ){.      rc 
144e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  = sqlite3VdbeClo
144f0 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65  seStatement(p, e
14500 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20  StatementOp);.  
14510 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
14520 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
14530 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70  =SQLITE_OK || (p
14540 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49  ->rc&0xff)==SQLI
14550 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b  TE_CONSTRAINT ){
14560 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
14570 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20   = rc;.         
14580 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
14590 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
145a0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72            p->zEr
145b0 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  rMsg = 0;.      
145c0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
145d0 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
145e0 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  b, SQLITE_ABORT_
145f0 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20  ROLLBACK);.     
14600 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53     sqlite3CloseS
14610 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20  avepoints(db);. 
14620 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
14630 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
14640 20 20 20 64 62 2d 3e 62 43 6f 6e 63 75 72 72 65     db->bConcurre
14650 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nt = 0;.        
14660 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
14670 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14680 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
14690 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55  was an INSERT, U
146a0 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
146b0 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74  and no statement
146c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20   transaction.   
146d0 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 6f 6c   ** has been rol
146e0 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61 74 65  led back, update
146f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
14700 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d  nnection change-
14710 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f  counter. .    */
14720 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e  .    if( p->chan
14730 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20  geCntOn ){.     
14740 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
14750 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p!=SAVEPOINT_ROL
14760 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  LBACK ){.       
14770 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
14780 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43  hanges(db, p->nC
14790 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65  hange);.      }e
147a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
147b0 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
147c0 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20  es(db, 0);.     
147d0 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61   }.      p->nCha
147e0 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  nge = 0;.    }..
147f0 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
14800 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  he locks */.    
14810 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
14820 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  (p);.  }..  /* W
14830 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66 75  e have successfu
14840 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63  lly halted and c
14850 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52  losed the VM.  R
14860 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e  ecord this fact.
14870 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
14880 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56  =0 ){.    db->nV
14890 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20  dbeActive--;.   
148a0 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c   if( !p->readOnl
148b0 79 20 29 20 64 62 2d 3e 6e 56 64 62 65 57 72 69  y ) db->nVdbeWri
148c0 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d  te--;.    if( p-
148d0 3e 62 49 73 52 65 61 64 65 72 20 29 20 64 62 2d  >bIsReader ) db-
148e0 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20  >nVdbeRead--;.  
148f0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56    assert( db->nV
14900 64 62 65 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e  dbeActive>=db->n
14910 56 64 62 65 52 65 61 64 20 29 3b 0a 20 20 20 20  VdbeRead );.    
14920 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62  assert( db->nVdb
14930 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65  eRead>=db->nVdbe
14940 57 72 69 74 65 20 29 3b 0a 20 20 20 20 61 73 73  Write );.    ass
14950 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 57 72  ert( db->nVdbeWr
14960 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  ite>=0 );.  }.  
14970 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
14980 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68  MAGIC_HALT;.  ch
14990 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
149a0 28 64 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64  (db);.  if( p->d
149b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
149c0 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
149d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
149e0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75  ..  /* If the au
149f0 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
14a00 73 20 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74  s set to true, t
14a10 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68  hen any locks th
14a20 61 74 20 77 65 72 65 20 68 65 6c 64 0a 20 20 2a  at were held.  *
14a30 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  * by connection 
14a40 64 62 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  db have now been
14a50 20 72 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20   released. Call 
14a60 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
14a70 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a  nUnlocked() .  *
14a80 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20  * to invoke any 
14a90 72 65 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d  required unlock-
14aa0 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73  notify callbacks
14ab0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
14ac0 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20  >autoCommit ){. 
14ad0 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
14ae0 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29  tionUnlocked(db)
14af0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
14b00 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65   db->nVdbeActive
14b10 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f  >0 || db->autoCo
14b20 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e  mmit==0 || db->n
14b30 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a  Statement==0 );.
14b40 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d    return (p->rc=
14b50 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 3f 20 53  =SQLITE_BUSY ? S
14b60 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 53 51 4c  QLITE_BUSY : SQL
14b70 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  ITE_OK);.}.../*.
14b80 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c  ** Each VDBE hol
14b90 64 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ds the result of
14ba0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
14bb0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
14bc0 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63  call.** in p->rc
14bd0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
14be0 73 65 74 73 20 74 68 61 74 20 72 65 73 75 6c 74  sets that result
14bf0 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f   back to SQLITE_
14c00 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  OK..*/.void sqli
14c10 74 65 33 56 64 62 65 52 65 73 65 74 53 74 65 70  te3VdbeResetStep
14c20 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b  Result(Vdbe *p){
14c30 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
14c40 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
14c50 6f 70 79 20 74 68 65 20 65 72 72 6f 72 20 63 6f  opy the error co
14c60 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73  de and error mes
14c70 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74  sage belonging t
14c80 6f 20 74 68 65 20 56 44 42 45 20 70 61 73 73 65  o the VDBE passe
14c90 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73  d.** as the firs
14ca0 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 69 74  t argument to it
14cb0 73 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  s database handl
14cc0 65 20 28 73 6f 20 74 68 61 74 20 74 68 65 79 20  e (so that they 
14cd0 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75  will be .** retu
14ce0 72 6e 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f  rned by calls to
14cf0 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
14d00 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 65  () and sqlite3_e
14d10 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20  rrmsg())..**.** 
14d20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  This function do
14d30 65 73 20 6e 6f 74 20 63 6c 65 61 72 20 74 68 65  es not clear the
14d40 20 56 44 42 45 20 65 72 72 6f 72 20 63 6f 64 65   VDBE error code
14d50 20 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a 75 73   or message, jus
14d60 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68 65 6d  t.** copies them
14d70 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
14d80 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   handle..*/.int 
14d90 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73  sqlite3VdbeTrans
14da0 66 65 72 45 72 72 6f 72 28 56 64 62 65 20 2a 70  ferError(Vdbe *p
14db0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
14dc0 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20   = p->db;.  int 
14dd0 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66  rc = p->rc;.  if
14de0 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a  ( p->zErrMsg ){.
14df0 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 46 61 69      u8 mallocFai
14e00 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63  led = db->malloc
14e10 46 61 69 6c 65 64 3b 0a 20 20 20 20 73 71 6c 69  Failed;.    sqli
14e20 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
14e30 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66 28 20  lloc();.    if( 
14e40 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29 20 64 62  db->pErr==0 ) db
14e50 2d 3e 70 45 72 72 20 3d 20 73 71 6c 69 74 65 33  ->pErr = sqlite3
14e60 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20  ValueNew(db);.  
14e70 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
14e80 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d  tStr(db->pErr, -
14e90 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53  1, p->zErrMsg, S
14ea0 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
14eb0 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
14ec0 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
14ed0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
14ee0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
14ef0 64 20 3d 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  d = mallocFailed
14f00 3b 0a 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64  ;.    db->errCod
14f10 65 20 3d 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b  e = rc;.  }else{
14f20 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
14f30 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 7d 0a 20  r(db, rc);.  }. 
14f40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
14f50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
14f60 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a  BLE_SQLLOG./*.**
14f70 20 49 66 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f   If an SQLITE_CO
14f80 4e 46 49 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b  NFIG_SQLLOG hook
14f90 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20 61   is registered a
14fa0 6e 64 20 74 68 65 20 56 4d 20 68 61 73 20 62 65  nd the VM has be
14fb0 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f  en run, .** invo
14fc0 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ke it..*/.static
14fd0 20 76 6f 69 64 20 76 64 62 65 49 6e 76 6f 6b 65   void vdbeInvoke
14fe0 53 71 6c 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b  Sqllog(Vdbe *v){
14ff0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
15000 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c  obalConfig.xSqll
15010 6f 67 20 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c  og && v->rc==SQL
15020 49 54 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71  ITE_OK && v->zSq
15030 6c 20 26 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b  l && v->pc>=0 ){
15040 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 78 70 61  .    char *zExpa
15050 6e 64 65 64 20 3d 20 73 71 6c 69 74 65 33 56 64  nded = sqlite3Vd
15060 62 65 45 78 70 61 6e 64 53 71 6c 28 76 2c 20 76  beExpandSql(v, v
15070 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 61 73 73  ->zSql);.    ass
15080 65 72 74 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74  ert( v->db->init
15090 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20  .busy==0 );.    
150a0 69 66 28 20 7a 45 78 70 61 6e 64 65 64 20 29 7b  if( zExpanded ){
150b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
150c0 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c  obalConfig.xSqll
150d0 6f 67 28 0a 20 20 20 20 20 20 20 20 20 20 73 71  og(.          sq
150e0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
150f0 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d  g.pSqllogArg, v-
15100 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20  >db, zExpanded, 
15110 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  1.      );.     
15120 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76   sqlite3DbFree(v
15130 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 29  ->db, zExpanded)
15140 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
15150 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62  lse.# define vdb
15160 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29  eInvokeSqllog(x)
15170 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
15180 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45 20 61  lean up a VDBE a
15190 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62  fter execution b
151a0 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65  ut do not delete
151b0 20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20 79   the VDBE just y
151c0 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79  et..** Write any
151d0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
151e0 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20  into *pzErrMsg. 
151f0 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
15200 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41  lt code..**.** A
15210 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
15220 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44  e is run, the VD
15230 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61  BE should be rea
15240 64 79 20 74 6f 20 62 65 20 65 78 65 63 75 74 65  dy to be execute
15250 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a  d.** again..**.*
15260 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20  * To look at it 
15270 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69  another way, thi
15280 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73  s routine resets
15290 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
152a0 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63  e.** virtual mac
152b0 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d  hine from VDBE_M
152c0 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45  AGIC_RUN or VDBE
152d0 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b  _MAGIC_HALT back
152e0 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49   to.** VDBE_MAGI
152f0 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73  C_INIT..*/.int s
15300 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28  qlite3VdbeReset(
15310 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
15320 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20  te3 *db;.  db = 
15330 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  p->db;..  /* If 
15340 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72  the VM did not r
15350 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e  un to completion
15360 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e   or if it encoun
15370 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72  tered an.  ** er
15380 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67  ror, then it mig
15390 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  ht not have been
153a0 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79   halted properly
153b0 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20  .  So halt.  ** 
153c0 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73  it now..  */.  s
153d0 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70  qlite3VdbeHalt(p
153e0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
153f0 56 44 42 45 20 68 61 73 20 62 65 20 72 75 6e 20  VDBE has be run 
15400 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20  even partially, 
15410 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68  then transfer th
15420 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a  e error code.  *
15430 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73  * and error mess
15440 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42  age from the VDB
15450 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  E into the main 
15460 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
15470 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66  re.  But.  ** if
15480 20 74 68 65 20 56 44 42 45 20 68 61 73 20 6a 75   the VDBE has ju
15490 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72  st been set to r
154a0 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61  un but has not a
154b0 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64  ctually executed
154c0 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75   any.  ** instru
154d0 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76  ctions yet, leav
154e0 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  e the main datab
154f0 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d  ase error inform
15500 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e  ation unchanged.
15510 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
15520 63 3e 3d 30 20 29 7b 0a 20 20 20 20 76 64 62 65  c>=0 ){.    vdbe
15530 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 70 29 3b  InvokeSqllog(p);
15540 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15550 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28 70 29  TransferError(p)
15560 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
15570 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
15580 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72  sg);.    p->zErr
15590 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Msg = 0;.    if(
155a0 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20   p->runOnlyOnce 
155b0 29 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31  ) p->expired = 1
155c0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
155d0 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65  >rc && p->expire
155e0 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  d ){.    /* The 
155f0 65 78 70 69 72 65 64 20 66 6c 61 67 20 77 61 73  expired flag was
15600 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45   set on the VDBE
15610 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
15620 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f  t call.    ** to
15630 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e   sqlite3_step().
15640 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79   For consistency
15650 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f   (since sqlite3_
15660 73 74 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a  step() was.    *
15670 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74  * called), set t
15680 68 65 20 64 61 74 61 62 61 73 65 20 65 72 72 6f  he database erro
15690 72 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61  r in this case a
156a0 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20  s well..    */. 
156b0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57     sqlite3ErrorW
156c0 69 74 68 4d 73 67 28 64 62 2c 20 70 2d 3e 72 63  ithMsg(db, p->rc
156d0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 22  , p->zErrMsg ? "
156e0 25 73 22 20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72  %s" : 0, p->zErr
156f0 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Msg);.    sqlite
15700 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
15710 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e  ErrMsg);.    p->
15720 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d  zErrMsg = 0;.  }
15730 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61  ..  /* Reclaim a
15740 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  ll memory used b
15750 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a  y the VDBE.  */.
15760 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20    Cleanup(p);.. 
15770 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69   /* Save profili
15780 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
15790 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72 75  rom this VDBE ru
157a0 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56  n..  */.#ifdef V
157b0 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a  DBE_PROFILE.  {.
157c0 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20      FILE *out = 
157d0 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66  fopen("vdbe_prof
157e0 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a  ile.out", "a");.
157f0 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20      if( out ){. 
15800 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
15810 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
15820 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66  ---- ");.      f
15830 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
15840 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
15850 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30  fprintf(out, "%0
15860 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  2x", p->aOp[i].o
15870 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pcode);.      }.
15880 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
15890 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  t, "\n");.      
158a0 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20  if( p->zSql ){. 
158b0 20 20 20 20 20 20 20 63 68 61 72 20 63 2c 20 70         char c, p
158c0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66  c = 0;.        f
158d0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20  printf(out, "-- 
158e0 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ");.        for(
158f0 69 3d 30 3b 20 28 63 20 3d 20 70 2d 3e 7a 53 71  i=0; (c = p->zSq
15900 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a  l[i])!=0; i++){.
15910 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 63            if( pc
15920 3d 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66  =='\n' ) fprintf
15930 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20  (out, "-- ");.  
15940 20 20 20 20 20 20 20 20 70 75 74 63 28 63 2c 20          putc(c, 
15950 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  out);.          
15960 70 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  pc = c;.        
15970 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63  }.        if( pc
15980 21 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66  !='\n' ) fprintf
15990 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  (out, "\n");.   
159a0 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
159b0 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
159c0 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  +){.        char
159d0 20 7a 48 64 72 5b 31 30 30 5d 3b 0a 20 20 20 20   zHdr[100];.    
159e0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
159f0 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 48 64 72  intf(sizeof(zHdr
15a00 29 2c 20 7a 48 64 72 2c 20 22 25 36 75 20 25 31  ), zHdr, "%6u %1
15a10 32 6c 6c 75 20 25 38 6c 6c 75 20 22 2c 0a 20 20  2llu %8llu ",.  
15a20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b           p->aOp[
15a30 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20  i].cnt,.        
15a40 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63     p->aOp[i].cyc
15a50 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  les,.           
15a60 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20  p->aOp[i].cnt>0 
15a70 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c  ? p->aOp[i].cycl
15a80 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74  es/p->aOp[i].cnt
15a90 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a   : 0.        );.
15aa0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
15ab0 6f 75 74 2c 20 22 25 73 22 2c 20 7a 48 64 72 29  out, "%s", zHdr)
15ac0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15ad0 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74  3VdbePrintOp(out
15ae0 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29  , i, &p->aOp[i])
15af0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15b00 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20  fclose(out);.   
15b10 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
15b20 70 2d 3e 69 43 75 72 72 65 6e 74 54 69 6d 65 20  p->iCurrentTime 
15b30 3d 20 30 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20  = 0;.  p->magic 
15b40 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  = VDBE_MAGIC_INI
15b50 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72  T;.  return p->r
15b60 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b  c & db->errMask;
15b70 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  .}. ./*.** Clean
15b80 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61   up and delete a
15b90 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63   VDBE after exec
15ba0 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61  ution.  Return a
15bb0 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
15bc0 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  is.** the result
15bd0 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e   code.  Write an
15be0 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  y error message 
15bf0 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72  text into *pzErr
15c00 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Msg..*/.int sqli
15c10 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28  te3VdbeFinalize(
15c20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
15c30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15c40 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d    if( p->magic==
15c50 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c  VDBE_MAGIC_RUN |
15c60 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  | p->magic==VDBE
15c70 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20  _MAGIC_HALT ){. 
15c80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
15c90 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20  dbeReset(p);.   
15ca0 20 61 73 73 65 72 74 28 20 28 72 63 20 26 20 70   assert( (rc & p
15cb0 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d  ->db->errMask)==
15cc0 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rc );.  }.  sqli
15cd0 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 70 29  te3VdbeDelete(p)
15ce0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
15cf0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ../*.** If param
15d00 65 74 65 72 20 69 4f 70 20 69 73 20 6c 65 73 73  eter iOp is less
15d10 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
15d20 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74   invoke the dest
15d30 72 75 63 74 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c  ructor for.** al
15d40 6c 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  l auxiliary data
15d50 20 70 6f 69 6e 74 65 72 73 20 63 75 72 72 65 6e   pointers curren
15d60 74 6c 79 20 63 61 63 68 65 64 20 62 79 20 74 68  tly cached by th
15d70 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 0a 2a  e VM passed as.*
15d80 2a 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  * the first argu
15d90 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  ment..**.** Or, 
15da0 69 66 20 69 4f 70 20 69 73 20 67 72 65 61 74 65  if iOp is greate
15db0 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
15dc0 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  to zero, then th
15dd0 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a  e destructor is.
15de0 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20  ** only invoked 
15df0 66 6f 72 20 74 68 6f 73 65 20 61 75 78 69 6c 69  for those auxili
15e00 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72  ary data pointer
15e10 73 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65  s created by the
15e20 20 75 73 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69   user .** functi
15e30 6f 6e 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68  on invoked by th
15e40 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70  e OP_Function op
15e50 63 6f 64 65 20 61 74 20 69 6e 73 74 72 75 63 74  code at instruct
15e60 69 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a 20 56  ion iOp of .** V
15e70 4d 20 70 56 64 62 65 2c 20 61 6e 64 20 6f 6e 6c  M pVdbe, and onl
15e80 79 20 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a  y then if:.**.**
15e90 20 20 20 20 2a 20 74 68 65 20 61 73 73 6f 63 69      * the associ
15ea0 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20 70 61  ated function pa
15eb0 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 33  rameter is the 3
15ec0 32 6e 64 20 6f 72 20 6c 61 74 65 72 20 28 63 6f  2nd or later (co
15ed0 75 6e 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66  unting.**      f
15ee0 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
15ef0 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20  t), or.**.**    
15f00 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  * the correspond
15f10 69 6e 67 20 62 69 74 20 69 6e 20 61 72 67 75 6d  ing bit in argum
15f20 65 6e 74 20 6d 61 73 6b 20 69 73 20 63 6c 65 61  ent mask is clea
15f30 72 20 28 77 68 65 72 65 20 74 68 65 20 66 69 72  r (where the fir
15f40 73 74 0a 2a 2a 20 20 20 20 20 20 66 75 6e 63 74  st.**      funct
15f50 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 63 6f  ion parameter co
15f60 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 62 69 74  rresponds to bit
15f70 20 30 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69   0 etc.)..*/.voi
15f80 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
15f90 65 74 65 41 75 78 44 61 74 61 28 56 64 62 65 20  eteAuxData(Vdbe 
15fa0 2a 70 56 64 62 65 2c 20 69 6e 74 20 69 4f 70 2c  *pVdbe, int iOp,
15fb0 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 41 75   int mask){.  Au
15fc0 78 44 61 74 61 20 2a 2a 70 70 20 3d 20 26 70 56  xData **pp = &pV
15fd0 64 62 65 2d 3e 70 41 75 78 44 61 74 61 3b 0a 20  dbe->pAuxData;. 
15fe0 20 77 68 69 6c 65 28 20 2a 70 70 20 29 7b 0a 20   while( *pp ){. 
15ff0 20 20 20 41 75 78 44 61 74 61 20 2a 70 41 75 78     AuxData *pAux
16000 20 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66 28 20   = *pp;.    if( 
16010 28 69 4f 70 3c 30 29 0a 20 20 20 20 20 7c 7c 20  (iOp<0).     || 
16020 28 70 41 75 78 2d 3e 69 4f 70 3d 3d 69 4f 70 20  (pAux->iOp==iOp 
16030 26 26 20 28 70 41 75 78 2d 3e 69 41 72 67 3e 33  && (pAux->iArg>3
16040 31 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20 4d 41  1 || !(mask & MA
16050 53 4b 42 49 54 33 32 28 70 41 75 78 2d 3e 69 41  SKBIT32(pAux->iA
16060 72 67 29 29 29 29 0a 20 20 20 20 29 7b 0a 20 20  rg)))).    ){.  
16070 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 41      testcase( pA
16080 75 78 2d 3e 69 41 72 67 3d 3d 33 31 20 29 3b 0a  ux->iArg==31 );.
16090 20 20 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e        if( pAux->
160a0 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  xDelete ){.     
160b0 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65     pAux->xDelete
160c0 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20  (pAux->pAux);.  
160d0 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20      }.      *pp 
160e0 3d 20 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20  = pAux->pNext;. 
160f0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
16100 65 65 28 70 56 64 62 65 2d 3e 64 62 2c 20 70 41  ee(pVdbe->db, pA
16110 75 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ux);.    }else{.
16120 20 20 20 20 20 20 70 70 3d 20 26 70 41 75 78 2d        pp= &pAux-
16130 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
16140 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
16150 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  all memory assoc
16160 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
16170 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dbe passed as th
16180 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
16190 74 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66 6f 72  t,.** except for
161a0 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2c 20   object itself, 
161b0 77 68 69 63 68 20 69 73 20 70 72 65 73 65 72 76  which is preserv
161c0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  ed..**.** The di
161d0 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
161e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
161f0 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  nd sqlite3VdbeDe
16200 6c 65 74 65 28 29 20 69 73 20 74 68 61 74 0a 2a  lete() is that.*
16210 2a 20 56 64 62 65 44 65 6c 65 74 65 28 29 20 61  * VdbeDelete() a
16220 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20  lso unlinks the 
16230 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20 6c 69  Vdbe from the li
16240 73 74 20 6f 66 20 56 4d 73 20 61 73 73 6f 63 69  st of VMs associ
16250 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65  ated with.** the
16260 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
16270 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 73 20 74  tion and frees t
16280 68 65 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66  he object itself
16290 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
162a0 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74  3VdbeClearObject
162b0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64  (sqlite3 *db, Vd
162c0 62 65 20 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f  be *p){.  SubPro
162d0 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65  gram *pSub, *pNe
162e0 78 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  xt;.  int i;.  a
162f0 73 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20  ssert( p->db==0 
16300 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a  || p->db==db );.
16310 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
16320 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56  y(p->aVar, p->nV
16330 61 72 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65  ar);.  releaseMe
16340 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61  mArray(p->aColNa
16350 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  me, p->nResColum
16360 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20  n*COLNAME_N);.  
16370 66 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f  for(pSub=p->pPro
16380 67 72 61 6d 3b 20 70 53 75 62 3b 20 70 53 75 62  gram; pSub; pSub
16390 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
163a0 78 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74  xt = pSub->pNext
163b0 3b 0a 20 20 20 20 76 64 62 65 46 72 65 65 4f 70  ;.    vdbeFreeOp
163c0 41 72 72 61 79 28 64 62 2c 20 70 53 75 62 2d 3e  Array(db, pSub->
163d0 61 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b  aOp, pSub->nOp);
163e0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
163f0 65 65 28 64 62 2c 20 70 53 75 62 29 3b 0a 20 20  ee(db, pSub);.  
16400 7d 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 7a 56  }.  for(i=p->nzV
16410 61 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ar-1; i>=0; i--)
16420 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
16430 62 2c 20 70 2d 3e 61 7a 56 61 72 5b 69 5d 29 3b  b, p->azVar[i]);
16440 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
16450 28 64 62 2c 20 70 2d 3e 61 7a 56 61 72 29 3b 0a  (db, p->azVar);.
16460 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61    vdbeFreeOpArra
16470 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d  y(db, p->aOp, p-
16480 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  >nOp);.  sqlite3
16490 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43  DbFree(db, p->aC
164a0 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  olName);.  sqlit
164b0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
164c0 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  zSql);.  sqlite3
164d0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46  DbFree(db, p->pF
164e0 72 65 65 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  ree);.#ifdef SQL
164f0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
16500 53 43 41 4e 53 54 41 54 55 53 0a 20 20 66 6f 72  SCANSTATUS.  for
16510 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 63 61 6e  (i=0; i<p->nScan
16520 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
16530 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
16540 3e 61 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d 65 29  >aScan[i].zName)
16550 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
16560 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63  bFree(db, p->aSc
16570 61 6e 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  an);.#endif.}../
16580 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65  *.** Delete an e
16590 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76  ntire VDBE..*/.v
165a0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  oid sqlite3VdbeD
165b0 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a  elete(Vdbe *p){.
165c0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
165d0 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30    if( NEVER(p==0
165e0 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62  ) ) return;.  db
165f0 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
16600 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
16610 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
16620 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ) );.  sqlite3Vd
16630 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 64 62  beClearObject(db
16640 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  , p);.  if( p->p
16650 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Prev ){.    p->p
16660 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
16670 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b  >pNext;.  }else{
16680 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
16690 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20  >pVdbe==p );.   
166a0 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e   db->pVdbe = p->
166b0 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pNext;.  }.  if(
166c0 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
166d0 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
166e0 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d   = p->pPrev;.  }
166f0 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
16700 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20  BE_MAGIC_DEAD;. 
16710 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71   p->db = 0;.  sq
16720 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
16730 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  p);.}../*.** The
16740 20 63 75 72 73 6f 72 20 22 70 22 20 68 61 73 20   cursor "p" has 
16750 61 20 70 65 6e 64 69 6e 67 20 73 65 65 6b 20 6f  a pending seek o
16760 70 65 72 61 74 69 6f 6e 20 74 68 61 74 20 68 61  peration that ha
16770 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a  s not yet been.*
16780 2a 20 63 61 72 72 69 65 64 20 6f 75 74 2e 20 20  * carried out.  
16790 53 65 65 6b 20 74 68 65 20 63 75 72 73 6f 72 20  Seek the cursor 
167a0 6e 6f 77 2e 20 20 49 66 20 61 6e 20 65 72 72 6f  now.  If an erro
167b0 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
167c0 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69  .** the appropri
167d0 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ate error code..
167e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
167f0 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61  LITE_NOINLINE ha
16800 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65  ndleDeferredMove
16810 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70  to(VdbeCursor *p
16820 29 7b 0a 20 20 69 6e 74 20 72 65 73 2c 20 72 63  ){.  int res, rc
16830 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
16840 54 45 53 54 0a 20 20 65 78 74 65 72 6e 20 69 6e  TEST.  extern in
16850 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68  t sqlite3_search
16860 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20  _count;.#endif. 
16870 20 61 73 73 65 72 74 28 20 70 2d 3e 64 65 66 65   assert( p->defe
16880 72 72 65 64 4d 6f 76 65 74 6f 20 29 3b 0a 20 20  rredMoveto );.  
16890 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62  assert( p->isTab
168a0 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  le );.  assert( 
168b0 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  p->eCurType==CUR
168c0 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
168d0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
168e0 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
168f0 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 30  p->uc.pCursor, 0
16900 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65  , p->movetoTarge
16910 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 69  t, 0, &res);.  i
16920 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
16930 63 3b 0a 20 20 69 66 28 20 72 65 73 21 3d 30 20  c;.  if( res!=0 
16940 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
16950 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 23 69  CORRUPT_BKPT;.#i
16960 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
16970 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63  .  sqlite3_searc
16980 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69  h_count++;.#endi
16990 66 0a 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d  f.  p->deferredM
169a0 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e  oveto = 0;.  p->
169b0 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
169c0 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 72 65 74  CHE_STALE;.  ret
169d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
169e0 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e  ../*.** Somethin
169f0 67 20 68 61 73 20 6d 6f 76 65 64 20 63 75 72 73  g has moved curs
16a00 6f 72 20 22 70 22 20 6f 75 74 20 6f 66 20 70 6c  or "p" out of pl
16a10 61 63 65 2e 20 20 4d 61 79 62 65 20 74 68 65 20  ace.  Maybe the 
16a20 72 6f 77 20 69 74 20 77 61 73 0a 2a 2a 20 70 6f  row it was.** po
16a30 69 6e 74 65 64 20 74 6f 20 77 61 73 20 64 65 6c  inted to was del
16a40 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
16a50 64 65 72 20 69 74 2e 20 20 4f 72 20 6d 61 79 62  der it.  Or mayb
16a60 65 20 74 68 65 20 62 74 72 65 65 20 77 61 73 0a  e the btree was.
16a70 2a 2a 20 72 65 62 61 6c 61 6e 63 65 64 2e 20 20  ** rebalanced.  
16a80 57 68 61 74 65 76 65 72 20 74 68 65 20 63 61 75  Whatever the cau
16a90 73 65 2c 20 74 72 79 20 74 6f 20 72 65 73 74 6f  se, try to resto
16aa0 72 65 20 22 70 22 20 74 6f 20 74 68 65 20 70 6c  re "p" to the pl
16ab0 61 63 65 20 69 74 0a 2a 2a 20 69 73 20 73 75 70  ace it.** is sup
16ac0 70 6f 73 65 64 20 74 6f 20 62 65 20 70 6f 69 6e  posed to be poin
16ad0 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72 6f  ting.  If the ro
16ae0 77 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75  w was deleted ou
16af0 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
16b00 0a 2a 2a 20 63 75 72 73 6f 72 2c 20 73 65 74 20  .** cursor, set 
16b10 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f  the cursor to po
16b20 69 6e 74 20 74 6f 20 61 20 4e 55 4c 4c 20 72 6f  int to a NULL ro
16b30 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  w..*/.static int
16b40 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
16b50 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73   handleMovedCurs
16b60 6f 72 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70  or(VdbeCursor *p
16b70 29 7b 0a 20 20 69 6e 74 20 69 73 44 69 66 66 65  ){.  int isDiffe
16b80 72 65 6e 74 52 6f 77 2c 20 72 63 3b 0a 20 20 61  rentRow, rc;.  a
16b90 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79  ssert( p->eCurTy
16ba0 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
16bb0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
16bc0 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20  ->uc.pCursor!=0 
16bd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
16be0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
16bf0 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43  asMoved(p->uc.pC
16c00 75 72 73 6f 72 29 20 29 3b 0a 20 20 72 63 20 3d  ursor) );.  rc =
16c10 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
16c20 73 6f 72 52 65 73 74 6f 72 65 28 70 2d 3e 75 63  sorRestore(p->uc
16c30 2e 70 43 75 72 73 6f 72 2c 20 26 69 73 44 69 66  .pCursor, &isDif
16c40 66 65 72 65 6e 74 52 6f 77 29 3b 0a 20 20 70 2d  ferentRow);.  p-
16c50 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
16c60 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66  ACHE_STALE;.  if
16c70 28 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77  ( isDifferentRow
16c80 20 29 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20   ) p->nullRow = 
16c90 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  1;.  return rc;.
16ca0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
16cb0 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
16cc0 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69  e cursor is vali
16cd0 64 2e 20 20 52 65 73 74 6f 72 65 20 74 68 65 20  d.  Restore the 
16ce0 63 75 72 73 6f 72 0a 2a 2a 20 69 66 20 6e 65 65  cursor.** if nee
16cf0 64 20 62 65 2e 20 20 52 65 74 75 72 6e 20 61 6e  d be.  Return an
16d00 79 20 49 2f 4f 20 65 72 72 6f 72 20 66 72 6f 6d  y I/O error from
16d10 20 74 68 65 20 72 65 73 74 6f 72 65 20 6f 70 65   the restore ope
16d20 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  ration..*/.int s
16d30 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72  qlite3VdbeCursor
16d40 52 65 73 74 6f 72 65 28 56 64 62 65 43 75 72 73  Restore(VdbeCurs
16d50 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  or *p){.  assert
16d60 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43  ( p->eCurType==C
16d70 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
16d80 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
16d90 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
16da0 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20  (p->uc.pCursor) 
16db0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61  ){.    return ha
16dc0 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28  ndleMovedCursor(
16dd0 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
16de0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
16df0 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
16e00 68 65 20 63 75 72 73 6f 72 20 70 20 69 73 20 72  he cursor p is r
16e10 65 61 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20  eady to read or 
16e20 77 72 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f  write the row to
16e30 20 77 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73   which it.** was
16e40 20 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64   last positioned
16e50 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  .  Return an err
16e60 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f  or code if an OO
16e70 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65  M fault or I/O e
16e80 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73  rror.** prevents
16e90 20 75 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f   us from positio
16ea0 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20  ning the cursor 
16eb0 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 70  to its correct p
16ec0 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  osition..**.** I
16ed0 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61  f a MoveTo opera
16ee0 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20  tion is pending 
16ef0 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72  on the given cur
16f00 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61  sor, then do tha
16f10 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e  t.** MoveTo now.
16f20 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20    If no move is 
16f30 70 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74  pending, check t
16f40 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 6f 77  o see if the row
16f50 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c   has been.** del
16f60 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
16f70 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 20 61  der the cursor a
16f80 6e 64 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61  nd if it has, ma
16f90 72 6b 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a  rk the row as.**
16fa0 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a   a NULL row..**.
16fb0 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  ** If the cursor
16fc0 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e   is already poin
16fd0 74 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72  ting to the corr
16fe0 65 63 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74  ect row and that
16ff0 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20   row has.** not 
17000 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74  been deleted out
17010 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20   from under the 
17020 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69  cursor, then thi
17030 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
17040 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
17050 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f  ite3VdbeCursorMo
17060 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20  veto(VdbeCursor 
17070 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 65 43  *p){.  if( p->eC
17080 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
17090 42 54 52 45 45 20 29 7b 0a 20 20 20 20 69 66 28  BTREE ){.    if(
170a0 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65   p->deferredMove
170b0 74 6f 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  to ){.      retu
170c0 72 6e 20 68 61 6e 64 6c 65 44 65 66 65 72 72 65  rn handleDeferre
170d0 64 4d 6f 76 65 74 6f 28 70 29 3b 0a 20 20 20 20  dMoveto(p);.    
170e0 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
170f0 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
17100 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73  oved(p->uc.pCurs
17110 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  or) ){.      ret
17120 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43  urn handleMovedC
17130 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 7d 0a  ursor(p);.    }.
17140 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
17150 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
17160 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
17170 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  unctions:.**.** 
17180 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
17190 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74  lType().** sqlit
171a0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
171b0 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Len().** sqlite3
171c0 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a  VdbeSerialLen().
171d0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
171e0 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c  rialPut().** sql
171f0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
17200 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73  t().**.** encaps
17210 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  ulate the code t
17220 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76  hat serializes v
17230 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67  alues for storag
17240 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64  e in SQLite.** d
17250 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65  ata and index re
17260 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69  cords. Each seri
17270 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e  alized value con
17280 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73  sists of a.** 's
17290 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20  erial-type' and 
172a0 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20  a blob of data. 
172b0 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  The serial type 
172c0 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73  is an 8-byte uns
172d0 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72  igned.** integer
172e0 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61  , stored as a va
172f0 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61  rint..**.** In a
17300 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72  n SQLite index r
17310 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61  ecord, the seria
17320 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64  l type is stored
17330 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65   directly before
17340 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20  .** the blob of 
17350 64 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72  data that it cor
17360 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20  responds to. In 
17370 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20  a table record, 
17380 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79  all serial.** ty
17390 70 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61  pes are stored a
173a0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
173b0 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74  he record, and t
173c0 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61  he blobs of data
173d0 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20   at.** the end. 
173e0 48 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63  Hence these func
173f0 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20  tions allow the 
17400 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65  caller to handle
17410 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74   the.** serial-t
17420 79 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f  ype and data blo
17430 62 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2a  b separately..**
17440 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
17450 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65  g table describe
17460 73 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74  s the various st
17470 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f  orage classes fo
17480 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20  r data:.**.**   
17490 73 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20  serial type     
174a0 20 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61     bytes of data
174b0 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20        type.**   
174c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
174d0 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
174e0 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --    ----------
174f0 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20  -----.**      0 
17500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17510 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
17520 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20   NULL.**      1 
17530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17540 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
17550 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
17560 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20  **      2       
17570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20                2 
17580 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
17590 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
175a0 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20    3             
175b0 20 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20          3       
175c0 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
175d0 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20  ger.**      4   
175e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175f0 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73    4            s
17600 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
17610 20 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20        5         
17620 20 20 20 20 20 20 20 20 20 20 20 20 36 20 20 20              6   
17630 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
17640 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
17650 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6               
17660 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
17670 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
17680 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20  r.**      7     
17690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176a0 38 20 20 20 20 20 20 20 20 20 20 20 20 49 45 45  8            IEE
176b0 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20  E float.**      
176c0 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  8               
176d0 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
176e0 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74     Integer const
176f0 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20  ant 0.**      9 
17700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17710 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
17720 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   Integer constan
17730 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31  t 1.**     10,11
17740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
17760 65 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 61  eserved for expa
17770 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31  nsion.**    N>=1
17780 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20  2 and even      
17790 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20   (N-12)/2       
177a0 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31   BLOB.**    N>=1
177b0 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20  3 and odd       
177c0 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20   (N-13)/2       
177d0 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20   text.**.** The 
177e0 38 20 61 6e 64 20 39 20 74 79 70 65 73 20 77 65  8 and 9 types we
177f0 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e  re added in 3.3.
17800 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34  0, file format 4
17810 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e  .  Prior version
17820 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77  s.** of SQLite w
17830 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61  ill not understa
17840 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20  nd those serial 
17850 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  types..*/../*.**
17860 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 72 69   Return the seri
17870 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20  al-type for the 
17880 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
17890 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  pMem..*/.u32 sql
178a0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
178b0 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e  pe(Mem *pMem, in
178c0 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 75  t file_format, u
178d0 33 32 20 2a 70 4c 65 6e 29 7b 0a 20 20 69 6e 74  32 *pLen){.  int
178e0 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66   flags = pMem->f
178f0 6c 61 67 73 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a  lags;.  u32 n;..
17900 20 20 61 73 73 65 72 74 28 20 70 4c 65 6e 21 3d    assert( pLen!=
17910 30 20 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  0 );.  if( flags
17920 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20  &MEM_Null ){.   
17930 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20   *pLen = 0;.    
17940 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
17950 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e  if( flags&MEM_In
17960 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75  t ){.    /* Figu
17970 72 65 20 6f 75 74 20 77 68 65 74 68 65 72 20 74  re out whether t
17980 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36  o use 1, 2, 4, 6
17990 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a   or 8 bytes. */.
179a0 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36  #   define MAX_6
179b0 42 59 54 45 20 28 28 28 28 69 36 34 29 30 78 30  BYTE ((((i64)0x0
179c0 30 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29  0008000)<<32)-1)
179d0 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65  .    i64 i = pMe
179e0 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20  m->u.i;.    u64 
179f0 75 3b 0a 20 20 20 20 69 66 28 20 69 3c 30 20 29  u;.    if( i<0 )
17a00 7b 0a 20 20 20 20 20 20 75 20 3d 20 7e 69 3b 0a  {.      u = ~i;.
17a10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17a20 20 75 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20   u = i;.    }.  
17a30 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a    if( u<=127 ){.
17a40 20 20 20 20 20 20 69 66 28 20 28 69 26 31 29 3d        if( (i&1)=
17a50 3d 69 20 26 26 20 66 69 6c 65 5f 66 6f 72 6d 61  =i && file_forma
17a60 74 3e 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20  t>=4 ){.        
17a70 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  *pLen = 0;.     
17a80 20 20 20 72 65 74 75 72 6e 20 38 2b 28 75 33 32     return 8+(u32
17a90 29 75 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  )u;.      }else{
17aa0 0a 20 20 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d  .        *pLen =
17ab0 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   1;.        retu
17ac0 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
17ad0 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 33    }.    if( u<=3
17ae0 32 37 36 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20  2767 ){ *pLen = 
17af0 32 3b 20 72 65 74 75 72 6e 20 32 3b 20 7d 0a 20  2; return 2; }. 
17b00 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30     if( u<=838860
17b10 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 33 3b 20  7 ){ *pLen = 3; 
17b20 72 65 74 75 72 6e 20 33 3b 20 7d 0a 20 20 20 20  return 3; }.    
17b30 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34  if( u<=214748364
17b40 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 34 3b 20  7 ){ *pLen = 4; 
17b50 72 65 74 75 72 6e 20 34 3b 20 7d 0a 20 20 20 20  return 4; }.    
17b60 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45  if( u<=MAX_6BYTE
17b70 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 36 3b 20 72   ){ *pLen = 6; r
17b80 65 74 75 72 6e 20 35 3b 20 7d 0a 20 20 20 20 2a  eturn 5; }.    *
17b90 70 4c 65 6e 20 3d 20 38 3b 0a 20 20 20 20 72 65  pLen = 8;.    re
17ba0 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66  turn 6;.  }.  if
17bb0 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c  ( flags&MEM_Real
17bc0 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20   ){.    *pLen = 
17bd0 38 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b  8;.    return 7;
17be0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
17bf0 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  Mem->db->mallocF
17c00 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26 28  ailed || flags&(
17c10 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62  MEM_Str|MEM_Blob
17c20 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
17c30 4d 65 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e  Mem->n>=0 );.  n
17c40 20 3d 20 28 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b   = (u32)pMem->n;
17c50 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d  .  if( flags & M
17c60 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e  EM_Zero ){.    n
17c70 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72   += pMem->u.nZer
17c80 6f 3b 0a 20 20 7d 0a 20 20 2a 70 4c 65 6e 20 3d  o;.  }.  *pLen =
17c90 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e   n;.  return ((n
17ca0 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61  *2) + 12 + ((fla
17cb0 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29  gs&MEM_Str)!=0))
17cc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
17cd0 69 7a 65 73 20 66 6f 72 20 73 65 72 69 61 6c 20  izes for serial 
17ce0 74 79 70 65 73 20 6c 65 73 73 20 74 68 61 6e 20  types less than 
17cf0 31 32 38 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  128.*/.static co
17d00 6e 73 74 20 75 38 20 73 71 6c 69 74 65 33 53 6d  nst u8 sqlite3Sm
17d10 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 5d 20 3d  allTypeSizes[] =
17d20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 20 30   {.        /*  0
17d30 20 20 20 31 20 20 20 32 20 20 20 33 20 20 20 34     1   2   3   4
17d40 20 20 20 35 20 20 20 36 20 20 20 37 20 20 20 38     5   6   7   8
17d50 20 20 20 39 20 2a 2f 20 20 20 0a 2f 2a 20 20 20     9 */   ./*   
17d60 30 20 2a 2f 20 20 20 30 2c 20 20 31 2c 20 20 32  0 */   0,  1,  2
17d70 2c 20 20 33 2c 20 20 34 2c 20 20 36 2c 20 20 38  ,  3,  4,  6,  8
17d80 2c 20 20 38 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a  ,  8,  0,  0,./*
17d90 20 20 31 30 20 2a 2f 20 20 20 30 2c 20 20 30 2c    10 */   0,  0,
17da0 20 20 30 2c 20 20 30 2c 20 20 31 2c 20 20 31 2c    0,  0,  1,  1,
17db0 20 20 32 2c 20 20 32 2c 20 20 33 2c 20 20 33 2c    2,  2,  3,  3,
17dc0 0a 2f 2a 20 20 32 30 20 2a 2f 20 20 20 34 2c 20  ./*  20 */   4, 
17dd0 20 34 2c 20 20 35 2c 20 20 35 2c 20 20 36 2c 20   4,  5,  5,  6, 
17de0 20 36 2c 20 20 37 2c 20 20 37 2c 20 20 38 2c 20   6,  7,  7,  8, 
17df0 20 38 2c 0a 2f 2a 20 20 33 30 20 2a 2f 20 20 20   8,./*  30 */   
17e00 39 2c 20 20 39 2c 20 31 30 2c 20 31 30 2c 20 31  9,  9, 10, 10, 1
17e10 31 2c 20 31 31 2c 20 31 32 2c 20 31 32 2c 20 31  1, 11, 12, 12, 1
17e20 33 2c 20 31 33 2c 0a 2f 2a 20 20 34 30 20 2a 2f  3, 13,./*  40 */
17e30 20 20 31 34 2c 20 31 34 2c 20 31 35 2c 20 31 35    14, 14, 15, 15
17e40 2c 20 31 36 2c 20 31 36 2c 20 31 37 2c 20 31 37  , 16, 16, 17, 17
17e50 2c 20 31 38 2c 20 31 38 2c 0a 2f 2a 20 20 35 30  , 18, 18,./*  50
17e60 20 2a 2f 20 20 31 39 2c 20 31 39 2c 20 32 30 2c   */  19, 19, 20,
17e70 20 32 30 2c 20 32 31 2c 20 32 31 2c 20 32 32 2c   20, 21, 21, 22,
17e80 20 32 32 2c 20 32 33 2c 20 32 33 2c 0a 2f 2a 20   22, 23, 23,./* 
17e90 20 36 30 20 2a 2f 20 20 32 34 2c 20 32 34 2c 20   60 */  24, 24, 
17ea0 32 35 2c 20 32 35 2c 20 32 36 2c 20 32 36 2c 20  25, 25, 26, 26, 
17eb0 32 37 2c 20 32 37 2c 20 32 38 2c 20 32 38 2c 0a  27, 27, 28, 28,.
17ec0 2f 2a 20 20 37 30 20 2a 2f 20 20 32 39 2c 20 32  /*  70 */  29, 2
17ed0 39 2c 20 33 30 2c 20 33 30 2c 20 33 31 2c 20 33  9, 30, 30, 31, 3
17ee0 31 2c 20 33 32 2c 20 33 32 2c 20 33 33 2c 20 33  1, 32, 32, 33, 3
17ef0 33 2c 0a 2f 2a 20 20 38 30 20 2a 2f 20 20 33 34  3,./*  80 */  34
17f00 2c 20 33 34 2c 20 33 35 2c 20 33 35 2c 20 33 36  , 34, 35, 35, 36
17f10 2c 20 33 36 2c 20 33 37 2c 20 33 37 2c 20 33 38  , 36, 37, 37, 38
17f20 2c 20 33 38 2c 0a 2f 2a 20 20 39 30 20 2a 2f 20  , 38,./*  90 */ 
17f30 20 33 39 2c 20 33 39 2c 20 34 30 2c 20 34 30 2c   39, 39, 40, 40,
17f40 20 34 31 2c 20 34 31 2c 20 34 32 2c 20 34 32 2c   41, 41, 42, 42,
17f50 20 34 33 2c 20 34 33 2c 0a 2f 2a 20 31 30 30 20   43, 43,./* 100 
17f60 2a 2f 20 20 34 34 2c 20 34 34 2c 20 34 35 2c 20  */  44, 44, 45, 
17f70 34 35 2c 20 34 36 2c 20 34 36 2c 20 34 37 2c 20  45, 46, 46, 47, 
17f80 34 37 2c 20 34 38 2c 20 34 38 2c 0a 2f 2a 20 31  47, 48, 48,./* 1
17f90 31 30 20 2a 2f 20 20 34 39 2c 20 34 39 2c 20 35  10 */  49, 49, 5
17fa0 30 2c 20 35 30 2c 20 35 31 2c 20 35 31 2c 20 35  0, 50, 51, 51, 5
17fb0 32 2c 20 35 32 2c 20 35 33 2c 20 35 33 2c 0a 2f  2, 52, 53, 53,./
17fc0 2a 20 31 32 30 20 2a 2f 20 20 35 34 2c 20 35 34  * 120 */  54, 54
17fd0 2c 20 35 35 2c 20 35 35 2c 20 35 36 2c 20 35 36  , 55, 55, 56, 56
17fe0 2c 20 35 37 2c 20 35 37 0a 7d 3b 0a 0a 2f 2a 0a  , 57, 57.};../*.
17ff0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65  ** Return the le
18000 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 61  ngth of the data
18010 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
18020 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 73  o the supplied s
18030 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75  erial-type..*/.u
18040 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
18050 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20  rialTypeLen(u32 
18060 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20  serial_type){.  
18070 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
18080 3d 31 32 38 20 29 7b 0a 20 20 20 20 72 65 74 75  =128 ){.    retu
18090 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d  rn (serial_type-
180a0 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a  12)/2;.  }else{.
180b0 20 20 20 20 61 73 73 65 72 74 28 20 73 65 72 69      assert( seri
180c0 61 6c 5f 74 79 70 65 3c 31 32 20 0a 20 20 20 20  al_type<12 .    
180d0 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
180e0 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73  e3SmallTypeSizes
180f0 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3d 3d 28  [serial_type]==(
18100 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32  serial_type - 12
18110 29 2f 32 20 29 3b 0a 20 20 20 20 72 65 74 75 72  )/2 );.    retur
18120 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79  n sqlite3SmallTy
18130 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74  peSizes[serial_t
18140 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 75 38 20 73  ype];.  }.}.u8 s
18150 71 6c 69 74 65 33 56 64 62 65 4f 6e 65 42 79 74  qlite3VdbeOneByt
18160 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75  eSerialTypeLen(u
18170 38 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a  8 serial_type){.
18180 20 20 61 73 73 65 72 74 28 20 73 65 72 69 61 6c    assert( serial
18190 5f 74 79 70 65 3c 31 32 38 20 29 3b 0a 20 20 72  _type<128 );.  r
181a0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 6d 61  eturn sqlite3Sma
181b0 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69  llTypeSizes[seri
181c0 61 6c 5f 74 79 70 65 5d 3b 20 20 0a 7d 0a 0a 2f  al_type];  .}../
181d0 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f  *.** If we are o
181e0 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74 75 72  n an architectur
181f0 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64  e with mixed-end
18200 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a  ian floating .**
18210 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d   points (ex: ARM
18220 37 29 20 74 68 65 6e 20 73 77 61 70 20 74 68 65  7) then swap the
18230 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20 77   lower 4 bytes w
18240 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65  ith the .** uppe
18250 72 20 34 20 62 79 74 65 73 2e 20 20 52 65 74 75  r 4 bytes.  Retu
18260 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  rn the result..*
18270 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72  *.** For most ar
18280 63 68 69 74 65 63 74 75 72 65 73 2c 20 74 68 69  chitectures, thi
18290 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s is a no-op..**
182a0 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74  .** (later):  It
182b0 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20   is reported to 
182c0 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69 78 65  me that the mixe
182d0 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d  d-endian problem
182e0 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61  .** on ARM7 is a
182f0 6e 20 69 73 73 75 65 20 77 69 74 68 20 47 43 43  n issue with GCC
18300 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41  , not with the A
18310 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73 65  RM7 chip.  It se
18320 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c  ems.** that earl
18330 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  y versions of GC
18340 43 20 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f  C stored the two
18350 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62   words of a 64-b
18360 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74  it.** float in t
18370 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20  he wrong order. 
18380 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20   And that error 
18390 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61  has been propaga
183a0 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63  ted.** ever sinc
183b0 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73  e.  The blame is
183c0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
183d0 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67   with GCC, thoug
183e0 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20  h..** GCC might 
183f0 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e  have just copyin
18400 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72  g the problem fr
18410 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69  om a prior compi
18420 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73  ler..** I am als
18430 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65  o told that newe
18440 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  r versions of GC
18450 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20  C that follow a 
18460 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49  different.** ABI
18470 20 67 65 74 20 74 68 65 20 62 79 74 65 20 6f 72   get the byte or
18480 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a  der right..**.**
18490 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e   Developers usin
184a0 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41  g SQLite on an A
184b0 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69  RM7 should compi
184c0 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72  le and run their
184d0 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  .** application 
184e0 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44  using -DSQLITE_D
184f0 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20  EBUG=1 at least 
18500 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42 55  once.  With DEBU
18510 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f  G.** enabled, so
18520 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77  me asserts below
18530 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61   will ensure tha
18540 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72  t the byte order
18550 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20   of.** floating 
18560 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20  point values is 
18570 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28  correct..**.** (
18580 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61  2007-08-30)  Fra
18590 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73 20  nk van Vugt has 
185a0 73 74 75 64 69 65 64 20 74 68 69 73 20 70 72 6f  studied this pro
185b0 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20  blem closely.** 
185c0 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69 73  and has send his
185d0 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65   findings to the
185e0 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65   SQLite develope
185f0 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72  rs.  Frank.** wr
18600 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c  ites that some L
18610 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66  inux kernels off
18620 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  er floating poin
18630 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d  t hardware.** em
18640 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65  ulation that use
18650 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61  s only 32-bit ma
18660 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61 64 20  ntissas instead 
18670 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38  of a full .** 48
18680 2d 62 69 74 73 20 61 73 20 72 65 71 75 69 72 65  -bits as require
18690 64 20 62 79 20 74 68 65 20 49 45 45 45 20 73 74  d by the IEEE st
186a0 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20 69  andard.  (This i
186b0 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f  s the.** CONFIG_
186c0 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69  FPE_FASTFPE opti
186d0 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79  on.)  On such sy
186e0 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20  stems, floating 
186f0 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77  point.** byte sw
18700 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76  apping becomes v
18710 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e  ery complicated.
18720 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c    To avoid probl
18730 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65  ems,.** the nece
18740 73 73 61 72 79 20 62 79 74 65 20 73 77 61 70 70  ssary byte swapp
18750 69 6e 67 20 69 73 20 63 61 72 72 69 65 64 20 6f  ing is carried o
18760 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69  ut using a 64-bi
18770 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74  t integer.** rat
18780 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69  her than a 64-bi
18790 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20  t float.  Frank 
187a0 61 73 73 75 72 65 73 20 75 73 20 74 68 61 74 20  assures us that 
187b0 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a  the code here.**
187c0 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20   works for him. 
187d0 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70   We, the develop
187e0 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79  ers, have no way
187f0 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c   to independentl
18800 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73  y.** verify this
18810 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d  , but Frank seem
18820 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68  s to know what h
18830 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f  e is talking abo
18840 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73  ut.** so we trus
18850 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66  t him..*/.#ifdef
18860 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e   SQLITE_MIXED_EN
18870 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54  DIAN_64BIT_FLOAT
18880 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61  .static u64 floa
18890 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20  tSwap(u64 in){. 
188a0 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34   union {.    u64
188b0 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d   r;.    u32 i[2]
188c0 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74  ;.  } u;.  u32 t
188d0 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20  ;..  u.r = in;. 
188e0 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75   t = u.i[0];.  u
188f0 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a  .i[0] = u.i[1];.
18900 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20    u.i[1] = t;.  
18910 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20  return u.r;.}.# 
18920 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64  define swapMixed
18930 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20  EndianFloat(X)  
18940 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29  X = floatSwap(X)
18950 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
18960 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
18970 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a  loat(X).#endif..
18980 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
18990 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20  serialized data 
189a0 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c  blob for the val
189b0 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65  ue stored in pMe
189c0 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20  m into .** buf. 
189d0 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
189e0 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
189f0 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66  s allocated suff
18a00 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a  icient space..**
18a10 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
18a20 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74  er of bytes writ
18a30 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20  ten..**.** nBuf 
18a40 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  is the amount of
18a50 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62   space left in b
18a60 75 66 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c 65  uf[].  The calle
18a70 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
18a80 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69  .** for allocati
18a90 6e 67 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  ng enough space 
18aa0 74 6f 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c 64  to buf[] to hold
18ab0 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c   the entire fiel
18ac0 64 2c 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  d, exclusive.** 
18ad0 6f 66 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e  of the pMem->u.n
18ae0 5a 65 72 6f 20 62 79 74 65 73 20 66 6f 72 20 61  Zero bytes for a
18af0 20 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65 2e   MEM_Zero value.
18b00 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
18b10 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
18b20 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74  s actually writt
18b30 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20  en into buf[].  
18b40 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  The number.** of
18b50 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65   bytes in the ze
18b60 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69  ro-filled tail i
18b70 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  s included in th
18b80 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
18b90 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20  nly.** if those 
18ba0 62 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65  bytes were zeroe
18bb0 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a  d in buf[]..*/ .
18bc0 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
18bd0 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66  erialPut(u8 *buf
18be0 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33 32  , Mem *pMem, u32
18bf0 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20   serial_type){. 
18c00 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20   u32 len;..  /* 
18c10 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c  Integer and Real
18c20 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
18c30 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69  _type<=7 && seri
18c40 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20  al_type>0 ){.   
18c50 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20   u64 v;.    u32 
18c60 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61  i;.    if( seria
18c70 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20  l_type==7 ){.   
18c80 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
18c90 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65  f(v)==sizeof(pMe
18ca0 6d 2d 3e 75 2e 72 29 20 29 3b 0a 20 20 20 20 20  m->u.r) );.     
18cb0 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65   memcpy(&v, &pMe
18cc0 6d 2d 3e 75 2e 72 2c 20 73 69 7a 65 6f 66 28 76  m->u.r, sizeof(v
18cd0 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69  ));.      swapMi
18ce0 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76  xedEndianFloat(v
18cf0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
18d00 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e      v = pMem->u.
18d10 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e  i;.    }.    len
18d20 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 53 6d   = i = sqlite3Sm
18d30 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72  allTypeSizes[ser
18d40 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 20 20 61  ial_type];.    a
18d50 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20  ssert( i>0 );.  
18d60 20 20 64 6f 7b 0a 20 20 20 20 20 20 62 75 66 5b    do{.      buf[
18d70 2d 2d 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78  --i] = (u8)(v&0x
18d80 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d  FF);.      v >>=
18d90 20 38 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20   8;.    }while( 
18da0 69 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  i );.    return 
18db0 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  len;.  }..  /* S
18dc0 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f  tring or blob */
18dd0 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
18de0 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73  pe>=12 ){.    as
18df0 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20  sert( pMem->n + 
18e00 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ((pMem->flags & 
18e10 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e  MEM_Zero)?pMem->
18e20 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20  u.nZero:0).     
18e30 20 20 20 20 20 20 20 20 3d 3d 20 28 69 6e 74 29          == (int)
18e40 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
18e50 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
18e60 74 79 70 65 29 20 29 3b 0a 20 20 20 20 6c 65 6e  type) );.    len
18e70 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20   = pMem->n;.    
18e80 69 66 28 20 6c 65 6e 3e 30 20 29 20 6d 65 6d 63  if( len>0 ) memc
18e90 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c  py(buf, pMem->z,
18ea0 20 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72   len);.    retur
18eb0 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  n len;.  }..  /*
18ec0 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e   NULL or constan
18ed0 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72  ts 0 or 1 */.  r
18ee0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49  eturn 0;.}../* I
18ef0 6e 70 75 74 20 22 78 22 20 69 73 20 61 20 73 65  nput "x" is a se
18f00 71 75 65 6e 63 65 20 6f 66 20 75 6e 73 69 67 6e  quence of unsign
18f10 65 64 20 63 68 61 72 61 63 74 65 72 73 20 74 68  ed characters th
18f20 61 74 20 72 65 70 72 65 73 65 6e 74 20 61 0a 2a  at represent a.*
18f30 2a 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  * big-endian int
18f40 65 67 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68  eger.  Return th
18f50 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6e 61 74  e equivalent nat
18f60 69 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 23  ive integer.*/.#
18f70 64 65 66 69 6e 65 20 4f 4e 45 5f 42 59 54 45 5f  define ONE_BYTE_
18f80 49 4e 54 28 78 29 20 20 20 20 28 28 69 38 29 28  INT(x)    ((i8)(
18f90 78 29 5b 30 5d 29 0a 23 64 65 66 69 6e 65 20 54  x)[0]).#define T
18fa0 57 4f 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20  WO_BYTE_INT(x)  
18fb0 20 20 28 32 35 36 2a 28 69 38 29 28 28 78 29 5b    (256*(i8)((x)[
18fc0 30 5d 29 7c 28 78 29 5b 31 5d 29 0a 23 64 65 66  0])|(x)[1]).#def
18fd0 69 6e 65 20 54 48 52 45 45 5f 42 59 54 45 5f 49  ine THREE_BYTE_I
18fe0 4e 54 28 78 29 20 20 28 36 35 35 33 36 2a 28 69  NT(x)  (65536*(i
18ff0 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b  8)((x)[0])|((x)[
19000 31 5d 3c 3c 38 29 7c 28 78 29 5b 32 5d 29 0a 23  1]<<8)|(x)[2]).#
19010 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45  define FOUR_BYTE
19020 5f 55 49 4e 54 28 78 29 20 20 28 28 28 75 33 32  _UINT(x)  (((u32
19030 29 28 78 29 5b 30 5d 3c 3c 32 34 29 7c 28 28 78  )(x)[0]<<24)|((x
19040 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32  )[1]<<16)|((x)[2
19050 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 23 64  ]<<8)|(x)[3]).#d
19060 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f  efine FOUR_BYTE_
19070 49 4e 54 28 78 29 20 28 31 36 37 37 37 32 31 36  INT(x) (16777216
19080 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28  *(i8)((x)[0])|((
19090 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b  x)[1]<<16)|((x)[
190a0 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 0a  2]<<8)|(x)[3])..
190b0 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a  /*.** Deserializ
190c0 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20  e the data blob 
190d0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75  pointed to by bu
190e0 66 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65  f as serial type
190f0 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20   serial_type.** 
19100 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
19110 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52  sult in pMem.  R
19120 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
19130 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a   of bytes read..
19140 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
19150 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
19160 65 64 20 61 73 20 74 77 6f 20 73 65 70 61 72 61  ed as two separa
19170 74 65 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20  te routines for 
19180 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20  performance..** 
19190 54 68 65 20 66 65 77 20 63 61 73 65 73 20 74 68  The few cases th
191a0 61 74 20 72 65 71 75 69 72 65 20 6c 6f 63 61 6c  at require local
191b0 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 62   variables are b
191c0 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 61  roken out into a
191d0 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 72 6f 75   separate.** rou
191e0 74 69 6e 65 20 73 6f 20 74 68 61 74 20 69 6e 20  tine so that in 
191f0 6d 6f 73 74 20 63 61 73 65 73 20 74 68 65 20 6f  most cases the o
19200 76 65 72 68 65 61 64 20 6f 66 20 6d 6f 76 69 6e  verhead of movin
19210 67 20 74 68 65 20 73 74 61 63 6b 20 70 6f 69 6e  g the stack poin
19220 74 65 72 0a 2a 2a 20 69 73 20 61 76 6f 69 64 65  ter.** is avoide
19230 64 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 75 33  d..*/ .static u3
19240 32 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  2 SQLITE_NOINLIN
19250 45 20 73 65 72 69 61 6c 47 65 74 28 0a 20 20 63  E serialGet(.  c
19260 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
19270 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20  ar *buf,     /* 
19280 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69  Buffer to deseri
19290 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20  alize from */.  
192a0 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  u32 serial_type,
192b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
192c0 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20   Serial type to 
192d0 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20  deserialize */. 
192e0 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20   Mem *pMem      
192f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19300 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f  * Memory cell to
19310 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74   write value int
19320 6f 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 78 20  o */.){.  u64 x 
19330 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
19340 28 62 75 66 29 3b 0a 20 20 75 33 32 20 79 20 3d  (buf);.  u32 y =
19350 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
19360 62 75 66 2b 34 29 3b 0a 20 20 78 20 3d 20 28 78  buf+4);.  x = (x
19370 3c 3c 33 32 29 20 2b 20 79 3b 0a 20 20 69 66 28  <<32) + y;.  if(
19380 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20   serial_type==6 
19390 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  ){.    /* EVIDEN
193a0 43 45 2d 4f 46 3a 20 52 2d 32 39 38 35 31 2d 35  CE-OF: R-29851-5
193b0 32 32 37 32 20 56 61 6c 75 65 20 69 73 20 61 20  2272 Value is a 
193c0 62 69 67 2d 65 6e 64 69 61 6e 20 36 34 2d 62 69  big-endian 64-bi
193d0 74 0a 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f  t.    ** twos-co
193e0 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72  mplement integer
193f0 2e 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  . */.    pMem->u
19400 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a  .i = *(i64*)&x;.
19410 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
19420 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 74  = MEM_Int;.    t
19430 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
19440 2e 69 3c 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  .i<0 );.  }else{
19450 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
19460 2d 4f 46 3a 20 52 2d 35 37 33 34 33 2d 34 39 31  -OF: R-57343-491
19470 31 34 20 56 61 6c 75 65 20 69 73 20 61 20 62 69  14 Value is a bi
19480 67 2d 65 6e 64 69 61 6e 20 49 45 45 45 20 37 35  g-endian IEEE 75
19490 34 2d 32 30 30 38 20 36 34 2d 62 69 74 0a 20 20  4-2008 64-bit.  
194a0 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f    ** floating po
194b0 69 6e 74 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 23  int number. */.#
194c0 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
194d0 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  UG) && !defined(
194e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
194f0 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20  TING_POINT).    
19500 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 69  /* Verify that i
19510 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61  ntegers and floa
19520 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
19530 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20  s use the same. 
19540 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72     ** byte order
19550 2e 20 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53  .  Or, that if S
19560 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49  QLITE_MIXED_ENDI
19570 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69  AN_64BIT_FLOAT i
19580 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64  s.    ** defined
19590 20 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f   that 64-bit flo
195a0 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
195b0 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69  es really are mi
195c0 78 65 64 0a 20 20 20 20 2a 2a 20 65 6e 64 69 61  xed.    ** endia
195d0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  n..    */.    st
195e0 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74  atic const u64 t
195f0 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30  1 = ((u64)0x3ff0
19600 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 73  0000)<<32;.    s
19610 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 62  tatic const doub
19620 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20  le r1 = 1.0;.   
19630 20 75 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 20   u64 t2 = t1;.  
19640 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
19650 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20 20  nFloat(t2);.    
19660 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72  assert( sizeof(r
19670 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26  1)==sizeof(t2) &
19680 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74  & memcmp(&r1, &t
19690 32 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d  2, sizeof(r1))==
196a0 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  0 );.#endif.    
196b0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78  assert( sizeof(x
196c0 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70  )==8 && sizeof(p
196d0 4d 65 6d 2d 3e 75 2e 72 29 3d 3d 38 20 29 3b 0a  Mem->u.r)==8 );.
196e0 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
196f0 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20  ianFloat(x);.   
19700 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 75   memcpy(&pMem->u
19710 2e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78  .r, &x, sizeof(x
19720 29 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ));.    pMem->fl
19730 61 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e  ags = sqlite3IsN
19740 61 4e 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 3f 20  aN(pMem->u.r) ? 
19750 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52  MEM_Null : MEM_R
19760 65 61 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eal;.  }.  retur
19770 6e 20 38 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74  n 8;.}.u32 sqlit
19780 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
19790 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
197a0 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20  d char *buf,    
197b0 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65   /* Buffer to de
197c0 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a  serialize from *
197d0 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74  /.  u32 serial_t
197e0 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
197f0 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
19800 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
19810 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20  */.  Mem *pMem  
19820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19830 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
19840 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65  l to write value
19850 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77   into */.){.  sw
19860 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70  itch( serial_typ
19870 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30  e ){.    case 10
19880 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20  :   /* Reserved 
19890 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a  for future use *
198a0 2f 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 20  /.    case 11:  
198b0 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72   /* Reserved for
198c0 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20   future use */. 
198d0 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a     case 0: {  /*
198e0 20 4e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 2f   Null */.      /
198f0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
19900 2d 32 34 30 37 38 2d 30 39 33 37 35 20 56 61 6c  -24078-09375 Val
19910 75 65 20 69 73 20 61 20 4e 55 4c 4c 2e 20 2a 2f  ue is a NULL. */
19920 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
19930 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
19940 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19950 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 0a  }.    case 1: {.
19960 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
19970 45 2d 4f 46 3a 20 52 2d 34 34 38 38 35 2d 32 35  E-OF: R-44885-25
19980 31 39 36 20 56 61 6c 75 65 20 69 73 20 61 6e 20  196 Value is an 
19990 38 2d 62 69 74 20 74 77 6f 73 2d 63 6f 6d 70 6c  8-bit twos-compl
199a0 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 69  ement.      ** i
199b0 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20  nteger. */.     
199c0 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45   pMem->u.i = ONE
199d0 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
199e0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
199f0 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
19a00 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
19a10 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
19a20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
19a30 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20  }.    case 2: { 
19a40 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 2-byte signed
19a50 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
19a60 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
19a70 3a 20 52 2d 34 39 37 39 34 2d 33 35 30 32 36 20  : R-49794-35026 
19a80 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65  Value is a big-e
19a90 6e 64 69 61 6e 20 31 36 2d 62 69 74 0a 20 20 20  ndian 16-bit.   
19aa0 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c     ** twos-compl
19ab0 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a  ement integer. *
19ac0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
19ad0 69 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54  i = TWO_BYTE_INT
19ae0 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65  (buf);.      pMe
19af0 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
19b00 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  nt;.      testca
19b10 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20  se( pMem->u.i<0 
19b20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
19b30 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  2;.    }.    cas
19b40 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65  e 3: { /* 3-byte
19b50 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
19b60 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  */.      /* EVID
19b70 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 38 33 39  ENCE-OF: R-37839
19b80 2d 35 34 33 30 31 20 56 61 6c 75 65 20 69 73 20  -54301 Value is 
19b90 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 32 34 2d  a big-endian 24-
19ba0 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f  bit.      ** two
19bb0 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74  s-complement int
19bc0 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70  eger. */.      p
19bd0 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 48 52 45 45  Mem->u.i = THREE
19be0 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
19bf0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
19c00 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
19c10 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
19c20 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
19c30 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20    return 3;.    
19c40 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20  }.    case 4: { 
19c50 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 4-byte signed
19c60 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
19c70 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
19c80 3a 20 52 2d 30 31 38 34 39 2d 32 36 30 37 39 20  : R-01849-26079 
19c90 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65  Value is a big-e
19ca0 6e 64 69 61 6e 20 33 32 2d 62 69 74 0a 20 20 20  ndian 32-bit.   
19cb0 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c     ** twos-compl
19cc0 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a  ement integer. *
19cd0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
19ce0 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e  i = FOUR_BYTE_IN
19cf0 54 28 62 75 66 29 3b 0a 23 69 66 64 65 66 20 5f  T(buf);.#ifdef _
19d00 5f 48 50 5f 63 63 20 0a 20 20 20 20 20 20 2f 2a  _HP_cc .      /*
19d10 20 57 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 73   Work around a s
19d20 69 67 6e 2d 65 78 74 65 6e 73 69 6f 6e 20 62 75  ign-extension bu
19d30 67 20 69 6e 20 74 68 65 20 48 50 20 63 6f 6d 70  g in the HP comp
19d40 69 6c 65 72 20 66 6f 72 20 48 50 2f 55 58 20 2a  iler for HP/UX *
19d50 2f 0a 20 20 20 20 20 20 69 66 28 20 62 75 66 5b  /.      if( buf[
19d60 30 5d 26 30 78 38 30 20 29 20 70 4d 65 6d 2d 3e  0]&0x80 ) pMem->
19d70 75 2e 69 20 7c 3d 20 30 78 66 66 66 66 66 66 66  u.i |= 0xfffffff
19d80 66 38 30 30 30 30 30 30 30 4c 4c 3b 0a 23 65 6e  f80000000LL;.#en
19d90 64 69 66 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  dif.      pMem->
19da0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
19db0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19dc0 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
19dd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a        return 4;.
19de0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35      }.    case 5
19df0 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69  : { /* 6-byte si
19e00 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
19e10 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
19e20 45 2d 4f 46 3a 20 52 2d 35 30 33 38 35 2d 30 39  E-OF: R-50385-09
19e30 36 37 34 20 56 61 6c 75 65 20 69 73 20 61 20 62  674 Value is a b
19e40 69 67 2d 65 6e 64 69 61 6e 20 34 38 2d 62 69 74  ig-endian 48-bit
19e50 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63  .      ** twos-c
19e60 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65  omplement intege
19e70 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  r. */.      pMem
19e80 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54  ->u.i = FOUR_BYT
19e90 45 5f 55 49 4e 54 28 62 75 66 2b 32 29 20 2b 20  E_UINT(buf+2) + 
19ea0 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54  (((i64)1)<<32)*T
19eb0 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29  WO_BYTE_INT(buf)
19ec0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
19ed0 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
19ee0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
19ef0 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20  Mem->u.i<0 );.  
19f00 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20      return 6;.  
19f10 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20    }.    case 6: 
19f20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e    /* 8-byte sign
19f30 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
19f40 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49    case 7: { /* I
19f50 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  EEE floating poi
19f60 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 54  nt */.      /* T
19f70 68 65 73 65 20 75 73 65 20 6c 6f 63 61 6c 20 76  hese use local v
19f80 61 72 69 61 62 6c 65 73 2c 20 73 6f 20 64 6f 20  ariables, so do 
19f90 74 68 65 6d 20 69 6e 20 61 20 73 65 70 61 72 61  them in a separa
19fa0 74 65 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 20  te routine.     
19fb0 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 68 61 76   ** to avoid hav
19fc0 69 6e 67 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  ing to move the 
19fd0 66 72 61 6d 65 20 70 6f 69 6e 74 65 72 20 69 6e  frame pointer in
19fe0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
19ff0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1a000 20 73 65 72 69 61 6c 47 65 74 28 62 75 66 2c 73   serialGet(buf,s
1a010 65 72 69 61 6c 5f 74 79 70 65 2c 70 4d 65 6d 29  erial_type,pMem)
1a020 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1a030 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65   8:    /* Intege
1a040 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  r 0 */.    case 
1a050 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72  9: {  /* Integer
1a060 20 31 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45   1 */.      /* E
1a070 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 32  VIDENCE-OF: R-12
1a080 39 37 36 2d 32 32 38 39 33 20 56 61 6c 75 65 20  976-22893 Value 
1a090 69 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 30  is the integer 0
1a0a0 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  . */.      /* EV
1a0b0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 31  IDENCE-OF: R-181
1a0c0 34 33 2d 31 32 31 32 31 20 56 61 6c 75 65 20 69  43-12121 Value i
1a0d0 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 31 2e  s the integer 1.
1a0e0 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
1a0f0 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70  u.i = serial_typ
1a100 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  e-8;.      pMem-
1a110 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
1a120 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
1a130 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
1a140 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ult: {.      /* 
1a150 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
1a160 34 36 30 36 2d 33 31 35 36 34 20 56 61 6c 75 65  4606-31564 Value
1a170 20 69 73 20 61 20 42 4c 4f 42 20 74 68 61 74 20   is a BLOB that 
1a180 69 73 20 28 4e 2d 31 32 29 2f 32 20 62 79 74 65  is (N-12)/2 byte
1a190 73 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65  s in.      ** le
1a1a0 6e 67 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20 45  ngth..      ** E
1a1b0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38  VIDENCE-OF: R-28
1a1c0 34 30 31 2d 30 30 31 34 30 20 56 61 6c 75 65 20  401-00140 Value 
1a1d0 69 73 20 61 20 73 74 72 69 6e 67 20 69 6e 20 74  is a string in t
1a1e0 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  he text encoding
1a1f0 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 4e   and.      ** (N
1a200 2d 31 33 29 2f 32 20 62 79 74 65 73 20 69 6e 20  -13)/2 bytes in 
1a210 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 20 20 20  length. */.     
1a220 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31   static const u1
1a230 36 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45  6 aFlag[] = { ME
1a240 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d  M_Blob|MEM_Ephem
1a250 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70  , MEM_Str|MEM_Ep
1a260 68 65 6d 20 7d 3b 0a 20 20 20 20 20 20 70 4d 65  hem };.      pMe
1a270 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62  m->z = (char *)b
1a280 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  uf;.      pMem->
1a290 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  n = (serial_type
1a2a0 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d  -12)/2;.      pM
1a2b0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61  em->flags = aFla
1a2c0 67 5b 73 65 72 69 61 6c 5f 74 79 70 65 26 31 5d  g[serial_type&1]
1a2d0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
1a2e0 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20  Mem->n;.    }.  
1a2f0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1a300 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1a310 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c  ne is used to al
1a320 6c 6f 63 61 74 65 20 73 75 66 66 69 63 69 65 6e  locate sufficien
1a330 74 20 73 70 61 63 65 20 66 6f 72 20 61 6e 20 55  t space for an U
1a340 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a  npackedRecord.**
1a350 20 73 74 72 75 63 74 75 72 65 20 6c 61 72 67 65   structure large
1a360 20 65 6e 6f 75 67 68 20 74 6f 20 62 65 20 75 73   enough to be us
1a370 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 56  ed with sqlite3V
1a380 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
1a390 29 20 69 66 0a 2a 2a 20 74 68 65 20 66 69 72 73  ) if.** the firs
1a3a0 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
1a3b0 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e  pointer to KeyIn
1a3c0 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 4b 65  fo structure pKe
1a3d0 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  yInfo..**.** The
1a3e0 20 73 70 61 63 65 20 69 73 20 65 69 74 68 65 72   space is either
1a3f0 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67   allocated using
1a400 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1a410 52 61 77 28 29 20 6f 72 20 66 72 6f 6d 20 77 69  Raw() or from wi
1a420 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c  thin.** the unal
1a430 69 67 6e 65 64 20 62 75 66 66 65 72 20 70 61 73  igned buffer pas
1a440 73 65 64 20 76 69 61 20 74 68 65 20 73 65 63 6f  sed via the seco
1a450 6e 64 20 61 6e 64 20 74 68 69 72 64 20 61 72 67  nd and third arg
1a460 75 6d 65 6e 74 73 20 28 70 72 65 73 75 6d 61 62  uments (presumab
1a470 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61 63  ly.** stack spac
1a480 65 29 2e 20 49 66 20 74 68 65 20 66 6f 72 6d 65  e). If the forme
1a490 72 2c 20 74 68 65 6e 20 2a 70 70 46 72 65 65 20  r, then *ppFree 
1a4a0 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 69 6e  is set to a poin
1a4b0 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64 0a  ter that should.
1a4c0 2a 2a 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79  ** be eventually
1a4d0 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
1a4e0 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74  ller using sqlit
1a4f0 65 33 44 62 46 72 65 65 28 29 2e 20 4f 72 2c 20  e3DbFree(). Or, 
1a500 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63  if the .** alloc
1a510 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d  ation comes from
1a520 20 74 68 65 20 70 53 70 61 63 65 2f 73 7a 53 70   the pSpace/szSp
1a530 61 63 65 20 62 75 66 66 65 72 2c 20 2a 70 70 46  ace buffer, *ppF
1a540 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55  ree is set to NU
1a550 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74  LL.** before ret
1a560 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
1a570 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63   an OOM error oc
1a580 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65  curs, NULL is re
1a590 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63  turned..*/.Unpac
1a5a0 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74  kedRecord *sqlit
1a5b0 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63  e3VdbeAllocUnpac
1a5c0 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 4b 65 79  kedRecord(.  Key
1a5d0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
1a5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a5f0 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  Description of t
1a600 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63  he record */.  c
1a610 68 61 72 20 2a 70 53 70 61 63 65 2c 20 20 20 20  har *pSpace,    
1a620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a630 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73 70 61 63  * Unaligned spac
1a640 65 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20  e available */. 
1a650 20 69 6e 74 20 73 7a 53 70 61 63 65 2c 20 20 20   int szSpace,   
1a660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a670 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53 70 61   /* Size of pSpa
1a680 63 65 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f  ce[] in bytes */
1a690 0a 20 20 63 68 61 72 20 2a 2a 70 70 46 72 65 65  .  char **ppFree
1a6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6b0 20 20 20 2f 2a 20 4f 55 54 3a 20 43 61 6c 6c 65     /* OUT: Calle
1a6c0 72 20 73 68 6f 75 6c 64 20 66 72 65 65 20 74 68  r should free th
1a6d0 69 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 29 7b  is pointer */.){
1a6e0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
1a6f0 64 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  d *p;           
1a700 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72     /* Unpacked r
1a710 65 63 6f 72 64 20 74 6f 20 72 65 74 75 72 6e 20  ecord to return 
1a720 2a 2f 0a 20 20 69 6e 74 20 6e 4f 66 66 3b 20 20  */.  int nOff;  
1a730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a740 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e       /* Incremen
1a750 74 20 70 53 70 61 63 65 20 62 79 20 6e 4f 66 66  t pSpace by nOff
1a760 20 74 6f 20 61 6c 69 67 6e 20 69 74 20 2a 2f 0a   to align it */.
1a770 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
1a780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a790 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
1a7a0 79 74 65 73 20 72 65 71 75 69 72 65 64 20 66 6f  ytes required fo
1a7b0 72 20 2a 70 20 2a 2f 0a 0a 20 20 2f 2a 20 57 65  r *p */..  /* We
1a7c0 20 77 61 6e 74 20 74 6f 20 73 68 69 66 74 20 74   want to shift t
1a7d0 68 65 20 70 6f 69 6e 74 65 72 20 70 53 70 61 63  he pointer pSpac
1a7e0 65 20 75 70 20 73 75 63 68 20 74 68 61 74 20 69  e up such that i
1a7f0 74 20 69 73 20 38 2d 62 79 74 65 20 61 6c 69 67  t is 8-byte alig
1a800 6e 65 64 2e 0a 20 20 2a 2a 20 54 68 75 73 2c 20  ned..  ** Thus, 
1a810 77 65 20 6e 65 65 64 20 74 6f 20 63 61 6c 63 75  we need to calcu
1a820 6c 61 74 65 20 61 20 76 61 6c 75 65 2c 20 6e 4f  late a value, nO
1a830 66 66 2c 20 62 65 74 77 65 65 6e 20 30 20 61 6e  ff, between 0 an
1a840 64 20 37 2c 20 74 6f 20 73 68 69 66 74 20 0a 20  d 7, to shift . 
1a850 20 2a 2a 20 69 74 20 62 79 2e 20 20 49 66 20 70   ** it by.  If p
1a860 53 70 61 63 65 20 69 73 20 61 6c 72 65 61 64 79  Space is already
1a870 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2c   8-byte aligned,
1a880 20 6e 4f 66 66 20 73 68 6f 75 6c 64 20 62 65 20   nOff should be 
1a890 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66  zero..  */.  nOf
1a8a0 66 20 3d 20 28 38 20 2d 20 28 53 51 4c 49 54 45  f = (8 - (SQLITE
1a8b0 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 53 70 61  _PTR_TO_INT(pSpa
1a8c0 63 65 29 20 26 20 37 29 29 20 26 20 37 3b 0a 20  ce) & 7)) & 7;. 
1a8d0 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28   nByte = ROUND8(
1a8e0 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52  sizeof(UnpackedR
1a8f0 65 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f 66  ecord)) + sizeof
1a900 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d  (Mem)*(pKeyInfo-
1a910 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20 69 66  >nField+1);.  if
1a920 28 20 6e 42 79 74 65 3e 73 7a 53 70 61 63 65 2b  ( nByte>szSpace+
1a930 6e 4f 66 66 20 29 7b 0a 20 20 20 20 70 20 3d 20  nOff ){.    p = 
1a940 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20  (UnpackedRecord 
1a950 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
1a960 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64  cRaw(pKeyInfo->d
1a970 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 2a  b, nByte);.    *
1a980 70 70 46 72 65 65 20 3d 20 28 63 68 61 72 20 2a  ppFree = (char *
1a990 29 70 3b 0a 20 20 20 20 69 66 28 20 21 70 20 29  )p;.    if( !p )
1a9a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
1a9b0 73 65 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70  se{.    p = (Unp
1a9c0 61 63 6b 65 64 52 65 63 6f 72 64 2a 29 26 70 53  ackedRecord*)&pS
1a9d0 70 61 63 65 5b 6e 4f 66 66 5d 3b 0a 20 20 20 20  pace[nOff];.    
1a9e0 2a 70 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d  *ppFree = 0;.  }
1a9f0 0a 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d  ..  p->aMem = (M
1aa00 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70 29 5b  em*)&((char*)p)[
1aa10 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e  ROUND8(sizeof(Un
1aa20 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b  packedRecord))];
1aa30 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49  .  assert( pKeyI
1aa40 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21  nfo->aSortOrder!
1aa50 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49  =0 );.  p->pKeyI
1aa60 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
1aa70 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b    p->nField = pK
1aa80 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b  eyInfo->nField +
1aa90 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a   1;.  return p;.
1aaa0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
1aab0 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63  he nKey-byte enc
1aac0 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72  oding of a recor
1aad0 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70  d in pKey[], pop
1aae0 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e  ulate the .** Un
1aaf0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72  packedRecord str
1ab00 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64  ucture indicated
1ab10 20 62 79 20 74 68 65 20 66 6f 75 72 74 68 20 61   by the fourth a
1ab20 72 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68 65  rgument with the
1ab30 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
1ab40 74 68 65 20 64 65 63 6f 64 65 64 20 72 65 63 6f  the decoded reco
1ab50 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c  rd..*/ .void sql
1ab60 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
1ab70 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20  pack(.  KeyInfo 
1ab80 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f  *pKeyInfo,     /
1ab90 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * Information ab
1aba0 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 66  out the record f
1abb0 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ormat */.  int n
1abc0 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
1abd0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1abe0 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a   binary record *
1abf0 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
1ac00 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68  pKey,      /* Th
1ac10 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20  e binary record 
1ac20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
1ac30 6f 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20 50  ord *p      /* P
1ac40 6f 70 75 6c 61 74 65 20 74 68 69 73 20 73 74 72  opulate this str
1ac50 75 63 74 75 72 65 20 62 65 66 6f 72 65 20 72 65  ucture before re
1ac60 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20  turning. */.){. 
1ac70 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1ac80 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f  char *aKey = (co
1ac90 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1aca0 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74 20  r *)pKey;.  int 
1acb0 64 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20 20  d; .  u32 idx;  
1acc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acd0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1ace0 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61  in aKey[] to rea
1acf0 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20  d from */.  u16 
1ad00 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
1ad10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1ad20 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
1ad30 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a  nter */.  u32 sz
1ad40 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  Hdr;.  Mem *pMem
1ad50 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70   = p->aMem;..  p
1ad60 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30  ->default_rc = 0
1ad70 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
1ad80 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
1ad90 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20  (pMem) );.  idx 
1ada0 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b  = getVarint32(aK
1adb0 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20  ey, szHdr);.  d 
1adc0 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30  = szHdr;.  u = 0
1add0 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73  ;.  while( idx<s
1ade0 7a 48 64 72 20 26 26 20 64 3c 3d 6e 4b 65 79 20  zHdr && d<=nKey 
1adf0 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  ){.    u32 seria
1ae00 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78  l_type;..    idx
1ae10 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
1ae20 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69  &aKey[idx], seri
1ae30 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70 4d  al_type);.    pM
1ae40 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e  em->enc = pKeyIn
1ae50 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65  fo->enc;.    pMe
1ae60 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m->db = pKeyInfo
1ae70 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d 65  ->db;.    /* pMe
1ae80 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f 2f  m->flags = 0; //
1ae90 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1aea0 61 6c 47 65 74 28 29 20 77 69 6c 6c 20 73 65 74  alGet() will set
1aeb0 20 74 68 69 73 20 66 6f 72 20 75 73 20 2a 2f 0a   this for us */.
1aec0 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c      pMem->szMall
1aed0 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d  oc = 0;.    d +=
1aee0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1aef0 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20  alGet(&aKey[d], 
1af00 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65  serial_type, pMe
1af10 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  m);.    pMem++;.
1af20 20 20 20 20 69 66 28 20 28 2b 2b 75 29 3e 3d 70      if( (++u)>=p
1af30 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72 65 61 6b  ->nField ) break
1af40 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1af50 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  u<=pKeyInfo->nFi
1af60 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e  eld + 1 );.  p->
1af70 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 23  nField = u;.}..#
1af80 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  if SQLITE_DEBUG.
1af90 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1afa0 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 77 6f  ion compares two
1afb0 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
1afc0 72 65 63 6f 72 64 20 6b 65 79 73 20 69 6e 20 74  record keys in t
1afd0 68 65 20 73 61 6d 65 20 77 61 79 0a 2a 2a 20 61  he same way.** a
1afe0 73 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  s the sqlite3Vdb
1aff0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
1b000 20 72 6f 75 74 69 6e 65 2e 20 55 6e 6c 69 6b 65   routine. Unlike
1b010 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   VdbeRecordCompa
1b020 72 65 28 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75  re(),.** this fu
1b030 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c 69  nction deseriali
1b040 7a 65 73 20 61 6e 64 20 63 6f 6d 70 61 72 65 73  zes and compares
1b050 20 76 61 6c 75 65 73 20 75 73 69 6e 67 20 74 68   values using th
1b060 65 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  e.** sqlite3Vdbe
1b070 53 65 72 69 61 6c 47 65 74 28 29 20 61 6e 64 20  SerialGet() and 
1b080 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
1b090 65 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 49  e() functions. I
1b0a0 74 20 69 73 20 75 73 65 64 0a 2a 2a 20 69 6e 20  t is used.** in 
1b0b0 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
1b0c0 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68  nts to ensure th
1b0d0 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 64  at the optimized
1b0e0 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 73 71 6c 69   code in.** sqli
1b0f0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1b100 70 61 72 65 28 29 20 72 65 74 75 72 6e 73 20 72  pare() returns r
1b110 65 73 75 6c 74 73 20 77 69 74 68 20 74 68 65 73  esults with thes
1b120 65 20 74 77 6f 20 70 72 69 6d 69 74 69 76 65 73  e two primitives
1b130 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
1b140 72 75 65 20 69 66 20 74 68 65 20 72 65 73 75 6c  rue if the resul
1b150 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  t of comparison 
1b160 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
1b170 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 2e 0a   desiredResult..
1b180 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  ** Return false 
1b190 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64 69  if there is a di
1b1a0 73 61 67 72 65 65 6d 65 6e 74 2e 0a 2a 2f 0a 73  sagreement..*/.s
1b1b0 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65  tatic int vdbeRe
1b1c0 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
1b1d0 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
1b1e0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
1b1f0 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f  , /* Left key */
1b200 0a 20 20 63 6f 6e 73 74 20 55 6e 70 61 63 6b 65  .  const Unpacke
1b210 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c  dRecord *pPKey2,
1b220 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
1b230 0a 20 20 69 6e 74 20 64 65 73 69 72 65 64 52 65  .  int desiredRe
1b240 73 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20  sult            
1b250 20 2f 2a 20 43 6f 72 72 65 63 74 20 61 6e 73 77   /* Correct answ
1b260 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64  er */.){.  u32 d
1b270 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
1b280 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65   Offset into aKe
1b290 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61  y[] of next data
1b2a0 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33   element */.  u3
1b2b0 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20  2 idx1;         
1b2c0 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
1b2d0 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68  aKey[] of next h
1b2e0 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f  eader element */
1b2f0 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20  .  u32 szHdr1;  
1b300 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1b310 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64  of bytes in head
1b320 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  er */.  int i = 
1b330 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  0;.  int rc = 0;
1b340 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
1b350 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20  d char *aKey1 = 
1b360 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
1b370 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20  char *)pKey1;.  
1b380 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1b390 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a  o;.  Mem mem1;..
1b3a0 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b    pKeyInfo = pPK
1b3b0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ey2->pKeyInfo;. 
1b3c0 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64   if( pKeyInfo->d
1b3d0 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  b==0 ) return 1;
1b3e0 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b  .  mem1.enc = pK
1b3f0 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d  eyInfo->enc;.  m
1b400 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66  em1.db = pKeyInf
1b410 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31  o->db;.  /* mem1
1b420 2e 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20  .flags = 0;  // 
1b430 57 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69  Will be initiali
1b440 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 56 64  zed by sqlite3Vd
1b450 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 2a 2f  beSerialGet() */
1b460 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d  .  VVA_ONLY( mem
1b470 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20  1.szMalloc = 0; 
1b480 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64  ) /* Only needed
1b490 20 62 79 20 61 73 73 65 72 74 28 29 20 73 74 61   by assert() sta
1b4a0 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a  tements */..  /*
1b4b0 20 43 6f 6d 70 69 6c 65 72 73 20 6d 61 79 20 63   Compilers may c
1b4c0 6f 6d 70 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d  omplain that mem
1b4d0 31 2e 75 2e 69 20 69 73 20 70 6f 74 65 6e 74 69  1.u.i is potenti
1b4e0 61 6c 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a  ally uninitializ
1b4f0 65 64 2e 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c  ed..  ** We coul
1b500 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c  d initialize it,
1b510 20 61 73 20 73 68 6f 77 6e 20 68 65 72 65 2c 20   as shown here, 
1b520 74 6f 20 73 69 6c 65 6e 63 65 20 74 68 6f 73 65  to silence those
1b530 20 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a   complaints..  *
1b540 2a 20 42 75 74 20 69 6e 20 66 61 63 74 2c 20 6d  * But in fact, m
1b550 65 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76  em1.u.i will nev
1b560 65 72 20 61 63 74 75 61 6c 6c 79 20 62 65 20 75  er actually be u
1b570 73 65 64 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  sed uninitialize
1b580 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20  d, and doing .  
1b590 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65 73 73 61  ** the unnecessa
1b5a0 72 79 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ry initializatio
1b5b0 6e 20 68 61 73 20 61 20 6d 65 61 73 75 72 61 62  n has a measurab
1b5c0 6c 65 20 6e 65 67 61 74 69 76 65 20 70 65 72 66  le negative perf
1b5d0 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70  ormance.  ** imp
1b5e0 61 63 74 2c 20 73 69 6e 63 65 20 74 68 69 73 20  act, since this 
1b5f0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76 65 72  routine is a ver
1b600 79 20 68 69 67 68 20 72 75 6e 6e 65 72 2e 20 20  y high runner.  
1b610 41 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73  And so, we choos
1b620 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65  e.  ** to ignore
1b630 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 61   the compiler wa
1b640 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61 76 65  rnings and leave
1b650 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 75   this variable u
1b660 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20  ninitialized..  
1b670 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e  */.  /*  mem1.u.
1b680 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e  i = 0;  // not n
1b690 65 65 64 65 64 2c 20 68 65 72 65 20 74 6f 20 73  eeded, here to s
1b6a0 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20  ilence compiler 
1b6b0 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20  warning */.  .  
1b6c0 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74  idx1 = getVarint
1b6d0 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31  32(aKey1, szHdr1
1b6e0 29 3b 0a 20 20 69 66 28 20 73 7a 48 64 72 31 3e  );.  if( szHdr1>
1b6f0 39 38 33 30 37 20 29 20 72 65 74 75 72 6e 20 53  98307 ) return S
1b700 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
1b710 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20   d1 = szHdr1;.  
1b720 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
1b730 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e 66  ->nField+pKeyInf
1b740 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65  o->nXField>=pPKe
1b750 79 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20 43 4f  y2->nField || CO
1b760 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73  RRUPT_DB );.  as
1b770 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
1b780 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b  aSortOrder!=0 );
1b790 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49  .  assert( pKeyI
1b7a0 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b  nfo->nField>0 );
1b7b0 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3c  .  assert( idx1<
1b7c0 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55  =szHdr1 || CORRU
1b7d0 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20  PT_DB );.  do{. 
1b7e0 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79     u32 serial_ty
1b7f0 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  pe1;..    /* Rea
1b800 64 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70  d the serial typ
1b810 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  es for the next 
1b820 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20  element in each 
1b830 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31  key. */.    idx1
1b840 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
1b850 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72   aKey1+idx1, ser
1b860 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 0a 20 20  ial_type1 );..  
1b870 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
1b880 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68   there is enough
1b890 20 6b 65 79 20 73 70 61 63 65 20 72 65 6d 61 69   key space remai
1b8a0 6e 69 6e 67 20 74 6f 20 61 76 6f 69 64 0a 20 20  ning to avoid.  
1b8b0 20 20 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 76    ** a buffer ov
1b8c0 65 72 72 65 61 64 2e 20 20 54 68 65 20 22 64 31  erread.  The "d1
1b8d0 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 22  +serial_type1+2"
1b8e0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 77   subexpression w
1b8f0 69 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79  ill.    ** alway
1b900 73 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  s be greater tha
1b910 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
1b920 65 20 61 6d 6f 75 6e 74 20 6f 66 20 72 65 71 75  e amount of requ
1b930 69 72 65 64 20 6b 65 79 20 73 70 61 63 65 2e 0a  ired key space..
1b940 20 20 20 20 2a 2a 20 55 73 65 20 74 68 61 74 20      ** Use that 
1b950 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 74 6f  approximation to
1b960 20 61 76 6f 69 64 20 74 68 65 20 6d 6f 72 65 20   avoid the more 
1b970 65 78 70 65 6e 73 69 76 65 20 63 61 6c 6c 20 74  expensive call t
1b980 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
1b990 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
1b9a0 6e 28 29 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  n() in the commo
1b9b0 6e 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  n case..    */. 
1b9c0 20 20 20 69 66 28 20 64 31 2b 73 65 72 69 61 6c     if( d1+serial
1b9d0 5f 74 79 70 65 31 2b 32 3e 28 75 33 32 29 6e 4b  _type1+2>(u32)nK
1b9e0 65 79 31 0a 20 20 20 20 20 26 26 20 64 31 2b 73  ey1.     && d1+s
1b9f0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1ba00 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
1ba10 79 70 65 31 29 3e 28 75 33 32 29 6e 4b 65 79 31  ype1)>(u32)nKey1
1ba20 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62   .    ){.      b
1ba30 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1ba40 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20   /* Extract the 
1ba50 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d  values to be com
1ba60 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  pared..    */.  
1ba70 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56    d1 += sqlite3V
1ba80 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
1ba90 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f  ey1[d1], serial_
1baa0 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a  type1, &mem1);..
1bab0 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f      /* Do the co
1bac0 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a  mparison.    */.
1bad0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1bae0 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31  MemCompare(&mem1
1baf0 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b  , &pPKey2->aMem[
1bb00 69 5d 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  i], pKeyInfo->aC
1bb10 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  oll[i]);.    if(
1bb20 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
1bb30 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d  assert( mem1.szM
1bb40 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20  alloc==0 );  /* 
1bb50 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f  See comment belo
1bb60 77 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  w */.      if( p
1bb70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
1bb80 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  der[i] ){.      
1bb90 20 20 72 63 20 3d 20 2d 72 63 3b 20 20 2f 2a 20    rc = -rc;  /* 
1bba0 49 6e 76 65 72 74 20 74 68 65 20 72 65 73 75 6c  Invert the resul
1bbb0 74 20 66 6f 72 20 44 45 53 43 20 73 6f 72 74 20  t for DESC sort 
1bbc0 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  order. */.      
1bbd0 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 62  }.      goto deb
1bbe0 75 67 43 6f 6d 70 61 72 65 45 6e 64 3b 0a 20 20  ugCompareEnd;.  
1bbf0 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d    }.    i++;.  }
1bc00 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64  while( idx1<szHd
1bc10 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e  r1 && i<pPKey2->
1bc20 6e 46 69 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20  nField );..  /* 
1bc30 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  No memory alloca
1bc40 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65  tion is ever use
1bc50 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76  d on mem1.  Prov
1bc60 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a  e this using.  *
1bc70 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
1bc80 61 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68  assert().  If th
1bc90 65 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73  e assert() fails
1bca0 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61  , it indicates a
1bcb0 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61  .  ** memory lea
1bcc0 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20  k and a need to 
1bcd0 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65  call sqlite3Vdbe
1bce0 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31  MemRelease(&mem1
1bcf0 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
1bd00 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d  ( mem1.szMalloc=
1bd10 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d  =0 );..  /* rc==
1bd20 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61  0 here means tha
1bd30 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79  t one of the key
1bd40 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65  s ran out of fie
1bd50 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c  lds and.  ** all
1bd60 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74   the fields up t
1bd70 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72  o that point wer
1bd80 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20  e equal. Return 
1bd90 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20  the default_rc. 
1bda0 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20   ** value.  */. 
1bdb0 20 72 63 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65   rc = pPKey2->de
1bdc0 66 61 75 6c 74 5f 72 63 3b 0a 0a 64 65 62 75 67  fault_rc;..debug
1bdd0 43 6f 6d 70 61 72 65 45 6e 64 3a 0a 20 20 69 66  CompareEnd:.  if
1bde0 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3d  ( desiredResult=
1bdf0 3d 30 20 26 26 20 72 63 3d 3d 30 20 29 20 72 65  =0 && rc==0 ) re
1be00 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65  turn 1;.  if( de
1be10 73 69 72 65 64 52 65 73 75 6c 74 3c 30 20 26 26  siredResult<0 &&
1be20 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20 31   rc<0 ) return 1
1be30 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52  ;.  if( desiredR
1be40 65 73 75 6c 74 3e 30 20 26 26 20 72 63 3e 30 20  esult>0 && rc>0 
1be50 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
1be60 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72  ( CORRUPT_DB ) r
1be70 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70  eturn 1;.  if( p
1be80 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c  KeyInfo->db->mal
1be90 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
1bea0 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
1beb0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
1bec0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
1bed0 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ** Count the num
1bee0 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 28 61  ber of fields (a
1bef0 2e 6b 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29 20 69  .k.a. columns) i
1bf00 6e 20 74 68 65 20 72 65 63 6f 72 64 20 67 69 76  n the record giv
1bf10 65 6e 20 62 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b  en by.** pKey,nK
1bf20 65 79 2e 20 20 54 68 65 20 76 65 72 69 66 79 20  ey.  The verify 
1bf30 74 68 61 74 20 74 68 69 73 20 63 6f 75 6e 74 20  that this count 
1bf40 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
1bf50 65 71 75 61 6c 20 74 6f 20 74 68 65 0a 2a 2a 20  equal to the.** 
1bf60 6c 69 6d 69 74 20 67 69 76 65 6e 20 62 79 20 70  limit given by p
1bf70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
1bf80 2b 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69  + pKeyInfo->nXFi
1bf90 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  eld..**.** If th
1bfa0 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  is constraint is
1bfb0 20 6e 6f 74 20 73 61 74 69 73 66 69 65 64 2c 20   not satisfied, 
1bfc0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
1bfd0 65 20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20  e high-speed.** 
1bfe0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1bff0 65 49 6e 74 28 29 20 61 6e 64 20 76 64 62 65 52  eInt() and vdbeR
1c000 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69  ecordCompareStri
1c010 6e 67 28 29 20 72 6f 75 74 69 6e 65 73 20 77 69  ng() routines wi
1c020 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 63  ll.** not work c
1c030 6f 72 72 65 63 74 6c 79 2e 20 20 49 66 20 74 68  orrectly.  If th
1c040 69 73 20 61 73 73 65 72 74 28 29 20 65 76 65 72  is assert() ever
1c050 20 66 69 72 65 73 2c 20 69 74 20 70 72 6f 62 61   fires, it proba
1c060 62 6c 79 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61  bly means.** tha
1c070 74 20 74 68 65 20 4b 65 79 49 6e 66 6f 2e 6e 46  t the KeyInfo.nF
1c080 69 65 6c 64 20 6f 72 20 4b 65 79 49 6e 66 6f 2e  ield or KeyInfo.
1c090 6e 58 46 69 65 6c 64 20 76 61 6c 75 65 73 20 77  nXField values w
1c0a0 65 72 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20  ere computed.** 
1c0b0 69 6e 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a  incorrectly..*/.
1c0c0 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65  static void vdbe
1c0d0 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74  AssertFieldCount
1c0e0 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 0a 20 20  WithinLimits(.  
1c0f0 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20  int nKey, const 
1c100 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a  void *pKey,   /*
1c110 20 54 68 65 20 72 65 63 6f 72 64 20 74 6f 20 76   The record to v
1c120 65 72 69 66 79 20 2a 2f 20 0a 20 20 63 6f 6e 73  erify */ .  cons
1c130 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
1c140 6e 66 6f 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d  nfo       /* Com
1c150 70 61 72 65 20 73 69 7a 65 20 77 69 74 68 20 74  pare size with t
1c160 68 69 73 20 4b 65 79 49 6e 66 6f 20 2a 2f 0a 29  his KeyInfo */.)
1c170 7b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 20 3d  {.  int nField =
1c180 20 30 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b   0;.  u32 szHdr;
1c190 0a 20 20 75 33 32 20 69 64 78 3b 0a 20 20 75 33  .  u32 idx;.  u3
1c1a0 32 20 6e 6f 74 55 73 65 64 3b 0a 20 20 63 6f 6e  2 notUsed;.  con
1c1b0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1c1c0 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20   *aKey = (const 
1c1d0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
1c1e0 4b 65 79 3b 0a 0a 20 20 69 66 28 20 43 4f 52 52  Key;..  if( CORR
1c1f0 55 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 3b  UPT_DB ) return;
1c200 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 72 69  .  idx = getVari
1c210 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72  nt32(aKey, szHdr
1c220 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65  );.  assert( nKe
1c230 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y>=0 );.  assert
1c240 28 20 73 7a 48 64 72 3c 3d 28 75 33 32 29 6e 4b  ( szHdr<=(u32)nK
1c250 65 79 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 69  ey );.  while( i
1c260 64 78 3c 73 7a 48 64 72 20 29 7b 0a 20 20 20 20  dx<szHdr ){.    
1c270 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  idx += getVarint
1c280 33 32 28 61 4b 65 79 2b 69 64 78 2c 20 6e 6f 74  32(aKey+idx, not
1c290 55 73 65 64 29 3b 0a 20 20 20 20 6e 46 69 65 6c  Used);.    nFiel
1c2a0 64 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  d++;.  }.  asser
1c2b0 74 28 20 6e 46 69 65 6c 64 20 3c 3d 20 70 4b 65  t( nField <= pKe
1c2c0 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b  yInfo->nField+pK
1c2d0 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 20  eyInfo->nXField 
1c2e0 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
1c2f0 69 6e 65 20 76 64 62 65 41 73 73 65 72 74 46 69  ine vdbeAssertFi
1c300 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69  eldCountWithinLi
1c310 6d 69 74 73 28 41 2c 42 2c 43 29 0a 23 65 6e 64  mits(A,B,C).#end
1c320 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a  if../*.** Both *
1c330 70 4d 65 6d 31 20 61 6e 64 20 2a 70 4d 65 6d 32  pMem1 and *pMem2
1c340 20 63 6f 6e 74 61 69 6e 20 73 74 72 69 6e 67 20   contain string 
1c350 76 61 6c 75 65 73 2e 20 43 6f 6d 70 61 72 65 20  values. Compare 
1c360 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a  the two values.*
1c370 2a 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c  * using the coll
1c380 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70  ation sequence p
1c390 43 6f 6c 6c 2e 20 41 73 20 75 73 75 61 6c 2c 20  Coll. As usual, 
1c3a0 72 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76  return a negativ
1c3b0 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70  e , zero.** or p
1c3c0 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66  ositive value if
1c3d0 20 2a 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20   *pMem1 is less 
1c3e0 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f  than, equal to o
1c3f0 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 0a  r greater than .
1c400 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72 65 73 70 65  ** *pMem2, respe
1c410 63 74 69 76 65 6c 79 2e 20 53 69 6d 69 6c 61 72  ctively. Similar
1c420 20 69 6e 20 73 70 69 72 69 74 20 74 6f 20 22 72   in spirit to "r
1c430 63 20 3d 20 28 2a 70 4d 65 6d 31 29 20 2d 20 28  c = (*pMem1) - (
1c440 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74  *pMem2);"..*/.st
1c450 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d  atic int vdbeCom
1c460 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20  pareMemString(. 
1c470 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d   const Mem *pMem
1c480 31 2c 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a  1,.  const Mem *
1c490 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73 74 20 43  pMem2,.  const C
1c4a0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20  ollSeq *pColl,. 
1c4b0 20 75 38 20 2a 70 72 63 45 72 72 20 20 20 20 20   u8 *prcErr     
1c4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4d0 20 2f 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63   /* If an OOM oc
1c4e0 63 75 72 73 2c 20 73 65 74 20 74 6f 20 53 51 4c  curs, set to SQL
1c4f0 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a  ITE_NOMEM */.){.
1c500 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 65 6e 63    if( pMem1->enc
1c510 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a  ==pColl->enc ){.
1c520 20 20 20 20 2f 2a 20 54 68 65 20 73 74 72 69 6e      /* The strin
1c530 67 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 69  gs are already i
1c540 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 65 6e  n the correct en
1c550 63 6f 64 69 6e 67 2e 20 20 43 61 6c 6c 20 74 68  coding.  Call th
1c560 65 0a 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72  e.     ** compar
1c570 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 64 69  ison function di
1c580 72 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20 72 65  rectly */.    re
1c590 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  turn pColl->xCmp
1c5a0 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d  (pColl->pUser,pM
1c5b0 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c  em1->n,pMem1->z,
1c5c0 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e  pMem2->n,pMem2->
1c5d0 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  z);.  }else{.   
1c5e0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 63 6f 6e   int rc;.    con
1c5f0 73 74 20 76 6f 69 64 20 2a 76 31 2c 20 2a 76 32  st void *v1, *v2
1c600 3b 0a 20 20 20 20 69 6e 74 20 6e 31 2c 20 6e 32  ;.    int n1, n2
1c610 3b 0a 20 20 20 20 4d 65 6d 20 63 31 3b 0a 20 20  ;.    Mem c1;.  
1c620 20 20 4d 65 6d 20 63 32 3b 0a 20 20 20 20 73 71    Mem c2;.    sq
1c630 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74  lite3VdbeMemInit
1c640 28 26 63 31 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c  (&c1, pMem1->db,
1c650 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20   MEM_Null);.    
1c660 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e  sqlite3VdbeMemIn
1c670 69 74 28 26 63 32 2c 20 70 4d 65 6d 31 2d 3e 64  it(&c2, pMem1->d
1c680 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20  b, MEM_Null);.  
1c690 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1c6a0 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 31 2c  ShallowCopy(&c1,
1c6b0 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70 68 65   pMem1, MEM_Ephe
1c6c0 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  m);.    sqlite3V
1c6d0 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70  dbeMemShallowCop
1c6e0 79 28 26 63 32 2c 20 70 4d 65 6d 32 2c 20 4d 45  y(&c2, pMem2, ME
1c6f0 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 76 31  M_Ephem);.    v1
1c700 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54   = sqlite3ValueT
1c710 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c  ext((sqlite3_val
1c720 75 65 2a 29 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e  ue*)&c1, pColl->
1c730 65 6e 63 29 3b 0a 20 20 20 20 6e 31 20 3d 20 76  enc);.    n1 = v
1c740 31 3d 3d 30 20 3f 20 30 20 3a 20 63 31 2e 6e 3b  1==0 ? 0 : c1.n;
1c750 0a 20 20 20 20 76 32 20 3d 20 73 71 6c 69 74 65  .    v2 = sqlite
1c760 33 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69  3ValueText((sqli
1c770 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 32 2c 20  te3_value*)&c2, 
1c780 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20  pColl->enc);.   
1c790 20 6e 32 20 3d 20 76 32 3d 3d 30 20 3f 20 30 20   n2 = v2==0 ? 0 
1c7a0 3a 20 63 32 2e 6e 3b 0a 20 20 20 20 72 63 20 3d  : c2.n;.    rc =
1c7b0 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f   pColl->xCmp(pCo
1c7c0 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e 31 2c 20 76  ll->pUser, n1, v
1c7d0 31 2c 20 6e 32 2c 20 76 32 29 3b 0a 20 20 20 20  1, n2, v2);.    
1c7e0 69 66 28 20 28 76 31 3d 3d 30 20 7c 7c 20 76 32  if( (v1==0 || v2
1c7f0 3d 3d 30 29 20 26 26 20 70 72 63 45 72 72 20 29  ==0) && prcErr )
1c800 20 2a 70 72 63 45 72 72 20 3d 20 53 51 4c 49 54   *prcErr = SQLIT
1c810 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 73 71 6c  E_NOMEM;.    sql
1c820 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
1c830 73 65 28 26 63 31 29 3b 0a 20 20 20 20 73 71 6c  se(&c1);.    sql
1c840 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
1c850 73 65 28 26 63 32 29 3b 0a 20 20 20 20 72 65 74  se(&c2);.    ret
1c860 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f  urn rc;.  }.}../
1c870 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f  *.** Compare two
1c880 20 62 6c 6f 62 73 2e 20 20 52 65 74 75 72 6e 20   blobs.  Return 
1c890 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20  negative, zero, 
1c8a0 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 74  or positive if t
1c8b0 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 73 20 6c  he first.** is l
1c8c0 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
1c8d0 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74  to, or greater t
1c8e0 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c 20  han the second, 
1c8f0 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
1c900 20 49 66 20 6f 6e 65 20 62 6c 6f 62 20 69 73 20   If one blob is 
1c910 61 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20  a prefix of the 
1c920 6f 74 68 65 72 2c 20 74 68 65 6e 20 74 68 65 20  other, then the 
1c930 73 68 6f 72 74 65 72 20 69 73 20 74 68 65 20 6c  shorter is the l
1c940 65 73 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  essor..*/.static
1c950 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
1c960 20 69 6e 74 20 73 71 6c 69 74 65 33 42 6c 6f 62   int sqlite3Blob
1c970 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65  Compare(const Me
1c980 6d 20 2a 70 42 31 2c 20 63 6f 6e 73 74 20 4d 65  m *pB1, const Me
1c990 6d 20 2a 70 42 32 29 7b 0a 20 20 69 6e 74 20 63  m *pB2){.  int c
1c9a0 20 3d 20 6d 65 6d 63 6d 70 28 70 42 31 2d 3e 7a   = memcmp(pB1->z
1c9b0 2c 20 70 42 32 2d 3e 7a 2c 20 70 42 31 2d 3e 6e  , pB2->z, pB1->n
1c9c0 3e 70 42 32 2d 3e 6e 20 3f 20 70 42 32 2d 3e 6e  >pB2->n ? pB2->n
1c9d0 20 3a 20 70 42 31 2d 3e 6e 29 3b 0a 20 20 69 66   : pB1->n);.  if
1c9e0 28 20 63 20 29 20 72 65 74 75 72 6e 20 63 3b 0a  ( c ) return c;.
1c9f0 20 20 72 65 74 75 72 6e 20 70 42 31 2d 3e 6e 20    return pB1->n 
1ca00 2d 20 70 42 32 2d 3e 6e 3b 0a 7d 0a 0a 2f 2a 0a  - pB2->n;.}../*.
1ca10 2a 2a 20 44 6f 20 61 20 63 6f 6d 70 61 72 69 73  ** Do a comparis
1ca20 6f 6e 20 62 65 74 77 65 65 6e 20 61 20 36 34 2d  on between a 64-
1ca30 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67  bit signed integ
1ca40 65 72 20 61 6e 64 20 61 20 36 34 2d 62 69 74 20  er and a 64-bit 
1ca50 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 0a 2a  floating-point.*
1ca60 2a 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72  * number.  Retur
1ca70 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  n negative, zero
1ca80 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  , or positive if
1ca90 20 74 68 65 20 66 69 72 73 74 20 28 69 36 34 29   the first (i64)
1caa0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 0a 2a   is less than,.*
1cab0 2a 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67  * equal to, or g
1cac0 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
1cad0 73 65 63 6f 6e 64 20 28 64 6f 75 62 6c 65 29 2e  second (double).
1cae0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1caf0 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f  qlite3IntFloatCo
1cb00 6d 70 61 72 65 28 69 36 34 20 69 2c 20 64 6f 75  mpare(i64 i, dou
1cb10 62 6c 65 20 72 29 7b 0a 20 20 69 66 28 20 73 69  ble r){.  if( si
1cb20 7a 65 6f 66 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f  zeof(LONGDOUBLE_
1cb30 54 59 50 45 29 3e 38 20 29 7b 0a 20 20 20 20 4c  TYPE)>8 ){.    L
1cb40 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 20 78  ONGDOUBLE_TYPE x
1cb50 20 3d 20 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54   = (LONGDOUBLE_T
1cb60 59 50 45 29 69 3b 0a 20 20 20 20 69 66 28 20 78  YPE)i;.    if( x
1cb70 3c 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  <r ) return -1;.
1cb80 20 20 20 20 69 66 28 20 78 3e 72 20 29 20 72 65      if( x>r ) re
1cb90 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 72 65 74  turn +1;.    ret
1cba0 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 0;.  }else{.
1cbb0 20 20 20 20 69 36 34 20 79 3b 0a 20 20 20 20 64      i64 y;.    d
1cbc0 6f 75 62 6c 65 20 73 3b 0a 20 20 20 20 69 66 28  ouble s;.    if(
1cbd0 20 72 3c 2d 39 32 32 33 33 37 32 30 33 36 38 35   r<-922337203685
1cbe0 34 37 37 35 38 30 38 2e 30 20 29 20 72 65 74 75  4775808.0 ) retu
1cbf0 72 6e 20 2b 31 3b 0a 20 20 20 20 69 66 28 20 72  rn +1;.    if( r
1cc00 3e 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37  >922337203685477
1cc10 35 38 30 37 2e 30 20 29 20 72 65 74 75 72 6e 20  5807.0 ) return 
1cc20 2d 31 3b 0a 20 20 20 20 79 20 3d 20 28 69 36 34  -1;.    y = (i64
1cc30 29 72 3b 0a 20 20 20 20 69 66 28 20 69 3c 79 20  )r;.    if( i<y 
1cc40 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
1cc50 20 69 66 28 20 69 3e 79 20 29 7b 0a 20 20 20 20   if( i>y ){.    
1cc60 20 20 69 66 28 20 79 3d 3d 53 4d 41 4c 4c 45 53    if( y==SMALLES
1cc70 54 5f 49 4e 54 36 34 20 26 26 20 72 3e 30 2e 30  T_INT64 && r>0.0
1cc80 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
1cc90 20 20 20 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20      return +1;. 
1cca0 20 20 20 7d 0a 20 20 20 20 73 20 3d 20 28 64 6f     }.    s = (do
1ccb0 75 62 6c 65 29 69 3b 0a 20 20 20 20 69 66 28 20  uble)i;.    if( 
1ccc0 73 3c 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  s<r ) return -1;
1ccd0 0a 20 20 20 20 69 66 28 20 73 3e 72 20 29 20 72  .    if( s>r ) r
1cce0 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 72 65  eturn +1;.    re
1ccf0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  turn 0;.  }.}../
1cd00 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
1cd10 20 76 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e 65   values containe
1cd20 64 20 62 79 20 74 68 65 20 74 77 6f 20 6d 65 6d  d by the two mem
1cd30 6f 72 79 20 63 65 6c 6c 73 2c 20 72 65 74 75 72  ory cells, retur
1cd40 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61 74 69 76 65  ning.** negative
1cd50 2c 20 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74 69  , zero or positi
1cd60 76 65 20 69 66 20 70 4d 65 6d 31 20 69 73 20 6c  ve if pMem1 is l
1cd70 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
1cd80 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 0a 2a  to, or greater.*
1cd90 2a 20 74 68 61 6e 20 70 4d 65 6d 32 2e 20 53 6f  * than pMem2. So
1cda0 72 74 69 6e 67 20 6f 72 64 65 72 20 69 73 20 4e  rting order is N
1cdb0 55 4c 4c 27 73 20 66 69 72 73 74 2c 20 66 6f 6c  ULL's first, fol
1cdc0 6c 6f 77 65 64 20 62 79 20 6e 75 6d 62 65 72 73  lowed by numbers
1cdd0 20 28 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 6e   (integers.** an
1cde0 64 20 72 65 61 6c 73 29 20 73 6f 72 74 65 64 20  d reals) sorted 
1cdf0 6e 75 6d 65 72 69 63 61 6c 6c 79 2c 20 66 6f 6c  numerically, fol
1ce00 6c 6f 77 65 64 20 62 79 20 74 65 78 74 20 6f 72  lowed by text or
1ce10 64 65 72 65 64 20 62 79 20 74 68 65 20 63 6f 6c  dered by the col
1ce20 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e  lating.** sequen
1ce30 63 65 20 70 43 6f 6c 6c 20 61 6e 64 20 66 69 6e  ce pColl and fin
1ce40 61 6c 6c 79 20 62 6c 6f 62 27 73 20 6f 72 64 65  ally blob's orde
1ce50 72 65 64 20 62 79 20 6d 65 6d 63 6d 70 28 29 2e  red by memcmp().
1ce60 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20  .**.** Two NULL 
1ce70 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69  values are consi
1ce80 64 65 72 65 64 20 65 71 75 61 6c 20 62 79 20 74  dered equal by t
1ce90 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
1cea0 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d 43  .int sqlite3MemC
1ceb0 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d  ompare(const Mem
1cec0 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73 74 20 4d   *pMem1, const M
1ced0 65 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73 74  em *pMem2, const
1cee0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29   CollSeq *pColl)
1cef0 7b 0a 20 20 69 6e 74 20 66 31 2c 20 66 32 3b 0a  {.  int f1, f2;.
1cf00 20 20 69 6e 74 20 63 6f 6d 62 69 6e 65 64 5f 66    int combined_f
1cf10 6c 61 67 73 3b 0a 0a 20 20 66 31 20 3d 20 70 4d  lags;..  f1 = pM
1cf20 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 32  em1->flags;.  f2
1cf30 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b   = pMem2->flags;
1cf40 0a 20 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  .  combined_flag
1cf50 73 20 3d 20 66 31 7c 66 32 3b 0a 20 20 61 73 73  s = f1|f2;.  ass
1cf60 65 72 74 28 20 28 63 6f 6d 62 69 6e 65 64 5f 66  ert( (combined_f
1cf70 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65  lags & MEM_RowSe
1cf80 74 29 3d 3d 30 20 29 3b 0a 20 0a 20 20 2f 2a 20  t)==0 );. .  /* 
1cf90 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20  If one value is 
1cfa0 4e 55 4c 4c 2c 20 69 74 20 69 73 20 6c 65 73 73  NULL, it is less
1cfb0 20 74 68 61 6e 20 74 68 65 20 6f 74 68 65 72 2e   than the other.
1cfc0 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73 0a   If both values.
1cfd0 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c 20 72    ** are NULL, r
1cfe0 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20  eturn 0..  */.  
1cff0 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  if( combined_fla
1d000 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20  gs&MEM_Null ){. 
1d010 20 20 20 72 65 74 75 72 6e 20 28 66 32 26 4d 45     return (f2&ME
1d020 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66 31 26 4d 45  M_Null) - (f1&ME
1d030 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20  M_Null);.  }..  
1d040 2f 2a 20 41 74 20 6c 65 61 73 74 20 6f 6e 65 20  /* At least one 
1d050 6f 66 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65  of the two value
1d060 73 20 69 73 20 61 20 6e 75 6d 62 65 72 0a 20 20  s is a number.  
1d070 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65  */.  if( combine
1d080 64 5f 66 6c 61 67 73 26 28 4d 45 4d 5f 49 6e 74  d_flags&(MEM_Int
1d090 7c 4d 45 4d 5f 52 65 61 6c 29 20 29 7b 0a 20 20  |MEM_Real) ){.  
1d0a0 20 20 69 66 28 20 28 66 31 20 26 20 66 32 20 26    if( (f1 & f2 &
1d0b0 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a   MEM_Int)!=0 ){.
1d0c0 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d        if( pMem1-
1d0d0 3e 75 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e  >u.i < pMem2->u.
1d0e0 69 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  i ) return -1;. 
1d0f0 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e       if( pMem1->
1d100 75 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69  u.i > pMem2->u.i
1d110 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20   ) return +1;.  
1d120 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1d130 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31 20    }.    if( (f1 
1d140 26 20 66 32 20 26 20 4d 45 4d 5f 52 65 61 6c 29  & f2 & MEM_Real)
1d150 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
1d160 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3c 20 70 4d   pMem1->u.r < pM
1d170 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74 75 72  em2->u.r ) retur
1d180 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20  n -1;.      if( 
1d190 70 4d 65 6d 31 2d 3e 75 2e 72 20 3e 20 70 4d 65  pMem1->u.r > pMe
1d1a0 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74 75 72 6e  m2->u.r ) return
1d1b0 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   +1;.      retur
1d1c0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 0;.    }.    i
1d1d0 66 28 20 28 66 31 26 4d 45 4d 5f 49 6e 74 29 21  f( (f1&MEM_Int)!
1d1e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1d1f0 28 66 32 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30  (f2&MEM_Real)!=0
1d200 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1d210 72 6e 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f  rn sqlite3IntFlo
1d220 61 74 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2d  atCompare(pMem1-
1d230 3e 75 2e 69 2c 20 70 4d 65 6d 32 2d 3e 75 2e 72  >u.i, pMem2->u.r
1d240 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1d250 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d          return -
1d260 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
1d270 0a 20 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d  .    if( (f1&MEM
1d280 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20  _Real)!=0 ){.   
1d290 20 20 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 49     if( (f2&MEM_I
1d2a0 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  nt)!=0 ){.      
1d2b0 20 20 72 65 74 75 72 6e 20 2d 73 71 6c 69 74 65    return -sqlite
1d2c0 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65  3IntFloatCompare
1d2d0 28 70 4d 65 6d 32 2d 3e 75 2e 69 2c 20 70 4d 65  (pMem2->u.i, pMe
1d2e0 6d 31 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20  m1->u.r);.      
1d2f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
1d300 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
1d310 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  }.    }.    retu
1d320 72 6e 20 2b 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn +1;.  }..  /*
1d330 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73   If one value is
1d340 20 61 20 73 74 72 69 6e 67 20 61 6e 64 20 74 68   a string and th
1d350 65 20 6f 74 68 65 72 20 69 73 20 61 20 62 6c 6f  e other is a blo
1d360 62 2c 20 74 68 65 20 73 74 72 69 6e 67 20 69 73  b, the string is
1d370 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62   less..  ** If b
1d380 6f 74 68 20 61 72 65 20 73 74 72 69 6e 67 73 2c  oth are strings,
1d390 20 63 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 74   compare using t
1d3a0 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  he collating fun
1d3b0 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ctions..  */.  i
1d3c0 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  f( combined_flag
1d3d0 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20  s&MEM_Str ){.   
1d3e0 20 69 66 28 20 28 66 31 20 26 20 4d 45 4d 5f 53   if( (f1 & MEM_S
1d3f0 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tr)==0 ){.      
1d400 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
1d410 20 20 20 20 69 66 28 20 28 66 32 20 26 20 4d 45      if( (f2 & ME
1d420 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20  M_Str)==0 ){.   
1d430 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
1d440 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
1d450 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65   pMem1->enc==pMe
1d460 6d 32 2d 3e 65 6e 63 20 7c 7c 20 70 4d 65 6d 31  m2->enc || pMem1
1d470 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1d480 65 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ed );.    assert
1d490 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51  ( pMem1->enc==SQ
1d4a0 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 0a 20 20  LITE_UTF8 || .  
1d4b0 20 20 20 20 20 20 20 20 20 20 70 4d 65 6d 31 2d            pMem1-
1d4c0 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  >enc==SQLITE_UTF
1d4d0 31 36 4c 45 20 7c 7c 20 70 4d 65 6d 31 2d 3e 65  16LE || pMem1->e
1d4e0 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  nc==SQLITE_UTF16
1d4f0 42 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  BE );..    /* Th
1d500 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
1d510 65 6e 63 65 20 6d 75 73 74 20 62 65 20 64 65 66  ence must be def
1d520 69 6e 65 64 20 61 74 20 74 68 69 73 20 70 6f 69  ined at this poi
1d530 6e 74 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20  nt, even if.    
1d540 2a 2a 20 74 68 65 20 75 73 65 72 20 64 65 6c 65  ** the user dele
1d550 74 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  tes the collatio
1d560 6e 20 73 65 71 75 65 6e 63 65 20 61 66 74 65 72  n sequence after
1d570 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61   the vdbe progra
1d580 6d 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6d 70  m is.    ** comp
1d590 69 6c 65 64 20 28 74 68 69 73 20 77 61 73 20 6e  iled (this was n
1d5a0 6f 74 20 61 6c 77 61 79 73 20 74 68 65 20 63 61  ot always the ca
1d5b0 73 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  se)..    */.    
1d5c0 61 73 73 65 72 74 28 20 21 70 43 6f 6c 6c 20 7c  assert( !pColl |
1d5d0 7c 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b  | pColl->xCmp );
1d5e0 0a 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ..    if( pColl 
1d5f0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1d600 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74  vdbeCompareMemSt
1d610 72 69 6e 67 28 70 4d 65 6d 31 2c 20 70 4d 65 6d  ring(pMem1, pMem
1d620 32 2c 20 70 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20  2, pColl, 0);.  
1d630 20 20 7d 0a 20 20 20 20 2f 2a 20 49 66 20 61 20    }.    /* If a 
1d640 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 77 61 73  NULL pointer was
1d650 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 63   passed as the c
1d660 6f 6c 6c 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c  ollate function,
1d670 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a 20 20   fall through.  
1d680 20 20 2a 2a 20 74 6f 20 74 68 65 20 62 6c 6f 62    ** to the blob
1d690 20 63 61 73 65 20 61 6e 64 20 75 73 65 20 6d 65   case and use me
1d6a0 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 7d 0a  mcmp().  */.  }.
1d6b0 20 0a 20 20 2f 2a 20 42 6f 74 68 20 76 61 6c 75   .  /* Both valu
1d6c0 65 73 20 6d 75 73 74 20 62 65 20 62 6c 6f 62 73  es must be blobs
1d6d0 2e 20 20 43 6f 6d 70 61 72 65 20 75 73 69 6e 67  .  Compare using
1d6e0 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20   memcmp().  */. 
1d6f0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42   return sqlite3B
1d700 6c 6f 62 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31  lobCompare(pMem1
1d710 2c 20 70 4d 65 6d 32 29 3b 0a 7d 0a 0a 0a 2f 2a  , pMem2);.}.../*
1d720 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
1d730 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
1d740 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1d750 73 20 61 20 73 65 72 69 61 6c 2d 74 79 70 65 20  s a serial-type 
1d760 74 68 61 74 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  that.** correspo
1d770 6e 64 73 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  nds to an intege
1d780 72 20 2d 20 61 6c 6c 20 76 61 6c 75 65 73 20 62  r - all values b
1d790 65 74 77 65 65 6e 20 31 20 61 6e 64 20 39 20 69  etween 1 and 9 i
1d7a0 6e 63 6c 75 73 69 76 65 20 0a 2a 2a 20 65 78 63  nclusive .** exc
1d7b0 65 70 74 20 37 2e 20 54 68 65 20 73 65 63 6f 6e  ept 7. The secon
1d7c0 64 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75  d points to a bu
1d7d0 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
1d7e0 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  an integer value
1d7f0 0a 2a 2a 20 73 65 72 69 61 6c 69 7a 65 64 20 61  .** serialized a
1d800 63 63 6f 72 64 69 6e 67 20 74 6f 20 73 65 72 69  ccording to seri
1d810 61 6c 5f 74 79 70 65 2e 20 54 68 69 73 20 66 75  al_type. This fu
1d820 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c 69  nction deseriali
1d830 7a 65 73 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72  zes.** and retur
1d840 6e 73 20 74 68 65 20 76 61 6c 75 65 2e 0a 2a 2f  ns the value..*/
1d850 0a 73 74 61 74 69 63 20 69 36 34 20 76 64 62 65  .static i64 vdbe
1d860 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28  RecordDecodeInt(
1d870 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  u32 serial_type,
1d880 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 29   const u8 *aKey)
1d890 7b 0a 20 20 75 33 32 20 79 3b 0a 20 20 61 73 73  {.  u32 y;.  ass
1d8a0 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
1d8b0 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65 3e  || (serial_type>
1d8c0 3d 31 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70  =1 && serial_typ
1d8d0 65 3c 3d 39 20 26 26 20 73 65 72 69 61 6c 5f 74  e<=9 && serial_t
1d8e0 79 70 65 21 3d 37 29 20 29 3b 0a 20 20 73 77 69  ype!=7) );.  swi
1d8f0 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65  tch( serial_type
1d900 20 29 7b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a   ){.    case 0:.
1d910 20 20 20 20 63 61 73 65 20 31 3a 0a 20 20 20 20      case 1:.    
1d920 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1d930 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1d940 20 20 72 65 74 75 72 6e 20 4f 4e 45 5f 42 59 54    return ONE_BYT
1d950 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1d960 20 63 61 73 65 20 32 3a 0a 20 20 20 20 20 20 74   case 2:.      t
1d970 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d  estcase( aKey[0]
1d980 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72  &0x80 );.      r
1d990 65 74 75 72 6e 20 54 57 4f 5f 42 59 54 45 5f 49  eturn TWO_BYTE_I
1d9a0 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61  NT(aKey);.    ca
1d9b0 73 65 20 33 3a 0a 20 20 20 20 20 20 74 65 73 74  se 3:.      test
1d9c0 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78  case( aKey[0]&0x
1d9d0 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  80 );.      retu
1d9e0 72 6e 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e  rn THREE_BYTE_IN
1d9f0 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73  T(aKey);.    cas
1da00 65 20 34 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  e 4: {.      tes
1da10 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30  tcase( aKey[0]&0
1da20 78 38 30 20 29 3b 0a 20 20 20 20 20 20 79 20 3d  x80 );.      y =
1da30 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1da40 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 72 65 74  aKey);.      ret
1da50 75 72 6e 20 28 69 36 34 29 2a 28 69 6e 74 2a 29  urn (i64)*(int*)
1da60 26 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  &y;.    }.    ca
1da70 73 65 20 35 3a 20 7b 0a 20 20 20 20 20 20 74 65  se 5: {.      te
1da80 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26  stcase( aKey[0]&
1da90 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65  0x80 );.      re
1daa0 74 75 72 6e 20 46 4f 55 52 5f 42 59 54 45 5f 55  turn FOUR_BYTE_U
1dab0 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20 28 28  INT(aKey+2) + ((
1dac0 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f  (i64)1)<<32)*TWO
1dad0 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
1dae0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1daf0 36 3a 20 7b 0a 20 20 20 20 20 20 75 36 34 20 78  6: {.      u64 x
1db00 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   = FOUR_BYTE_UIN
1db10 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74  T(aKey);.      t
1db20 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d  estcase( aKey[0]
1db30 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 78  &0x80 );.      x
1db40 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55   = (x<<32) | FOU
1db50 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
1db60 2b 34 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  +4);.      retur
1db70 6e 20 28 69 36 34 29 2a 28 69 36 34 2a 29 26 78  n (i64)*(i64*)&x
1db80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
1db90 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79  eturn (serial_ty
1dba0 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pe - 8);.}../*.*
1dbb0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1dbc0 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f  compares the two
1dbd0 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69   table rows or i
1dbe0 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20  ndex records.** 
1dbf0 73 70 65 63 69 66 69 65 64 20 62 79 20 7b 6e 4b  specified by {nK
1dc00 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20  ey1, pKey1} and 
1dc10 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65 74 75  pPKey2.  It retu
1dc20 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65 2c 20  rns a negative, 
1dc30 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74  zero.** or posit
1dc40 69 76 65 20 69 6e 74 65 67 65 72 20 69 66 20 6b  ive integer if k
1dc50 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ey1 is less than
1dc60 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a  , equal to or .*
1dc70 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6b  * greater than k
1dc80 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31  ey2.  The {nKey1
1dc90 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73  , pKey1} key mus
1dca0 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63  t be a blob.** c
1dcb0 72 65 61 74 65 64 20 62 79 20 74 68 65 20 4f 50  reated by the OP
1dcc0 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
1dcd0 64 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20  de of the VDBE. 
1dce0 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b   The pPKey2.** k
1dcf0 65 79 20 6d 75 73 74 20 62 65 20 61 20 70 61 72  ey must be a par
1dd00 73 65 64 20 6b 65 79 20 73 75 63 68 20 61 73 20  sed key such as 
1dd10 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
1dd20 20 73 71 6c 69 74 65 33 56 64 62 65 50 61 72 73   sqlite3VdbePars
1dd30 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49  eRecord..**.** I
1dd40 66 20 61 72 67 75 6d 65 6e 74 20 62 53 6b 69 70  f argument bSkip
1dd50 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74   is non-zero, it
1dd60 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
1dd70 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
1dd80 61 6c 72 65 61 64 79 0a 2a 2a 20 64 65 74 65 72  already.** deter
1dd90 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65 20 66  mined that the f
1dda0 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74  irst fields of t
1ddb0 68 65 20 6b 65 79 73 20 61 72 65 20 65 71 75 61  he keys are equa
1ddc0 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e  l..**.** Key1 an
1ddd0 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68 61  d Key2 do not ha
1dde0 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ve to contain th
1ddf0 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
1de00 20 66 69 65 6c 64 73 2e 20 49 66 20 61 6c 6c 20   fields. If all 
1de10 0a 2a 2a 20 66 69 65 6c 64 73 20 74 68 61 74 20  .** fields that 
1de20 61 70 70 65 61 72 20 69 6e 20 62 6f 74 68 20 6b  appear in both k
1de30 65 79 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74  eys are equal, t
1de40 68 65 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  hen pPKey2->defa
1de50 75 6c 74 5f 72 63 20 69 73 20 0a 2a 2a 20 72 65  ult_rc is .** re
1de60 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
1de70 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
1de80 74 69 6f 6e 20 69 73 20 64 69 73 63 6f 76 65 72  tion is discover
1de90 65 64 2c 20 73 65 74 20 70 50 4b 65 79 32 2d 3e  ed, set pPKey2->
1dea0 65 72 72 43 6f 64 65 20 74 6f 20 0a 2a 2a 20 53  errCode to .** S
1deb0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 61 6e  QLITE_CORRUPT an
1dec0 64 20 72 65 74 75 72 6e 20 30 2e 20 49 66 20 61  d return 0. If a
1ded0 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65  n OOM error is e
1dee0 6e 63 6f 75 6e 74 65 72 65 64 2c 20 0a 2a 2a 20  ncountered, .** 
1def0 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20  pPKey2->errCode 
1df00 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
1df10 5f 4e 4f 4d 45 4d 20 61 6e 64 2c 20 69 66 20 69  _NOMEM and, if i
1df20 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  t is not NULL, t
1df30 68 65 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d 66 61 69  he.** malloc-fai
1df40 6c 65 64 20 66 6c 61 67 20 73 65 74 20 6f 6e 20  led flag set on 
1df50 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
1df60 28 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66  (pPKey2->pKeyInf
1df70 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73  o->db)..*/.int s
1df80 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1df90 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28  CompareWithSkip(
1dfa0 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
1dfb0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
1dfc0 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a     /* Left key *
1dfd0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
1dfe0 72 64 20 2a 70 50 4b 65 79 32 2c 20 20 20 20 20  rd *pPKey2,     
1dff0 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79      /* Right key
1e000 20 2a 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70 20   */.  int bSkip 
1e010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e020 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
1e030 2c 20 73 6b 69 70 20 74 68 65 20 66 69 72 73 74  , skip the first
1e040 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 75   field */.){.  u
1e050 33 32 20 64 31 3b 20 20 20 20 20 20 20 20 20 20  32 d1;          
1e060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e070 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b  * Offset into aK
1e080 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74  ey[] of next dat
1e090 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  a element */.  i
1e0a0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
1e0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e0c0 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20  * Index of next 
1e0d0 66 69 65 6c 64 20 74 6f 20 63 6f 6d 70 61 72 65  field to compare
1e0e0 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31   */.  u32 szHdr1
1e0f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e100 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1e110 20 72 65 63 6f 72 64 20 68 65 61 64 65 72 20 69   record header i
1e120 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
1e130 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20 20   idx1;          
1e140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e150 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20  Offset of first 
1e160 74 79 70 65 20 69 6e 20 68 65 61 64 65 72 20 2a  type in header *
1e170 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20  /.  int rc = 0; 
1e180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e190 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
1e1a0 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52  lue */.  Mem *pR
1e1b0 68 73 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65  hs = pPKey2->aMe
1e1c0 6d 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74  m;       /* Next
1e1d0 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32   field of pPKey2
1e1e0 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20   to compare */. 
1e1f0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1e200 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65  fo = pPKey2->pKe
1e210 79 49 6e 66 6f 3b 0a 20 20 63 6f 6e 73 74 20 75  yInfo;.  const u
1e220 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
1e230 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73  ey1 = (const uns
1e240 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65  igned char *)pKe
1e250 79 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a  y1;.  Mem mem1;.
1e260 0a 20 20 2f 2a 20 49 66 20 62 53 6b 69 70 20 69  .  /* If bSkip i
1e270 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
1e280 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65   caller has alre
1e290 61 64 79 20 64 65 74 65 72 6d 69 6e 65 64 20 74  ady determined t
1e2a0 68 61 74 20 74 68 65 20 66 69 72 73 74 0a 20 20  hat the first.  
1e2b0 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20  ** two elements 
1e2c0 69 6e 20 74 68 65 20 6b 65 79 73 20 61 72 65 20  in the keys are 
1e2d0 65 71 75 61 6c 2e 20 46 69 78 20 74 68 65 20 76  equal. Fix the v
1e2e0 61 72 69 6f 75 73 20 73 74 61 63 6b 20 76 61 72  arious stack var
1e2f0 69 61 62 6c 65 73 20 73 6f 0a 20 20 2a 2a 20 74  iables so.  ** t
1e300 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hat this routine
1e310 20 62 65 67 69 6e 73 20 63 6f 6d 70 61 72 69 6e   begins comparin
1e320 67 20 61 74 20 74 68 65 20 73 65 63 6f 6e 64 20  g at the second 
1e330 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 69 66 28 20  field. */.  if( 
1e340 62 53 6b 69 70 20 29 7b 0a 20 20 20 20 75 33 32  bSkip ){.    u32
1e350 20 73 31 3b 0a 20 20 20 20 69 64 78 31 20 3d 20   s1;.    idx1 = 
1e360 31 20 2b 20 67 65 74 56 61 72 69 6e 74 33 32 28  1 + getVarint32(
1e370 26 61 4b 65 79 31 5b 31 5d 2c 20 73 31 29 3b 0a  &aKey1[1], s1);.
1e380 20 20 20 20 73 7a 48 64 72 31 20 3d 20 61 4b 65      szHdr1 = aKe
1e390 79 31 5b 30 5d 3b 0a 20 20 20 20 64 31 20 3d 20  y1[0];.    d1 = 
1e3a0 73 7a 48 64 72 31 20 2b 20 73 71 6c 69 74 65 33  szHdr1 + sqlite3
1e3b0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
1e3c0 6e 28 73 31 29 3b 0a 20 20 20 20 69 20 3d 20 31  n(s1);.    i = 1
1e3d0 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20  ;.    pRhs++;.  
1e3e0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 31 20  }else{.    idx1 
1e3f0 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b  = getVarint32(aK
1e400 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20  ey1, szHdr1);.  
1e410 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20    d1 = szHdr1;. 
1e420 20 20 20 69 66 28 20 64 31 3e 28 75 6e 73 69 67     if( d1>(unsig
1e430 6e 65 64 29 6e 4b 65 79 31 20 29 7b 20 0a 20 20  ned)nKey1 ){ .  
1e440 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43      pPKey2->errC
1e450 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45  ode = (u8)SQLITE
1e460 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1e470 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1e480 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  /* Corruption */
1e490 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 30  .    }.    i = 0
1e4a0 3b 0a 20 20 7d 0a 0a 20 20 56 56 41 5f 4f 4e 4c  ;.  }..  VVA_ONL
1e4b0 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63  Y( mem1.szMalloc
1e4c0 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20   = 0; ) /* Only 
1e4d0 6e 65 65 64 65 64 20 62 79 20 61 73 73 65 72 74  needed by assert
1e4e0 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  () statements */
1e4f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79  .  assert( pPKey
1e500 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  2->pKeyInfo->nFi
1e510 65 6c 64 2b 70 50 4b 65 79 32 2d 3e 70 4b 65 79  eld+pPKey2->pKey
1e520 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70  Info->nXField>=p
1e530 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 0a 20  PKey2->nField . 
1e540 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54        || CORRUPT
1e550 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
1e560 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1e570 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30  o->aSortOrder!=0
1e580 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1e590 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
1e5a0 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73  nField>0 );.  as
1e5b0 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64  sert( idx1<=szHd
1e5c0 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  r1 || CORRUPT_DB
1e5d0 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33   );.  do{.    u3
1e5e0 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a  2 serial_type;..
1e5f0 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 6e      /* RHS is an
1e600 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1e610 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20  if( pRhs->flags 
1e620 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20  & MEM_Int ){.   
1e630 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d     serial_type =
1e640 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20   aKey1[idx1];.  
1e650 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65      testcase( se
1e660 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b  rial_type==12 );
1e670 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
1e680 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20  l_type>=10 ){.  
1e690 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20        rc = +1;. 
1e6a0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
1e6b0 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b  erial_type==0 ){
1e6c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31  .        rc = -1
1e6d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1e6e0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37  ( serial_type==7
1e6f0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1e700 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1e710 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72  (&aKey1[d1], ser
1e720 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29  ial_type, &mem1)
1e730 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  ;.        rc = -
1e740 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43  sqlite3IntFloatC
1e750 6f 6d 70 61 72 65 28 70 52 68 73 2d 3e 75 2e 69  ompare(pRhs->u.i
1e760 2c 20 6d 65 6d 31 2e 75 2e 72 29 3b 0a 20 20 20  , mem1.u.r);.   
1e770 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e780 20 20 69 36 34 20 6c 68 73 20 3d 20 76 64 62 65    i64 lhs = vdbe
1e790 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28  RecordDecodeInt(
1e7a0 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 61 4b  serial_type, &aK
1e7b0 65 79 31 5b 64 31 5d 29 3b 0a 20 20 20 20 20 20  ey1[d1]);.      
1e7c0 20 20 69 36 34 20 72 68 73 20 3d 20 70 52 68 73    i64 rhs = pRhs
1e7d0 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 69  ->u.i;.        i
1e7e0 66 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20  f( lhs<rhs ){.  
1e7f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
1e800 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1e810 66 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20  f( lhs>rhs ){.  
1e820 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b          rc = +1;
1e830 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1e840 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1e850 20 52 48 53 20 69 73 20 72 65 61 6c 20 2a 2f 0a   RHS is real */.
1e860 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68      else if( pRh
1e870 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  s->flags & MEM_R
1e880 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 65 72  eal ){.      ser
1e890 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31  ial_type = aKey1
1e8a0 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 69 66  [idx1];.      if
1e8b0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
1e8c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
1e8d0 53 65 72 69 61 6c 20 74 79 70 65 73 20 31 32 20  Serial types 12 
1e8e0 6f 72 20 67 72 65 61 74 65 72 20 61 72 65 20 73  or greater are s
1e8f0 74 72 69 6e 67 73 20 61 6e 64 20 62 6c 6f 62 73  trings and blobs
1e900 20 28 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20   (greater than. 
1e910 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
1e920 73 29 2e 20 54 79 70 65 73 20 31 30 20 61 6e 64  s). Types 10 and
1e930 20 31 31 20 61 72 65 20 63 75 72 72 65 6e 74 6c   11 are currentl
1e940 79 20 22 72 65 73 65 72 76 65 64 20 66 6f 72 20  y "reserved for 
1e950 66 75 74 75 72 65 20 0a 20 20 20 20 20 20 20 20  future .        
1e960 2a 2a 20 75 73 65 22 2c 20 73 6f 20 69 74 20 64  ** use", so it d
1e970 6f 65 73 6e 27 74 20 72 65 61 6c 6c 79 20 6d 61  oesn't really ma
1e980 74 74 65 72 20 77 68 61 74 20 74 68 65 20 72 65  tter what the re
1e990 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70 61 72 69  sults of compari
1e9a0 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ng.        ** th
1e9b0 65 6d 20 74 6f 20 6e 75 6d 62 65 72 69 63 20 76  em to numberic v
1e9c0 61 6c 75 65 73 20 61 72 65 2e 20 20 2a 2f 0a 20  alues are.  */. 
1e9d0 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a         rc = +1;.
1e9e0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1e9f0 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29  serial_type==0 )
1ea00 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
1ea10 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
1ea20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1ea30 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
1ea40 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f  ey1[d1], serial_
1ea50 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20  type, &mem1);.  
1ea60 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
1ea70 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20  _type==7 ){.    
1ea80 20 20 20 20 20 20 69 66 28 20 6d 65 6d 31 2e 75        if( mem1.u
1ea90 2e 72 3c 70 52 68 73 2d 3e 75 2e 72 20 29 7b 0a  .r<pRhs->u.r ){.
1eaa0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1eab0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   -1;.          }
1eac0 65 6c 73 65 20 69 66 28 20 6d 65 6d 31 2e 75 2e  else if( mem1.u.
1ead0 72 3e 70 52 68 73 2d 3e 75 2e 72 20 29 7b 0a 20  r>pRhs->u.r ){. 
1eae0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1eaf0 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  +1;.          }.
1eb00 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1eb10 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1eb20 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d  lite3IntFloatCom
1eb30 70 61 72 65 28 6d 65 6d 31 2e 75 2e 69 2c 20 70  pare(mem1.u.i, p
1eb40 52 68 73 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20  Rhs->u.r);.     
1eb50 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1eb60 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69   }..    /* RHS i
1eb70 73 20 61 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  s a string */.  
1eb80 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d    else if( pRhs-
1eb90 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72  >flags & MEM_Str
1eba0 20 29 7b 0a 20 20 20 20 20 20 67 65 74 56 61 72   ){.      getVar
1ebb0 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78  int32(&aKey1[idx
1ebc0 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29  1], serial_type)
1ebd0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1ebe0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31  ( serial_type==1
1ebf0 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  2 );.      if( s
1ec00 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b  erial_type<12 ){
1ec10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31  .        rc = -1
1ec20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1ec30 28 20 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20  ( !(serial_type 
1ec40 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20  & 0x01) ){.     
1ec50 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20     rc = +1;.    
1ec60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1ec70 20 6d 65 6d 31 2e 6e 20 3d 20 28 73 65 72 69 61   mem1.n = (seria
1ec80 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32  l_type - 12) / 2
1ec90 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1eca0 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 3d  se( (d1+mem1.n)=
1ecb0 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
1ecc0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
1ecd0 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e  case( (d1+mem1.n
1ece0 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e  +1)==(unsigned)n
1ecf0 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20  Key1 );.        
1ed00 69 66 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 20  if( (d1+mem1.n) 
1ed10 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  > (unsigned)nKey
1ed20 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  1 ){.          p
1ed30 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d  PKey2->errCode =
1ed40 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52   (u8)SQLITE_CORR
1ed50 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1ed60 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1ed70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ed80 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  Corruption */.  
1ed90 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1eda0 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
1edb0 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i] ){.          
1edc0 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49  mem1.enc = pKeyI
1edd0 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20  nfo->enc;.      
1ede0 20 20 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b      mem1.db = pK
1edf0 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20  eyInfo->db;.    
1ee00 20 20 20 20 20 20 6d 65 6d 31 2e 66 6c 61 67 73        mem1.flags
1ee10 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 20 20   = MEM_Str;.    
1ee20 20 20 20 20 20 20 6d 65 6d 31 2e 7a 20 3d 20 28        mem1.z = (
1ee30 63 68 61 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d  char*)&aKey1[d1]
1ee40 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1ee50 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53   vdbeCompareMemS
1ee60 74 72 69 6e 67 28 0a 20 20 20 20 20 20 20 20 20  tring(.         
1ee70 20 20 20 20 20 26 6d 65 6d 31 2c 20 70 52 68 73       &mem1, pRhs
1ee80 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  , pKeyInfo->aCol
1ee90 6c 5b 69 5d 2c 20 26 70 50 4b 65 79 32 2d 3e 65  l[i], &pPKey2->e
1eea0 72 72 43 6f 64 65 0a 20 20 20 20 20 20 20 20 20  rrCode.         
1eeb0 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   );.        }els
1eec0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e{.          int
1eed0 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d 65 6d 31   nCmp = MIN(mem1
1eee0 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20  .n, pRhs->n);.  
1eef0 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d          rc = mem
1ef00 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  cmp(&aKey1[d1], 
1ef10 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a  pRhs->z, nCmp);.
1ef20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1ef30 3d 3d 30 20 29 20 72 63 20 3d 20 6d 65 6d 31 2e  ==0 ) rc = mem1.
1ef40 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a 20 20  n - pRhs->n; .  
1ef50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1ef60 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48      }..    /* RH
1ef70 53 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20  S is a blob */. 
1ef80 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73     else if( pRhs
1ef90 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c  ->flags & MEM_Bl
1efa0 6f 62 20 29 7b 0a 20 20 20 20 20 20 67 65 74 56  ob ){.      getV
1efb0 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69  arint32(&aKey1[i
1efc0 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  dx1], serial_typ
1efd0 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
1efe0 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  se( serial_type=
1eff0 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28  =12 );.      if(
1f000 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20   serial_type<12 
1f010 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20  || (serial_type 
1f020 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20  & 0x01) ){.     
1f030 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
1f040 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f050 20 69 6e 74 20 6e 53 74 72 20 3d 20 28 73 65 72   int nStr = (ser
1f060 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f  ial_type - 12) /
1f070 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   2;.        test
1f080 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72 29 3d  case( (d1+nStr)=
1f090 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
1f0a0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
1f0b0 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72 2b 31  case( (d1+nStr+1
1f0c0 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  )==(unsigned)nKe
1f0d0 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  y1 );.        if
1f0e0 28 20 28 64 31 2b 6e 53 74 72 29 20 3e 20 28 75  ( (d1+nStr) > (u
1f0f0 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b  nsigned)nKey1 ){
1f100 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79  .          pPKey
1f110 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38  2->errCode = (u8
1f120 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f  )SQLITE_CORRUPT_
1f130 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
1f140 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1f150 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72           /* Corr
1f160 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uption */.      
1f170 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f180 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49     int nCmp = MI
1f190 4e 28 6e 53 74 72 2c 20 70 52 68 73 2d 3e 6e 29  N(nStr, pRhs->n)
1f1a0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1f1b0 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64   memcmp(&aKey1[d
1f1c0 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d  1], pRhs->z, nCm
1f1d0 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  p);.          if
1f1e0 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6e  ( rc==0 ) rc = n
1f1f0 53 74 72 20 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20  Str - pRhs->n;. 
1f200 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1f210 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
1f220 48 53 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20  HS is null */.  
1f230 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 65    else{.      se
1f240 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79  rial_type = aKey
1f250 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 72  1[idx1];.      r
1f260 63 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  c = (serial_type
1f270 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  !=0);.    }..   
1f280 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
1f290 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
1f2a0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
1f2b0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1f2c0 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -rc;.      }.   
1f2d0 20 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52     assert( vdbeR
1f2e0 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75  ecordCompareDebu
1f2f0 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  g(nKey1, pKey1, 
1f300 70 50 4b 65 79 32 2c 20 72 63 29 20 29 3b 0a 20  pPKey2, rc) );. 
1f310 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d       assert( mem
1f320 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  1.szMalloc==0 );
1f330 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74    /* See comment
1f340 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20   below */.      
1f350 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1f360 0a 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 70  ..    i++;.    p
1f370 52 68 73 2b 2b 3b 0a 20 20 20 20 64 31 20 2b 3d  Rhs++;.    d1 +=
1f380 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1f390 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
1f3a0 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 64 78 31  _type);.    idx1
1f3b0 20 2b 3d 20 73 71 6c 69 74 65 33 56 61 72 69 6e   += sqlite3Varin
1f3c0 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  tLen(serial_type
1f3d0 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78  );.  }while( idx
1f3e0 31 3c 28 75 6e 73 69 67 6e 65 64 29 73 7a 48 64  1<(unsigned)szHd
1f3f0 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e  r1 && i<pPKey2->
1f400 6e 46 69 65 6c 64 20 26 26 20 64 31 3c 3d 28 75  nField && d1<=(u
1f410 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b  nsigned)nKey1 );
1f420 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79  ..  /* No memory
1f430 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65   allocation is e
1f440 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31  ver used on mem1
1f450 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73  .  Prove this us
1f460 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c  ing.  ** the fol
1f470 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e  lowing assert().
1f480 20 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28    If the assert(
1f490 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69  ) fails, it indi
1f4a0 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d  cates a.  ** mem
1f4b0 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e  ory leak and a n
1f4c0 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69  eed to call sqli
1f4d0 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
1f4e0 65 28 26 6d 65 6d 31 29 2e 20 20 2a 2f 0a 20 20  e(&mem1).  */.  
1f4f0 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d  assert( mem1.szM
1f500 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f  alloc==0 );..  /
1f510 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61  * rc==0 here mea
1f520 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 72 20 62  ns that one or b
1f530 6f 74 68 20 6f 66 20 74 68 65 20 6b 65 79 73 20  oth of the keys 
1f540 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64  ran out of field
1f550 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74  s and.  ** all t
1f560 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20  he fields up to 
1f570 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20  that point were 
1f580 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68  equal. Return th
1f590 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a  e default_rc.  *
1f5a0 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 61  * value.  */.  a
1f5b0 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
1f5c0 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 76 64 62  B .       || vdb
1f5d0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65  eRecordCompareDe
1f5e0 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  bug(nKey1, pKey1
1f5f0 2c 20 70 50 4b 65 79 32 2c 20 70 50 4b 65 79 32  , pPKey2, pPKey2
1f600 2d 3e 64 65 66 61 75 6c 74 5f 72 63 29 20 0a 20  ->default_rc) . 
1f610 20 20 20 20 20 20 7c 7c 20 70 4b 65 79 49 6e 66        || pKeyInf
1f620 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  o->db->mallocFai
1f630 6c 65 64 0a 20 20 29 3b 0a 20 20 70 50 4b 65 79  led.  );.  pPKey
1f640 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20  2->eqSeen = 1;. 
1f650 20 72 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e   return pPKey2->
1f660 64 65 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a 69 6e  default_rc;.}.in
1f670 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  t sqlite3VdbeRec
1f680 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e  ordCompare(.  in
1f690 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
1f6a0 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a  oid *pKey1,   /*
1f6b0 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55   Left key */.  U
1f6c0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1f6d0 50 4b 65 79 32 20 20 20 20 20 20 20 20 20 20 2f  PKey2          /
1f6e0 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29  * Right key */.)
1f6f0 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
1f700 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1f710 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79  areWithSkip(nKey
1f720 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1f730 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  , 0);.}.../*.** 
1f740 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1f750 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65   an optimized ve
1f760 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33  rsion of sqlite3
1f770 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1f780 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29  e() .** that (a)
1f790 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
1f7a0 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61 6e   of pPKey2 is an
1f7b0 20 69 6e 74 65 67 65 72 2c 20 61 6e 64 20 28 62   integer, and (b
1f7c0 29 20 74 68 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f  ) the .** size-o
1f7d0 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20  f-header varint 
1f7e0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
1f7f0 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69  (pKey1/nKey1) fi
1f800 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 0a 2a  ts in a single.*
1f810 2a 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20  * byte (i.e. is 
1f820 6c 65 73 73 20 74 68 61 6e 20 31 32 38 29 2e 0a  less than 128)..
1f830 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 63  **.** To avoid c
1f840 6f 6e 63 65 72 6e 73 20 61 62 6f 75 74 20 62 75  oncerns about bu
1f850 66 66 65 72 20 6f 76 65 72 72 65 61 64 73 2c 20  ffer overreads, 
1f860 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1f870 6f 6e 6c 79 20 75 73 65 64 0a 2a 2a 20 6f 6e 20  only used.** on 
1f880 73 63 68 65 6d 61 73 20 77 68 65 72 65 20 74 68  schemas where th
1f890 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 69 64 20  e maximum valid 
1f8a0 68 65 61 64 65 72 20 73 69 7a 65 20 69 73 20 36  header size is 6
1f8b0 33 20 62 79 74 65 73 20 6f 72 20 6c 65 73 73 2e  3 bytes or less.
1f8c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
1f8d0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1f8e0 49 6e 74 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31  Int(.  int nKey1
1f8f0 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
1f900 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79  ey1, /* Left key
1f910 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
1f920 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20  cord *pPKey2    
1f930 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79      /* Right key
1f940 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75   */.){.  const u
1f950 38 20 2a 61 4b 65 79 20 3d 20 26 28 28 63 6f 6e  8 *aKey = &((con
1f960 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 2a 28  st u8*)pKey1)[*(
1f970 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 20  const u8*)pKey1 
1f980 26 20 30 78 33 46 5d 3b 0a 20 20 69 6e 74 20 73  & 0x3F];.  int s
1f990 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 28 28 63  erial_type = ((c
1f9a0 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b  onst u8*)pKey1)[
1f9b0 31 5d 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  1];.  int res;. 
1f9c0 20 75 33 32 20 79 3b 0a 20 20 75 36 34 20 78 3b   u32 y;.  u64 x;
1f9d0 0a 20 20 69 36 34 20 76 20 3d 20 70 50 4b 65 79  .  i64 v = pPKey
1f9e0 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a  2->aMem[0].u.i;.
1f9f0 20 20 69 36 34 20 6c 68 73 3b 0a 0a 20 20 76 64    i64 lhs;..  vd
1fa00 62 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75  beAssertFieldCou
1fa10 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e  ntWithinLimits(n
1fa20 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
1fa30 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a  ey2->pKeyInfo);.
1fa40 20 20 61 73 73 65 72 74 28 20 28 2a 28 75 38 2a    assert( (*(u8*
1fa50 29 70 4b 65 79 31 29 3c 3d 30 78 33 46 20 7c 7c  )pKey1)<=0x3F ||
1fa60 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
1fa70 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f   switch( serial_
1fa80 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
1fa90 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20   1: { /* 1-byte 
1faa0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1fab0 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 4f 4e  /.      lhs = ON
1fac0 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  E_BYTE_INT(aKey)
1fad0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1fae0 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
1faf0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1fb00 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32    case 2: { /* 2
1fb10 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1fb20 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68  eger */.      lh
1fb30 73 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54  s = TWO_BYTE_INT
1fb40 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65  (aKey);.      te
1fb50 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
1fb60 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1fb70 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20    }.    case 3: 
1fb80 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e  { /* 3-byte sign
1fb90 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1fba0 20 20 20 20 6c 68 73 20 3d 20 54 48 52 45 45 5f      lhs = THREE_
1fbb0 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1fbc0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fbd0 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
1fbe0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1fbf0 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62  case 4: { /* 4-b
1fc00 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1fc10 65 72 20 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20  er */.      y = 
1fc20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
1fc30 4b 65 79 29 3b 0a 20 20 20 20 20 20 6c 68 73 20  Key);.      lhs 
1fc40 3d 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79  = (i64)*(int*)&y
1fc50 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1fc60 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
1fc70 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1fc80 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36    case 5: { /* 6
1fc90 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1fca0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68  eger */.      lh
1fcb0 73 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  s = FOUR_BYTE_UI
1fcc0 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28  NT(aKey+2) + (((
1fcd0 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f  i64)1)<<32)*TWO_
1fce0 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1fcf0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fd00 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
1fd10 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1fd20 63 61 73 65 20 36 3a 20 7b 20 2f 2a 20 38 2d 62  case 6: { /* 8-b
1fd30 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1fd40 65 72 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20  er */.      x = 
1fd50 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
1fd60 4b 65 79 29 3b 0a 20 20 20 20 20 20 78 20 3d 20  Key);.      x = 
1fd70 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42  (x<<32) | FOUR_B
1fd80 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29  YTE_UINT(aKey+4)
1fd90 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 2a 28  ;.      lhs = *(
1fda0 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 74  i64*)&x;.      t
1fdb0 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
1fdc0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1fdd0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a     }.    case 8:
1fde0 20 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 30 3b   .      lhs = 0;
1fdf0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1fe00 20 20 63 61 73 65 20 39 3a 0a 20 20 20 20 20 20    case 9:.      
1fe10 6c 68 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 62  lhs = 1;.      b
1fe20 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  reak;..    /* Th
1fe30 69 73 20 63 61 73 65 20 63 6f 75 6c 64 20 62 65  is case could be
1fe40 20 72 65 6d 6f 76 65 64 20 77 69 74 68 6f 75 74   removed without
1fe50 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 72 65   changing the re
1fe60 73 75 6c 74 73 20 6f 66 20 72 75 6e 6e 69 6e 67  sults of running
1fe70 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64  .    ** this cod
1fe80 65 2e 20 49 6e 63 6c 75 64 69 6e 67 20 69 74 20  e. Including it 
1fe90 63 61 75 73 65 73 20 67 63 63 20 74 6f 20 67 65  causes gcc to ge
1fea0 6e 65 72 61 74 65 20 61 20 66 61 73 74 65 72 20  nerate a faster 
1feb0 73 77 69 74 63 68 20 0a 20 20 20 20 2a 2a 20 73  switch .    ** s
1fec0 74 61 74 65 6d 65 6e 74 20 28 73 69 6e 63 65 20  tatement (since 
1fed0 74 68 65 20 72 61 6e 67 65 20 6f 66 20 73 77 69  the range of swi
1fee0 74 63 68 20 74 61 72 67 65 74 73 20 6e 6f 77 20  tch targets now 
1fef0 73 74 61 72 74 73 20 61 74 20 7a 65 72 6f 20 61  starts at zero a
1ff00 6e 64 0a 20 20 20 20 2a 2a 20 69 73 20 63 6f 6e  nd.    ** is con
1ff10 74 69 67 75 6f 75 73 29 20 62 75 74 20 64 6f 65  tiguous) but doe
1ff20 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20  s not cause any 
1ff30 64 75 70 6c 69 63 61 74 65 20 63 6f 64 65 20 74  duplicate code t
1ff40 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 0a 20  o be generated. 
1ff50 20 20 20 2a 2a 20 28 61 73 20 67 63 63 20 69 73     ** (as gcc is
1ff60 20 63 6c 65 76 65 72 20 65 6e 6f 75 67 68 20 74   clever enough t
1ff70 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 74 77  o combine the tw
1ff80 6f 20 6c 69 6b 65 20 63 61 73 65 73 29 2e 20 4f  o like cases). O
1ff90 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6d  ther .    ** com
1ffa0 70 69 6c 65 72 73 20 6d 69 67 68 74 20 62 65 20  pilers might be 
1ffb0 73 69 6d 69 6c 61 72 2e 20 20 2a 2f 20 0a 20 20  similar.  */ .  
1ffc0 20 20 63 61 73 65 20 30 3a 20 63 61 73 65 20 37    case 0: case 7
1ffd0 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  :.      return s
1ffe0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1fff0 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70  Compare(nKey1, p
20000 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 0a  Key1, pPKey2);..
20010 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
20020 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
20030 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
20040 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  re(nKey1, pKey1,
20050 20 70 50 4b 65 79 32 29 3b 0a 20 20 7d 0a 0a 20   pPKey2);.  }.. 
20060 20 69 66 28 20 76 3e 6c 68 73 20 29 7b 0a 20 20   if( v>lhs ){.  
20070 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
20080 72 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  r1;.  }else if( 
20090 76 3c 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73  v<lhs ){.    res
200a0 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20   = pPKey2->r2;. 
200b0 20 7d 65 6c 73 65 20 69 66 28 20 70 50 4b 65 79   }else if( pPKey
200c0 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20  2->nField>1 ){. 
200d0 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
200e0 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77  fields of the tw
200f0 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c  o keys are equal
20100 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74 72  . Compare the tr
20110 61 69 6c 69 6e 67 20 0a 20 20 20 20 2a 2a 20 66  ailing .    ** f
20120 69 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 20 20 72  ields.  */.    r
20130 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  es = sqlite3Vdbe
20140 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74  RecordCompareWit
20150 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65  hSkip(nKey1, pKe
20160 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a  y1, pPKey2, 1);.
20170 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
20180 54 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73  The first fields
20190 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73   of the two keys
201a0 20 61 72 65 20 65 71 75 61 6c 20 61 6e 64 20 74   are equal and t
201b0 68 65 72 65 20 61 72 65 20 6e 6f 20 74 72 61 69  here are no trai
201c0 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 66 69 65 6c  ling.    ** fiel
201d0 64 73 2e 20 52 65 74 75 72 6e 20 70 50 4b 65 79  ds. Return pPKey
201e0 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 6e  2->default_rc in
201f0 20 74 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20   this case. */. 
20200 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
20210 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20  >default_rc;.   
20220 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20   pPKey2->eqSeen 
20230 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  = 1;.  }..  asse
20240 72 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f  rt( vdbeRecordCo
20250 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31  mpareDebug(nKey1
20260 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
20270 20 72 65 73 29 20 29 3b 0a 20 20 72 65 74 75 72   res) );.  retur
20280 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
20290 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
202a0 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65   an optimized ve
202b0 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33  rsion of sqlite3
202c0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
202d0 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29  e() .** that (a)
202e0 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
202f0 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61 20   of pPKey2 is a 
20300 73 74 72 69 6e 67 2c 20 74 68 61 74 20 28 62 29  string, that (b)
20310 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
20320 0a 2a 2a 20 75 73 65 73 20 74 68 65 20 63 6f 6c  .** uses the col
20330 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
20340 42 49 4e 41 52 59 20 61 6e 64 20 28 63 29 20 74  BINARY and (c) t
20350 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d  hat the size-of-
20360 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 0a 2a  header varint .*
20370 2a 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  * at the start o
20380 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20  f (pKey1/nKey1) 
20390 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65  fits in a single
203a0 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   byte..*/.static
203b0 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43   int vdbeRecordC
203c0 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 0a 20 20  ompareString(.  
203d0 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
203e0 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a   void *pKey1, /*
203f0 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55   Left key */.  U
20400 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
20410 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20  PKey2        /* 
20420 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a  Right key */.){.
20430 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79    const u8 *aKey
20440 31 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29 70  1 = (const u8*)p
20450 4b 65 79 31 3b 0a 20 20 69 6e 74 20 73 65 72 69  Key1;.  int seri
20460 61 6c 5f 74 79 70 65 3b 0a 20 20 69 6e 74 20 72  al_type;.  int r
20470 65 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  es;..  assert( p
20480 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 66  PKey2->aMem[0].f
20490 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
204a0 3b 0a 20 20 76 64 62 65 41 73 73 65 72 74 46 69  ;.  vdbeAssertFi
204b0 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69  eldCountWithinLi
204c0 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79  mits(nKey1, pKey
204d0 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  1, pPKey2->pKeyI
204e0 6e 66 6f 29 3b 0a 20 20 67 65 74 56 61 72 69 6e  nfo);.  getVarin
204f0 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73  t32(&aKey1[1], s
20500 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 69  erial_type);.  i
20510 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31  f( serial_type<1
20520 32 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70  2 ){.    res = p
20530 50 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20 20 20  PKey2->r1;      
20540 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29  /* (pKey1/nKey1)
20550 20 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 72 20   is a number or 
20560 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73  a null */.  }els
20570 65 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74  e if( !(serial_t
20580 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 20 0a  ype & 0x01) ){ .
20590 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
205a0 2d 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20 28 70  ->r2;      /* (p
205b0 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61  Key1/nKey1) is a
205c0 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73 65   blob */.  }else
205d0 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a  {.    int nCmp;.
205e0 20 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a 20 20      int nStr;.  
205f0 20 20 69 6e 74 20 73 7a 48 64 72 20 3d 20 61 4b    int szHdr = aK
20600 65 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53 74  ey1[0];..    nSt
20610 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  r = (serial_type
20620 2d 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 69 66  -12) / 2;.    if
20630 28 20 28 73 7a 48 64 72 20 2b 20 6e 53 74 72 29  ( (szHdr + nStr)
20640 20 3e 20 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20   > nKey1 ){.    
20650 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64    pPKey2->errCod
20660 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43  e = (u8)SQLITE_C
20670 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
20680 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
20690 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  /* Corruption */
206a0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6d 70 20  .    }.    nCmp 
206b0 3d 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d 3e 61  = MIN( pPKey2->a
206c0 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20 29  Mem[0].n, nStr )
206d0 3b 0a 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63  ;.    res = memc
206e0 6d 70 28 26 61 4b 65 79 31 5b 73 7a 48 64 72 5d  mp(&aKey1[szHdr]
206f0 2c 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30  , pPKey2->aMem[0
20700 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20 20  ].z, nCmp);..   
20710 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
20720 20 20 20 20 20 72 65 73 20 3d 20 6e 53 74 72 20       res = nStr 
20730 2d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30  - pPKey2->aMem[0
20740 5d 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ].n;.      if( r
20750 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  es==0 ){.       
20760 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69   if( pPKey2->nFi
20770 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 20  eld>1 ){.       
20780 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33     res = sqlite3
20790 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
207a0 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c  eWithSkip(nKey1,
207b0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
207c0 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1);.        }els
207d0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73  e{.          res
207e0 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75   = pPKey2->defau
207f0 6c 74 5f 72 63 3b 0a 20 20 20 20 20 20 20 20 20  lt_rc;.         
20800 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20   pPKey2->eqSeen 
20810 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
20820 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
20830 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  es>0 ){.        
20840 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32  res = pPKey2->r2
20850 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
20860 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b         res = pPK
20870 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 20 20 7d  ey2->r1;.      }
20880 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
20890 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 65  es>0 ){.      re
208a0 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a  s = pPKey2->r2;.
208b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
208c0 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
208d0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
208e0 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f  assert( vdbeReco
208f0 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
20900 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
20910 65 79 32 2c 20 72 65 73 29 0a 20 20 20 20 20 20  ey2, res).      
20920 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 0a 20   || CORRUPT_DB. 
20930 20 20 20 20 20 20 7c 7c 20 70 50 4b 65 79 32 2d        || pPKey2-
20940 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d  >pKeyInfo->db->m
20950 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b  allocFailed.  );
20960 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
20970 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
20980 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
20990 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
209a0 43 6f 6d 70 61 72 65 28 29 20 63 6f 6d 70 61 74  Compare() compat
209b0 69 62 6c 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ible function.**
209c0 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 63 6f   suitable for co
209d0 6d 70 61 72 69 6e 67 20 73 65 72 69 61 6c 69 7a  mparing serializ
209e0 65 64 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68  ed records to th
209f0 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72  e unpacked recor
20a00 64 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  d passed.** as t
20a10 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
20a20 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f 6d 70 61  ..*/.RecordCompa
20a30 72 65 20 73 71 6c 69 74 65 33 56 64 62 65 46 69  re sqlite3VdbeFi
20a40 6e 64 43 6f 6d 70 61 72 65 28 55 6e 70 61 63 6b  ndCompare(Unpack
20a50 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20  edRecord *p){.  
20a60 2f 2a 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43  /* varintRecordC
20a70 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64 20  ompareInt() and 
20a80 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70  varintRecordComp
20a90 61 72 65 53 74 72 69 6e 67 28 29 20 62 6f 74 68  areString() both
20aa0 20 61 73 73 75 6d 65 0a 20 20 2a 2a 20 74 68 61   assume.  ** tha
20ab0 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65  t the size-of-he
20ac0 61 64 65 72 20 76 61 72 69 6e 74 20 74 68 61 74  ader varint that
20ad0 20 6f 63 63 75 72 73 20 61 74 20 74 68 65 20 73   occurs at the s
20ae0 74 61 72 74 20 6f 66 20 65 61 63 68 20 72 65 63  tart of each rec
20af0 6f 72 64 0a 20 20 2a 2a 20 66 69 74 73 20 69 6e  ord.  ** fits in
20b00 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 28   a single byte (
20b10 69 2e 65 2e 20 69 73 20 31 32 37 20 6f 72 20 6c  i.e. is 127 or l
20b20 65 73 73 29 2e 20 76 61 72 69 6e 74 52 65 63 6f  ess). varintReco
20b30 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 0a 20  rdCompareInt(). 
20b40 20 2a 2a 20 61 6c 73 6f 20 61 73 73 75 6d 65 73   ** also assumes
20b50 20 74 68 61 74 20 69 74 20 69 73 20 73 61 66 65   that it is safe
20b60 20 74 6f 20 6f 76 65 72 72 65 61 64 20 61 20 62   to overread a b
20b70 75 66 66 65 72 20 62 79 20 61 74 20 6c 65 61 73  uffer by at leas
20b80 74 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61 78 69  t the .  ** maxi
20b90 6d 75 6d 20 70 6f 73 73 69 62 6c 65 20 6c 65 67  mum possible leg
20ba0 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 70  al header size p
20bb0 6c 75 73 20 38 20 62 79 74 65 73 2e 20 42 65 63  lus 8 bytes. Bec
20bc0 61 75 73 65 20 74 68 65 72 65 20 69 73 0a 20 20  ause there is.  
20bd0 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  ** guaranteed to
20be0 20 62 65 20 61 74 20 6c 65 61 73 74 20 37 34 20   be at least 74 
20bf0 28 62 75 74 20 6e 6f 74 20 31 33 36 29 20 62 79  (but not 136) by
20c00 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20 66  tes of padding f
20c10 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 0a 20 20  ollowing each.  
20c20 2a 2a 20 62 75 66 66 65 72 20 70 61 73 73 65 64  ** buffer passed
20c30 20 74 6f 20 76 61 72 69 6e 74 52 65 63 6f 72 64   to varintRecord
20c40 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 74 68 69  CompareInt() thi
20c50 73 20 6d 61 6b 65 73 20 69 74 20 63 6f 6e 76 65  s makes it conve
20c60 6e 69 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 6c 69  nient to.  ** li
20c70 6d 69 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  mit the size of 
20c80 74 68 65 20 68 65 61 64 65 72 20 74 6f 20 36 34  the header to 64
20c90 20 62 79 74 65 73 20 69 6e 20 63 61 73 65 73 20   bytes in cases 
20ca0 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74 20  where the first 
20cb0 66 69 65 6c 64 0a 20 20 2a 2a 20 69 73 20 61 6e  field.  ** is an
20cc0 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 0a 20   integer..  **. 
20cd0 20 2a 2a 20 54 68 65 20 65 61 73 69 65 73 74 20   ** The easiest 
20ce0 77 61 79 20 74 6f 20 65 6e 66 6f 72 63 65 20 74  way to enforce t
20cf0 68 69 73 20 6c 69 6d 69 74 20 69 73 20 74 6f 20  his limit is to 
20d00 63 6f 6e 73 69 64 65 72 20 6f 6e 6c 79 20 72 65  consider only re
20d10 63 6f 72 64 73 20 77 69 74 68 0a 20 20 2a 2a 20  cords with.  ** 
20d20 31 33 20 66 69 65 6c 64 73 20 6f 72 20 6c 65 73  13 fields or les
20d30 73 2e 20 49 66 20 74 68 65 20 66 69 72 73 74 20  s. If the first 
20d40 66 69 65 6c 64 20 69 73 20 61 6e 20 69 6e 74 65  field is an inte
20d50 67 65 72 2c 20 74 68 65 20 6d 61 78 69 6d 75 6d  ger, the maximum
20d60 20 6c 65 67 61 6c 0a 20 20 2a 2a 20 68 65 61 64   legal.  ** head
20d70 65 72 20 73 69 7a 65 20 69 73 20 28 31 32 2a 35  er size is (12*5
20d80 20 2b 20 31 20 2b 20 31 29 20 62 79 74 65 73 2e   + 1 + 1) bytes.
20d90 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 70    */.  if( (p->p
20da0 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
20db0 2b 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e  + p->pKeyInfo->n
20dc0 58 46 69 65 6c 64 29 3c 3d 31 33 20 29 7b 0a 20  XField)<=13 ){. 
20dd0 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70     int flags = p
20de0 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 3b  ->aMem[0].flags;
20df0 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4b 65 79  .    if( p->pKey
20e00 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
20e10 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  [0] ){.      p->
20e20 72 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d  r1 = 1;.      p-
20e30 3e 72 32 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65  >r2 = -1;.    }e
20e40 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31  lse{.      p->r1
20e50 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e   = -1;.      p->
20e60 72 32 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  r2 = 1;.    }.  
20e70 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 4d    if( (flags & M
20e80 45 4d 5f 49 6e 74 29 20 29 7b 0a 20 20 20 20 20  EM_Int) ){.     
20e90 20 72 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f   return vdbeReco
20ea0 72 64 43 6f 6d 70 61 72 65 49 6e 74 3b 0a 20 20  rdCompareInt;.  
20eb0 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65    }.    testcase
20ec0 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ( flags & MEM_Re
20ed0 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
20ee0 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  se( flags & MEM_
20ef0 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 74 65 73 74  Null );.    test
20f00 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45  case( flags & ME
20f10 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 69 66  M_Blob );.    if
20f20 28 20 28 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f  ( (flags & (MEM_
20f30 52 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45  Real|MEM_Null|ME
20f40 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 26 26 20 70  M_Blob))==0 && p
20f50 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  ->pKeyInfo->aCol
20f60 6c 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  l[0]==0 ){.     
20f70 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 20 26   assert( flags &
20f80 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 20 20   MEM_Str );.    
20f90 20 20 72 65 74 75 72 6e 20 76 64 62 65 52 65 63    return vdbeRec
20fa0 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67  ordCompareString
20fb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
20fc0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
20fd0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a  eRecordCompare;.
20fe0 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f  }../*.** pCur po
20ff0 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78  ints at an index
21000 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20 75   entry created u
21010 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65  sing the OP_Make
21020 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a  Record opcode..*
21030 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 69 64  * Read the rowid
21040 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64   (the last field
21050 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20   in the record) 
21060 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20  and store it in 
21070 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72  *rowid..** Retur
21080 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
21090 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c  verything works,
210a0 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
210b0 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  e otherwise..**.
210c0 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20 62 65  ** pCur might be
210d0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78   pointing to tex
210e0 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  t obtained from 
210f0 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
21100 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74  se file..** So t
21110 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f  he content canno
21120 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 20 44  t be trusted.  D
21130 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 68  o appropriate ch
21140 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ecks on the cont
21150 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
21160 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28  te3VdbeIdxRowid(
21170 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43  sqlite3 *db, BtC
21180 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34  ursor *pCur, i64
21190 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20   *rowid){.  i64 
211a0 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
211b0 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a  int rc;.  u32 sz
211c0 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  Hdr;        /* S
211d0 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
211e0 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52  r */.  u32 typeR
211f0 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69  owid;    /* Seri
21200 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72  al type of the r
21210 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65  owid */.  u32 le
21220 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53  nRowid;     /* S
21230 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ize of the rowid
21240 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a   */.  Mem m, v;.
21250 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69  .  /* Get the si
21260 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ze of the index 
21270 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64  entry.  Only ind
21280 69 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20  ices entries of 
21290 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32  less.  ** than 2
212a0 47 69 42 20 61 72 65 20 73 75 70 70 6f 72 74 20  GiB are support 
212b0 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65  - anything large
212c0 20 6d 75 73 74 20 62 65 20 64 61 74 61 62 61 73   must be databas
212d0 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
212e0 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f  ** Any corruptio
212f0 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 69 6e  n is detected in
21300 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
21310 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f  seCellPtr(), tho
21320 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69  ugh, so.  ** thi
21330 73 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c  s code can safel
21340 79 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43  y assume that nC
21350 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74  ellKey is 32-bit
21360 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  s  .  */.  asser
21370 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
21380 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75  ursorIsValid(pCu
21390 72 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59  r) );.  VVA_ONLY
213a0 28 72 63 20 3d 29 20 73 71 6c 69 74 65 33 42 74  (rc =) sqlite3Bt
213b0 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c  reeKeySize(pCur,
213c0 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61   &nCellKey);.  a
213d0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
213e0 45 5f 4f 4b 20 29 3b 20 20 20 20 20 2f 2a 20 70  E_OK );     /* p
213f0 43 75 72 20 69 73 20 61 6c 77 61 79 73 20 76 61  Cur is always va
21400 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 63  lid so KeySize c
21410 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20  annot fail */.  
21420 61 73 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65  assert( (nCellKe
21430 79 20 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55  y & SQLITE_MAX_U
21440 33 32 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b  32)==(u64)nCellK
21450 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  ey );..  /* Read
21460 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65   in the complete
21470 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
21480 69 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20  index entry */. 
21490 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
214a0 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b 0a  nit(&m, db, 0);.
214b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
214c0 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
214d0 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65  Cur, 0, (u32)nCe
214e0 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20  llKey, 1, &m);. 
214f0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
21500 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
21510 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65 6e   /* The index en
21520 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20 77  try must begin w
21530 69 74 68 20 61 20 68 65 61 64 65 72 20 73 69 7a  ith a header siz
21540 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74  e */.  (void)get
21550 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e  Varint32((u8*)m.
21560 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65 73  z, szHdr);.  tes
21570 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33 20  tcase( szHdr==3 
21580 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
21590 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69  zHdr==m.n );.  i
215a0 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48 64  f( unlikely(szHd
215b0 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48 64  r<3 || (int)szHd
215c0 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f  r>m.n) ){.    go
215d0 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  to idx_rowid_cor
215e0 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20  ruption;.  }..  
215f0 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65 6c  /* The last fiel
21600 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 73  d of the index s
21610 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65  hould be an inte
21620 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44 2e  ger - the ROWID.
21630 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68 61  .  ** Verify tha
21640 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
21650 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e   really is an in
21660 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69  teger. */.  (voi
21670 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75  d)getVarint32((u
21680 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d  8*)&m.z[szHdr-1]
21690 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20  , typeRowid);.  
216a0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
216b0 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74  wid==1 );.  test
216c0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
216d0 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =2 );.  testcase
216e0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20 29  ( typeRowid==3 )
216f0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
21700 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20  peRowid==4 );.  
21710 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
21720 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74  wid==5 );.  test
21730 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
21740 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =6 );.  testcase
21750 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20 29  ( typeRowid==8 )
21760 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
21770 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20  peRowid==9 );.  
21780 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70  if( unlikely(typ
21790 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70 65  eRowid<1 || type
217a0 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65 52  Rowid>9 || typeR
217b0 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20  owid==7) ){.    
217c0 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
217d0 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20  orruption;.  }. 
217e0 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69   lenRowid = sqli
217f0 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65  te3SmallTypeSize
21800 73 5b 74 79 70 65 52 6f 77 69 64 5d 3b 0a 20 20  s[typeRowid];.  
21810 74 65 73 74 63 61 73 65 28 20 28 75 33 32 29 6d  testcase( (u32)m
21820 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77  .n==szHdr+lenRow
21830 69 64 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  id );.  if( unli
21840 6b 65 6c 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a  kely((u32)m.n<sz
21850 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b  Hdr+lenRowid) ){
21860 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f  .    goto idx_ro
21870 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a  wid_corruption;.
21880 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20    }..  /* Fetch 
21890 74 68 65 20 69 6e 74 65 67 65 72 20 6f 66 66 20  the integer off 
218a0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
218b0 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20  ndex record */. 
218c0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
218d0 61 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b  alGet((u8*)&m.z[
218e0 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74  m.n-lenRowid], t
218f0 79 70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20  ypeRowid, &v);. 
21900 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b   *rowid = v.u.i;
21910 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
21920 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20  mRelease(&m);.  
21930 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
21940 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
21950 65 20 69 66 20 64 61 74 61 62 61 73 65 20 63 6f  e if database co
21960 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65  rruption is dete
21970 63 74 65 64 20 61 66 74 65 72 20 6d 20 68 61 73  cted after m has
21980 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63   been.  ** alloc
21990 61 74 65 64 2e 20 20 46 72 65 65 20 74 68 65 20  ated.  Free the 
219a0 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74  m object and ret
219b0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
219c0 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64  PT. */.idx_rowid
219d0 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74  _corruption:.  t
219e0 65 73 74 63 61 73 65 28 20 6d 2e 73 7a 4d 61 6c  estcase( m.szMal
219f0 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  loc!=0 );.  sqli
21a00 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
21a10 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(&m);.  return 
21a20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
21a30 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  KPT;.}../*.** Co
21a40 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66  mpare the key of
21a50 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
21a60 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 20   that cursor pC 
21a70 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
21a80 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65  gainst.** the ke
21a90 79 20 73 74 72 69 6e 67 20 69 6e 20 70 55 6e 70  y string in pUnp
21aa0 61 63 6b 65 64 2e 20 20 57 72 69 74 65 20 69 6e  acked.  Write in
21ab0 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65  to *pRes a numbe
21ac0 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67  r.** that is neg
21ad0 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20  ative, zero, or 
21ae0 70 6f 73 69 74 69 76 65 20 69 66 20 70 43 20 69  positive if pC i
21af0 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
21b00 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65  al to,.** or gre
21b10 61 74 65 72 20 74 68 61 6e 20 70 55 6e 70 61 63  ater than pUnpac
21b20 6b 65 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ked.  Return SQL
21b30 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
21b40 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b  s..**.** pUnpack
21b50 65 64 20 69 73 20 65 69 74 68 65 72 20 63 72 65  ed is either cre
21b60 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 20 72  ated without a r
21b70 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63  owid or is trunc
21b80 61 74 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a  ated so that it.
21b90 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77  ** omits the row
21ba0 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20  id at the end.  
21bb0 54 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65  The rowid at the
21bc0 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
21bd0 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67  x entry.** is ig
21be0 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 20 20  nored as well.  
21bf0 48 65 6e 63 65 2c 20 74 68 69 73 20 72 6f 75 74  Hence, this rout
21c00 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65  ine only compare
21c10 73 20 74 68 65 20 70 72 65 66 69 78 65 73 20 0a  s the prefixes .
21c20 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79 73 20 70  ** of the keys p
21c30 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69 6e 61  rior to the fina
21c40 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65  l rowid, not the
21c50 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a   entire key..*/.
21c60 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49  int sqlite3VdbeI
21c70 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20  dxKeyCompare(.  
21c80 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
21c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ca0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
21cb0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62  nection */.  Vdb
21cc0 65 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20  eCursor *pC,    
21cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21ce0 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63   The cursor to c
21cf0 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a  ompare against *
21d00 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
21d10 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20  rd *pUnpacked,  
21d20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64       /* Unpacked
21d30 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20   version of key 
21d40 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20  */.  int *res   
21d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d60 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
21d70 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65  he comparison re
21d80 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  sult here */.){.
21d90 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d    i64 nCellKey =
21da0 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
21db0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
21dc0 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65    Mem m;..  asse
21dd0 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
21de0 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
21df0 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 43 2d 3e  );.  pCur = pC->
21e00 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20 61 73  uc.pCursor;.  as
21e10 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
21e20 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
21e30 70 43 75 72 29 20 29 3b 0a 20 20 56 56 41 5f 4f  pCur) );.  VVA_O
21e40 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74 65  NLY(rc =) sqlite
21e50 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43  3BtreeKeySize(pC
21e60 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  ur, &nCellKey);.
21e70 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
21e80 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a  LITE_OK );    /*
21e90 20 70 43 75 72 20 69 73 20 61 6c 77 61 79 73 20   pCur is always 
21ea0 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65  valid so KeySize
21eb0 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a   cannot fail */.
21ec0 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69    /* nCellKey wi
21ed0 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65 74  ll always be bet
21ee0 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66  ween 0 and 0xfff
21ef0 66 66 66 66 66 20 62 65 63 61 75 73 65 20 6f 66  fffff because of
21f00 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 74 68   the way.  ** th
21f10 61 74 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  at btreeParseCel
21f20 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74  lPtr() and sqlit
21f30 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 29 20  e3GetVarint32() 
21f40 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  are implemented 
21f50 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65  */.  if( nCellKe
21f60 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79  y<=0 || nCellKey
21f70 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20  >0x7fffffff ){. 
21f80 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20     *res = 0;.   
21f90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
21fa0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
21fb0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
21fc0 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29  mInit(&m, db, 0)
21fd0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
21fe0 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
21ff0 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e  (pCur, 0, (u32)n
22000 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b  CellKey, 1, &m);
22010 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
22020 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
22030 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33    *res = sqlite3
22040 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
22050 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70  e(m.n, m.z, pUnp
22060 61 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74 65  acked);.  sqlite
22070 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
22080 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
22090 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
220a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
220b0 65 74 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f  ets the value to
220c0 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
220d0 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
220e0 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63   to.** sqlite3_c
220f0 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20  hanges() on the 
22100 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
22110 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  'db'. .*/.void s
22120 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
22130 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
22140 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a  , int nChange){.
22150 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
22160 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
22170 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d  >mutex) );.  db-
22180 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e  >nChange = nChan
22190 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c  ge;.  db->nTotal
221a0 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67  Change += nChang
221b0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  e;.}../*.** Set 
221c0 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64  a flag in the vd
221d0 62 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  be to update the
221e0 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
221f0 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c  when it is final
22200 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74  ised.** or reset
22210 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
22220 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65  3VdbeCountChange
22230 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d  s(Vdbe *v){.  v-
22240 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31  >changeCntOn = 1
22250 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
22260 65 76 65 72 79 20 70 72 65 70 61 72 65 64 20 73  every prepared s
22270 74 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61  tatement associa
22280 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
22290 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
222a0 2a 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a  * as expired..**
222b0 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73  .** An expired s
222c0 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74  tatement means t
222d0 68 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f  hat recompilatio
222e0 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  n of the stateme
222f0 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65  nt is.** recomme
22300 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20  nd.  Statements 
22310 65 78 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e  expire when thin
22320 67 73 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d  gs happen that m
22330 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f  ake their.** pro
22340 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20  grams obsolete. 
22350 20 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64   Removing user-d
22360 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  efined functions
22370 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a   or collating.**
22380 20 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63   sequences, or c
22390 68 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f  hanging an autho
223a0 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  rization functio
223b0 6e 20 61 72 65 20 74 68 65 20 74 79 70 65 73 20  n are the types 
223c0 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61  of.** things tha
223d0 74 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20  t make prepared 
223e0 73 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c  statements obsol
223f0 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ete..*/.void sql
22400 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
22410 65 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c  edStatements(sql
22420 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62  ite3 *db){.  Vdb
22430 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20  e *p;.  for(p = 
22440 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d  db->pVdbe; p; p=
22450 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  p->pNext){.    p
22460 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20  ->expired = 1;. 
22470 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
22480 72 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  rn the database 
22490 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
224a0 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c  the Vdbe..*/.sql
224b0 69 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62  ite3 *sqlite3Vdb
224c0 65 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  eDb(Vdbe *v){.  
224d0 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a  return v->db;.}.
224e0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
224f0 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
22500 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75  lite3_value stru
22510 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67  cture containing
22520 20 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64   the value bound
22530 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56  .** parameter iV
22540 61 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65  ar of VM v. Exce
22550 70 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65  pt, if the value
22560 20 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c   is an SQL NULL,
22570 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e   return .** 0 in
22580 73 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74  stead. Unless it
22590 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20   is NULL, apply 
225a0 61 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e  affinity aff (on
225b0 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f  e of the SQLITE_
225c0 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e  AFF_*.** constan
225d0 74 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ts) to the value
225e0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
225f0 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  g it..**.** The 
22600 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d  returned value m
22610 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
22620 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67  the caller using
22630 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
22640 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  e()..*/.sqlite3_
22650 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64  value *sqlite3Vd
22660 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28  beGetBoundValue(
22670 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61  Vdbe *v, int iVa
22680 72 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73  r, u8 aff){.  as
22690 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a  sert( iVar>0 );.
226a0 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d    if( v ){.    M
226b0 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61  em *pMem = &v->a
226c0 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20  Var[iVar-1];.   
226d0 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66   if( 0==(pMem->f
226e0 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29  lags & MEM_Null)
226f0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
22700 33 5f 76 61 6c 75 65 20 2a 70 52 65 74 20 3d 20  3_value *pRet = 
22710 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
22720 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66  v->db);.      if
22730 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20  ( pRet ){.      
22740 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
22750 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52 65 74  Copy((Mem *)pRet
22760 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  , pMem);.       
22770 20 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70   sqlite3ValueApp
22780 6c 79 41 66 66 69 6e 69 74 79 28 70 52 65 74 2c  lyAffinity(pRet,
22790 20 61 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46   aff, SQLITE_UTF
227a0 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  8);.      }.    
227b0 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 20    return pRet;. 
227c0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
227d0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  n 0;.}../*.** Co
227e0 6e 66 69 67 75 72 65 20 53 51 4c 20 76 61 72 69  nfigure SQL vari
227f0 61 62 6c 65 20 69 56 61 72 20 73 6f 20 74 68 61  able iVar so tha
22800 74 20 62 69 6e 64 69 6e 67 20 61 20 6e 65 77 20  t binding a new 
22810 76 61 6c 75 65 20 74 6f 20 69 74 20 73 69 67 6e  value to it sign
22820 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  als.** to sqlite
22830 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29 20 74  3_reoptimize() t
22840 68 61 74 20 72 65 2d 70 72 65 70 61 72 69 6e 67  hat re-preparing
22850 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6d   the statement m
22860 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20  ay result.** in 
22870 61 20 62 65 74 74 65 72 20 71 75 65 72 79 20 70  a better query p
22880 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  lan..*/.void sql
22890 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61  ite3VdbeSetVarma
228a0 73 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  sk(Vdbe *v, int 
228b0 69 56 61 72 29 7b 0a 20 20 61 73 73 65 72 74 28  iVar){.  assert(
228c0 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28   iVar>0 );.  if(
228d0 20 69 56 61 72 3e 33 32 20 29 7b 0a 20 20 20 20   iVar>32 ){.    
228e0 76 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 78 66  v->expmask = 0xf
228f0 66 66 66 66 66 66 66 3b 0a 20 20 7d 65 6c 73 65  fffffff;.  }else
22900 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b  {.    v->expmask
22910 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c 20 28   |= ((u32)1 << (
22920 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a  iVar-1));.  }.}.
22930 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22940 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
22950 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72  E./*.** Transfer
22960 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
22970 65 78 74 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69  ext from an sqli
22980 74 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67  te3_vtab.zErrMsg
22990 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a   (text stored.**
229a0 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
229b0 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
229c0 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20  _malloc) into a 
229d0 56 64 62 65 2e 7a 45 72 72 4d 73 67 20 28 74 65  Vdbe.zErrMsg (te
229e0 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  xt stored.** in 
229f0 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
22a00 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61  from sqlite3DbMa
22a10 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  lloc)..*/.void s
22a20 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74  qlite3VtabImport
22a30 45 72 72 6d 73 67 28 56 64 62 65 20 2a 70 2c 20  Errmsg(Vdbe *p, 
22a40 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
22a50 74 61 62 29 7b 0a 20 20 69 66 28 20 70 56 74 61  tab){.  if( pVta
22a60 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  b->zErrMsg ){.  
22a70 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
22a80 70 2d 3e 64 62 3b 0a 20 20 20 20 73 71 6c 69 74  p->db;.    sqlit
22a90 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
22aa0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d  zErrMsg);.    p-
22ab0 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  >zErrMsg = sqlit
22ac0 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
22ad0 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
22ae0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22af0 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29  (pVtab->zErrMsg)
22b00 3b 0a 20 20 20 20 70 56 74 61 62 2d 3e 7a 45 72  ;.    pVtab->zEr
22b10 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  rMsg = 0;.  }.}.
22b20 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
22b30 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
22b40 4c 45 20 2a 2f 0a                                LE */.