/ Hex Artifact Content
Login

Artifact 07f8f485a6cbc0a62da660f14e303061d45d5cb6:


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 73 71  rans++;.      sq
10260 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
10270 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  pBt);.      rc =
10280 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63   sqlite3PagerExc
10290 6c 75 73 69 76 65 4c 6f 63 6b 28 73 71 6c 69 74  lusiveLock(sqlit
102a0 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
102b0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
102c0 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 29  3BtreeLeave(pBt)
102d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
102e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
102f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
10300 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
10310 68 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69  here are any wri
10320 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te-transactions 
10330 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74  at all, invoke t
10340 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a  he commit hook *
10350 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d  /.  if( needXcom
10360 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d  mit && db->xComm
10370 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  itCallback ){.  
10380 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d    rc = db->xComm
10390 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  itCallback(db->p
103a0 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20  CommitArg);.    
103b0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
103c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
103d0 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48  NSTRAINT_COMMITH
103e0 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  OOK;.    }.  }..
103f0 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20    /* The simple 
10400 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74  case - no more t
10410 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65  han one database
10420 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74   file (not count
10430 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d  ing the.  ** TEM
10440 50 20 64 61 74 61 62 61 73 65 29 20 68 61 73 20  P database) has 
10450 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63  a transaction ac
10460 74 69 76 65 2e 20 20 20 54 68 65 72 65 20 69 73  tive.   There is
10470 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65   no need for the
10480 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75  .  ** master-jou
10490 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rnal..  **.  ** 
104a0 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  If the return va
104b0 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74  lue of sqlite3Bt
104c0 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29  reeGetFilename()
104d0 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74   is a zero lengt
104e0 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69  h.  ** string, i
104f0 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e  t means the main
10500 20 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65   database is :me
10510 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20  mory: or a temp 
10520 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20  file.  In .  ** 
10530 74 68 61 74 20 63 61 73 65 20 77 65 20 64 6f 20  that case we do 
10540 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d  not support atom
10550 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f  ic multi-file co
10560 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68  mmits, so use th
10570 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63  e .  ** simple c
10580 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20  ase then too..  
10590 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69  */.  if( 0==sqli
105a0 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69  te3Strlen30(sqli
105b0 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
105c0 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
105d0 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e  Bt)).   || nTran
105e0 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f  s<=1.  ){.    fo
105f0 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
10600 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
10610 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
10620 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
10630 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
10640 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
10650 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
10660 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
10670 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20  eOne(pBt, 0);.  
10680 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
10690 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69   /* Do the commi
106a0 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61  t only if all da
106b0 74 61 62 61 73 65 73 20 73 75 63 63 65 73 73 66  tabases successf
106c0 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68  ully complete ph
106d0 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49  ase 1. .    ** I
106e0 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72  f one of the Btr
106f0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
10700 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20  () calls fails, 
10710 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 61  this indicates a
10720 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f  n.    ** IO erro
10730 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67  r while deleting
10740 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61   or truncating a
10750 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
10760 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20  t is unlikely,. 
10770 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20     ** but could 
10780 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20  happen. In this 
10790 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f  case abandon pro
107a0 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75  cessing and retu
107b0 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20  rn the error..  
107c0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
107d0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
107e0 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
107f0 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
10800 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
10810 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
10820 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
10830 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
10840 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
10850 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  pBt, 0);.      }
10860 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
10870 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
10880 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61        sqlite3Vta
10890 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20  bCommit(db);.   
108a0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
108b0 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20   complex case - 
108c0 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69  There is a multi
108d0 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e  -file write-tran
108e0 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a  saction active..
108f0 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72    ** This requir
10900 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  es a master jour
10910 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75  nal file to ensu
10920 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
10930 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69  on is.  ** commi
10940 74 74 65 64 20 61 74 6f 6d 69 63 61 6c 6c 79 2e  tted atomically.
10950 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
10960 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
10970 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c  .  else{.    sql
10980 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
10990 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69   db->pVfs;.    i
109a0 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  nt needSync = 0;
109b0 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  .    char *zMast
109c0 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c  er = 0;   /* Fil
109d0 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d  e-name for the m
109e0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f  aster journal */
109f0 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20  .    char const 
10a00 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c  *zMainFile = sql
10a10 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
10a20 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
10a30 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
10a40 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20  3_file *pMaster 
10a50 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66  = 0;.    i64 off
10a60 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  set = 0;.    int
10a70 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 72 65   res;.    int re
10a80 74 72 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  tryCount = 0;.  
10a90 20 20 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b    int nMainFile;
10aa0 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20  ..    /* Select 
10ab0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
10ac0 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   file name */.  
10ad0 20 20 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71    nMainFile = sq
10ae0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d  lite3Strlen30(zM
10af0 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d  ainFile);.    zM
10b00 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  aster = sqlite3M
10b10 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d  Printf(db, "%s-m
10b20 6a 58 58 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d  jXXXXXX9XXz", zM
10b30 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66  ainFile);.    if
10b40 28 20 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20 72  ( zMaster==0 ) r
10b50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
10b60 45 4d 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20  EM;.    do {.   
10b70 20 20 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a     u32 iRandom;.
10b80 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79 43        if( retryC
10b90 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ount ){.        
10ba0 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3e 31  if( retryCount>1
10bb0 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  00 ){.          
10bc0 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
10bd0 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c  TE_FULL, "MJ del
10be0 65 74 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65  ete: %s", zMaste
10bf0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  r);.          sq
10c00 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
10c10 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
10c20 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
10c30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
10c40 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d  if( retryCount==
10c50 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  1 ){.          s
10c60 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
10c70 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c  E_FULL, "MJ coll
10c80 69 64 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65  ide: %s", zMaste
10c90 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
10ca0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 72      }.      retr
10cb0 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  yCount++;.      
10cc0 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
10cd0 73 73 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f  ss(sizeof(iRando
10ce0 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20  m), &iRandom);. 
10cf0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
10d00 72 69 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73 74  rintf(13, &zMast
10d10 65 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22  er[nMainFile], "
10d20 2d 6d 6a 25 30 36 58 39 25 30 32 58 22 2c 0a 20  -mj%06X9%02X",. 
10d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
10d50 52 61 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66  Random>>8)&0xfff
10d60 66 66 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66  fff, iRandom&0xf
10d70 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  f);.      /* The
10d80 20 61 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74 65   antipenultimate
10d90 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68   character of th
10da0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
10db0 20 6e 61 6d 65 20 6d 75 73 74 0a 20 20 20 20 20   name must.     
10dc0 20 2a 2a 20 62 65 20 22 39 22 20 74 6f 20 61 76   ** be "9" to av
10dd0 6f 69 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69  oid name collisi
10de0 6f 6e 73 20 77 68 65 6e 20 75 73 69 6e 67 20 38  ons when using 8
10df0 2b 33 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f  +3 filenames. */
10e00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a  .      assert( z
10e10 4d 61 73 74 65 72 5b 73 71 6c 69 74 65 33 53 74  Master[sqlite3St
10e20 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d  rlen30(zMaster)-
10e30 33 5d 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20 20  3]=='9' );.     
10e40 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
10e50 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a  ix3(zMainFile, z
10e60 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
10e70 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
10e80 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ess(pVfs, zMaste
10e90 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  r, SQLITE_ACCESS
10ea0 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a  _EXISTS, &res);.
10eb0 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d      }while( rc==
10ec0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73  SQLITE_OK && res
10ed0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
10ee0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10ef0 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d     /* Open the m
10f00 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a  aster journal. *
10f10 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
10f20 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63  ite3OsOpenMalloc
10f30 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
10f40 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20  &pMaster, .     
10f50 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
10f60 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
10f70 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20  E_OPEN_CREATE|. 
10f80 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
10f90 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53  OPEN_EXCLUSIVE|S
10fa0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
10fb0 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20  R_JOURNAL, 0.   
10fc0 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
10fd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10fe0 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
10ff0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
11000 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
11010 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a  urn rc;.    }. .
11020 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
11030 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61   name of each da
11040 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74  tabase file in t
11050 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
11060 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20  nto the new.    
11070 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
11080 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72  l file. If an er
11090 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74 68  ror occurs at th
110a0 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20  is point close. 
110b0 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65     ** and delete
110c0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
110d0 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68  nal file. All th
110e0 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  e individual jou
110f0 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a  rnal files.    *
11100 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75  * still have 'nu
11110 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74 65  ll' as the maste
11120 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
11130 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20  r, so they will 
11140 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b  roll.    ** back
11150 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69   independently i
11160 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75  f a failure occu
11170 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  rs..    */.    f
11180 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
11190 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
111a0 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
111b0 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
111c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
111d0 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
111e0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
111f0 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20   const *zFile = 
11200 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a  sqlite3BtreeGetJ
11210 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b  ournalname(pBt);
11220 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69  .        if( zFi
11230 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  le==0 ){.       
11240 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a     continue;  /*
11250 20 49 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64   Ignore TEMP and
11260 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61   :memory: databa
11270 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ses */.        }
11280 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
11290 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a   zFile[0]!=0 );.
112a0 20 20 20 20 20 20 20 20 69 66 28 20 21 6e 65 65          if( !nee
112b0 64 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65  dSync && !sqlite
112c0 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c  3BtreeSyncDisabl
112d0 65 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ed(pBt) ){.     
112e0 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20       needSync = 
112f0 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
11300 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11310 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65 72  3OsWrite(pMaster
11320 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33  , zFile, sqlite3
11330 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b  Strlen30(zFile)+
11340 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  1, offset);.    
11350 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71      offset += sq
11360 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
11370 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20  ile)+1;.        
11380 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11390 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
113a0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
113b0 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
113c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
113d0 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
113e0 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ter, 0);.       
113f0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
11400 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
11410 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
11420 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
11430 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
11440 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73   /* Sync the mas
11450 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
11460 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53  . If the IOCAP_S
11470 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65  EQUENTIAL device
11480 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20  .    ** flag is 
11490 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  set this is not 
114a0 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
114b0 0a 20 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e  .    if( needSyn
114c0 63 20 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 73  c .     && 0==(s
114d0 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
114e0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 4d  aracteristics(pM
114f0 61 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f  aster)&SQLITE_IO
11500 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a  CAP_SEQUENTIAL).
11510 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f       && SQLITE_O
11520 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
11530 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20  OsSync(pMaster, 
11540 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
11550 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  AL)).    ){.    
11560 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
11570 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  Free(pMaster);. 
11580 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
11590 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
115a0 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  er, 0);.      sq
115b0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
115c0 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
115d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
115e0 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c  ..    /* Sync al
115f0 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73 20 69  l the db files i
11600 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74  nvolved in the t
11610 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
11620 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  same call.    **
11630 20 73 65 74 73 20 74 68 65 20 6d 61 73 74 65 72   sets the master
11640 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
11650 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64   in each individ
11660 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ual journal. If.
11670 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20      ** an error 
11680 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20  occurs here, do 
11690 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d  not delete the m
116a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
116b0 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
116c0 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f  * If the error o
116d0 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
116e0 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20   first call to. 
116f0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72     ** sqlite3Btr
11700 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
11710 28 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69  (), then there i
11720 73 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20  s a chance that 
11730 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  the.    ** maste
11740 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  r journal file w
11750 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e  ill be orphaned.
11760 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64   But we cannot d
11770 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a  elete it,.    **
11780 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73   in case the mas
11790 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
117a0 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74 65   name was writte
117b0 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
117c0 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62  al.    ** file b
117d0 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72  efore the failur
117e0 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20  e occurred..    
117f0 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
11800 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
11810 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
11820 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
11830 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
11840 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
11850 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
11860 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
11870 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
11880 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  Bt, zMaster);.  
11890 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
118a0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
118b0 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
118c0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
118d0 49 54 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20  ITE_BUSY );.    
118e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
118f0 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
11900 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
11910 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
11920 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
11930 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65     /* Delete the
11940 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11950 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69  file. This commi
11960 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ts the transacti
11970 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a  on. After.    **
11980 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20   doing this the 
11990 64 69 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e  directory is syn
119a0 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65  ced again before
119b0 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a   any individual.
119c0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
119d0 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c  on files are del
119e0 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
119f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
11a00 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
11a10 74 65 72 2c 20 6e 65 65 64 53 79 6e 63 29 3b 0a  ter, needSync);.
11a20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
11a30 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
11a40 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b      zMaster = 0;
11a50 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
11a60 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
11a70 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c      }..    /* Al
11a80 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65  l files and dire
11a90 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72  ctories have alr
11aa0 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
11ab0 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  , so the followi
11ac0 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20  ng.    ** calls 
11ad0 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  to sqlite3BtreeC
11ae0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
11af0 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67  are only closing
11b00 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a   files and.    *
11b10 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72  * deleting or tr
11b20 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c  uncating journal
11b30 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20  s. If something 
11b40 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65  goes wrong while
11b50 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20  .    ** this is 
11b60 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e  happening we don
11b70 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20  't really care. 
11b80 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  The integrity of
11b90 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
11ba0 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  saction is alrea
11bb0 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62  dy guaranteed, b
11bc0 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63  ut some stray 'c
11bd0 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20  old' journals.  
11be0 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e    ** may be lyin
11bf0 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e  g around. Return
11c00 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ing an error cod
11c10 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74  e won't help mat
11c20 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ters..    */.   
11c30 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
11c40 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
11c50 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
11c60 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
11c70 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
11c80 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
11c90 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
11ca0 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
11cb0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
11cc0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
11cd0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
11ce0 73 65 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20  seTwo(pBt, 1);. 
11cf0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
11d00 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
11d10 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65  nMalloc();.    e
11d20 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
11d30 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20  io_errors();..  
11d40 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d    sqlite3VtabCom
11d50 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  mit(db);.  }.#en
11d60 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
11d70 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  ;.}../* .** This
11d80 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
11d90 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
11da0 2e 6e 56 64 62 65 41 63 74 69 76 65 20 63 6f 75  .nVdbeActive cou
11db0 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d  nt variable.** m
11dc0 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65  atches the numbe
11dd0 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74  r of vdbe's in t
11de0 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e  he list sqlite3.
11df0 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a  pVdbe that are.*
11e00 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  * currently acti
11e10 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e  ve. An assertion
11e20 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74 77   fails if the tw
11e30 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20  o counts do not 
11e40 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69  match..** This i
11e50 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65  s an internal se
11e60 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20  lf-check only - 
11e70 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73  it is not an ess
11e80 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e  ential processin
11e90 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a  g.** step..**.**
11ea0 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
11eb0 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64 65   if NDEBUG is de
11ec0 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65  fined..*/.#ifnde
11ed0 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
11ee0 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76 65  void checkActive
11ef0 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20  VdbeCnt(sqlite3 
11f00 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
11f10 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
11f20 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30    int nWrite = 0
11f30 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64 20 3d 20  ;.  int nRead = 
11f40 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64  0;.  p = db->pVd
11f50 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  be;.  while( p )
11f60 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
11f70 33 5f 73 74 6d 74 5f 62 75 73 79 28 28 73 71 6c  3_stmt_busy((sql
11f80 69 74 65 33 5f 73 74 6d 74 2a 29 70 29 20 29 7b  ite3_stmt*)p) ){
11f90 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  .      cnt++;.  
11fa0 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f      if( p->readO
11fb0 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b  nly==0 ) nWrite+
11fc0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  +;.      if( p->
11fd0 62 49 73 52 65 61 64 65 72 20 29 20 6e 52 65 61  bIsReader ) nRea
11fe0 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  d++;.    }.    p
11ff0 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
12000 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d  .  assert( cnt==
12010 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20  db->nVdbeActive 
12020 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72  );.  assert( nWr
12030 69 74 65 3d 3d 64 62 2d 3e 6e 56 64 62 65 57 72  ite==db->nVdbeWr
12040 69 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ite );.  assert(
12050 20 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e 56 64 62   nRead==db->nVdb
12060 65 52 65 61 64 20 29 3b 0a 7d 0a 23 65 6c 73 65  eRead );.}.#else
12070 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63  .#define checkAc
12080 74 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23  tiveVdbeCnt(x).#
12090 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
120a0 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20  the Vdbe passed 
120b0 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
120c0 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61 20 73  ument opened a s
120d0 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63  tatement-transac
120e0 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69  tion,.** close i
120f0 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20  t now. Argument 
12100 65 4f 70 20 6d 75 73 74 20 62 65 20 65 69 74 68  eOp must be eith
12110 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  er SAVEPOINT_ROL
12120 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45  LBACK or.** SAVE
12130 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49  POINT_RELEASE. I
12140 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e  f it is SAVEPOIN
12150 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e  T_ROLLBACK, then
12160 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   the statement.*
12170 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
12180 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66   rolled back. If
12190 20 65 4f 70 20 69 73 20 53 41 56 45 50 4f 49 4e   eOp is SAVEPOIN
121a0 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20  T_RELEASE, then 
121b0 74 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  the .** statemen
121c0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
121d0 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a   committed..**.*
121e0 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
121f0 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 49   occurs, an SQLI
12200 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72  TE_IOERR_XXX err
12210 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
12220 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  ned. .** Otherwi
12230 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
12240 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
12250 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56  CloseStatement(V
12260 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29  dbe *p, int eOp)
12270 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e  {.  sqlite3 *con
12280 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  st db = p->db;. 
12290 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
122a0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 2d  _OK;..  /* If p-
122b0 3e 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 67  >iStatement is g
122c0 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
122d0 2c 20 74 68 65 6e 20 74 68 69 73 20 56 64 62 65  , then this Vdbe
122e0 20 6f 70 65 6e 65 64 20 61 20 0a 20 20 2a 2a 20   opened a .  ** 
122f0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
12300 63 74 69 6f 6e 20 74 68 61 74 20 73 68 6f 75 6c  ction that shoul
12310 64 20 62 65 20 63 6c 6f 73 65 64 20 68 65 72 65  d be closed here
12320 2e 20 54 68 65 20 6f 6e 6c 79 20 65 78 63 65 70  . The only excep
12330 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 68 61  tion.  ** is tha
12340 74 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6d 61  t an IO error ma
12350 79 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 2c  y have occurred,
12360 20 63 61 75 73 69 6e 67 20 61 6e 20 65 6d 65 72   causing an emer
12370 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a  gency rollback..
12380 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
12390 65 20 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  e (db->nStatemen
123a0 74 3d 3d 30 29 2c 20 61 6e 64 20 74 68 65 72 65  t==0), and there
123b0 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64   is nothing to d
123c0 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  o..  */.  if( db
123d0 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26 26 20  ->nStatement && 
123e0 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 29 7b  p->iStatement ){
123f0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
12400 63 6f 6e 73 74 20 69 6e 74 20 69 53 61 76 65 70  const int iSavep
12410 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74 65  oint = p->iState
12420 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20 20 61 73 73  ment-1;..    ass
12430 65 72 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f  ert( eOp==SAVEPO
12440 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20  INT_ROLLBACK || 
12450 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
12460 45 4c 45 41 53 45 29 3b 0a 20 20 20 20 61 73 73  ELEASE);.    ass
12470 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d  ert( db->nStatem
12480 65 6e 74 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ent>0 );.    ass
12490 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d 65  ert( p->iStateme
124a0 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65 6d  nt==(db->nStatem
124b0 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69  ent+db->nSavepoi
124c0 6e 74 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28  nt) );..    for(
124d0 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
124e0 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74  i++){ .      int
124f0 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc2 = SQLITE_OK
12500 3b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  ;.      Btree *p
12510 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
12520 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
12530 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  Bt ){.        if
12540 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  ( eOp==SAVEPOINT
12550 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
12560 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c         rc2 = sql
12570 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
12580 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e  nt(pBt, SAVEPOIN
12590 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76  T_ROLLBACK, iSav
125a0 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  epoint);.       
125b0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
125c0 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  c2==SQLITE_OK ){
125d0 0a 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d  .          rc2 =
125e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
125f0 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45  epoint(pBt, SAVE
12600 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69  POINT_RELEASE, i
12610 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
12620 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
12630 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
12640 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
12650 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 20 20 7d  = rc2;.        }
12660 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12670 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e     db->nStatemen
12680 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69 53 74 61  t--;.    p->iSta
12690 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 20  tement = 0;..   
126a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
126b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
126c0 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
126d0 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
126e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
126f0 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c  tabSavepoint(db,
12700 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
12710 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ACK, iSavepoint)
12720 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12730 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
12740 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
12750 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76  = sqlite3VtabSav
12760 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50  epoint(db, SAVEP
12770 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53  OINT_RELEASE, iS
12780 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
12790 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
127a0 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
127b0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
127c0 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
127d0 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72 65  ck, also restore
127e0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74   the .    ** dat
127f0 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64 65  abase handles de
12800 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e  ferred constrain
12810 74 20 63 6f 75 6e 74 65 72 20 74 6f 20 74 68 65  t counter to the
12820 20 76 61 6c 75 65 20 69 74 20 68 61 64 20 77 68   value it had wh
12830 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  en .    ** the s
12840 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
12850 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e  tion was opened.
12860 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70    */.    if( eOp
12870 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
12880 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 64 62  BACK ){.      db
12890 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20  ->nDeferredCons 
128a0 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e  = p->nStmtDefCon
128b0 73 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65  s;.      db->nDe
128c0 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20  ferredImmCons = 
128d0 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d 6d 43 6f  p->nStmtDefImmCo
128e0 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ns;.    }.  }.  
128f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12900 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
12910 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
12920 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
12930 70 65 6e 65 64 20 62 79 20 74 68 65 20 64 61 74  pened by the dat
12940 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65  abase .** handle
12950 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
12960 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61   the VM passed a
12970 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 69 73  s an argument is
12980 20 61 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a   about to be .**
12990 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20 74   committed. If t
129a0 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
129b0 64 69 6e 67 20 64 65 66 65 72 72 65 64 20 66 6f  ding deferred fo
129c0 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
129d0 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f  aint.** violatio
129e0 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ns, return SQLIT
129f0 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72 77 69  E_ERROR. Otherwi
12a00 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  se, SQLITE_OK..*
12a10 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
12a20 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 46 4b  e outstanding FK
12a30 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20   violations and 
12a40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
12a50 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
12a60 5f 45 52 52 4f 52 2c 20 73 65 74 20 74 68 65 20  _ERROR, set the 
12a70 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 56 4d  result of the VM
12a80 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   to SQLITE_CONST
12a90 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59  RAINT_FOREIGNKEY
12aa0 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 61 6e  .** and write an
12ab0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
12ac0 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 74 75 72  o it. Then retur
12ad0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a  n SQLITE_ERROR..
12ae0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
12af0 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
12b00 45 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  EY.int sqlite3Vd
12b10 62 65 43 68 65 63 6b 46 6b 28 56 64 62 65 20 2a  beCheckFk(Vdbe *
12b20 70 2c 20 69 6e 74 20 64 65 66 65 72 72 65 64 29  p, int deferred)
12b30 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
12b40 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28  = p->db;.  if( (
12b50 64 65 66 65 72 72 65 64 20 26 26 20 28 64 62 2d  deferred && (db-
12b60 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 2b 64  >nDeferredCons+d
12b70 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
12b80 6f 6e 73 29 3e 30 29 20 0a 20 20 20 7c 7c 20 28  ons)>0) .   || (
12b90 21 64 65 66 65 72 72 65 64 20 26 26 20 70 2d 3e  !deferred && p->
12ba0 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30 29  nFkConstraint>0)
12bb0 20 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63   .  ){.    p->rc
12bc0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   = SQLITE_CONSTR
12bd0 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b  AINT_FOREIGNKEY;
12be0 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74  .    p->errorAct
12bf0 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ion = OE_Abort;.
12c00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
12c10 72 72 6f 72 28 70 2c 20 22 46 4f 52 45 49 47 4e  rror(p, "FOREIGN
12c20 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
12c30 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 72 65  failed");.    re
12c40 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
12c50 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
12c60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
12c70 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
12c80 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
12c90 64 20 74 68 65 20 77 68 65 6e 20 61 20 56 44 42  d the when a VDB
12ca0 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74 2e  E tries to halt.
12cb0 20 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a 2a    If the VDBE.**
12cc0 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67 65   has made change
12cd0 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74 6f  s and is in auto
12ce0 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65  commit mode, the
12cf0 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a  n commit those.*
12d00 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20 61  * changes.  If a
12d10 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65   rollback is nee
12d20 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65  ded, then do the
12d30 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
12d40 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
12d50 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f   the only way to
12d60 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65 20   move the state 
12d70 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20  of a VM from.** 
12d80 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e  SQLITE_MAGIC_RUN
12d90 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43   to SQLITE_MAGIC
12da0 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68 61  _HALT.  It is ha
12db0 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c  rmless to.** cal
12dc0 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20 74  l this on a VM t
12dd0 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 53 51  hat is in the SQ
12de0 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  LITE_MAGIC_HALT 
12df0 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  state..**.** Ret
12e00 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
12e10 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69  e.  If the commi
12e20 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70  t could not comp
12e30 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f 66 0a  lete because of.
12e40 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  ** lock contenti
12e50 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  on, return SQLIT
12e60 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c 49  E_BUSY.  If SQLI
12e70 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
12e80 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73  ned, it.** means
12e90 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20 6e   the close did n
12ea0 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e 65  ot happen and ne
12eb0 65 64 73 20 74 6f 20 62 65 20 72 65 70 65 61 74  eds to be repeat
12ec0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
12ed0 65 33 56 64 62 65 48 61 6c 74 28 56 64 62 65 20  e3VdbeHalt(Vdbe 
12ee0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  *p){.  int rc;  
12ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f00 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
12f10 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69 65 6e  o store transien
12f20 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20 2a  t return codes *
12f30 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
12f40 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54  = p->db;..  /* T
12f50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e  his function con
12f60 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20  tains the logic 
12f70 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20  that determines 
12f80 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  if a statement o
12f90 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  r.  ** transacti
12fa0 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69  on will be commi
12fb0 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
12fc0 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20  ack as a result 
12fd0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63  of the.  ** exec
12fe0 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69  ution of this vi
12ff0 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a  rtual machine. .
13000 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79    **.  ** If any
13010 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
13020 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a  g errors occur:.
13030 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51    **.  **     SQ
13040 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20  LITE_NOMEM.  ** 
13050 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52      SQLITE_IOERR
13060 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
13070 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  _FULL.  **     S
13080 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 0a  QLITE_INTERRUPT.
13090 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74    **.  ** Then t
130a0 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68  he internal cach
130b0 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65  e might have bee
130c0 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  n left in an inc
130d0 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73  onsistent.  ** s
130e0 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20 74  tate.  We need t
130f0 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73  o rollback the s
13100 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
13110 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 69  tion, if there i
13120 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74  s.  ** one, or t
13130 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e  he complete tran
13140 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65  saction if there
13150 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74   is no statement
13160 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
13170 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d  */..  if( p->db-
13180 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
13190 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
131a0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
131b0 20 69 66 28 20 70 2d 3e 61 4f 6e 63 65 46 6c 61   if( p->aOnceFla
131c0 67 20 29 20 6d 65 6d 73 65 74 28 70 2d 3e 61 4f  g ) memset(p->aO
131d0 6e 63 65 46 6c 61 67 2c 20 30 2c 20 70 2d 3e 6e  nceFlag, 0, p->n
131e0 4f 6e 63 65 46 6c 61 67 29 3b 0a 20 20 63 6c 6f  OnceFlag);.  clo
131f0 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b  seAllCursors(p);
13200 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  .  if( p->magic!
13210 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
13220 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
13230 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63  LITE_OK;.  }.  c
13240 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
13250 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  t(db);..  /* No 
13260 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
13270 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68 65  ck needed if the
13280 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73   program never s
13290 74 61 72 74 65 64 20 6f 72 20 69 66 20 74 68 65  tarted or if the
132a0 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d  .  ** SQL statem
132b0 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 61  ent does not rea
132c0 64 20 6f 72 20 77 72 69 74 65 20 61 20 64 61 74  d or write a dat
132d0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 2a 2f 0a  abase file.  */.
132e0 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 26    if( p->pc>=0 &
132f0 26 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29  & p->bIsReader )
13300 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20 20  {.    int mrc;  
13310 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72 6f   /* Primary erro
13320 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72  r code from p->r
13330 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53 74  c */.    int eSt
13340 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a 20  atementOp = 0;. 
13350 20 20 20 69 6e 74 20 69 73 53 70 65 63 69 61 6c     int isSpecial
13360 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20  Error;          
13370 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65    /* Set to true
13380 20 69 66 20 61 20 27 73 70 65 63 69 61 6c 27 20   if a 'special' 
13390 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a  error */..    /*
133a0 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65 73   Lock all btrees
133b0 20 75 73 65 64 20 62 79 20 74 68 65 20 73 74 61   used by the sta
133c0 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71  tement */.    sq
133d0 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 70  lite3VdbeEnter(p
133e0 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  );..    /* Check
133f0 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20   for one of the 
13400 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 2a  special errors *
13410 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72  /.    mrc = p->r
13420 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20 69 73  c & 0xff;.    is
13430 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d  SpecialError = m
13440 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
13450 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
13460 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20  IOERR.          
13470 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72             || mr
13480 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  c==SQLITE_INTERR
13490 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  UPT || mrc==SQLI
134a0 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28  TE_FULL;.    if(
134b0 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20   isSpecialError 
134c0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
134d0 68 65 20 71 75 65 72 79 20 77 61 73 20 72 65 61  he query was rea
134e0 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65 20 65  d-only and the e
134f0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c  rror code is SQL
13500 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2c 20 0a  ITE_INTERRUPT, .
13510 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c        ** no roll
13520 62 61 63 6b 20 69 73 20 6e 65 63 65 73 73 61 72  back is necessar
13530 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74  y. Otherwise, at
13540 20 6c 65 61 73 74 20 61 20 73 61 76 65 70 6f 69   least a savepoi
13550 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61  nt .      ** tra
13560 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
13570 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20   rolled back to 
13580 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
13590 62 61 73 65 20 74 6f 20 61 20 0a 20 20 20 20 20  base to a .     
135a0 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20 73   ** consistent s
135b0 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  tate..      **. 
135c0 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69 66 20       ** Even if 
135d0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
135e0 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74 20 69   read-only, it i
135f0 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70  s important to p
13600 65 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20  erform.      ** 
13610 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 74  a statement or t
13620 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62  ransaction rollb
13630 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49  ack operation. I
13640 66 20 74 68 65 20 65 72 72 6f 72 20 0a 20 20 20  f the error .   
13650 20 20 20 2a 2a 20 6f 63 63 75 72 72 65 64 20 77     ** occurred w
13660 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20  hile writing to 
13670 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 75 62  the journal, sub
13680 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61 74 61  -journal or data
13690 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69  base.      ** fi
136a0 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e  le as part of an
136b0 20 65 66 66 6f 72 74 20 74 6f 20 66 72 65 65 20   effort to free 
136c0 75 70 20 63 61 63 68 65 20 73 70 61 63 65 20 28  up cache space (
136d0 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20  see function.   
136e0 20 20 20 2a 2a 20 70 61 67 65 72 53 74 72 65 73     ** pagerStres
136f0 73 28 29 20 69 6e 20 70 61 67 65 72 2e 63 29 2c  s() in pager.c),
13700 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69 73   the rollback is
13710 20 72 65 71 75 69 72 65 64 20 74 6f 20 72 65 73   required to res
13720 74 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74  tore .      ** t
13730 68 65 20 70 61 67 65 72 20 74 6f 20 61 20 63 6f  he pager to a co
13740 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a  nsistent state..
13750 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
13760 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20  f( !p->readOnly 
13770 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49  || mrc!=SQLITE_I
13780 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20 20  NTERRUPT ){.    
13790 20 20 20 20 69 66 28 20 28 6d 72 63 3d 3d 53 51      if( (mrc==SQ
137a0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72  LITE_NOMEM || mr
137b0 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20  c==SQLITE_FULL) 
137c0 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f  && p->usesStmtJo
137d0 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  urnal ){.       
137e0 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20     eStatementOp 
137f0 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  = SAVEPOINT_ROLL
13800 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65  BACK;.        }e
13810 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
13820 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65 64 20  * We are forced 
13830 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65  to roll back the
13840 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
13850 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e  ion. Before doin
13860 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  g.          ** s
13870 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74 68  o, abort any oth
13880 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  er statements th
13890 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65 6e  is handle curren
138a0 74 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e 0a  tly has active..
138b0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
138c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
138d0 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
138e0 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
138f0 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ACK);.          
13900 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
13910 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  points(db);.    
13920 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
13930 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
13940 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
13950 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
13960 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
13970 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 69 6d   /* Check for im
13980 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
13990 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 20  key violations. 
139a0 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  */.    if( p->rc
139b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
139c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
139d0 43 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b 0a 20  CheckFk(p, 0);. 
139e0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
139f0 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  f the auto-commi
13a00 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e  t flag is set an
13a10 64 20 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e  d this is the on
13a20 6c 79 20 61 63 74 69 76 65 20 77 72 69 74 65 72  ly active writer
13a30 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65   .    ** VM, the
13a40 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72 20 61  n we do either a
13a50 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62   commit or rollb
13a60 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72 65  ack of the curre
13a70 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  nt transaction. 
13a80 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
13a90 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20  ote: This block 
13aa0 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65  also runs if one
13ab0 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
13ac0 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a  errors handled .
13ad0 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73      ** above has
13ae0 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20 20 20   occurred. .    
13af0 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69  */.    if( !sqli
13b00 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28 64 62  te3VtabInSync(db
13b10 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 61  ) .     && db->a
13b20 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20  utoCommit .     
13b30 26 26 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74  && db->nVdbeWrit
13b40 65 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d  e==(p->readOnly=
13b50 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  =0) .    ){.    
13b60 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
13b70 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72  ITE_OK || (p->er
13b80 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61  rorAction==OE_Fa
13b90 69 6c 20 26 26 20 21 69 73 53 70 65 63 69 61 6c  il && !isSpecial
13ba0 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20  Error) ){.      
13bb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
13bc0 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 3b  beCheckFk(p, 1);
13bd0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
13be0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13bf0 20 20 20 20 20 20 20 20 69 66 28 20 4e 45 56 45          if( NEVE
13c00 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29  R(p->readOnly) )
13c10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
13c20 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70  lite3VdbeLeave(p
13c30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
13c40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
13c50 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  OR;.          }.
13c60 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
13c70 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
13c80 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20  _FOREIGNKEY;.   
13c90 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20       }else{ .   
13ca0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 75         /* The au
13cb0 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
13cc0 73 20 74 72 75 65 2c 20 74 68 65 20 76 64 62 65  s true, the vdbe
13cd0 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73 75 63   program was suc
13ce0 63 65 73 73 66 75 6c 20 0a 20 20 20 20 20 20 20  cessful .       
13cf0 20 20 20 2a 2a 20 6f 72 20 68 69 74 20 61 6e 20     ** or hit an 
13d00 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72  'OR FAIL' constr
13d10 61 69 6e 74 20 61 6e 64 20 74 68 65 72 65 20 61  aint and there a
13d20 72 65 20 6e 6f 20 64 65 66 65 72 72 65 64 20 66  re no deferred f
13d30 6f 72 65 69 67 6e 0a 20 20 20 20 20 20 20 20 20  oreign.         
13d40 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72 61 69   ** key constrai
13d50 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75 70 20 74  nts to hold up t
13d60 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
13d70 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d  This means a com
13d80 6d 69 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a  mit .          *
13d90 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a  * is required. *
13da0 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
13db0 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c 20   vdbeCommit(db, 
13dc0 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  p);.        }.  
13dd0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
13de0 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 2d 3e  LITE_BUSY && p->
13df0 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
13e00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13e10 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
13e20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
13e30 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
13e40 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53   }else if( rc!=S
13e50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13e60 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
13e70 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
13e80 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
13e90 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  b, SQLITE_OK);. 
13ea0 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61           p->nCha
13eb0 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nge = 0;.       
13ec0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13ed0 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43    db->nDeferredC
13ee0 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ons = 0;.       
13ef0 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
13f00 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20  ImmCons = 0;.   
13f10 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73         db->flags
13f20 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66 65   &= ~SQLITE_Defe
13f30 72 46 4b 73 3b 0a 20 20 20 20 20 20 20 20 20 20  rFKs;.          
13f40 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74  sqlite3CommitInt
13f50 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29  ernalChanges(db)
13f60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13f70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13f80 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
13f90 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  All(db, SQLITE_O
13fa0 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e  K);.        p->n
13fb0 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
13fc0 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6e 53    }.      db->nS
13fd0 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20  tatement = 0;.  
13fe0 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74 61    }else if( eSta
13ff0 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20  tementOp==0 ){. 
14000 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
14010 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
14020 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
14030 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Fail ){.        
14040 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53  eStatementOp = S
14050 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
14060 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
14070 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  ( p->errorAction
14080 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20  ==OE_Abort ){.  
14090 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74        eStatement
140a0 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52  Op = SAVEPOINT_R
140b0 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 7d  OLLBACK;.      }
140c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
140d0 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
140e0 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52  (db, SQLITE_ABOR
140f0 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20  T_ROLLBACK);.   
14100 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73       sqlite3Clos
14110 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
14120 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74  .        db->aut
14130 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
14140 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
14150 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
14160 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
14170 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69 73 20  eStatementOp is 
14180 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
14190 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
141a0 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a  action needs to.
141b0 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74      ** be commit
141c0 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  ted or rolled ba
141d0 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  ck. Call sqlite3
141e0 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
141f0 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64  nt() to.    ** d
14200 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20 6f 70  o so. If this op
14210 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  eration returns 
14220 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68  an error, and th
14230 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  e current statem
14240 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72  ent.    ** error
14250 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f   code is SQLITE_
14260 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e  OK or SQLITE_CON
14270 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20 70 72  STRAINT, then pr
14280 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  omote the.    **
14290 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65   current stateme
142a0 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20  nt error code.. 
142b0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 53     */.    if( eS
142c0 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20  tatementOp ){.  
142d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
142e0 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
142f0 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e 74  nt(p, eStatement
14300 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Op);.      if( r
14310 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  c ){.        if(
14320 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
14330 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66 66  K || (p->rc&0xff
14340 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  )==SQLITE_CONSTR
14350 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20  AINT ){.        
14360 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
14370 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
14380 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
14390 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  rMsg);.         
143a0 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
143b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
143c0 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
143d0 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
143e0 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29  _ABORT_ROLLBACK)
143f0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
14400 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
14410 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62  (db);.        db
14420 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
14430 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68  ;.        p->nCh
14440 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  ange = 0;.      
14450 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
14460 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61 6e  * If this was an
14470 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20   INSERT, UPDATE 
14480 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f  or DELETE and no
14490 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
144a0 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61  action.    ** ha
144b0 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  s been rolled ba
144c0 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65 20 64  ck, update the d
144d0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
144e0 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  on change-counte
144f0 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  r. .    */.    i
14500 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f  f( p->changeCntO
14510 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  n ){.      if( e
14520 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56  StatementOp!=SAV
14530 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
14540 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
14550 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
14560 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29  (db, p->nChange)
14570 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14580 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14590 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c  beSetChanges(db,
145a0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
145b0 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
145c0 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
145d0 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
145e0 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ks */.    sqlite
145f0 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
14600 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65   }..  /* We have
14610 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61   successfully ha
14620 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20  lted and closed 
14630 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20  the VM.  Record 
14640 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20  this fact. */.  
14650 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a  if( p->pc>=0 ){.
14660 20 20 20 20 64 62 2d 3e 6e 56 64 62 65 41 63 74      db->nVdbeAct
14670 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 21  ive--;.    if( !
14680 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 20 64 62  p->readOnly ) db
14690 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d 2d 3b 0a  ->nVdbeWrite--;.
146a0 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65      if( p->bIsRe
146b0 61 64 65 72 20 29 20 64 62 2d 3e 6e 56 64 62 65  ader ) db->nVdbe
146c0 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61 73 73 65  Read--;.    asse
146d0 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74  rt( db->nVdbeAct
146e0 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62 65 52 65  ive>=db->nVdbeRe
146f0 61 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ad );.    assert
14700 28 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e  ( db->nVdbeRead>
14710 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20  =db->nVdbeWrite 
14720 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
14730 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e 3d 30  b->nVdbeWrite>=0
14740 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67   );.  }.  p->mag
14750 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
14760 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74  HALT;.  checkAct
14770 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a  iveVdbeCnt(db);.
14780 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
14790 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
147a0 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
147b0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
147c0 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d   If the auto-com
147d0 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20  mit flag is set 
147e0 74 6f 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  to true, then an
147f0 79 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 65 72  y locks that wer
14800 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63  e held.  ** by c
14810 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 76  onnection db hav
14820 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65 61  e now been relea
14830 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65  sed. Call sqlite
14840 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63  3ConnectionUnloc
14850 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69  ked() .  ** to i
14860 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71 75 69 72  nvoke any requir
14870 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79  ed unlock-notify
14880 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f   callbacks..  */
14890 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43  .  if( db->autoC
148a0 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  ommit ){.    sql
148b0 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e  ite3ConnectionUn
148c0 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a  locked(db);.  }.
148d0 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e  .  assert( db->n
148e0 56 64 62 65 41 63 74 69 76 65 3e 30 20 7c 7c 20  VdbeActive>0 || 
148f0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d  db->autoCommit==
14900 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d  0 || db->nStatem
14910 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ent==0 );.  retu
14920 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rn (p->rc==SQLIT
14930 45 5f 42 55 53 59 20 3f 20 53 51 4c 49 54 45 5f  E_BUSY ? SQLITE_
14940 42 55 53 59 20 3a 20 53 51 4c 49 54 45 5f 4f 4b  BUSY : SQLITE_OK
14950 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  );.}.../*.** Eac
14960 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65  h VDBE holds the
14970 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d   result of the m
14980 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74  ost recent sqlit
14990 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a  e3_step() call.*
149a0 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69  * in p->rc.  Thi
149b0 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
149c0 68 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20  hat result back 
149d0 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  to SQLITE_OK..*/
149e0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
149f0 65 52 65 73 65 74 53 74 65 70 52 65 73 75 6c 74  eResetStepResult
14a00 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e  (Vdbe *p){.  p->
14a10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14a20 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68  }../*.** Copy th
14a30 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  e error code and
14a40 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 62   error message b
14a50 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20  elonging to the 
14a60 56 44 42 45 20 70 61 73 73 65 64 0a 2a 2a 20 61  VDBE passed.** a
14a70 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
14a80 6d 65 6e 74 20 74 6f 20 69 74 73 20 64 61 74 61  ment to its data
14a90 62 61 73 65 20 68 61 6e 64 6c 65 20 28 73 6f 20  base handle (so 
14aa0 74 68 61 74 20 74 68 65 79 20 77 69 6c 6c 20 62  that they will b
14ab0 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 62  e .** returned b
14ac0 79 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  y calls to sqlit
14ad0 65 33 5f 65 72 72 63 6f 64 65 28 29 20 61 6e 64  e3_errcode() and
14ae0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
14af0 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ))..**.** This f
14b00 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
14b10 20 63 6c 65 61 72 20 74 68 65 20 56 44 42 45 20   clear the VDBE 
14b20 65 72 72 6f 72 20 63 6f 64 65 20 6f 72 20 6d 65  error code or me
14b30 73 73 61 67 65 2c 20 6a 75 73 74 0a 2a 2a 20 63  ssage, just.** c
14b40 6f 70 69 65 73 20 74 68 65 6d 20 74 6f 20 74 68  opies them to th
14b50 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
14b60 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
14b70 33 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72  3VdbeTransferErr
14b80 6f 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  or(Vdbe *p){.  s
14b90 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
14ba0 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  db;.  int rc = p
14bb0 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a  ->rc;.  if( p->z
14bc0 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 75 38  ErrMsg ){.    u8
14bd0 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20   mallocFailed = 
14be0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
14bf0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
14c00 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
14c10 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 45  ;.    if( db->pE
14c20 72 72 3d 3d 30 20 29 20 64 62 2d 3e 70 45 72 72  rr==0 ) db->pErr
14c30 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
14c40 65 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69  ew(db);.    sqli
14c50 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64  te3ValueSetStr(d
14c60 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e  b->pErr, -1, p->
14c70 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f  zErrMsg, SQLITE_
14c80 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41  UTF8, SQLITE_TRA
14c90 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
14ca0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
14cb0 6c 6f 63 28 29 3b 0a 20 20 20 20 64 62 2d 3e 6d  loc();.    db->m
14cc0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61  allocFailed = ma
14cd0 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20  llocFailed;.    
14ce0 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  db->errCode = rc
14cf0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
14d00 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
14d10 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rc);.  }.  retur
14d20 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
14d30 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
14d40 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e  LLOG./*.** If an
14d50 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
14d60 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73 20 72 65  QLLOG hook is re
14d70 67 69 73 74 65 72 65 64 20 61 6e 64 20 74 68 65  gistered and the
14d80 20 56 4d 20 68 61 73 20 62 65 65 6e 20 72 75 6e   VM has been run
14d90 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69 74 2e  , .** invoke it.
14da0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14db0 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67  vdbeInvokeSqllog
14dc0 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 69 66 28  (Vdbe *v){.  if(
14dd0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
14de0 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 26 26 20  nfig.xSqllog && 
14df0 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  v->rc==SQLITE_OK
14e00 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26 26 20 76   && v->zSql && v
14e10 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 63  ->pc>=0 ){.    c
14e20 68 61 72 20 2a 7a 45 78 70 61 6e 64 65 64 20 3d  har *zExpanded =
14e30 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 61   sqlite3VdbeExpa
14e40 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c  ndSql(v, v->zSql
14e50 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76  );.    assert( v
14e60 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ->db->init.busy=
14e70 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 45  =0 );.    if( zE
14e80 78 70 61 6e 64 65 64 20 29 7b 0a 20 20 20 20 20  xpanded ){.     
14e90 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
14ea0 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 0a 20 20  nfig.xSqllog(.  
14eb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
14ec0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c  lobalConfig.pSql
14ed0 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62 2c 20 7a  logArg, v->db, z
14ee0 45 78 70 61 6e 64 65 64 2c 20 31 0a 20 20 20 20  Expanded, 1.    
14ef0 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
14f00 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20  e3DbFree(v->db, 
14f10 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20 20 20 20  zExpanded);.    
14f20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  }.  }.}.#else.# 
14f30 64 65 66 69 6e 65 20 76 64 62 65 49 6e 76 6f 6b  define vdbeInvok
14f40 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65 6e 64 69  eSqllog(x).#endi
14f50 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  f../*.** Clean u
14f60 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65  p a VDBE after e
14f70 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20  xecution but do 
14f80 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56  not delete the V
14f90 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a  DBE just yet..**
14fa0 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72   Write any error
14fb0 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a   messages into *
14fc0 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72  pzErrMsg.  Retur
14fd0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  n the result cod
14fe0 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  e..**.** After t
14ff0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72  his routine is r
15000 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f  un, the VDBE sho
15010 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20  uld be ready to 
15020 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61  be executed.** a
15030 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c  gain..**.** To l
15040 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65  ook at it anothe
15050 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74  r way, this rout
15060 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73  ine resets the s
15070 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76  tate of the.** v
15080 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
15090 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  rom VDBE_MAGIC_R
150a0 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43  UN or VDBE_MAGIC
150b0 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a  _HALT back to.**
150c0 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
150d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
150e0 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a  VdbeReset(Vdbe *
150f0 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
15100 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  b;.  db = p->db;
15110 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d  ..  /* If the VM
15120 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20   did not run to 
15130 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66  completion or if
15140 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   it encountered 
15150 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74  an.  ** error, t
15160 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74  hen it might not
15170 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65   have been halte
15180 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20  d properly.  So 
15190 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77  halt.  ** it now
151a0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
151b0 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20  VdbeHalt(p);..  
151c0 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45 20 68  /* If the VDBE h
151d0 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20 70  as be run even p
151e0 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74  artially, then t
151f0 72 61 6e 73 66 65 72 20 74 68 65 20 65 72 72 6f  ransfer the erro
15200 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20  r code.  ** and 
15210 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72  error message fr
15220 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74 6f  om the VDBE into
15230 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
15240 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 42  se structure.  B
15250 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 56  ut.  ** if the V
15260 44 42 45 20 68 61 73 20 6a 75 73 74 20 62 65 65  DBE has just bee
15270 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75 74  n set to run but
15280 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c   has not actuall
15290 79 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a 20  y executed any. 
152a0 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   ** instructions
152b0 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65 20   yet, leave the 
152c0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 65 72  main database er
152d0 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ror information 
152e0 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a  unchanged..  */.
152f0 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
15300 7b 0a 20 20 20 20 76 64 62 65 49 6e 76 6f 6b 65  {.    vdbeInvoke
15310 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20 20 20 73  Sqllog(p);.    s
15320 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 66  qlite3VdbeTransf
15330 65 72 45 72 72 6f 72 28 70 29 3b 0a 20 20 20 20  erError(p);.    
15340 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
15350 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
15360 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
15370 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 75  0;.    if( p->ru
15380 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65  nOnlyOnce ) p->e
15390 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65  xpired = 1;.  }e
153a0 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26  lse if( p->rc &&
153b0 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20   p->expired ){. 
153c0 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65     /* The expire
153d0 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f  d flag was set o
153e0 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f 72  n the VDBE befor
153f0 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  e the first call
15400 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  .    ** to sqlit
15410 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63  e3_step(). For c
15420 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63  onsistency (sinc
15430 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
15440 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c   was.    ** call
15450 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61 74  ed), set the dat
15460 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74  abase error in t
15470 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c  his case as well
15480 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
15490 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
154a0 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a  (db, p->rc, p->z
154b0 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a 20  ErrMsg ? "%s" : 
154c0 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  0, p->zErrMsg);.
154d0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
154e0 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
154f0 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73  );.    p->zErrMs
15500 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  g = 0;.  }..  /*
15510 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d   Reclaim all mem
15520 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 65 20  ory used by the 
15530 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61  VDBE.  */.  Clea
15540 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61  nup(p);..  /* Sa
15550 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66  ve profiling inf
15560 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
15570 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a  is VDBE run..  *
15580 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  /.#ifdef VDBE_PR
15590 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49  OFILE.  {.    FI
155a0 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28  LE *out = fopen(
155b0 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75  "vdbe_profile.ou
155c0 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66  t", "a");.    if
155d0 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69  ( out ){.      i
155e0 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69  nt i;.      fpri
155f0 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22  ntf(out, "---- "
15600 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
15610 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
15620 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
15630 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70  f(out, "%02x", p
15640 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29  ->aOp[i].opcode)
15650 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15660 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
15670 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ");.      if( p-
15680 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20  >zSql ){.       
15690 20 63 68 61 72 20 63 2c 20 70 63 20 3d 20 30 3b   char c, pc = 0;
156a0 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
156b0 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20  (out, "-- ");.  
156c0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28        for(i=0; (
156d0 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21  c = p->zSql[i])!
156e0 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  =0; i++){.      
156f0 20 20 20 20 69 66 28 20 70 63 3d 3d 27 5c 6e 27      if( pc=='\n'
15700 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20   ) fprintf(out, 
15710 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20  "-- ");.        
15720 20 20 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a    putc(c, out);.
15730 20 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 63            pc = c
15740 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15750 20 20 20 20 69 66 28 20 70 63 21 3d 27 5c 6e 27      if( pc!='\n'
15760 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20   ) fprintf(out, 
15770 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  "\n");.      }. 
15780 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
15790 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
157a0 20 20 20 20 20 20 63 68 61 72 20 7a 48 64 72 5b        char zHdr[
157b0 31 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 71  100];.        sq
157c0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
157d0 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20 7a 48 64  izeof(zHdr), zHd
157e0 72 2c 20 22 25 36 75 20 25 31 32 6c 6c 75 20 25  r, "%6u %12llu %
157f0 38 6c 6c 75 20 22 2c 0a 20 20 20 20 20 20 20 20  8llu ",.        
15800 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
15810 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
15820 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20  aOp[i].cycles,. 
15830 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
15840 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61  [i].cnt>0 ? p->a
15850 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e  Op[i].cycles/p->
15860 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20  aOp[i].cnt : 0. 
15870 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
15880 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
15890 25 73 22 2c 20 7a 48 64 72 29 3b 0a 20 20 20 20  %s", zHdr);.    
158a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
158b0 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26  rintOp(out, i, &
158c0 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20  p->aOp[i]);.    
158d0 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65    }.      fclose
158e0 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (out);.    }.  }
158f0 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 69 43 75  .#endif.  p->iCu
15900 72 72 65 6e 74 54 69 6d 65 20 3d 20 30 3b 0a 20  rrentTime = 0;. 
15910 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
15920 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72  _MAGIC_INIT;.  r
15930 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62  eturn p->rc & db
15940 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f  ->errMask;.}. ./
15950 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e  *.** Clean up an
15960 64 20 64 65 6c 65 74 65 20 61 20 56 44 42 45 20  d delete a VDBE 
15970 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e  after execution.
15980 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65    Return an inte
15990 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20  ger which is.** 
159a0 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e  the result code.
159b0 20 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f    Write any erro
159c0 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 69  r message text i
159d0 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a  nto *pzErrMsg..*
159e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
159f0 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a  eFinalize(Vdbe *
15a00 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  p){.  int rc = S
15a10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
15a20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
15a30 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d  AGIC_RUN || p->m
15a40 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
15a50 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20  _HALT ){.    rc 
15a60 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  = sqlite3VdbeRes
15a70 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72  et(p);.    asser
15a80 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e  t( (rc & p->db->
15a90 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a  errMask)==rc );.
15aa0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
15ab0 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65  eDelete(p);.  re
15ac0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
15ad0 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69  * If parameter i
15ae0 4f 70 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  Op is less than 
15af0 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e 76 6f 6b  zero, then invok
15b00 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  e the destructor
15b10 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75 78 69   for.** all auxi
15b20 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74  liary data point
15b30 65 72 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61  ers currently ca
15b40 63 68 65 64 20 62 79 20 74 68 65 20 56 4d 20 70  ched by the VM p
15b50 61 73 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20  assed as.** the 
15b60 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
15b70 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 4f 70  **.** Or, if iOp
15b80 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
15b90 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
15ba0 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 65 73 74  o, then the dest
15bb0 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c  ructor is.** onl
15bc0 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20 74 68  y invoked for th
15bd0 6f 73 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  ose auxiliary da
15be0 74 61 20 70 6f 69 6e 74 65 72 73 20 63 72 65 61  ta pointers crea
15bf0 74 65 64 20 62 79 20 74 68 65 20 75 73 65 72 20  ted by the user 
15c00 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76  .** function inv
15c10 6f 6b 65 64 20 62 79 20 74 68 65 20 4f 50 5f 46  oked by the OP_F
15c20 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 61  unction opcode a
15c30 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 4f  t instruction iO
15c40 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70 56 64 62  p of .** VM pVdb
15c50 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 6e  e, and only then
15c60 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20   if:.**.**    * 
15c70 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66  the associated f
15c80 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65  unction paramete
15c90 72 20 69 73 20 74 68 65 20 33 32 6e 64 20 6f 72  r is the 32nd or
15ca0 20 6c 61 74 65 72 20 28 63 6f 75 6e 74 69 6e 67   later (counting
15cb0 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 6c 65  .**      from le
15cc0 66 74 20 74 6f 20 72 69 67 68 74 29 2c 20 6f 72  ft to right), or
15cd0 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  .**.**    * the 
15ce0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
15cf0 74 20 69 6e 20 61 72 67 75 6d 65 6e 74 20 6d 61  t in argument ma
15d00 73 6b 20 69 73 20 63 6c 65 61 72 20 28 77 68 65  sk is clear (whe
15d10 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  re the first.** 
15d20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 70 61       function pa
15d30 72 61 6d 65 74 65 72 20 63 6f 72 72 65 73 70 6f  rameter correspo
15d40 6e 64 73 20 74 6f 20 62 69 74 20 30 20 65 74 63  nds to bit 0 etc
15d50 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  .)..*/.void sqli
15d60 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78  te3VdbeDeleteAux
15d70 44 61 74 61 28 56 64 62 65 20 2a 70 56 64 62 65  Data(Vdbe *pVdbe
15d80 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74 20 6d  , int iOp, int m
15d90 61 73 6b 29 7b 0a 20 20 41 75 78 44 61 74 61 20  ask){.  AuxData 
15da0 2a 2a 70 70 20 3d 20 26 70 56 64 62 65 2d 3e 70  **pp = &pVdbe->p
15db0 41 75 78 44 61 74 61 3b 0a 20 20 77 68 69 6c 65  AuxData;.  while
15dc0 28 20 2a 70 70 20 29 7b 0a 20 20 20 20 41 75 78  ( *pp ){.    Aux
15dd0 44 61 74 61 20 2a 70 41 75 78 20 3d 20 2a 70 70  Data *pAux = *pp
15de0 3b 0a 20 20 20 20 69 66 28 20 28 69 4f 70 3c 30  ;.    if( (iOp<0
15df0 29 0a 20 20 20 20 20 7c 7c 20 28 70 41 75 78 2d  ).     || (pAux-
15e00 3e 69 4f 70 3d 3d 69 4f 70 20 26 26 20 28 70 41  >iOp==iOp && (pA
15e10 75 78 2d 3e 69 41 72 67 3e 33 31 20 7c 7c 20 21  ux->iArg>31 || !
15e20 28 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49 54 33  (mask & MASKBIT3
15e30 32 28 70 41 75 78 2d 3e 69 41 72 67 29 29 29 29  2(pAux->iArg))))
15e40 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65  .    ){.      te
15e50 73 74 63 61 73 65 28 20 70 41 75 78 2d 3e 69 41  stcase( pAux->iA
15e60 72 67 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20  rg==31 );.      
15e70 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74  if( pAux->xDelet
15e80 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75  e ){.        pAu
15e90 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d  x->xDelete(pAux-
15ea0 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a  >pAux);.      }.
15eb0 20 20 20 20 20 20 2a 70 70 20 3d 20 70 41 75 78        *pp = pAux
15ec0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73  ->pNext;.      s
15ed0 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 56 64  qlite3DbFree(pVd
15ee0 62 65 2d 3e 64 62 2c 20 70 41 75 78 29 3b 0a 20  be->db, pAux);. 
15ef0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15f00 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e 65 78 74  pp= &pAux->pNext
15f10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
15f20 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65  *.** Free all me
15f30 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
15f40 77 69 74 68 20 74 68 65 20 56 64 62 65 20 70 61  with the Vdbe pa
15f50 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
15f60 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  nd argument,.** 
15f70 65 78 63 65 70 74 20 66 6f 72 20 6f 62 6a 65 63  except for objec
15f80 74 20 69 74 73 65 6c 66 2c 20 77 68 69 63 68 20  t itself, which 
15f90 69 73 20 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a  is preserved..**
15fa0 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
15fb0 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
15fc0 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c  function and sql
15fd0 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 29  ite3VdbeDelete()
15fe0 20 69 73 20 74 68 61 74 0a 2a 2a 20 56 64 62 65   is that.** Vdbe
15ff0 44 65 6c 65 74 65 28 29 20 61 6c 73 6f 20 75 6e  Delete() also un
16000 6c 69 6e 6b 73 20 74 68 65 20 56 64 62 65 20 66  links the Vdbe f
16010 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20  rom the list of 
16020 56 4d 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  VMs associated w
16030 69 74 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ith.** the datab
16040 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  ase connection a
16050 6e 64 20 66 72 65 65 73 20 74 68 65 20 6f 62 6a  nd frees the obj
16060 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76  ect itself..*/.v
16070 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
16080 6c 65 61 72 4f 62 6a 65 63 74 28 73 71 6c 69 74  learObject(sqlit
16090 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29  e3 *db, Vdbe *p)
160a0 7b 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a  {.  SubProgram *
160b0 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  pSub, *pNext;.  
160c0 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
160d0 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e   p->db==0 || p->
160e0 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65  db==db );.  rele
160f0 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
16100 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20  Var, p->nVar);. 
16110 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
16120 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d  (p->aColName, p-
16130 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e  >nResColumn*COLN
16140 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53  AME_N);.  for(pS
16150 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20  ub=p->pProgram; 
16160 70 53 75 62 3b 20 70 53 75 62 3d 70 4e 65 78 74  pSub; pSub=pNext
16170 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
16180 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sub->pNext;.    
16190 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
161a0 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70  db, pSub->aOp, p
161b0 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73  Sub->nOp);.    s
161c0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
161d0 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20 66 6f   pSub);.  }.  fo
161e0 72 28 69 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20  r(i=p->nzVar-1; 
161f0 69 3e 3d 30 3b 20 69 2d 2d 29 20 73 71 6c 69 74  i>=0; i--) sqlit
16200 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
16210 61 7a 56 61 72 5b 69 5d 29 3b 0a 20 20 73 71 6c  azVar[i]);.  sql
16220 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
16230 2d 3e 61 7a 56 61 72 29 3b 0a 20 20 76 64 62 65  ->azVar);.  vdbe
16240 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20  FreeOpArray(db, 
16250 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b  p->aOp, p->nOp);
16260 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
16270 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  (db, p->aColName
16280 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
16290 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b  ee(db, p->zSql);
162a0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
162b0 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a  (db, p->pFree);.
162c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
162d0 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
162e0 41 54 55 53 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ATUS.  for(i=0; 
162f0 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20 69 2b 2b 29  i<p->nScan; i++)
16300 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
16310 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e  ree(db, p->aScan
16320 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  [i].zName);.  }.
16330 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
16340 64 62 2c 20 70 2d 3e 61 53 63 61 6e 29 3b 0a 23  db, p->aScan);.#
16350 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  endif.}../*.** D
16360 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
16370 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  VDBE..*/.void sq
16380 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
16390 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
163a0 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  te3 *db;..  if( 
163b0 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65  NEVER(p==0) ) re
163c0 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  turn;.  db = p->
163d0 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  db;.  assert( sq
163e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
163f0 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
16400 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61   sqlite3VdbeClea
16410 72 4f 62 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a  rObject(db, p);.
16420 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
16430 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e  {.    p->pPrev->
16440 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
16450 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
16460 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62 65  ssert( db->pVdbe
16470 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70  ==p );.    db->p
16480 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Vdbe = p->pNext;
16490 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e  .  }.  if( p->pN
164a0 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e  ext ){.    p->pN
164b0 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e  ext->pPrev = p->
164c0 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e  pPrev;.  }.  p->
164d0 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
164e0 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62  IC_DEAD;.  p->db
164f0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44   = 0;.  sqlite3D
16500 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a  bFree(db, p);.}.
16510 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f  ./*.** The curso
16520 72 20 22 70 22 20 68 61 73 20 61 20 70 65 6e 64  r "p" has a pend
16530 69 6e 67 20 73 65 65 6b 20 6f 70 65 72 61 74 69  ing seek operati
16540 6f 6e 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20  on that has not 
16550 79 65 74 20 62 65 65 6e 0a 2a 2a 20 63 61 72 72  yet been.** carr
16560 69 65 64 20 6f 75 74 2e 20 20 53 65 65 6b 20 74  ied out.  Seek t
16570 68 65 20 63 75 72 73 6f 72 20 6e 6f 77 2e 20 20  he cursor now.  
16580 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
16590 72 73 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68  rs, return.** th
165a0 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  e appropriate er
165b0 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
165c0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e  tic int SQLITE_N
165d0 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 44 65  OINLINE handleDe
165e0 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 56 64 62  ferredMoveto(Vdb
165f0 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69  eCursor *p){.  i
16600 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64  nt res, rc;.#ifd
16610 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
16620 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
16630 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
16640 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
16650 74 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f  t( p->deferredMo
16660 76 65 74 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  veto );.  assert
16670 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a  ( p->isTable );.
16680 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75    assert( p->eCu
16690 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
166a0 54 52 45 45 20 29 3b 0a 20 20 72 63 20 3d 20 73  TREE );.  rc = s
166b0 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
166c0 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 75 63 2e  oUnpacked(p->uc.
166d0 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d  pCursor, 0, p->m
166e0 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20  ovetoTarget, 0, 
166f0 26 72 65 73 29 3b 0a 20 20 69 66 28 20 72 63 20  &res);.  if( rc 
16700 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69  ) return rc;.  i
16710 66 28 20 72 65 73 21 3d 30 20 29 20 72 65 74 75  f( res!=0 ) retu
16720 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
16730 54 5f 42 4b 50 54 3b 0a 23 69 66 64 65 66 20 53  T_BKPT;.#ifdef S
16740 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
16750 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
16760 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d  t++;.#endif.  p-
16770 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
16780 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53  = 0;.  p->cacheS
16790 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
167a0 41 4c 45 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ALE;.  return SQ
167b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
167c0 2a 20 53 6f 6d 65 74 68 69 6e 67 20 68 61 73 20  * Something has 
167d0 6d 6f 76 65 64 20 63 75 72 73 6f 72 20 22 70 22  moved cursor "p"
167e0 20 6f 75 74 20 6f 66 20 70 6c 61 63 65 2e 20 20   out of place.  
167f0 4d 61 79 62 65 20 74 68 65 20 72 6f 77 20 69 74  Maybe the row it
16800 20 77 61 73 0a 2a 2a 20 70 6f 69 6e 74 65 64 20   was.** pointed 
16810 74 6f 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f  to was deleted o
16820 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 69 74  ut from under it
16830 2e 20 20 4f 72 20 6d 61 79 62 65 20 74 68 65 20  .  Or maybe the 
16840 62 74 72 65 65 20 77 61 73 0a 2a 2a 20 72 65 62  btree was.** reb
16850 61 6c 61 6e 63 65 64 2e 20 20 57 68 61 74 65 76  alanced.  Whatev
16860 65 72 20 74 68 65 20 63 61 75 73 65 2c 20 74 72  er the cause, tr
16870 79 20 74 6f 20 72 65 73 74 6f 72 65 20 22 70 22  y to restore "p"
16880 20 74 6f 20 74 68 65 20 70 6c 61 63 65 20 69 74   to the place it
16890 0a 2a 2a 20 69 73 20 73 75 70 70 6f 73 65 64 20  .** is supposed 
168a0 74 6f 20 62 65 20 70 6f 69 6e 74 69 6e 67 2e 20  to be pointing. 
168b0 20 49 66 20 74 68 65 20 72 6f 77 20 77 61 73 20   If the row was 
168c0 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
168d0 20 75 6e 64 65 72 20 74 68 65 0a 2a 2a 20 63 75   under the.** cu
168e0 72 73 6f 72 2c 20 73 65 74 20 74 68 65 20 63 75  rsor, set the cu
168f0 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  rsor to point to
16900 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a   a NULL row..*/.
16910 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
16920 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c  E_NOINLINE handl
16930 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 56 64 62  eMovedCursor(Vdb
16940 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69  eCursor *p){.  i
16950 6e 74 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f  nt isDifferentRo
16960 77 2c 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  w, rc;.  assert(
16970 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55   p->eCurType==CU
16980 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
16990 20 61 73 73 65 72 74 28 20 70 2d 3e 75 63 2e 70   assert( p->uc.p
169a0 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61  Cursor!=0 );.  a
169b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
169c0 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
169d0 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29  d(p->uc.pCursor)
169e0 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
169f0 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73  e3BtreeCursorRes
16a00 74 6f 72 65 28 70 2d 3e 75 63 2e 70 43 75 72 73  tore(p->uc.pCurs
16a10 6f 72 2c 20 26 69 73 44 69 66 66 65 72 65 6e 74  or, &isDifferent
16a20 52 6f 77 29 3b 0a 20 20 70 2d 3e 63 61 63 68 65  Row);.  p->cache
16a30 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
16a40 54 41 4c 45 3b 0a 20 20 69 66 28 20 69 73 44 69  TALE;.  if( isDi
16a50 66 66 65 72 65 6e 74 52 6f 77 20 29 20 70 2d 3e  fferentRow ) p->
16a60 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72  nullRow = 1;.  r
16a70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
16a80 2a 2a 20 43 68 65 63 6b 20 74 6f 20 65 6e 73 75  ** Check to ensu
16a90 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73  re that the curs
16aa0 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 52 65  or is valid.  Re
16ab0 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72  store the cursor
16ac0 0a 2a 2a 20 69 66 20 6e 65 65 64 20 62 65 2e 20  .** if need be. 
16ad0 20 52 65 74 75 72 6e 20 61 6e 79 20 49 2f 4f 20   Return any I/O 
16ae0 65 72 72 6f 72 20 66 72 6f 6d 20 74 68 65 20 72  error from the r
16af0 65 73 74 6f 72 65 20 6f 70 65 72 61 74 69 6f 6e  estore operation
16b00 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16b10 56 64 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72  VdbeCursorRestor
16b20 65 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29  e(VdbeCursor *p)
16b30 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  {.  assert( p->e
16b40 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
16b50 5f 42 54 52 45 45 20 29 3b 0a 20 20 69 66 28 20  _BTREE );.  if( 
16b60 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
16b70 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63  orHasMoved(p->uc
16b80 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20  .pCursor) ){.   
16b90 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f   return handleMo
16ba0 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20  vedCursor(p);.  
16bb0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
16bc0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
16bd0 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 75 72  ake sure the cur
16be0 73 6f 72 20 70 20 69 73 20 72 65 61 64 79 20 74  sor p is ready t
16bf0 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
16c00 74 68 65 20 72 6f 77 20 74 6f 20 77 68 69 63 68  the row to which
16c10 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20   it.** was last 
16c20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52 65 74  positioned.  Ret
16c30 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
16c40 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c  e if an OOM faul
16c50 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a  t or I/O error.*
16c60 2a 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72  * prevents us fr
16c70 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74  om positioning t
16c80 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74 73  he cursor to its
16c90 20 63 6f 72 72 65 63 74 20 70 6f 73 69 74 69 6f   correct positio
16ca0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f  n..**.** If a Mo
16cb0 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69  veTo operation i
16cc0 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  s pending on the
16cd0 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74   given cursor, t
16ce0 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d  hen do that.** M
16cf0 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e  oveTo now.  If n
16d00 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e 64 69 6e  o move is pendin
16d10 67 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  g, check to see 
16d20 69 66 20 74 68 65 20 72 6f 77 20 68 61 73 20 62  if the row has b
16d30 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f  een.** deleted o
16d40 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ut from under th
16d50 65 20 63 75 72 73 6f 72 20 61 6e 64 20 69 66 20  e cursor and if 
16d60 69 74 20 68 61 73 2c 20 6d 61 72 6b 20 74 68 65  it has, mark the
16d70 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c   row as.** a NUL
16d80 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  L row..**.** If 
16d90 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
16da0 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
16db0 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 6f  o the correct ro
16dc0 77 20 61 6e 64 20 74 68 61 74 20 72 6f 77 20 68  w and that row h
16dd0 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64  as.** not been d
16de0 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
16df0 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72  under the cursor
16e00 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
16e10 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
16e20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
16e30 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56  beCursorMoveto(V
16e40 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  dbeCursor *p){. 
16e50 20 69 66 28 20 70 2d 3e 65 43 75 72 54 79 70 65   if( p->eCurType
16e60 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
16e70 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 65  ){.    if( p->de
16e80 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a  ferredMoveto ){.
16e90 20 20 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e        return han
16ea0 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74  dleDeferredMovet
16eb0 6f 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  o(p);.    }.    
16ec0 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
16ed0 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70  CursorHasMoved(p
16ee0 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29 7b  ->uc.pCursor) ){
16ef0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 68 61  .      return ha
16f00 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28  ndleMovedCursor(
16f10 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  p);.    }.  }.  
16f20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16f30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
16f40 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f  ollowing functio
16f50 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65  ns:.**.** sqlite
16f60 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
16f70 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
16f80 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a  SerialTypeLen().
16f90 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
16fa0 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c  rialLen().** sql
16fb0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75  ite3VdbeSerialPu
16fc0 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  t().** sqlite3Vd
16fd0 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a  beSerialGet().**
16fe0 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20  .** encapsulate 
16ff0 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 65  the code that se
17000 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20  rializes values 
17010 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53  for storage in S
17020 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e  QLite.** data an
17030 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e  d index records.
17040 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64   Each serialized
17050 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20   value consists 
17060 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d  of a.** 'serial-
17070 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62  type' and a blob
17080 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73 65   of data. The se
17090 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20  rial type is an 
170a0 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a  8-byte unsigned.
170b0 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72  ** integer, stor
170c0 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a  ed as a varint..
170d0 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69  **.** In an SQLi
170e0 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c  te index record,
170f0 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
17100 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65 63   is stored direc
17110 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  tly before.** th
17120 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74  e blob of data t
17130 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e  hat it correspon
17140 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c  ds to. In a tabl
17150 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65  e record, all se
17160 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72  rial.** types ar
17170 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  e stored at the 
17180 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65 63  start of the rec
17190 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f  ord, and the blo
171a0 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a  bs of data at.**
171b0 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20   the end. Hence 
171c0 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20  these functions 
171d0 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72  allow the caller
171e0 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a   to handle the.*
171f0 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e  * serial-type an
17200 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70 61  d data blob sepa
17210 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  rately..**.** Th
17220 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
17230 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
17240 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20  various storage 
17250 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74 61  classes for data
17260 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c  :.**.**   serial
17270 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79 74   type        byt
17280 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20 20  es of data      
17290 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  type.**   ------
172a0 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d  --------     ---
172b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
172c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
172d0 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20 20  **      0       
172e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
172f0 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a             NULL.
17300 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 20  **      1       
17310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
17320 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
17330 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
17340 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
17350 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20          2       
17360 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
17370 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20  ger.**      3   
17380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17390 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 73    3            s
173a0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
173b0 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
173c0 20 20 20 20 20 20 20 20 20 20 20 20 34 20 20 20              4   
173d0 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
173e0 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
173f0 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  5               
17400 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20        6         
17410 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
17420 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20  r.**      6     
17430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17440 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  8            sig
17450 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
17460 20 20 20 20 37 20 20 20 20 20 20 20 20 20 20 20      7           
17470 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
17480 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61         IEEE floa
17490 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20  t.**      8     
174a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174b0 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
174c0 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a  eger constant 0.
174d0 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 20 20  **      9       
174e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
174f0 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
17500 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a  er constant 1.**
17510 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 20 20       10,11      
17520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17530 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65           reserve
17540 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a  d for expansion.
17550 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20  **    N>=12 and 
17560 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32  even       (N-12
17570 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a  )/2        BLOB.
17580 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20  **    N>=13 and 
17590 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33  odd        (N-13
175a0 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74 0a  )/2        text.
175b0 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20  **.** The 8 and 
175c0 39 20 74 79 70 65 73 20 77 65 72 65 20 61 64 64  9 types were add
175d0 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c  ed in 3.3.0, fil
175e0 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69  e format 4.  Pri
175f0 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f  or versions.** o
17600 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f  f SQLite will no
17610 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f  t understand tho
17620 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e  se serial types.
17630 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .*/../*.** Retur
17640 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70  n the serial-typ
17650 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  e for the value 
17660 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a  stored in pMem..
17670 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  */.u32 sqlite3Vd
17680 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d  beSerialType(Mem
17690 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65   *pMem, int file
176a0 5f 66 6f 72 6d 61 74 2c 20 75 33 32 20 2a 70 4c  _format, u32 *pL
176b0 65 6e 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73  en){.  int flags
176c0 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a   = pMem->flags;.
176d0 20 20 75 33 32 20 6e 3b 0a 0a 20 20 61 73 73 65    u32 n;..  asse
176e0 72 74 28 20 70 4c 65 6e 21 3d 30 20 29 3b 0a 20  rt( pLen!=0 );. 
176f0 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e   if( flags&MEM_N
17700 75 6c 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e  ull ){.    *pLen
17710 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
17720 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   0;.  }.  if( fl
17730 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  ags&MEM_Int ){. 
17740 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
17750 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20   whether to use 
17760 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20  1, 2, 4, 6 or 8 
17770 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65  bytes. */.#   de
17780 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28  fine MAX_6BYTE (
17790 28 28 28 69 36 34 29 30 78 30 30 30 30 38 30 30  (((i64)0x0000800
177a0 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69  0)<<32)-1).    i
177b0 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69  64 i = pMem->u.i
177c0 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20  ;.    u64 u;.   
177d0 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20   if( i<0 ){.    
177e0 20 20 75 20 3d 20 7e 69 3b 0a 20 20 20 20 7d 65    u = ~i;.    }e
177f0 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69  lse{.      u = i
17800 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17810 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 20 20  u<=127 ){.      
17820 69 66 28 20 28 69 26 31 29 3d 3d 69 20 26 26 20  if( (i&1)==i && 
17830 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29  file_format>=4 )
17840 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c 65 6e 20  {.        *pLen 
17850 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
17860 75 72 6e 20 38 2b 28 75 33 32 29 75 3b 0a 20 20  urn 8+(u32)u;.  
17870 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17880 20 20 20 2a 70 4c 65 6e 20 3d 20 31 3b 0a 20 20     *pLen = 1;.  
17890 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
178a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
178b0 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29    if( u<=32767 )
178c0 7b 20 2a 70 4c 65 6e 20 3d 20 32 3b 20 72 65 74  { *pLen = 2; ret
178d0 75 72 6e 20 32 3b 20 7d 0a 20 20 20 20 69 66 28  urn 2; }.    if(
178e0 20 75 3c 3d 38 33 38 38 36 30 37 20 29 7b 20 2a   u<=8388607 ){ *
178f0 70 4c 65 6e 20 3d 20 33 3b 20 72 65 74 75 72 6e  pLen = 3; return
17900 20 33 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c   3; }.    if( u<
17910 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b 20 2a  =2147483647 ){ *
17920 70 4c 65 6e 20 3d 20 34 3b 20 72 65 74 75 72 6e  pLen = 4; return
17930 20 34 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c   4; }.    if( u<
17940 3d 4d 41 58 5f 36 42 59 54 45 20 29 7b 20 2a 70  =MAX_6BYTE ){ *p
17950 4c 65 6e 20 3d 20 36 3b 20 72 65 74 75 72 6e 20  Len = 6; return 
17960 35 3b 20 7d 0a 20 20 20 20 2a 70 4c 65 6e 20 3d  5; }.    *pLen =
17970 20 38 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36   8;.    return 6
17980 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
17990 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  s&MEM_Real ){.  
179a0 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20 20    *pLen = 8;.   
179b0 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20   return 7;.  }. 
179c0 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64   assert( pMem->d
179d0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
179e0 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74  || flags&(MEM_St
179f0 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20  r|MEM_Blob) );. 
17a00 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e   assert( pMem->n
17a10 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75 33  >=0 );.  n = (u3
17a20 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28  2)pMem->n;.  if(
17a30 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72   flags & MEM_Zer
17a40 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d  o ){.    n += pM
17a50 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d  em->u.nZero;.  }
17a60 0a 20 20 2a 70 4c 65 6e 20 3d 20 6e 3b 0a 20 20  .  *pLen = n;.  
17a70 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20  return ((n*2) + 
17a80 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d  12 + ((flags&MEM
17a90 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f  _Str)!=0));.}../
17aa0 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 73 20 66  *.** The sizes f
17ab0 6f 72 20 73 65 72 69 61 6c 20 74 79 70 65 73 20  or serial types 
17ac0 6c 65 73 73 20 74 68 61 6e 20 31 32 38 0a 2a 2f  less than 128.*/
17ad0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38  .static const u8
17ae0 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
17af0 65 53 69 7a 65 73 5b 5d 20 3d 20 7b 0a 20 20 20  eSizes[] = {.   
17b00 20 20 20 20 20 2f 2a 20 20 30 20 20 20 31 20 20       /*  0   1  
17b10 20 32 20 20 20 33 20 20 20 34 20 20 20 35 20 20   2   3   4   5  
17b20 20 36 20 20 20 37 20 20 20 38 20 20 20 39 20 2a   6   7   8   9 *
17b30 2f 20 20 20 0a 2f 2a 20 20 20 30 20 2a 2f 20 20  /   ./*   0 */  
17b40 20 30 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c 20   0,  1,  2,  3, 
17b50 20 34 2c 20 20 36 2c 20 20 38 2c 20 20 38 2c 20   4,  6,  8,  8, 
17b60 20 30 2c 20 20 30 2c 0a 2f 2a 20 20 31 30 20 2a   0,  0,./*  10 *
17b70 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  /   0,  0,  0,  
17b80 30 2c 20 20 31 2c 20 20 31 2c 20 20 32 2c 20 20  0,  1,  1,  2,  
17b90 32 2c 20 20 33 2c 20 20 33 2c 0a 2f 2a 20 20 32  2,  3,  3,./*  2
17ba0 30 20 2a 2f 20 20 20 34 2c 20 20 34 2c 20 20 35  0 */   4,  4,  5
17bb0 2c 20 20 35 2c 20 20 36 2c 20 20 36 2c 20 20 37  ,  5,  6,  6,  7
17bc0 2c 20 20 37 2c 20 20 38 2c 20 20 38 2c 0a 2f 2a  ,  7,  8,  8,./*
17bd0 20 20 33 30 20 2a 2f 20 20 20 39 2c 20 20 39 2c    30 */   9,  9,
17be0 20 31 30 2c 20 31 30 2c 20 31 31 2c 20 31 31 2c   10, 10, 11, 11,
17bf0 20 31 32 2c 20 31 32 2c 20 31 33 2c 20 31 33 2c   12, 12, 13, 13,
17c00 0a 2f 2a 20 20 34 30 20 2a 2f 20 20 31 34 2c 20  ./*  40 */  14, 
17c10 31 34 2c 20 31 35 2c 20 31 35 2c 20 31 36 2c 20  14, 15, 15, 16, 
17c20 31 36 2c 20 31 37 2c 20 31 37 2c 20 31 38 2c 20  16, 17, 17, 18, 
17c30 31 38 2c 0a 2f 2a 20 20 35 30 20 2a 2f 20 20 31  18,./*  50 */  1
17c40 39 2c 20 31 39 2c 20 32 30 2c 20 32 30 2c 20 32  9, 19, 20, 20, 2
17c50 31 2c 20 32 31 2c 20 32 32 2c 20 32 32 2c 20 32  1, 21, 22, 22, 2
17c60 33 2c 20 32 33 2c 0a 2f 2a 20 20 36 30 20 2a 2f  3, 23,./*  60 */
17c70 20 20 32 34 2c 20 32 34 2c 20 32 35 2c 20 32 35    24, 24, 25, 25
17c80 2c 20 32 36 2c 20 32 36 2c 20 32 37 2c 20 32 37  , 26, 26, 27, 27
17c90 2c 20 32 38 2c 20 32 38 2c 0a 2f 2a 20 20 37 30  , 28, 28,./*  70
17ca0 20 2a 2f 20 20 32 39 2c 20 32 39 2c 20 33 30 2c   */  29, 29, 30,
17cb0 20 33 30 2c 20 33 31 2c 20 33 31 2c 20 33 32 2c   30, 31, 31, 32,
17cc0 20 33 32 2c 20 33 33 2c 20 33 33 2c 0a 2f 2a 20   32, 33, 33,./* 
17cd0 20 38 30 20 2a 2f 20 20 33 34 2c 20 33 34 2c 20   80 */  34, 34, 
17ce0 33 35 2c 20 33 35 2c 20 33 36 2c 20 33 36 2c 20  35, 35, 36, 36, 
17cf0 33 37 2c 20 33 37 2c 20 33 38 2c 20 33 38 2c 0a  37, 37, 38, 38,.
17d00 2f 2a 20 20 39 30 20 2a 2f 20 20 33 39 2c 20 33  /*  90 */  39, 3
17d10 39 2c 20 34 30 2c 20 34 30 2c 20 34 31 2c 20 34  9, 40, 40, 41, 4
17d20 31 2c 20 34 32 2c 20 34 32 2c 20 34 33 2c 20 34  1, 42, 42, 43, 4
17d30 33 2c 0a 2f 2a 20 31 30 30 20 2a 2f 20 20 34 34  3,./* 100 */  44
17d40 2c 20 34 34 2c 20 34 35 2c 20 34 35 2c 20 34 36  , 44, 45, 45, 46
17d50 2c 20 34 36 2c 20 34 37 2c 20 34 37 2c 20 34 38  , 46, 47, 47, 48
17d60 2c 20 34 38 2c 0a 2f 2a 20 31 31 30 20 2a 2f 20  , 48,./* 110 */ 
17d70 20 34 39 2c 20 34 39 2c 20 35 30 2c 20 35 30 2c   49, 49, 50, 50,
17d80 20 35 31 2c 20 35 31 2c 20 35 32 2c 20 35 32 2c   51, 51, 52, 52,
17d90 20 35 33 2c 20 35 33 2c 0a 2f 2a 20 31 32 30 20   53, 53,./* 120 
17da0 2a 2f 20 20 35 34 2c 20 35 34 2c 20 35 35 2c 20  */  54, 54, 55, 
17db0 35 35 2c 20 35 36 2c 20 35 36 2c 20 35 37 2c 20  55, 56, 56, 57, 
17dc0 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  57.};../*.** Ret
17dd0 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  urn the length o
17de0 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65  f the data corre
17df0 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
17e00 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d  supplied serial-
17e10 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  type..*/.u32 sql
17e20 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
17e30 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c  peLen(u32 serial
17e40 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65  _type){.  if( se
17e50 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 38 20 29  rial_type>=128 )
17e60 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 65  {.    return (se
17e70 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b  rial_type-12)/2;
17e80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
17e90 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70  sert( serial_typ
17ea0 65 3c 31 32 20 0a 20 20 20 20 20 20 20 20 20 20  e<12 .          
17eb0 20 20 7c 7c 20 73 71 6c 69 74 65 33 53 6d 61 6c    || sqlite3Smal
17ec0 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61  lTypeSizes[seria
17ed0 6c 5f 74 79 70 65 5d 3d 3d 28 73 65 72 69 61 6c  l_type]==(serial
17ee0 5f 74 79 70 65 20 2d 20 31 32 29 2f 32 20 29 3b  _type - 12)/2 );
17ef0 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
17f00 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65  te3SmallTypeSize
17f10 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a  s[serial_type];.
17f20 20 20 7d 0a 7d 0a 75 38 20 73 71 6c 69 74 65 33    }.}.u8 sqlite3
17f30 56 64 62 65 4f 6e 65 42 79 74 65 53 65 72 69 61  VdbeOneByteSeria
17f40 6c 54 79 70 65 4c 65 6e 28 75 38 20 73 65 72 69  lTypeLen(u8 seri
17f50 61 6c 5f 74 79 70 65 29 7b 0a 20 20 61 73 73 65  al_type){.  asse
17f60 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  rt( serial_type<
17f70 31 32 38 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  128 );.  return 
17f80 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65  sqlite3SmallType
17f90 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70  Sizes[serial_typ
17fa0 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  e];  .}../*.** I
17fb0 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61  f we are on an a
17fc0 72 63 68 69 74 65 63 74 75 72 65 20 77 69 74 68  rchitecture with
17fd0 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c   mixed-endian fl
17fe0 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74  oating .** point
17ff0 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65  s (ex: ARM7) the
18000 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72  n swap the lower
18010 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68   4 bytes with th
18020 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79  e .** upper 4 by
18030 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  tes.  Return the
18040 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46   result..**.** F
18050 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63  or most architec
18060 74 75 72 65 73 2c 20 74 68 69 73 20 69 73 20 61  tures, this is a
18070 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c   no-op..**.** (l
18080 61 74 65 72 29 3a 20 20 49 74 20 69 73 20 72 65  ater):  It is re
18090 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61  ported to me tha
180a0 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69  t the mixed-endi
180b0 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e  an problem.** on
180c0 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75   ARM7 is an issu
180d0 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20  e with GCC, not 
180e0 77 69 74 68 20 74 68 65 20 41 52 4d 37 20 63 68  with the ARM7 ch
180f0 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a  ip.  It seems.**
18100 20 74 68 61 74 20 65 61 72 6c 79 20 76 65 72 73   that early vers
18110 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72  ions of GCC stor
18120 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73  ed the two words
18130 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20   of a 64-bit.** 
18140 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f  float in the wro
18150 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74  ng order.  And t
18160 68 61 74 20 65 72 72 6f 72 20 68 61 73 20 62 65  hat error has be
18170 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a  en propagated.**
18180 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68   ever since.  Th
18190 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e  e blame is not n
181a0 65 63 65 73 73 61 72 69 6c 79 20 77 69 74 68 20  ecessarily with 
181b0 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20  GCC, though..** 
181c0 47 43 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a  GCC might have j
181d0 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20  ust copying the 
181e0 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70  problem from a p
181f0 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a  rior compiler..*
18200 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64  * I am also told
18210 20 74 68 61 74 20 6e 65 77 65 72 20 76 65 72 73   that newer vers
18220 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74  ions of GCC that
18230 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72   follow a differ
18240 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74  ent.** ABI get t
18250 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 72 69  he byte order ri
18260 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c  ght..**.** Devel
18270 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69  opers using SQLi
18280 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68  te on an ARM7 sh
18290 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64  ould compile and
182a0 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70   run their.** ap
182b0 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20  plication using 
182c0 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31  -DSQLITE_DEBUG=1
182d0 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20   at least once. 
182e0 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65   With DEBUG.** e
182f0 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73  nabled, some ass
18300 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20  erts below will 
18310 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
18320 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a  byte order of.**
18330 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
18340 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63  values is correc
18350 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30  t..**.** (2007-0
18360 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e  8-30)  Frank van
18370 20 56 75 67 74 20 68 61 73 20 73 74 75 64 69 65   Vugt has studie
18380 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63  d this problem c
18390 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61  losely.** and ha
183a0 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69  s send his findi
183b0 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74  ngs to the SQLit
183c0 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46  e developers.  F
183d0 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74  rank.** writes t
183e0 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b  hat some Linux k
183f0 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f  ernels offer flo
18400 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64  ating point hard
18410 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f  ware.** emulatio
18420 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79  n that uses only
18430 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61   32-bit mantissa
18440 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66  s instead of a f
18450 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20  ull .** 48-bits 
18460 61 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  as required by t
18470 68 65 20 49 45 45 45 20 73 74 61 6e 64 61 72 64  he IEEE standard
18480 2e 20 20 28 54 68 69 73 20 69 73 20 74 68 65 0a  .  (This is the.
18490 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41  ** CONFIG_FPE_FA
184a0 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20  STFPE option.)  
184b0 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c  On such systems,
184c0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a   floating point.
184d0 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e 67  ** byte swapping
184e0 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f   becomes very co
184f0 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61  mplicated.  To a
18500 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a  void problems,.*
18510 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  * the necessary 
18520 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 69 73  byte swapping is
18530 20 63 61 72 72 69 65 64 20 6f 75 74 20 75 73 69   carried out usi
18540 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  ng a 64-bit inte
18550 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68  ger.** rather th
18560 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61  an a 64-bit floa
18570 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65  t.  Frank assure
18580 73 20 75 73 20 74 68 61 74 20 74 68 65 20 63 6f  s us that the co
18590 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73  de here.** works
185a0 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74   for him.  We, t
185b0 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68  he developers, h
185c0 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e  ave no way to in
185d0 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76  dependently.** v
185e0 65 72 69 66 79 20 74 68 69 73 2c 20 62 75 74 20  erify this, but 
185f0 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b  Frank seems to k
18600 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73 20 74  now what he is t
18610 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20  alking about.** 
18620 73 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e  so we trust him.
18630 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
18640 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36  E_MIXED_ENDIAN_6
18650 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69  4BIT_FLOAT.stati
18660 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28  c u64 floatSwap(
18670 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e  u64 in){.  union
18680 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20   {.    u64 r;.  
18690 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20    u32 i[2];.  } 
186a0 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75  u;.  u32 t;..  u
186b0 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75  .r = in;.  t = u
186c0 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20  .i[0];.  u.i[0] 
186d0 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b  = u.i[1];.  u.i[
186e0 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e  1] = t;.  return
186f0 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65   u.r;.}.# define
18700 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
18710 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c  Float(X)  X = fl
18720 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65  oatSwap(X).#else
18730 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69  .# define swapMi
18740 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58  xedEndianFloat(X
18750 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
18760 57 72 69 74 65 20 74 68 65 20 73 65 72 69 61 6c  Write the serial
18770 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66  ized data blob f
18780 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f  or the value sto
18790 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f  red in pMem into
187a0 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20   .** buf. It is 
187b0 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
187c0 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f   caller has allo
187d0 63 61 74 65 64 20 73 75 66 66 69 63 69 65 6e 74  cated sufficient
187e0 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72   space..** Retur
187f0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
18800 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a  bytes written..*
18810 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65  *.** nBuf is the
18820 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65   amount of space
18830 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20   left in buf[]. 
18840 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   The caller is r
18850 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66 6f  esponsible.** fo
18860 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20 65 6e 6f  r allocating eno
18870 75 67 68 20 73 70 61 63 65 20 74 6f 20 62 75 66  ugh space to buf
18880 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65  [] to hold the e
18890 6e 74 69 72 65 20 66 69 65 6c 64 2c 20 65 78 63  ntire field, exc
188a0 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20 74 68 65  lusive.** of the
188b0 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 62   pMem->u.nZero b
188c0 79 74 65 73 20 66 6f 72 20 61 20 4d 45 4d 5f 5a  ytes for a MEM_Z
188d0 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  ero value..**.**
188e0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
188f0 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
18900 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74  ally written int
18910 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75  o buf[].  The nu
18920 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73  mber.** of bytes
18930 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c   in the zero-fil
18940 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c  led tail is incl
18950 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75  uded in the retu
18960 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a  rn value only.**
18970 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73 20   if those bytes 
18980 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62  were zeroed in b
18990 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71  uf[]..*/ .u32 sq
189a0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
189b0 75 74 28 75 38 20 2a 62 75 66 2c 20 4d 65 6d 20  ut(u8 *buf, Mem 
189c0 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65 72 69 61  *pMem, u32 seria
189d0 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33 32 20 6c  l_type){.  u32 l
189e0 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65  en;..  /* Intege
189f0 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20  r and Real */.  
18a00 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
18a10 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70  =7 && serial_typ
18a20 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76  e>0 ){.    u64 v
18a30 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20  ;.    u32 i;.   
18a40 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
18a50 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==7 ){.      ass
18a60 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d  ert( sizeof(v)==
18a70 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72  sizeof(pMem->u.r
18a80 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ) );.      memcp
18a90 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72  y(&v, &pMem->u.r
18aa0 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20  , sizeof(v));.  
18ab0 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
18ac0 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20  ianFloat(v);.   
18ad0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20   }else{.      v 
18ae0 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  = pMem->u.i;.   
18af0 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d   }.    len = i =
18b00 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
18b10 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79  eSizes[serial_ty
18b20 70 65 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pe];.    assert(
18b30 20 69 3e 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a   i>0 );.    do{.
18b40 20 20 20 20 20 20 62 75 66 5b 2d 2d 69 5d 20 3d        buf[--i] =
18b50 20 28 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20   (u8)(v&0xFF);. 
18b60 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20       v >>= 8;.  
18b70 20 20 7d 77 68 69 6c 65 28 20 69 20 29 3b 0a 20    }while( i );. 
18b80 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
18b90 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20   }..  /* String 
18ba0 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28  or blob */.  if(
18bb0 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
18bc0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
18bd0 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d  pMem->n + ((pMem
18be0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
18bf0 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72  ro)?pMem->u.nZer
18c00 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  o:0).           
18c10 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65    == (int)sqlite
18c20 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
18c30 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20  en(serial_type) 
18c40 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65  );.    len = pMe
18c50 6d 2d 3e 6e 3b 0a 20 20 20 20 69 66 28 20 6c 65  m->n;.    if( le
18c60 6e 3e 30 20 29 20 6d 65 6d 63 70 79 28 62 75 66  n>0 ) memcpy(buf
18c70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b  , pMem->z, len);
18c80 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b  .    return len;
18c90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20  .  }..  /* NULL 
18ca0 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f  or constants 0 o
18cb0 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  r 1 */.  return 
18cc0 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 22  0;.}../* Input "
18cd0 78 22 20 69 73 20 61 20 73 65 71 75 65 6e 63 65  x" is a sequence
18ce0 20 6f 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61   of unsigned cha
18cf0 72 61 63 74 65 72 73 20 74 68 61 74 20 72 65 70  racters that rep
18d00 72 65 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67 2d  resent a.** big-
18d10 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 2e 20  endian integer. 
18d20 20 52 65 74 75 72 6e 20 74 68 65 20 65 71 75 69   Return the equi
18d30 76 61 6c 65 6e 74 20 6e 61 74 69 76 65 20 69 6e  valent native in
18d40 74 65 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65  teger.*/.#define
18d50 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78 29   ONE_BYTE_INT(x)
18d60 20 20 20 20 28 28 69 38 29 28 78 29 5b 30 5d 29      ((i8)(x)[0])
18d70 0a 23 64 65 66 69 6e 65 20 54 57 4f 5f 42 59 54  .#define TWO_BYT
18d80 45 5f 49 4e 54 28 78 29 20 20 20 20 28 32 35 36  E_INT(x)    (256
18d90 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 78  *(i8)((x)[0])|(x
18da0 29 5b 31 5d 29 0a 23 64 65 66 69 6e 65 20 54 48  )[1]).#define TH
18db0 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20  REE_BYTE_INT(x) 
18dc0 20 28 36 35 35 33 36 2a 28 69 38 29 28 28 78 29   (65536*(i8)((x)
18dd0 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 29  [0])|((x)[1]<<8)
18de0 7c 28 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e 65  |(x)[2]).#define
18df0 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
18e00 78 29 20 20 28 28 28 75 33 32 29 28 78 29 5b 30  x)  (((u32)(x)[0
18e10 5d 3c 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c 3c  ]<<24)|((x)[1]<<
18e20 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c  16)|((x)[2]<<8)|
18e30 28 78 29 5b 33 5d 29 0a 23 64 65 66 69 6e 65 20  (x)[3]).#define 
18e40 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 78 29  FOUR_BYTE_INT(x)
18e50 20 28 31 36 37 37 37 32 31 36 2a 28 69 38 29 28   (16777216*(i8)(
18e60 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c  (x)[0])|((x)[1]<
18e70 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29  <16)|((x)[2]<<8)
18e80 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20  |(x)[3])../*.** 
18e90 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20  Deserialize the 
18ea0 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65  data blob pointe
18eb0 64 20 74 6f 20 62 79 20 62 75 66 20 61 73 20 73  d to by buf as s
18ec0 65 72 69 61 6c 20 74 79 70 65 20 73 65 72 69 61  erial type seria
18ed0 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74  l_type.** and st
18ee0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
18ef0 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20  n pMem.  Return 
18f00 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
18f10 74 65 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  tes read..**.** 
18f20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
18f30 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
18f40 74 77 6f 20 73 65 70 61 72 61 74 65 20 72 6f 75  two separate rou
18f50 74 69 6e 65 73 20 66 6f 72 20 70 65 72 66 6f 72  tines for perfor
18f60 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 66 65  mance..** The fe
18f70 77 20 63 61 73 65 73 20 74 68 61 74 20 72 65 71  w cases that req
18f80 75 69 72 65 20 6c 6f 63 61 6c 20 76 61 72 69 61  uire local varia
18f90 62 6c 65 73 20 61 72 65 20 62 72 6f 6b 65 6e 20  bles are broken 
18fa0 6f 75 74 20 69 6e 74 6f 20 61 20 73 65 70 61 72  out into a separ
18fb0 61 74 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73  ate.** routine s
18fc0 6f 20 74 68 61 74 20 69 6e 20 6d 6f 73 74 20 63  o that in most c
18fd0 61 73 65 73 20 74 68 65 20 6f 76 65 72 68 65 61  ases the overhea
18fe0 64 20 6f 66 20 6d 6f 76 69 6e 67 20 74 68 65 20  d of moving the 
18ff0 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a  stack pointer.**
19000 20 69 73 20 61 76 6f 69 64 65 64 2e 0a 2a 2f 20   is avoided..*/ 
19010 0a 73 74 61 74 69 63 20 75 33 32 20 53 51 4c 49  .static u32 SQLI
19020 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65 72 69  TE_NOINLINE seri
19030 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75  alGet(.  const u
19040 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
19050 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72  f,     /* Buffer
19060 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
19070 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65  from */.  u32 se
19080 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20  rial_type,      
19090 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61          /* Seria
190a0 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69  l type to deseri
190b0 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a  alize */.  Mem *
190c0 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20  pMem            
190d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
190e0 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65  ry cell to write
190f0 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29   value into */.)
19100 7b 0a 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52  {.  u64 x = FOUR
19110 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 29 3b  _BYTE_UINT(buf);
19120 0a 20 20 75 33 32 20 79 20 3d 20 46 4f 55 52 5f  .  u32 y = FOUR_
19130 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 34 29  BYTE_UINT(buf+4)
19140 3b 0a 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20  ;.  x = (x<<32) 
19150 2b 20 79 3b 0a 20 20 69 66 28 20 73 65 72 69 61  + y;.  if( seria
19160 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20  l_type==6 ){.   
19170 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
19180 20 52 2d 32 39 38 35 31 2d 35 32 32 37 32 20 56   R-29851-52272 V
19190 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
191a0 64 69 61 6e 20 36 34 2d 62 69 74 0a 20 20 20 20  dian 64-bit.    
191b0 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  ** twos-compleme
191c0 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  nt integer. */. 
191d0 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a     pMem->u.i = *
191e0 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 70 4d  (i64*)&x;.    pM
191f0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
19200 49 6e 74 3b 0a 20 20 20 20 74 65 73 74 63 61 73  Int;.    testcas
19210 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
19220 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
19230 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
19240 2d 35 37 33 34 33 2d 34 39 31 31 34 20 56 61 6c  -57343-49114 Val
19250 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
19260 61 6e 20 49 45 45 45 20 37 35 34 2d 32 30 30 38  an IEEE 754-2008
19270 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 66   64-bit.    ** f
19280 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75  loating point nu
19290 6d 62 65 72 2e 20 2a 2f 0a 23 69 66 20 21 64 65  mber. */.#if !de
192a0 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26  fined(NDEBUG) &&
192b0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
192c0 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
192d0 4f 49 4e 54 29 0a 20 20 20 20 2f 2a 20 56 65 72  OINT).    /* Ver
192e0 69 66 79 20 74 68 61 74 20 69 6e 74 65 67 65 72  ify that integer
192f0 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70  s and floating p
19300 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20  oint values use 
19310 74 68 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20  the same.    ** 
19320 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c  byte order.  Or,
19330 20 74 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f   that if SQLITE_
19340 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42  MIXED_ENDIAN_64B
19350 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20  IT_FLOAT is.    
19360 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20  ** defined that 
19370 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20  64-bit floating 
19380 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61  point values rea
19390 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20  lly are mixed.  
193a0 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20    ** endian..   
193b0 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63   */.    static c
193c0 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28 28  onst u64 t1 = ((
193d0 75 36 34 29 30 78 33 66 66 30 30 30 30 30 29 3c  u64)0x3ff00000)<
193e0 3c 33 32 3b 0a 20 20 20 20 73 74 61 74 69 63 20  <32;.    static 
193f0 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20  const double r1 
19400 3d 20 31 2e 30 3b 0a 20 20 20 20 75 36 34 20 74  = 1.0;.    u64 t
19410 32 20 3d 20 74 31 3b 0a 20 20 20 20 73 77 61 70  2 = t1;.    swap
19420 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
19430 28 74 32 29 3b 0a 20 20 20 20 61 73 73 65 72 74  (t2);.    assert
19440 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69  ( sizeof(r1)==si
19450 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63  zeof(t2) && memc
19460 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a  mp(&r1, &t2, siz
19470 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23  eof(r1))==0 );.#
19480 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74  endif.    assert
19490 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26  ( sizeof(x)==8 &
194a0 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75  & sizeof(pMem->u
194b0 2e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 73 77  .r)==8 );.    sw
194c0 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
194d0 61 74 28 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70  at(x);.    memcp
194e0 79 28 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78  y(&pMem->u.r, &x
194f0 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
19500 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
19510 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65  sqlite3IsNaN(pMe
19520 6d 2d 3e 75 2e 72 29 20 3f 20 4d 45 4d 5f 4e 75  m->u.r) ? MEM_Nu
19530 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20  ll : MEM_Real;. 
19540 20 7d 0a 20 20 72 65 74 75 72 6e 20 38 3b 0a 7d   }.  return 8;.}
19550 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
19560 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e  SerialGet(.  con
19570 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
19580 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75   *buf,     /* Bu
19590 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c  ffer to deserial
195a0 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ize from */.  u3
195b0 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20  2 serial_type,  
195c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
195d0 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65  erial type to de
195e0 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d  serialize */.  M
195f0 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20  em *pMem        
19600 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19610 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77  Memory cell to w
19620 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20  rite value into 
19630 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20  */.){.  switch( 
19640 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20  serial_type ){. 
19650 20 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a     case 10:   /*
19660 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75   Reserved for fu
19670 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20  ture use */.    
19680 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65  case 11:   /* Re
19690 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72  served for futur
196a0 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73  e use */.    cas
196b0 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 75 6c 6c 20  e 0: {  /* Null 
196c0 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  */.      /* EVID
196d0 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30 37 38  ENCE-OF: R-24078
196e0 2d 30 39 33 37 35 20 56 61 6c 75 65 20 69 73 20  -09375 Value is 
196f0 61 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20  a NULL. */.     
19700 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
19710 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62  EM_Null;.      b
19720 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
19730 63 61 73 65 20 31 3a 20 7b 0a 20 20 20 20 20 20  case 1: {.      
19740 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
19750 52 2d 34 34 38 38 35 2d 32 35 31 39 36 20 56 61  R-44885-25196 Va
19760 6c 75 65 20 69 73 20 61 6e 20 38 2d 62 69 74 20  lue is an 8-bit 
19770 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 0a  twos-complement.
19780 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72        ** integer
19790 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
197a0 3e 75 2e 69 20 3d 20 4f 4e 45 5f 42 59 54 45 5f  >u.i = ONE_BYTE_
197b0 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20  INT(buf);.      
197c0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
197d0 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73  M_Int;.      tes
197e0 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69  tcase( pMem->u.i
197f0 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  <0 );.      retu
19800 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
19810 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62  case 2: { /* 2-b
19820 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
19830 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45  er */.      /* E
19840 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39  VIDENCE-OF: R-49
19850 37 39 34 2d 33 35 30 32 36 20 56 61 6c 75 65 20  794-35026 Value 
19860 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20  is a big-endian 
19870 31 36 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20  16-bit.      ** 
19880 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20  twos-complement 
19890 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20  integer. */.    
198a0 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 57    pMem->u.i = TW
198b0 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b  O_BYTE_INT(buf);
198c0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
198d0 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
198e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
198f0 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20  em->u.i<0 );.   
19900 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20     return 2;.   
19910 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b   }.    case 3: {
19920 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65   /* 3-byte signe
19930 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
19940 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
19950 46 3a 20 52 2d 33 37 38 33 39 2d 35 34 33 30 31  F: R-37839-54301
19960 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d   Value is a big-
19970 65 6e 64 69 61 6e 20 32 34 2d 62 69 74 0a 20 20  endian 24-bit.  
19980 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70      ** twos-comp
19990 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20  lement integer. 
199a0 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
199b0 2e 69 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f  .i = THREE_BYTE_
199c0 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20  INT(buf);.      
199d0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
199e0 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73  M_Int;.      tes
199f0 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69  tcase( pMem->u.i
19a00 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  <0 );.      retu
19a10 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 3;.    }.    
19a20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62  case 4: { /* 4-b
19a30 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
19a40 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45  er */.      /* E
19a50 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31  VIDENCE-OF: R-01
19a60 38 34 39 2d 32 36 30 37 39 20 56 61 6c 75 65 20  849-26079 Value 
19a70 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20  is a big-endian 
19a80 33 32 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20  32-bit.      ** 
19a90 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20  twos-complement 
19aa0 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20  integer. */.    
19ab0 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f    pMem->u.i = FO
19ac0 55 52 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29  UR_BYTE_INT(buf)
19ad0 3b 0a 23 69 66 64 65 66 20 5f 5f 48 50 5f 63 63  ;.#ifdef __HP_cc
19ae0 20 0a 20 20 20 20 20 20 2f 2a 20 57 6f 72 6b 20   .      /* Work 
19af0 61 72 6f 75 6e 64 20 61 20 73 69 67 6e 2d 65 78  around a sign-ex
19b00 74 65 6e 73 69 6f 6e 20 62 75 67 20 69 6e 20 74  tension bug in t
19b10 68 65 20 48 50 20 63 6f 6d 70 69 6c 65 72 20 66  he HP compiler f
19b20 6f 72 20 48 50 2f 55 58 20 2a 2f 0a 20 20 20 20  or HP/UX */.    
19b30 20 20 69 66 28 20 62 75 66 5b 30 5d 26 30 78 38    if( buf[0]&0x8
19b40 30 20 29 20 70 4d 65 6d 2d 3e 75 2e 69 20 7c 3d  0 ) pMem->u.i |=
19b50 20 30 78 66 66 66 66 66 66 66 66 38 30 30 30 30   0xffffffff80000
19b60 30 30 30 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20  000LL;.#endif.  
19b70 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
19b80 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
19b90 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
19ba0 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20  >u.i<0 );.      
19bb0 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a  return 4;.    }.
19bc0 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a      case 5: { /*
19bd0 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   6-byte signed i
19be0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
19bf0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
19c00 52 2d 35 30 33 38 35 2d 30 39 36 37 34 20 56 61  R-50385-09674 Va
19c10 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64  lue is a big-end
19c20 69 61 6e 20 34 38 2d 62 69 74 0a 20 20 20 20 20  ian 48-bit.     
19c30 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d   ** twos-complem
19c40 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a  ent integer. */.
19c50 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
19c60 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
19c70 28 62 75 66 2b 32 29 20 2b 20 28 28 28 69 36 34  (buf+2) + (((i64
19c80 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54  )1)<<32)*TWO_BYT
19c90 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20  E_INT(buf);.    
19ca0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
19cb0 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
19cc0 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
19cd0 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
19ce0 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20  turn 6;.    }.  
19cf0 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38    case 6:   /* 8
19d00 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
19d10 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65  eger */.    case
19d20 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c   7: { /* IEEE fl
19d30 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a  oating point */.
19d40 20 20 20 20 20 20 2f 2a 20 54 68 65 73 65 20 75        /* These u
19d50 73 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  se local variabl
19d60 65 73 2c 20 73 6f 20 64 6f 20 74 68 65 6d 20 69  es, so do them i
19d70 6e 20 61 20 73 65 70 61 72 61 74 65 20 72 6f 75  n a separate rou
19d80 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  tine.      ** to
19d90 20 61 76 6f 69 64 20 68 61 76 69 6e 67 20 74 6f   avoid having to
19da0 20 6d 6f 76 65 20 74 68 65 20 66 72 61 6d 65 20   move the frame 
19db0 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 63  pointer in the c
19dc0 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20  ommon case */.  
19dd0 20 20 20 20 72 65 74 75 72 6e 20 73 65 72 69 61      return seria
19de0 6c 47 65 74 28 62 75 66 2c 73 65 72 69 61 6c 5f  lGet(buf,serial_
19df0 74 79 70 65 2c 70 4d 65 6d 29 3b 0a 20 20 20 20  type,pMem);.    
19e00 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20 20  }.    case 8:   
19e10 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f   /* Integer 0 */
19e20 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20  .    case 9: {  
19e30 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a  /* Integer 1 */.
19e40 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
19e50 45 2d 4f 46 3a 20 52 2d 31 32 39 37 36 2d 32 32  E-OF: R-12976-22
19e60 38 39 33 20 56 61 6c 75 65 20 69 73 20 74 68 65  893 Value is the
19e70 20 69 6e 74 65 67 65 72 20 30 2e 20 2a 2f 0a 20   integer 0. */. 
19e80 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
19e90 2d 4f 46 3a 20 52 2d 31 38 31 34 33 2d 31 32 31  -OF: R-18143-121
19ea0 32 31 20 56 61 6c 75 65 20 69 73 20 74 68 65 20  21 Value is the 
19eb0 69 6e 74 65 67 65 72 20 31 2e 20 2a 2f 0a 20 20  integer 1. */.  
19ec0 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
19ed0 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20  serial_type-8;. 
19ee0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
19ef0 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
19f00 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
19f10 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
19f20 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
19f30 43 45 2d 4f 46 3a 20 52 2d 31 34 36 30 36 2d 33  CE-OF: R-14606-3
19f40 31 35 36 34 20 56 61 6c 75 65 20 69 73 20 61 20  1564 Value is a 
19f50 42 4c 4f 42 20 74 68 61 74 20 69 73 20 28 4e 2d  BLOB that is (N-
19f60 31 32 29 2f 32 20 62 79 74 65 73 20 69 6e 0a 20  12)/2 bytes in. 
19f70 20 20 20 20 20 2a 2a 20 6c 65 6e 67 74 68 2e 0a       ** length..
19f80 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43        ** EVIDENC
19f90 45 2d 4f 46 3a 20 52 2d 32 38 34 30 31 2d 30 30  E-OF: R-28401-00
19fa0 31 34 30 20 56 61 6c 75 65 20 69 73 20 61 20 73  140 Value is a s
19fb0 74 72 69 6e 67 20 69 6e 20 74 68 65 20 74 65 78  tring in the tex
19fc0 74 20 65 6e 63 6f 64 69 6e 67 20 61 6e 64 0a 20  t encoding and. 
19fd0 20 20 20 20 20 2a 2a 20 28 4e 2d 31 33 29 2f 32       ** (N-13)/2
19fe0 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68   bytes in length
19ff0 2e 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69  . */.      stati
1a000 63 20 63 6f 6e 73 74 20 75 31 36 20 61 46 6c 61  c const u16 aFla
1a010 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62  g[] = { MEM_Blob
1a020 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f  |MEM_Ephem, MEM_
1a030 53 74 72 7c 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b  Str|MEM_Ephem };
1a040 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  .      pMem->z =
1a050 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20   (char *)buf;.  
1a060 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 28 73      pMem->n = (s
1a070 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32  erial_type-12)/2
1a080 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
1a090 61 67 73 20 3d 20 61 46 6c 61 67 5b 73 65 72 69  ags = aFlag[seri
1a0a0 61 6c 5f 74 79 70 65 26 31 5d 3b 0a 20 20 20 20  al_type&1];.    
1a0b0 20 20 72 65 74 75 72 6e 20 70 4d 65 6d 2d 3e 6e    return pMem->n
1a0c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1a0d0 74 75 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  turn 0;.}./*.** 
1a0e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1a0f0 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
1a100 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
1a110 65 20 66 6f 72 20 61 6e 20 55 6e 70 61 63 6b 65  e for an Unpacke
1a120 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63  dRecord.** struc
1a130 74 75 72 65 20 6c 61 72 67 65 20 65 6e 6f 75 67  ture large enoug
1a140 68 20 74 6f 20 62 65 20 75 73 65 64 20 77 69 74  h to be used wit
1a150 68 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  h sqlite3VdbeRec
1a160 6f 72 64 55 6e 70 61 63 6b 28 29 20 69 66 0a 2a  ordUnpack() if.*
1a170 2a 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  * the first argu
1a180 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
1a190 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20 73 74 72  r to KeyInfo str
1a1a0 75 63 74 75 72 65 20 70 4b 65 79 49 6e 66 6f 2e  ucture pKeyInfo.
1a1b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70 61 63 65  .**.** The space
1a1c0 20 69 73 20 65 69 74 68 65 72 20 61 6c 6c 6f 63   is either alloc
1a1d0 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  ated using sqlit
1a1e0 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 29 20  e3DbMallocRaw() 
1a1f0 6f 72 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a  or from within.*
1a200 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e 65 64 20  * the unaligned 
1a210 62 75 66 66 65 72 20 70 61 73 73 65 64 20 76 69  buffer passed vi
1a220 61 20 74 68 65 20 73 65 63 6f 6e 64 20 61 6e 64  a the second and
1a230 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 73   third arguments
1a240 20 28 70 72 65 73 75 6d 61 62 6c 79 0a 2a 2a 20   (presumably.** 
1a250 73 74 61 63 6b 20 73 70 61 63 65 29 2e 20 49 66  stack space). If
1a260 20 74 68 65 20 66 6f 72 6d 65 72 2c 20 74 68 65   the former, the
1a270 6e 20 2a 70 70 46 72 65 65 20 69 73 20 73 65 74  n *ppFree is set
1a280 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 68   to a pointer th
1a290 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  at should.** be 
1a2a0 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64  eventually freed
1a2b0 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75   by the caller u
1a2c0 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72  sing sqlite3DbFr
1a2d0 65 65 28 29 2e 20 4f 72 2c 20 69 66 20 74 68 65  ee(). Or, if the
1a2e0 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   .** allocation 
1a2f0 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 70  comes from the p
1a300 53 70 61 63 65 2f 73 7a 53 70 61 63 65 20 62 75  Space/szSpace bu
1a310 66 66 65 72 2c 20 2a 70 70 46 72 65 65 20 69 73  ffer, *ppFree is
1a320 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20   set to NULL.** 
1a330 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1a340 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f  ..**.** If an OO
1a350 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  M error occurs, 
1a360 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
1a370 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64 52 65 63  ..*/.UnpackedRec
1a380 6f 72 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65  ord *sqlite3Vdbe
1a390 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63  AllocUnpackedRec
1a3a0 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ord(.  KeyInfo *
1a3b0 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20  pKeyInfo,       
1a3c0 20 20 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69         /* Descri
1a3d0 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 63  ption of the rec
1a3e0 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70  ord */.  char *p
1a3f0 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20  Space,          
1a400 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 61 6c           /* Unal
1a410 69 67 6e 65 64 20 73 70 61 63 65 20 61 76 61 69  igned space avai
1a420 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73  lable */.  int s
1a430 7a 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20  zSpace,         
1a440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1a450 7a 65 20 6f 66 20 70 53 70 61 63 65 5b 5d 20 69  ze of pSpace[] i
1a460 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61  n bytes */.  cha
1a470 72 20 2a 2a 70 70 46 72 65 65 20 20 20 20 20 20  r **ppFree      
1a480 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a490 4f 55 54 3a 20 43 61 6c 6c 65 72 20 73 68 6f 75  OUT: Caller shou
1a4a0 6c 64 20 66 72 65 65 20 74 68 69 73 20 70 6f 69  ld free this poi
1a4b0 6e 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70  nter */.){.  Unp
1a4c0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 20  ackedRecord *p; 
1a4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a4e0 55 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20  Unpacked record 
1a4f0 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
1a500 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20 20 20 20  nt nOff;        
1a510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a520 2a 20 49 6e 63 72 65 6d 65 6e 74 20 70 53 70 61  * Increment pSpa
1a530 63 65 20 62 79 20 6e 4f 66 66 20 74 6f 20 61 6c  ce by nOff to al
1a540 69 67 6e 20 69 74 20 2a 2f 0a 20 20 69 6e 74 20  ign it */.  int 
1a550 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
1a560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1a570 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
1a580 65 71 75 69 72 65 64 20 66 6f 72 20 2a 70 20 2a  equired for *p *
1a590 2f 0a 0a 20 20 2f 2a 20 57 65 20 77 61 6e 74 20  /..  /* We want 
1a5a0 74 6f 20 73 68 69 66 74 20 74 68 65 20 70 6f 69  to shift the poi
1a5b0 6e 74 65 72 20 70 53 70 61 63 65 20 75 70 20 73  nter pSpace up s
1a5c0 75 63 68 20 74 68 61 74 20 69 74 20 69 73 20 38  uch that it is 8
1a5d0 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20  -byte aligned.. 
1a5e0 20 2a 2a 20 54 68 75 73 2c 20 77 65 20 6e 65 65   ** Thus, we nee
1a5f0 64 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 61  d to calculate a
1a600 20 76 61 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65   value, nOff, be
1a610 74 77 65 65 6e 20 30 20 61 6e 64 20 37 2c 20 74  tween 0 and 7, t
1a620 6f 20 73 68 69 66 74 20 0a 20 20 2a 2a 20 69 74  o shift .  ** it
1a630 20 62 79 2e 20 20 49 66 20 70 53 70 61 63 65 20   by.  If pSpace 
1a640 69 73 20 61 6c 72 65 61 64 79 20 38 2d 62 79 74  is already 8-byt
1a650 65 20 61 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20  e aligned, nOff 
1a660 73 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a  should be zero..
1a670 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38    */.  nOff = (8
1a680 20 2d 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54   - (SQLITE_PTR_T
1a690 4f 5f 49 4e 54 28 70 53 70 61 63 65 29 20 26 20  O_INT(pSpace) & 
1a6a0 37 29 29 20 26 20 37 3b 0a 20 20 6e 42 79 74 65  7)) & 7;.  nByte
1a6b0 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   = ROUND8(sizeof
1a6c0 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29  (UnpackedRecord)
1a6d0 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a  ) + sizeof(Mem)*
1a6e0 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  (pKeyInfo->nFiel
1a6f0 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  d+1);.  if( nByt
1a700 65 3e 73 7a 53 70 61 63 65 2b 6e 4f 66 66 20 29  e>szSpace+nOff )
1a710 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63  {.    p = (Unpac
1a720 6b 65 64 52 65 63 6f 72 64 20 2a 29 73 71 6c 69  kedRecord *)sqli
1a730 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70  te3DbMallocRaw(p
1a740 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79  KeyInfo->db, nBy
1a750 74 65 29 3b 0a 20 20 20 20 2a 70 70 46 72 65 65  te);.    *ppFree
1a760 20 3d 20 28 63 68 61 72 20 2a 29 70 3b 0a 20 20   = (char *)p;.  
1a770 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
1a780 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n 0;.  }else{.  
1a790 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52    p = (UnpackedR
1a7a0 65 63 6f 72 64 2a 29 26 70 53 70 61 63 65 5b 6e  ecord*)&pSpace[n
1a7b0 4f 66 66 5d 3b 0a 20 20 20 20 2a 70 70 46 72 65  Off];.    *ppFre
1a7c0 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 2d  e = 0;.  }..  p-
1a7d0 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28  >aMem = (Mem*)&(
1a7e0 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38  (char*)p)[ROUND8
1a7f0 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64  (sizeof(Unpacked
1a800 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73  Record))];.  ass
1a810 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ert( pKeyInfo->a
1a820 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a  SortOrder!=0 );.
1a830 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20    p->pKeyInfo = 
1a840 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e  pKeyInfo;.  p->n
1a850 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f  Field = pKeyInfo
1a860 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20  ->nField + 1;.  
1a870 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
1a880 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 4b 65  ** Given the nKe
1a890 79 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e 67 20  y-byte encoding 
1a8a0 6f 66 20 61 20 72 65 63 6f 72 64 20 69 6e 20 70  of a record in p
1a8b0 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c 61 74 65 20  Key[], populate 
1a8c0 74 68 65 20 0a 2a 2a 20 55 6e 70 61 63 6b 65 64  the .** Unpacked
1a8d0 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65  Record structure
1a8e0 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68   indicated by th
1a8f0 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e  e fourth argumen
1a900 74 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 63 6f  t with the.** co
1a910 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 65  ntents of the de
1a920 63 6f 64 65 64 20 72 65 63 6f 72 64 2e 0a 2a 2f  coded record..*/
1a930 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64   .void sqlite3Vd
1a940 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a  beRecordUnpack(.
1a950 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
1a960 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f  nfo,     /* Info
1a970 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
1a980 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 20  e record format 
1a990 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20  */.  int nKey,  
1a9a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1a9b0 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e 61 72  ize of the binar
1a9c0 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f  y record */.  co
1a9d0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
1a9e0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69 6e 61       /* The bina
1a9f0 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 55  ry record */.  U
1aa00 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1aa10 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74        /* Populat
1aa20 65 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  e this structure
1aa30 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
1aa40 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  g. */.){.  const
1aa50 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1aa60 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e  aKey = (const un
1aa70 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
1aa80 65 79 3b 0a 20 20 69 6e 74 20 64 3b 20 0a 20 20  ey;.  int d; .  
1aa90 75 33 32 20 69 64 78 3b 20 20 20 20 20 20 20 20  u32 idx;        
1aaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aab0 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 61 4b 65  /* Offset in aKe
1aac0 79 5b 5d 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  y[] to read from
1aad0 20 2a 2f 0a 20 20 75 31 36 20 75 3b 20 20 20 20   */.  u16 u;    
1aae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aaf0 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
1ab00 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
1ab10 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20  /.  u32 szHdr;. 
1ab20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e   Mem *pMem = p->
1ab30 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 64 65 66 61  aMem;..  p->defa
1ab40 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20 61 73  ult_rc = 0;.  as
1ab50 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
1ab60 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29  _ALIGNMENT(pMem)
1ab70 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56   );.  idx = getV
1ab80 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a  arint32(aKey, sz
1ab90 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64  Hdr);.  d = szHd
1aba0 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77 68  r;.  u = 0;.  wh
1abb0 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20 26  ile( idx<szHdr &
1abc0 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20  & d<=nKey ){.   
1abd0 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
1abe0 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65  ;..    idx += ge
1abf0 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b  tVarint32(&aKey[
1ac00 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  idx], serial_typ
1ac10 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  e);.    pMem->en
1ac20 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
1ac30 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20  c;.    pMem->db 
1ac40 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
1ac50 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61      /* pMem->fla
1ac60 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69 74  gs = 0; // sqlit
1ac70 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1ac80 29 20 77 69 6c 6c 20 73 65 74 20 74 68 69 73 20  ) will set this 
1ac90 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 70 4d  for us */.    pM
1aca0 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30  em->szMalloc = 0
1acb0 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 74  ;.    d += sqlit
1acc0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1acd0 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c  &aKey[d], serial
1ace0 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20  _type, pMem);.  
1acf0 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 69 66    pMem++;.    if
1ad00 28 20 28 2b 2b 75 29 3e 3d 70 2d 3e 6e 46 69 65  ( (++u)>=p->nFie
1ad10 6c 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ld ) break;.  }.
1ad20 20 20 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65    assert( u<=pKe
1ad30 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20  yInfo->nField + 
1ad40 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64  1 );.  p->nField
1ad50 20 3d 20 75 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c   = u;.}..#if SQL
1ad60 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
1ad70 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
1ad80 6d 70 61 72 65 73 20 74 77 6f 20 69 6e 64 65 78  mpares two index
1ad90 20 6f 72 20 74 61 62 6c 65 20 72 65 63 6f 72 64   or table record
1ada0 20 6b 65 79 73 20 69 6e 20 74 68 65 20 73 61 6d   keys in the sam
1adb0 65 20 77 61 79 0a 2a 2a 20 61 73 20 74 68 65 20  e way.** as the 
1adc0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1add0 64 43 6f 6d 70 61 72 65 28 29 20 72 6f 75 74 69  dCompare() routi
1ade0 6e 65 2e 20 55 6e 6c 69 6b 65 20 56 64 62 65 52  ne. Unlike VdbeR
1adf0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 2c 0a  ecordCompare(),.
1ae00 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
1ae10 20 64 65 73 65 72 69 61 6c 69 7a 65 73 20 61 6e   deserializes an
1ae20 64 20 63 6f 6d 70 61 72 65 73 20 76 61 6c 75 65  d compares value
1ae30 73 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73  s using the.** s
1ae40 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1ae50 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65  Get() and sqlite
1ae60 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29 20 66 75  3MemCompare() fu
1ae70 6e 63 74 69 6f 6e 73 2e 20 49 74 20 69 73 20 75  nctions. It is u
1ae80 73 65 64 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74  sed.** in assert
1ae90 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  () statements to
1aea0 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
1aeb0 20 6f 70 74 69 6d 69 7a 65 64 20 63 6f 64 65 20   optimized code 
1aec0 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  in.** sqlite3Vdb
1aed0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
1aee0 20 72 65 74 75 72 6e 73 20 72 65 73 75 6c 74 73   returns results
1aef0 20 77 69 74 68 20 74 68 65 73 65 20 74 77 6f 20   with these two 
1af00 70 72 69 6d 69 74 69 76 65 73 2e 0a 2a 2a 0a 2a  primitives..**.*
1af10 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1af20 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63   the result of c
1af30 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 65 71 75  omparison is equ
1af40 69 76 61 6c 65 6e 74 20 74 6f 20 64 65 73 69 72  ivalent to desir
1af50 65 64 52 65 73 75 6c 74 2e 0a 2a 2a 20 52 65 74  edResult..** Ret
1af60 75 72 6e 20 66 61 6c 73 65 20 69 66 20 74 68 65  urn false if the
1af70 72 65 20 69 73 20 61 20 64 69 73 61 67 72 65 65  re is a disagree
1af80 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
1af90 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f  int vdbeRecordCo
1afa0 6d 70 61 72 65 44 65 62 75 67 28 0a 20 20 69 6e  mpareDebug(.  in
1afb0 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
1afc0 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c  oid *pKey1, /* L
1afd0 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e  eft key */.  con
1afe0 73 74 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  st UnpackedRecor
1aff0 64 20 2a 70 50 4b 65 79 32 2c 20 2f 2a 20 52 69  d *pPKey2, /* Ri
1b000 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  ght key */.  int
1b010 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 20 20   desiredResult  
1b020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1b030 72 72 65 63 74 20 61 6e 73 77 65 72 20 2a 2f 0a  rrect answer */.
1b040 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20  ){.  u32 d1;    
1b050 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
1b060 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
1b070 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65   next data eleme
1b080 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31  nt */.  u32 idx1
1b090 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  ;          /* Of
1b0a0 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
1b0b0 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72 20   of next header 
1b0c0 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32  element */.  u32
1b0d0 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20   szHdr1;        
1b0e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1b0f0 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a  es in header */.
1b100 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69    int i = 0;.  i
1b110 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e  nt rc = 0;.  con
1b120 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1b130 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74   *aKey1 = (const
1b140 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1b150 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66  )pKey1;.  KeyInf
1b160 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d  o *pKeyInfo;.  M
1b170 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79  em mem1;..  pKey
1b180 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70  Info = pPKey2->p
1b190 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70  KeyInfo;.  if( p
1b1a0 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30 20 29  KeyInfo->db==0 )
1b1b0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d   return 1;.  mem
1b1c0 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f  1.enc = pKeyInfo
1b1d0 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62  ->enc;.  mem1.db
1b1e0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
1b1f0 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73  .  /* mem1.flags
1b200 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62   = 0;  // Will b
1b210 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79  e initialized by
1b220 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1b230 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41  alGet() */.  VVA
1b240 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61  _ONLY( mem1.szMa
1b250 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f  lloc = 0; ) /* O
1b260 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73  nly needed by as
1b270 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
1b280 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69  s */..  /* Compi
1b290 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69  lers may complai
1b2a0 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20  n that mem1.u.i 
1b2b0 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75  is potentially u
1b2c0 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20  ninitialized..  
1b2d0 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e 69 74  ** We could init
1b2e0 69 61 6c 69 7a 65 20 69 74 2c 20 61 73 20 73 68  ialize it, as sh
1b2f0 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20 73 69 6c  own here, to sil
1b300 65 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c  ence those compl
1b310 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20  aints..  ** But 
1b320 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e  in fact, mem1.u.
1b330 69 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 63 74  i will never act
1b340 75 61 6c 6c 79 20 62 65 20 75 73 65 64 20 75 6e  ually be used un
1b350 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64  initialized, and
1b360 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65   doing .  ** the
1b370 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69 6e 69   unnecessary ini
1b380 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20  tialization has 
1b390 61 20 6d 65 61 73 75 72 61 62 6c 65 20 6e 65 67  a measurable neg
1b3a0 61 74 69 76 65 20 70 65 72 66 6f 72 6d 61 6e 63  ative performanc
1b3b0 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73  e.  ** impact, s
1b3c0 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e  ince this routin
1b3d0 65 20 69 73 20 61 20 76 65 72 79 20 68 69 67 68  e is a very high
1b3e0 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f   runner.  And so
1b3f0 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a  , we choose.  **
1b400 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63   to ignore the c
1b410 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73  ompiler warnings
1b420 20 61 6e 64 20 6c 65 61 76 65 20 74 68 69 73 20   and leave this 
1b430 76 61 72 69 61 62 6c 65 20 75 6e 69 6e 69 74 69  variable uniniti
1b440 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f  alized..  */.  /
1b450 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b  *  mem1.u.i = 0;
1b460 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c    // not needed,
1b470 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e 63 65   here to silence
1b480 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e   compiler warnin
1b490 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d  g */.  .  idx1 =
1b4a0 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
1b4b0 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 69  y1, szHdr1);.  i
1b4c0 66 28 20 73 7a 48 64 72 31 3e 39 38 33 30 37 20  f( szHdr1>98307 
1b4d0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1b4e0 43 4f 52 52 55 50 54 3b 0a 20 20 64 31 20 3d 20  CORRUPT;.  d1 = 
1b4f0 73 7a 48 64 72 31 3b 0a 20 20 61 73 73 65 72 74  szHdr1;.  assert
1b500 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  ( pKeyInfo->nFie
1b510 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46  ld+pKeyInfo->nXF
1b520 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46  ield>=pPKey2->nF
1b530 69 65 6c 64 20 7c 7c 20 43 4f 52 52 55 50 54 5f  ield || CORRUPT_
1b540 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
1b550 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
1b560 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  rder!=0 );.  ass
1b570 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ert( pKeyInfo->n
1b580 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73  Field>0 );.  ass
1b590 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72  ert( idx1<=szHdr
1b5a0 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  1 || CORRUPT_DB 
1b5b0 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32  );.  do{.    u32
1b5c0 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a   serial_type1;..
1b5d0 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
1b5e0 73 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72  serial types for
1b5f0 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e   the next elemen
1b600 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a  t in each key. *
1b610 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65  /.    idx1 += ge
1b620 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31  tVarint32( aKey1
1b630 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79  +idx1, serial_ty
1b640 70 65 31 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 56  pe1 );..    /* V
1b650 65 72 69 66 79 20 74 68 61 74 20 74 68 65 72 65  erify that there
1b660 20 69 73 20 65 6e 6f 75 67 68 20 6b 65 79 20 73   is enough key s
1b670 70 61 63 65 20 72 65 6d 61 69 6e 69 6e 67 20 74  pace remaining t
1b680 6f 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a 20 61  o avoid.    ** a
1b690 20 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64   buffer overread
1b6a0 2e 20 20 54 68 65 20 22 64 31 2b 73 65 72 69 61  .  The "d1+seria
1b6b0 6c 5f 74 79 70 65 31 2b 32 22 20 73 75 62 65 78  l_type1+2" subex
1b6c0 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 0a 20 20  pression will.  
1b6d0 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 67    ** always be g
1b6e0 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
1b6f0 71 75 61 6c 20 74 6f 20 74 68 65 20 61 6d 6f 75  qual to the amou
1b700 6e 74 20 6f 66 20 72 65 71 75 69 72 65 64 20 6b  nt of required k
1b710 65 79 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a  ey space..    **
1b720 20 55 73 65 20 74 68 61 74 20 61 70 70 72 6f 78   Use that approx
1b730 69 6d 61 74 69 6f 6e 20 74 6f 20 61 76 6f 69 64  imation to avoid
1b740 20 74 68 65 20 6d 6f 72 65 20 65 78 70 65 6e 73   the more expens
1b750 69 76 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  ive call to.    
1b760 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
1b770 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 20 69 6e  rialTypeLen() in
1b780 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
1b790 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1b7a0 20 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31   d1+serial_type1
1b7b0 2b 32 3e 28 75 33 32 29 6e 4b 65 79 31 0a 20 20  +2>(u32)nKey1.  
1b7c0 20 20 20 26 26 20 64 31 2b 73 71 6c 69 74 65 33     && d1+sqlite3
1b7d0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
1b7e0 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e  n(serial_type1)>
1b7f0 28 75 33 32 29 6e 4b 65 79 31 20 0a 20 20 20 20  (u32)nKey1 .    
1b800 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
1b810 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78      }..    /* Ex
1b820 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 73  tract the values
1b830 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e   to be compared.
1b840 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b  .    */.    d1 +
1b850 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
1b860 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31  ialGet(&aKey1[d1
1b870 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c  ], serial_type1,
1b880 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a   &mem1);..    /*
1b890 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73   Do the comparis
1b8a0 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  on.    */.    rc
1b8b0 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d   = sqlite3MemCom
1b8c0 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b  pare(&mem1, &pPK
1b8d0 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 70 4b  ey2->aMem[i], pK
1b8e0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
1b8f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  );.    if( rc!=0
1b900 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1b910 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d  ( mem1.szMalloc=
1b920 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f  =0 );  /* See co
1b930 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20  mment below */. 
1b940 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
1b950 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  o->aSortOrder[i]
1b960 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1b970 20 2d 72 63 3b 20 20 2f 2a 20 49 6e 76 65 72 74   -rc;  /* Invert
1b980 20 74 68 65 20 72 65 73 75 6c 74 20 66 6f 72 20   the result for 
1b990 44 45 53 43 20 73 6f 72 74 20 6f 72 64 65 72 2e  DESC sort order.
1b9a0 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
1b9b0 20 20 67 6f 74 6f 20 64 65 62 75 67 43 6f 6d 70    goto debugComp
1b9c0 61 72 65 45 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  areEnd;.    }.  
1b9d0 20 20 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28    i++;.  }while(
1b9e0 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20   idx1<szHdr1 && 
1b9f0 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  i<pPKey2->nField
1ba00 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d   );..  /* No mem
1ba10 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  ory allocation i
1ba20 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d  s ever used on m
1ba30 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73  em1.  Prove this
1ba40 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20   using.  ** the 
1ba50 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
1ba60 28 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65  ().  If the asse
1ba70 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69  rt() fails, it i
1ba80 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20  ndicates a.  ** 
1ba90 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20  memory leak and 
1baa0 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73  a need to call s
1bab0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
1bac0 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a  ease(&mem1)..  *
1bad0 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31  /.  assert( mem1
1bae0 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  .szMalloc==0 );.
1baf0 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65  .  /* rc==0 here
1bb00 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20   means that one 
1bb10 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20  of the keys ran 
1bb20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e  out of fields an
1bb30 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66  d.  ** all the f
1bb40 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74  ields up to that
1bb50 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61   point were equa
1bb60 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  l. Return the de
1bb70 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61  fault_rc.  ** va
1bb80 6c 75 65 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20  lue.  */.  rc = 
1bb90 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
1bba0 72 63 3b 0a 0a 64 65 62 75 67 43 6f 6d 70 61 72  rc;..debugCompar
1bbb0 65 45 6e 64 3a 0a 20 20 69 66 28 20 64 65 73 69  eEnd:.  if( desi
1bbc0 72 65 64 52 65 73 75 6c 74 3d 3d 30 20 26 26 20  redResult==0 && 
1bbd0 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  rc==0 ) return 1
1bbe0 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52  ;.  if( desiredR
1bbf0 65 73 75 6c 74 3c 30 20 26 26 20 72 63 3c 30 20  esult<0 && rc<0 
1bc00 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
1bc10 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3e  ( desiredResult>
1bc20 30 20 26 26 20 72 63 3e 30 20 29 20 72 65 74 75  0 && rc>0 ) retu
1bc30 72 6e 20 31 3b 0a 20 20 69 66 28 20 43 4f 52 52  rn 1;.  if( CORR
1bc40 55 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 20  UPT_DB ) return 
1bc50 31 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66  1;.  if( pKeyInf
1bc60 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  o->db->mallocFai
1bc70 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  led ) return 1;.
1bc80 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
1bc90 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
1bca0 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 6f 75  _DEBUG./*.** Cou
1bcb0 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
1bcc0 20 66 69 65 6c 64 73 20 28 61 2e 6b 2e 61 2e 20   fields (a.k.a. 
1bcd0 63 6f 6c 75 6d 6e 73 29 20 69 6e 20 74 68 65 20  columns) in the 
1bce0 72 65 63 6f 72 64 20 67 69 76 65 6e 20 62 79 0a  record given by.
1bcf0 2a 2a 20 70 4b 65 79 2c 6e 4b 65 79 2e 20 20 54  ** pKey,nKey.  T
1bd00 68 65 20 76 65 72 69 66 79 20 74 68 61 74 20 74  he verify that t
1bd10 68 69 73 20 63 6f 75 6e 74 20 69 73 20 6c 65 73  his count is les
1bd20 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
1bd30 74 6f 20 74 68 65 0a 2a 2a 20 6c 69 6d 69 74 20  to the.** limit 
1bd40 67 69 76 65 6e 20 62 79 20 70 4b 65 79 49 6e 66  given by pKeyInf
1bd50 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 4b 65 79  o->nField + pKey
1bd60 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 2e 0a 2a  Info->nXField..*
1bd70 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 63 6f 6e  *.** If this con
1bd80 73 74 72 61 69 6e 74 20 69 73 20 6e 6f 74 20 73  straint is not s
1bd90 61 74 69 73 66 69 65 64 2c 20 69 74 20 6d 65 61  atisfied, it mea
1bda0 6e 73 20 74 68 61 74 20 74 68 65 20 68 69 67 68  ns that the high
1bdb0 2d 73 70 65 65 64 0a 2a 2a 20 76 64 62 65 52 65  -speed.** vdbeRe
1bdc0 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29  cordCompareInt()
1bdd0 20 61 6e 64 20 76 64 62 65 52 65 63 6f 72 64 43   and vdbeRecordC
1bde0 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29 20 72  ompareString() r
1bdf0 6f 75 74 69 6e 65 73 20 77 69 6c 6c 0a 2a 2a 20  outines will.** 
1be00 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74  not work correct
1be10 6c 79 2e 20 20 49 66 20 74 68 69 73 20 61 73 73  ly.  If this ass
1be20 65 72 74 28 29 20 65 76 65 72 20 66 69 72 65 73  ert() ever fires
1be30 2c 20 69 74 20 70 72 6f 62 61 62 6c 79 20 6d 65  , it probably me
1be40 61 6e 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ans.** that the 
1be50 4b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 6f  KeyInfo.nField o
1be60 72 20 4b 65 79 49 6e 66 6f 2e 6e 58 46 69 65 6c  r KeyInfo.nXFiel
1be70 64 20 76 61 6c 75 65 73 20 77 65 72 65 20 63 6f  d values were co
1be80 6d 70 75 74 65 64 0a 2a 2a 20 69 6e 63 6f 72 72  mputed.** incorr
1be90 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ectly..*/.static
1bea0 20 76 6f 69 64 20 76 64 62 65 41 73 73 65 72 74   void vdbeAssert
1beb0 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e  FieldCountWithin
1bec0 4c 69 6d 69 74 73 28 0a 20 20 69 6e 74 20 6e 4b  Limits(.  int nK
1bed0 65 79 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ey, const void *
1bee0 70 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65 20 72  pKey,   /* The r
1bef0 65 63 6f 72 64 20 74 6f 20 76 65 72 69 66 79 20  ecord to verify 
1bf00 2a 2f 20 0a 20 20 63 6f 6e 73 74 20 4b 65 79 49  */ .  const KeyI
1bf10 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20  nfo *pKeyInfo   
1bf20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20 73      /* Compare s
1bf30 69 7a 65 20 77 69 74 68 20 74 68 69 73 20 4b 65  ize with this Ke
1bf40 79 49 6e 66 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e  yInfo */.){.  in
1bf50 74 20 6e 46 69 65 6c 64 20 3d 20 30 3b 0a 20 20  t nField = 0;.  
1bf60 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 75 33 32  u32 szHdr;.  u32
1bf70 20 69 64 78 3b 0a 20 20 75 33 32 20 6e 6f 74 55   idx;.  u32 notU
1bf80 73 65 64 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  sed;.  const uns
1bf90 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
1bfa0 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
1bfb0 65 64 20 63 68 61 72 2a 29 70 4b 65 79 3b 0a 0a  ed char*)pKey;..
1bfc0 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42    if( CORRUPT_DB
1bfd0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 64 78   ) return;.  idx
1bfe0 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
1bff0 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 61  Key, szHdr);.  a
1c000 73 73 65 72 74 28 20 6e 4b 65 79 3e 3d 30 20 29  ssert( nKey>=0 )
1c010 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 48 64  ;.  assert( szHd
1c020 72 3c 3d 28 75 33 32 29 6e 4b 65 79 20 29 3b 0a  r<=(u32)nKey );.
1c030 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48    while( idx<szH
1c040 64 72 20 29 7b 0a 20 20 20 20 69 64 78 20 2b 3d  dr ){.    idx +=
1c050 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
1c060 79 2b 69 64 78 2c 20 6e 6f 74 55 73 65 64 29 3b  y+idx, notUsed);
1c070 0a 20 20 20 20 6e 46 69 65 6c 64 2b 2b 3b 0a 20  .    nField++;. 
1c080 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 46 69   }.  assert( nFi
1c090 65 6c 64 20 3c 3d 20 70 4b 65 79 49 6e 66 6f 2d  eld <= pKeyInfo-
1c0a0 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f  >nField+pKeyInfo
1c0b0 2d 3e 6e 58 46 69 65 6c 64 20 29 3b 0a 7d 0a 23  ->nXField );.}.#
1c0c0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64  else.# define vd
1c0d0 62 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75  beAssertFieldCou
1c0e0 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 41  ntWithinLimits(A
1c0f0 2c 42 2c 43 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,B,C).#endif../*
1c100 0a 2a 2a 20 42 6f 74 68 20 2a 70 4d 65 6d 31 20  .** Both *pMem1 
1c110 61 6e 64 20 2a 70 4d 65 6d 32 20 63 6f 6e 74 61  and *pMem2 conta
1c120 69 6e 20 73 74 72 69 6e 67 20 76 61 6c 75 65 73  in string values
1c130 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74 77  . Compare the tw
1c140 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 75 73 69 6e  o values.** usin
1c150 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  g the collation 
1c160 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20  sequence pColl. 
1c170 41 73 20 75 73 75 61 6c 2c 20 72 65 74 75 72 6e  As usual, return
1c180 20 61 20 6e 65 67 61 74 69 76 65 20 2c 20 7a 65   a negative , ze
1c190 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76  ro.** or positiv
1c1a0 65 20 76 61 6c 75 65 20 69 66 20 2a 70 4d 65 6d  e value if *pMem
1c1b0 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  1 is less than, 
1c1c0 65 71 75 61 6c 20 74 6f 20 6f 72 20 67 72 65 61  equal to or grea
1c1d0 74 65 72 20 74 68 61 6e 20 0a 2a 2a 20 2a 70 4d  ter than .** *pM
1c1e0 65 6d 32 2c 20 72 65 73 70 65 63 74 69 76 65 6c  em2, respectivel
1c1f0 79 2e 20 53 69 6d 69 6c 61 72 20 69 6e 20 73 70  y. Similar in sp
1c200 69 72 69 74 20 74 6f 20 22 72 63 20 3d 20 28 2a  irit to "rc = (*
1c210 70 4d 65 6d 31 29 20 2d 20 28 2a 70 4d 65 6d 32  pMem1) - (*pMem2
1c220 29 3b 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  );"..*/.static i
1c230 6e 74 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65  nt vdbeCompareMe
1c240 6d 53 74 72 69 6e 67 28 0a 20 20 63 6f 6e 73 74  mString(.  const
1c250 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 0a 20 20 63   Mem *pMem1,.  c
1c260 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c  onst Mem *pMem2,
1c270 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71  .  const CollSeq
1c280 20 2a 70 43 6f 6c 6c 2c 0a 20 20 75 38 20 2a 70   *pColl,.  u8 *p
1c290 72 63 45 72 72 20 20 20 20 20 20 20 20 20 20 20  rcErr           
1c2a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
1c2b0 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20   an OOM occurs, 
1c2c0 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f  set to SQLITE_NO
1c2d0 4d 45 4d 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  MEM */.){.  if( 
1c2e0 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 43 6f 6c  pMem1->enc==pCol
1c2f0 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 2f 2a  l->enc ){.    /*
1c300 20 54 68 65 20 73 74 72 69 6e 67 73 20 61 72 65   The strings are
1c310 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
1c320 63 6f 72 72 65 63 74 20 65 6e 63 6f 64 69 6e 67  correct encoding
1c330 2e 20 20 43 61 6c 6c 20 74 68 65 0a 20 20 20 20  .  Call the.    
1c340 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66   ** comparison f
1c350 75 6e 63 74 69 6f 6e 20 64 69 72 65 63 74 6c 79  unction directly
1c360 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70   */.    return p
1c370 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c  Coll->xCmp(pColl
1c380 2d 3e 70 55 73 65 72 2c 70 4d 65 6d 31 2d 3e 6e  ->pUser,pMem1->n
1c390 2c 70 4d 65 6d 31 2d 3e 7a 2c 70 4d 65 6d 32 2d  ,pMem1->z,pMem2-
1c3a0 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a 29 3b 0a 20 20  >n,pMem2->z);.  
1c3b0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
1c3c0 63 3b 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69  c;.    const voi
1c3d0 64 20 2a 76 31 2c 20 2a 76 32 3b 0a 20 20 20 20  d *v1, *v2;.    
1c3e0 69 6e 74 20 6e 31 2c 20 6e 32 3b 0a 20 20 20 20  int n1, n2;.    
1c3f0 4d 65 6d 20 63 31 3b 0a 20 20 20 20 4d 65 6d 20  Mem c1;.    Mem 
1c400 63 32 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  c2;.    sqlite3V
1c410 64 62 65 4d 65 6d 49 6e 69 74 28 26 63 31 2c 20  dbeMemInit(&c1, 
1c420 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e  pMem1->db, MEM_N
1c430 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ull);.    sqlite
1c440 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 63 32  3VdbeMemInit(&c2
1c450 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d  , pMem1->db, MEM
1c460 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69  _Null);.    sqli
1c470 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f  te3VdbeMemShallo
1c480 77 43 6f 70 79 28 26 63 31 2c 20 70 4d 65 6d 31  wCopy(&c1, pMem1
1c490 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20  , MEM_Ephem);.  
1c4a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1c4b0 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 32 2c  ShallowCopy(&c2,
1c4c0 20 70 4d 65 6d 32 2c 20 4d 45 4d 5f 45 70 68 65   pMem2, MEM_Ephe
1c4d0 6d 29 3b 0a 20 20 20 20 76 31 20 3d 20 73 71 6c  m);.    v1 = sql
1c4e0 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 28 73  ite3ValueText((s
1c4f0 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63  qlite3_value*)&c
1c500 31 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a  1, pColl->enc);.
1c510 20 20 20 20 6e 31 20 3d 20 76 31 3d 3d 30 20 3f      n1 = v1==0 ?
1c520 20 30 20 3a 20 63 31 2e 6e 3b 0a 20 20 20 20 76   0 : c1.n;.    v
1c530 32 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  2 = sqlite3Value
1c540 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61  Text((sqlite3_va
1c550 6c 75 65 2a 29 26 63 32 2c 20 70 43 6f 6c 6c 2d  lue*)&c2, pColl-
1c560 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 32 20 3d 20  >enc);.    n2 = 
1c570 76 32 3d 3d 30 20 3f 20 30 20 3a 20 63 32 2e 6e  v2==0 ? 0 : c2.n
1c580 3b 0a 20 20 20 20 72 63 20 3d 20 70 43 6f 6c 6c  ;.    rc = pColl
1c590 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55  ->xCmp(pColl->pU
1c5a0 73 65 72 2c 20 6e 31 2c 20 76 31 2c 20 6e 32 2c  ser, n1, v1, n2,
1c5b0 20 76 32 29 3b 0a 20 20 20 20 69 66 28 20 28 76   v2);.    if( (v
1c5c0 31 3d 3d 30 20 7c 7c 20 76 32 3d 3d 30 29 20 26  1==0 || v2==0) &
1c5d0 26 20 70 72 63 45 72 72 20 29 20 2a 70 72 63 45  & prcErr ) *prcE
1c5e0 72 72 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rr = SQLITE_NOME
1c5f0 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  M;.    sqlite3Vd
1c600 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 31  beMemRelease(&c1
1c610 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1c620 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 32  beMemRelease(&c2
1c630 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
1c640 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
1c650 6f 6d 70 61 72 65 20 74 77 6f 20 62 6c 6f 62 73  ompare two blobs
1c660 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69  .  Return negati
1c670 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73  ve, zero, or pos
1c680 69 74 69 76 65 20 69 66 20 74 68 65 20 66 69 72  itive if the fir
1c690 73 74 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74 68  st.** is less th
1c6a0 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72  an, equal to, or
1c6b0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
1c6c0 65 20 73 65 63 6f 6e 64 2c 20 72 65 73 70 65 63  e second, respec
1c6d0 74 69 76 65 6c 79 2e 0a 2a 2a 20 49 66 20 6f 6e  tively..** If on
1c6e0 65 20 62 6c 6f 62 20 69 73 20 61 20 70 72 65 66  e blob is a pref
1c6f0 69 78 20 6f 66 20 74 68 65 20 6f 74 68 65 72 2c  ix of the other,
1c700 20 74 68 65 6e 20 74 68 65 20 73 68 6f 72 74 65   then the shorte
1c710 72 20 69 73 20 74 68 65 20 6c 65 73 73 6f 72 2e  r is the lessor.
1c720 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
1c730 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 73  E_NOINLINE int s
1c740 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72  qlite3BlobCompar
1c750 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 31  e(const Mem *pB1
1c760 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 32  , const Mem *pB2
1c770 29 7b 0a 20 20 69 6e 74 20 63 20 3d 20 6d 65 6d  ){.  int c = mem
1c780 63 6d 70 28 70 42 31 2d 3e 7a 2c 20 70 42 32 2d  cmp(pB1->z, pB2-
1c790 3e 7a 2c 20 70 42 31 2d 3e 6e 3e 70 42 32 2d 3e  >z, pB1->n>pB2->
1c7a0 6e 20 3f 20 70 42 32 2d 3e 6e 20 3a 20 70 42 31  n ? pB2->n : pB1
1c7b0 2d 3e 6e 29 3b 0a 20 20 69 66 28 20 63 20 29 20  ->n);.  if( c ) 
1c7c0 72 65 74 75 72 6e 20 63 3b 0a 20 20 72 65 74 75  return c;.  retu
1c7d0 72 6e 20 70 42 31 2d 3e 6e 20 2d 20 70 42 32 2d  rn pB1->n - pB2-
1c7e0 3e 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  >n;.}../*.** Do 
1c7f0 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74  a comparison bet
1c800 77 65 65 6e 20 61 20 36 34 2d 62 69 74 20 73 69  ween a 64-bit si
1c810 67 6e 65 64 20 69 6e 74 65 67 65 72 20 61 6e 64  gned integer and
1c820 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69   a 64-bit floati
1c830 6e 67 2d 70 6f 69 6e 74 0a 2a 2a 20 6e 75 6d 62  ng-point.** numb
1c840 65 72 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61  er.  Return nega
1c850 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70  tive, zero, or p
1c860 6f 73 69 74 69 76 65 20 69 66 20 74 68 65 20 66  ositive if the f
1c870 69 72 73 74 20 28 69 36 34 29 20 69 73 20 6c 65  irst (i64) is le
1c880 73 73 20 74 68 61 6e 2c 0a 2a 2a 20 65 71 75 61  ss than,.** equa
1c890 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72  l to, or greater
1c8a0 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64   than the second
1c8b0 20 28 64 6f 75 62 6c 65 29 2e 0a 2a 2f 0a 73 74   (double)..*/.st
1c8c0 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
1c8d0 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28  IntFloatCompare(
1c8e0 69 36 34 20 69 2c 20 64 6f 75 62 6c 65 20 72 29  i64 i, double r)
1c8f0 7b 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 4c  {.  if( sizeof(L
1c900 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 29 3e  ONGDOUBLE_TYPE)>
1c910 38 20 29 7b 0a 20 20 20 20 4c 4f 4e 47 44 4f 55  8 ){.    LONGDOU
1c920 42 4c 45 5f 54 59 50 45 20 78 20 3d 20 28 4c 4f  BLE_TYPE x = (LO
1c930 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 29 69 3b  NGDOUBLE_TYPE)i;
1c940 0a 20 20 20 20 69 66 28 20 78 3c 72 20 29 20 72  .    if( x<r ) r
1c950 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66  eturn -1;.    if
1c960 28 20 78 3e 72 20 29 20 72 65 74 75 72 6e 20 2b  ( x>r ) return +
1c970 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  1;.    return 0;
1c980 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36  .  }else{.    i6
1c990 34 20 79 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  4 y;.    double 
1c9a0 73 3b 0a 20 20 20 20 69 66 28 20 72 3c 2d 39 32  s;.    if( r<-92
1c9b0 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30  2337203685477580
1c9c0 38 2e 30 20 29 20 72 65 74 75 72 6e 20 2b 31 3b  8.0 ) return +1;
1c9d0 0a 20 20 20 20 69 66 28 20 72 3e 39 32 32 33 33  .    if( r>92233
1c9e0 37 32 30 33 36 38 35 34 37 37 35 38 30 37 2e 30  72036854775807.0
1c9f0 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
1ca00 20 20 79 20 3d 20 28 69 36 34 29 72 3b 0a 20 20    y = (i64)r;.  
1ca10 20 20 69 66 28 20 69 3c 79 20 29 20 72 65 74 75    if( i<y ) retu
1ca20 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 69  rn -1;.    if( i
1ca30 3e 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >y ){.      if( 
1ca40 79 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36  y==SMALLEST_INT6
1ca50 34 20 26 26 20 72 3e 30 2e 30 20 29 20 72 65 74  4 && r>0.0 ) ret
1ca60 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 72 65  urn -1;.      re
1ca70 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 7d 0a 20  turn +1;.    }. 
1ca80 20 20 20 73 20 3d 20 28 64 6f 75 62 6c 65 29 69     s = (double)i
1ca90 3b 0a 20 20 20 20 69 66 28 20 73 3c 72 20 29 20  ;.    if( s<r ) 
1caa0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69  return -1;.    i
1cab0 66 28 20 73 3e 72 20 29 20 72 65 74 75 72 6e 20  f( s>r ) return 
1cac0 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  +1;.    return 0
1cad0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
1cae0 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75 65  ompare the value
1caf0 73 20 63 6f 6e 74 61 69 6e 65 64 20 62 79 20 74  s contained by t
1cb00 68 65 20 74 77 6f 20 6d 65 6d 6f 72 79 20 63 65  he two memory ce
1cb10 6c 6c 73 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a  lls, returning.*
1cb20 2a 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  * negative, zero
1cb30 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20   or positive if 
1cb40 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68  pMem1 is less th
1cb50 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72  an, equal to, or
1cb60 20 67 72 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e   greater.** than
1cb70 20 70 4d 65 6d 32 2e 20 53 6f 72 74 69 6e 67 20   pMem2. Sorting 
1cb80 6f 72 64 65 72 20 69 73 20 4e 55 4c 4c 27 73 20  order is NULL's 
1cb90 66 69 72 73 74 2c 20 66 6f 6c 6c 6f 77 65 64 20  first, followed 
1cba0 62 79 20 6e 75 6d 62 65 72 73 20 28 69 6e 74 65  by numbers (inte
1cbb0 67 65 72 73 0a 2a 2a 20 61 6e 64 20 72 65 61 6c  gers.** and real
1cbc0 73 29 20 73 6f 72 74 65 64 20 6e 75 6d 65 72 69  s) sorted numeri
1cbd0 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64 20  cally, followed 
1cbe0 62 79 20 74 65 78 74 20 6f 72 64 65 72 65 64 20  by text ordered 
1cbf0 62 79 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  by the collating
1cc00 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 70 43 6f  .** sequence pCo
1cc10 6c 6c 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 62  ll and finally b
1cc20 6c 6f 62 27 73 20 6f 72 64 65 72 65 64 20 62 79  lob's ordered by
1cc30 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a   memcmp()..**.**
1cc40 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73   Two NULL values
1cc50 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
1cc60 65 71 75 61 6c 20 62 79 20 74 68 69 73 20 66 75  equal by this fu
1cc70 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
1cc80 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
1cc90 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d  (const Mem *pMem
1cca0 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d  1, const Mem *pM
1ccb0 65 6d 32 2c 20 63 6f 6e 73 74 20 43 6f 6c 6c 53  em2, const CollS
1ccc0 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 6e  eq *pColl){.  in
1ccd0 74 20 66 31 2c 20 66 32 3b 0a 20 20 69 6e 74 20  t f1, f2;.  int 
1cce0 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 3b 0a  combined_flags;.
1ccf0 0a 20 20 66 31 20 3d 20 70 4d 65 6d 31 2d 3e 66  .  f1 = pMem1->f
1cd00 6c 61 67 73 3b 0a 20 20 66 32 20 3d 20 70 4d 65  lags;.  f2 = pMe
1cd10 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 63 6f 6d  m2->flags;.  com
1cd20 62 69 6e 65 64 5f 66 6c 61 67 73 20 3d 20 66 31  bined_flags = f1
1cd30 7c 66 32 3b 0a 20 20 61 73 73 65 72 74 28 20 28  |f2;.  assert( (
1cd40 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 26  combined_flags &
1cd50 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20   MEM_RowSet)==0 
1cd60 29 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 6f 6e 65  );. .  /* If one
1cd70 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20   value is NULL, 
1cd80 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  it is less than 
1cd90 74 68 65 20 6f 74 68 65 72 2e 20 49 66 20 62 6f  the other. If bo
1cda0 74 68 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20 61  th values.  ** a
1cdb0 72 65 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20  re NULL, return 
1cdc0 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f  0..  */.  if( co
1cdd0 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d  mbined_flags&MEM
1cde0 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Null ){.    ret
1cdf0 75 72 6e 20 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c  urn (f2&MEM_Null
1ce00 29 20 2d 20 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c  ) - (f1&MEM_Null
1ce10 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20  );.  }..  /* At 
1ce20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65  least one of the
1ce30 20 74 77 6f 20 76 61 6c 75 65 73 20 69 73 20 61   two values is a
1ce40 20 6e 75 6d 62 65 72 0a 20 20 2a 2f 0a 20 20 69   number.  */.  i
1ce50 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  f( combined_flag
1ce60 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52  s&(MEM_Int|MEM_R
1ce70 65 61 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20  eal) ){.    if( 
1ce80 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 49  (f1 & f2 & MEM_I
1ce90 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  nt)!=0 ){.      
1cea0 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c  if( pMem1->u.i <
1ceb0 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65   pMem2->u.i ) re
1cec0 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69  turn -1;.      i
1ced0 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20  f( pMem1->u.i > 
1cee0 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74  pMem2->u.i ) ret
1cef0 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65  urn +1;.      re
1cf00 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
1cf10 20 20 69 66 28 20 28 66 31 20 26 20 66 32 20 26    if( (f1 & f2 &
1cf20 20 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b   MEM_Real)!=0 ){
1cf30 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31  .      if( pMem1
1cf40 2d 3e 75 2e 72 20 3c 20 70 4d 65 6d 32 2d 3e 75  ->u.r < pMem2->u
1cf50 2e 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .r ) return -1;.
1cf60 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d        if( pMem1-
1cf70 3e 75 2e 72 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e  >u.r > pMem2->u.
1cf80 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20  r ) return +1;. 
1cf90 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1cfa0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31     }.    if( (f1
1cfb0 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a  &MEM_Int)!=0 ){.
1cfc0 20 20 20 20 20 20 69 66 28 20 28 66 32 26 4d 45        if( (f2&ME
1cfd0 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20  M_Real)!=0 ){.  
1cfe0 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
1cff0 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70  ite3IntFloatComp
1d000 61 72 65 28 70 4d 65 6d 31 2d 3e 75 2e 69 2c 20  are(pMem1->u.i, 
1d010 70 4d 65 6d 32 2d 3e 75 2e 72 29 3b 0a 20 20 20  pMem2->u.r);.   
1d020 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d030 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
1d040 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1d050 66 28 20 28 66 31 26 4d 45 4d 5f 52 65 61 6c 29  f( (f1&MEM_Real)
1d060 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
1d070 20 28 66 32 26 4d 45 4d 5f 49 6e 74 29 21 3d 30   (f2&MEM_Int)!=0
1d080 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1d090 72 6e 20 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c  rn -sqlite3IntFl
1d0a0 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d 65 6d 32  oatCompare(pMem2
1d0b0 2d 3e 75 2e 69 2c 20 70 4d 65 6d 31 2d 3e 75 2e  ->u.i, pMem1->u.
1d0c0 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r);.      }else{
1d0d0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1d0e0 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
1d0f0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 31 3b  }.    return +1;
1d100 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e  .  }..  /* If on
1d110 65 20 76 61 6c 75 65 20 69 73 20 61 20 73 74 72  e value is a str
1d120 69 6e 67 20 61 6e 64 20 74 68 65 20 6f 74 68 65  ing and the othe
1d130 72 20 69 73 20 61 20 62 6c 6f 62 2c 20 74 68 65  r is a blob, the
1d140 20 73 74 72 69 6e 67 20 69 73 20 6c 65 73 73 2e   string is less.
1d150 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68 20 61 72  .  ** If both ar
1d160 65 20 73 74 72 69 6e 67 73 2c 20 63 6f 6d 70 61  e strings, compa
1d170 72 65 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c  re using the col
1d180 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  lating functions
1d190 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d  ..  */.  if( com
1d1a0 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f  bined_flags&MEM_
1d1b0 53 74 72 20 29 7b 0a 20 20 20 20 69 66 28 20 28  Str ){.    if( (
1d1c0 66 31 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30  f1 & MEM_Str)==0
1d1d0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1d1e0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
1d1f0 28 20 28 66 32 20 26 20 4d 45 4d 5f 53 74 72 29  ( (f2 & MEM_Str)
1d200 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
1d210 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20  urn -1;.    }.. 
1d220 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31     assert( pMem1
1d230 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e  ->enc==pMem2->en
1d240 63 20 7c 7c 20 70 4d 65 6d 31 2d 3e 64 62 2d 3e  c || pMem1->db->
1d250 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1d260 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
1d270 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  1->enc==SQLITE_U
1d280 54 46 38 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  TF8 || .        
1d290 20 20 20 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d      pMem1->enc==
1d2a0 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 7c  SQLITE_UTF16LE |
1d2b0 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51  | pMem1->enc==SQ
1d2c0 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a  LITE_UTF16BE );.
1d2d0 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c  .    /* The coll
1d2e0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6d  ation sequence m
1d2f0 75 73 74 20 62 65 20 64 65 66 69 6e 65 64 20 61  ust be defined a
1d300 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 65 76  t this point, ev
1d310 65 6e 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65  en if.    ** the
1d320 20 75 73 65 72 20 64 65 6c 65 74 65 73 20 74 68   user deletes th
1d330 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
1d340 65 6e 63 65 20 61 66 74 65 72 20 74 68 65 20 76  ence after the v
1d350 64 62 65 20 70 72 6f 67 72 61 6d 20 69 73 0a 20  dbe program is. 
1d360 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 28     ** compiled (
1d370 74 68 69 73 20 77 61 73 20 6e 6f 74 20 61 6c 77  this was not alw
1d380 61 79 73 20 74 68 65 20 63 61 73 65 29 2e 0a 20  ays the case).. 
1d390 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
1d3a0 28 20 21 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c  ( !pColl || pCol
1d3b0 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20 20 20 20  l->xCmp );..    
1d3c0 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
1d3d0 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 43 6f     return vdbeCo
1d3e0 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 70  mpareMemString(p
1d3f0 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c 20 70 43 6f  Mem1, pMem2, pCo
1d400 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ll, 0);.    }.  
1d410 20 20 2f 2a 20 49 66 20 61 20 4e 55 4c 4c 20 70    /* If a NULL p
1d420 6f 69 6e 74 65 72 20 77 61 73 20 70 61 73 73 65  ointer was passe
1d430 64 20 61 73 20 74 68 65 20 63 6f 6c 6c 61 74 65  d as the collate
1d440 20 66 75 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c 20   function, fall 
1d450 74 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74  through.    ** t
1d460 6f 20 74 68 65 20 62 6c 6f 62 20 63 61 73 65 20  o the blob case 
1d470 61 6e 64 20 75 73 65 20 6d 65 6d 63 6d 70 28 29  and use memcmp()
1d480 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a  .  */.  }. .  /*
1d490 20 42 6f 74 68 20 76 61 6c 75 65 73 20 6d 75 73   Both values mus
1d4a0 74 20 62 65 20 62 6c 6f 62 73 2e 20 20 43 6f 6d  t be blobs.  Com
1d4b0 70 61 72 65 20 75 73 69 6e 67 20 6d 65 6d 63 6d  pare using memcm
1d4c0 70 28 29 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72  p().  */.  retur
1d4d0 6e 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d  n sqlite3BlobCom
1d4e0 70 61 72 65 28 70 4d 65 6d 31 2c 20 70 4d 65 6d  pare(pMem1, pMem
1d4f0 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  2);.}.../*.** Th
1d500 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1d510 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
1d520 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 73 65  function is a se
1d530 72 69 61 6c 2d 74 79 70 65 20 74 68 61 74 0a 2a  rial-type that.*
1d540 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  * corresponds to
1d550 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 61 6c   an integer - al
1d560 6c 20 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e  l values between
1d570 20 31 20 61 6e 64 20 39 20 69 6e 63 6c 75 73 69   1 and 9 inclusi
1d580 76 65 20 0a 2a 2a 20 65 78 63 65 70 74 20 37 2e  ve .** except 7.
1d590 20 54 68 65 20 73 65 63 6f 6e 64 20 70 6f 69 6e   The second poin
1d5a0 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  ts to a buffer c
1d5b0 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 69 6e 74  ontaining an int
1d5c0 65 67 65 72 20 76 61 6c 75 65 0a 2a 2a 20 73 65  eger value.** se
1d5d0 72 69 61 6c 69 7a 65 64 20 61 63 63 6f 72 64 69  rialized accordi
1d5e0 6e 67 20 74 6f 20 73 65 72 69 61 6c 5f 74 79 70  ng to serial_typ
1d5f0 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
1d600 20 64 65 73 65 72 69 61 6c 69 7a 65 73 0a 2a 2a   deserializes.**
1d610 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65   and returns the
1d620 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
1d630 63 20 69 36 34 20 76 64 62 65 52 65 63 6f 72 64  c i64 vdbeRecord
1d640 44 65 63 6f 64 65 49 6e 74 28 75 33 32 20 73 65  DecodeInt(u32 se
1d650 72 69 61 6c 5f 74 79 70 65 2c 20 63 6f 6e 73 74  rial_type, const
1d660 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33   u8 *aKey){.  u3
1d670 32 20 79 3b 0a 20 20 61 73 73 65 72 74 28 20 43  2 y;.  assert( C
1d680 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 28 73 65  ORRUPT_DB || (se
1d690 72 69 61 6c 5f 74 79 70 65 3e 3d 31 20 26 26 20  rial_type>=1 && 
1d6a0 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 39 20 26  serial_type<=9 &
1d6b0 26 20 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 37  & serial_type!=7
1d6c0 29 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73  ) );.  switch( s
1d6d0 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20  erial_type ){.  
1d6e0 20 20 63 61 73 65 20 30 3a 0a 20 20 20 20 63 61    case 0:.    ca
1d6f0 73 65 20 31 3a 0a 20 20 20 20 20 20 74 65 73 74  se 1:.      test
1d700 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78  case( aKey[0]&0x
1d710 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  80 );.      retu
1d720 72 6e 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28  rn ONE_BYTE_INT(
1d730 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20  aKey);.    case 
1d740 32 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  2:.      testcas
1d750 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
1d760 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1d770 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  TWO_BYTE_INT(aKe
1d780 79 29 3b 0a 20 20 20 20 63 61 73 65 20 33 3a 0a  y);.    case 3:.
1d790 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1d7a0 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1d7b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 48 52        return THR
1d7c0 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  EE_BYTE_INT(aKey
1d7d0 29 3b 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b  );.    case 4: {
1d7e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d7f0 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
1d800 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f  .      y = FOUR_
1d810 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b  BYTE_UINT(aKey);
1d820 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 69  .      return (i
1d830 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20  64)*(int*)&y;.  
1d840 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20    }.    case 5: 
1d850 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1d860 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1d870 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 46  ;.      return F
1d880 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
1d890 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31  ey+2) + (((i64)1
1d8a0 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f  )<<32)*TWO_BYTE_
1d8b0 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 7d  INT(aKey);.    }
1d8c0 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b 0a 20  .    case 6: {. 
1d8d0 20 20 20 20 20 75 36 34 20 78 20 3d 20 46 4f 55       u64 x = FOU
1d8e0 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
1d8f0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1d900 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
1d910 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c  );.      x = (x<
1d920 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45  <32) | FOUR_BYTE
1d930 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20  _UINT(aKey+4);. 
1d940 20 20 20 20 20 72 65 74 75 72 6e 20 28 69 36 34       return (i64
1d950 29 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20  )*(i64*)&x;.    
1d960 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
1d970 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 38  (serial_type - 8
1d980 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
1d990 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72   function compar
1d9a0 65 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  es the two table
1d9b0 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72   rows or index r
1d9c0 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66  ecords.** specif
1d9d0 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70  ied by {nKey1, p
1d9e0 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32  Key1} and pPKey2
1d9f0 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 61 20  .  It returns a 
1da00 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a  negative, zero.*
1da10 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e  * or positive in
1da20 74 65 67 65 72 20 69 66 20 6b 65 79 31 20 69 73  teger if key1 is
1da30 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
1da40 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61  l to or .** grea
1da50 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e 20 20  ter than key2.  
1da60 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79  The {nKey1, pKey
1da70 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61  1} key must be a
1da80 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64   blob.** created
1da90 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52   by the OP_MakeR
1daa0 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20  ecord opcode of 
1dab0 74 68 65 20 56 44 42 45 2e 20 20 54 68 65 20 70  the VDBE.  The p
1dac0 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73  PKey2.** key mus
1dad0 74 20 62 65 20 61 20 70 61 72 73 65 64 20 6b 65  t be a parsed ke
1dae0 79 20 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e  y such as obtain
1daf0 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
1db00 65 33 56 64 62 65 50 61 72 73 65 52 65 63 6f 72  e3VdbeParseRecor
1db10 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75  d..**.** If argu
1db20 6d 65 6e 74 20 62 53 6b 69 70 20 69 73 20 6e 6f  ment bSkip is no
1db30 6e 2d 7a 65 72 6f 2c 20 69 74 20 69 73 20 61 73  n-zero, it is as
1db40 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63  sumed that the c
1db50 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64  aller has alread
1db60 79 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20  y.** determined 
1db70 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 66  that the first f
1db80 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6b 65 79  ields of the key
1db90 73 20 61 72 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a  s are equal..**.
1dba0 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32  ** Key1 and Key2
1dbb0 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20   do not have to 
1dbc0 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65  contain the same
1dbd0 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64   number of field
1dbe0 73 2e 20 49 66 20 61 6c 6c 20 0a 2a 2a 20 66 69  s. If all .** fi
1dbf0 65 6c 64 73 20 74 68 61 74 20 61 70 70 65 61 72  elds that appear
1dc00 20 69 6e 20 62 6f 74 68 20 6b 65 79 73 20 61 72   in both keys ar
1dc10 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 70 50  e equal, then pP
1dc20 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
1dc30 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
1dc40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 62  ..**.** If datab
1dc50 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
1dc60 73 20 64 69 73 63 6f 76 65 72 65 64 2c 20 73 65  s discovered, se
1dc70 74 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64  t pPKey2->errCod
1dc80 65 20 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  e to .** SQLITE_
1dc90 43 4f 52 52 55 50 54 20 61 6e 64 20 72 65 74 75  CORRUPT and retu
1dca0 72 6e 20 30 2e 20 49 66 20 61 6e 20 4f 4f 4d 20  rn 0. If an OOM 
1dcb0 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
1dcc0 65 72 65 64 2c 20 0a 2a 2a 20 70 50 4b 65 79 32  ered, .** pPKey2
1dcd0 2d 3e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74  ->errCode is set
1dce0 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   to SQLITE_NOMEM
1dcf0 20 61 6e 64 2c 20 69 66 20 69 74 20 69 73 20 6e   and, if it is n
1dd00 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20  ot NULL, the.** 
1dd10 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c  malloc-failed fl
1dd20 61 67 20 73 65 74 20 6f 6e 20 64 61 74 61 62 61  ag set on databa
1dd30 73 65 20 68 61 6e 64 6c 65 20 28 70 50 4b 65 79  se handle (pPKey
1dd40 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 29  2->pKeyInfo->db)
1dd50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1dd60 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1dd70 65 57 69 74 68 53 6b 69 70 28 0a 20 20 69 6e 74  eWithSkip(.  int
1dd80 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
1dd90 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20  id *pKey1,   /* 
1dda0 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e  Left key */.  Un
1ddb0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
1ddc0 4b 65 79 32 2c 20 20 20 20 20 20 20 20 20 2f 2a  Key2,         /*
1ddd0 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20   Right key */.  
1dde0 69 6e 74 20 62 53 6b 69 70 20 20 20 20 20 20 20  int bSkip       
1ddf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de00 2f 2a 20 49 66 20 74 72 75 65 2c 20 73 6b 69 70  /* If true, skip
1de10 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
1de20 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b   */.){.  u32 d1;
1de30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de40 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1de50 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
1de60 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d  f next data elem
1de70 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ent */.  int i; 
1de80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de90 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1dea0 78 20 6f 66 20 6e 65 78 74 20 66 69 65 6c 64 20  x of next field 
1deb0 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20  to compare */.  
1dec0 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20  u32 szHdr1;     
1ded0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dee0 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72  /* Size of recor
1def0 64 20 68 65 61 64 65 72 20 69 6e 20 62 79 74 65  d header in byte
1df00 73 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b  s */.  u32 idx1;
1df10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1df30 20 6f 66 20 66 69 72 73 74 20 74 79 70 65 20 69   of first type i
1df40 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  n header */.  in
1df50 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20  t rc = 0;       
1df60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1df70 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
1df80 0a 20 20 4d 65 6d 20 2a 70 52 68 73 20 3d 20 70  .  Mem *pRhs = p
1df90 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20 20 20 20  PKey2->aMem;    
1dfa0 20 20 20 2f 2a 20 4e 65 78 74 20 66 69 65 6c 64     /* Next field
1dfb0 20 6f 66 20 70 50 4b 65 79 32 20 74 6f 20 63 6f   of pPKey2 to co
1dfc0 6d 70 61 72 65 20 2a 2f 0a 20 20 4b 65 79 49 6e  mpare */.  KeyIn
1dfd0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70  fo *pKeyInfo = p
1dfe0 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b  PKey2->pKeyInfo;
1dff0 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
1e000 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20  d char *aKey1 = 
1e010 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
1e020 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20  char *)pKey1;.  
1e030 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20  Mem mem1;..  /* 
1e040 49 66 20 62 53 6b 69 70 20 69 73 20 74 72 75 65  If bSkip is true
1e050 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
1e060 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 64 65  r has already de
1e070 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68  termined that th
1e080 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f  e first.  ** two
1e090 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
1e0a0 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e   keys are equal.
1e0b0 20 46 69 78 20 74 68 65 20 76 61 72 69 6f 75 73   Fix the various
1e0c0 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65 73   stack variables
1e0d0 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68   so.  ** that th
1e0e0 69 73 20 72 6f 75 74 69 6e 65 20 62 65 67 69 6e  is routine begin
1e0f0 73 20 63 6f 6d 70 61 72 69 6e 67 20 61 74 20 74  s comparing at t
1e100 68 65 20 73 65 63 6f 6e 64 20 66 69 65 6c 64 2e  he second field.
1e110 20 2a 2f 0a 20 20 69 66 28 20 62 53 6b 69 70 20   */.  if( bSkip 
1e120 29 7b 0a 20 20 20 20 75 33 32 20 73 31 3b 0a 20  ){.    u32 s1;. 
1e130 20 20 20 69 64 78 31 20 3d 20 31 20 2b 20 67 65     idx1 = 1 + ge
1e140 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31  tVarint32(&aKey1
1e150 5b 31 5d 2c 20 73 31 29 3b 0a 20 20 20 20 73 7a  [1], s1);.    sz
1e160 48 64 72 31 20 3d 20 61 4b 65 79 31 5b 30 5d 3b  Hdr1 = aKey1[0];
1e170 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31  .    d1 = szHdr1
1e180 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   + sqlite3VdbeSe
1e190 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 31 29 3b  rialTypeLen(s1);
1e1a0 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20 20 20  .    i = 1;.    
1e1b0 70 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  pRhs++;.  }else{
1e1c0 0a 20 20 20 20 69 64 78 31 20 3d 20 67 65 74 56  .    idx1 = getV
1e1d0 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73  arint32(aKey1, s
1e1e0 7a 48 64 72 31 29 3b 0a 20 20 20 20 64 31 20 3d  zHdr1);.    d1 =
1e1f0 20 73 7a 48 64 72 31 3b 0a 20 20 20 20 69 66 28   szHdr1;.    if(
1e200 20 64 31 3e 28 75 6e 73 69 67 6e 65 64 29 6e 4b   d1>(unsigned)nK
1e210 65 79 31 20 29 7b 20 0a 20 20 20 20 20 20 70 50  ey1 ){ .      pP
1e220 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20  Key2->errCode = 
1e230 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55  (u8)SQLITE_CORRU
1e240 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72  PT_BKPT;.      r
1e250 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72  eturn 0;  /* Cor
1e260 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d  ruption */.    }
1e270 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 7d 0a  .    i = 0;.  }.
1e280 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d  .  VVA_ONLY( mem
1e290 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20  1.szMalloc = 0; 
1e2a0 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64  ) /* Only needed
1e2b0 20 62 79 20 61 73 73 65 72 74 28 29 20 73 74 61   by assert() sta
1e2c0 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 61 73 73  tements */.  ass
1e2d0 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ert( pPKey2->pKe
1e2e0 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 50  yInfo->nField+pP
1e2f0 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
1e300 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d  nXField>=pPKey2-
1e310 3e 6e 46 69 65 6c 64 20 0a 20 20 20 20 20 20 20  >nField .       
1e320 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
1e330 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79  .  assert( pPKey
1e340 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  2->pKeyInfo->aSo
1e350 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
1e360 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e  assert( pPKey2->
1e370 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
1e380 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
1e390 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20  idx1<=szHdr1 || 
1e3a0 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
1e3b0 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69  do{.    u32 seri
1e3c0 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 2f 2a  al_type;..    /*
1e3d0 20 52 48 53 20 69 73 20 61 6e 20 69 6e 74 65 67   RHS is an integ
1e3e0 65 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52  er */.    if( pR
1e3f0 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
1e400 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 65 72  Int ){.      ser
1e410 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31  ial_type = aKey1
1e420 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 74 65  [idx1];.      te
1e430 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74  stcase( serial_t
1e440 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20  ype==12 );.     
1e450 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1e460 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20  >=10 ){.        
1e470 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d  rc = +1;.      }
1e480 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f  else if( serial_
1e490 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  type==0 ){.     
1e4a0 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
1e4b0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69    }else if( seri
1e4c0 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20  al_type==7 ){.  
1e4d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e4e0 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
1e4f0 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  1[d1], serial_ty
1e500 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20  pe, &mem1);.    
1e510 20 20 20 20 72 63 20 3d 20 2d 73 71 6c 69 74 65      rc = -sqlite
1e520 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65  3IntFloatCompare
1e530 28 70 52 68 73 2d 3e 75 2e 69 2c 20 6d 65 6d 31  (pRhs->u.i, mem1
1e540 2e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  .u.r);.      }el
1e550 73 65 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20  se{.        i64 
1e560 6c 68 73 20 3d 20 76 64 62 65 52 65 63 6f 72 64  lhs = vdbeRecord
1e570 44 65 63 6f 64 65 49 6e 74 28 73 65 72 69 61 6c  DecodeInt(serial
1e580 5f 74 79 70 65 2c 20 26 61 4b 65 79 31 5b 64 31  _type, &aKey1[d1
1e590 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20  ]);.        i64 
1e5a0 72 68 73 20 3d 20 70 52 68 73 2d 3e 75 2e 69 3b  rhs = pRhs->u.i;
1e5b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 68 73  .        if( lhs
1e5c0 3c 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20  <rhs ){.        
1e5d0 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1e5e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 68 73     }else if( lhs
1e5f0 3e 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20  >rhs ){.        
1e600 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20    rc = +1;.     
1e610 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1e620 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69   }..    /* RHS i
1e630 73 20 72 65 61 6c 20 2a 2f 0a 20 20 20 20 65 6c  s real */.    el
1e640 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61  se if( pRhs->fla
1e650 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b  gs & MEM_Real ){
1e660 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79  .      serial_ty
1e670 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d  pe = aKey1[idx1]
1e680 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69  ;.      if( seri
1e690 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20  al_type>=10 ){. 
1e6a0 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c         /* Serial
1e6b0 20 74 79 70 65 73 20 31 32 20 6f 72 20 67 72 65   types 12 or gre
1e6c0 61 74 65 72 20 61 72 65 20 73 74 72 69 6e 67 73  ater are strings
1e6d0 20 61 6e 64 20 62 6c 6f 62 73 20 28 67 72 65 61   and blobs (grea
1e6e0 74 65 72 20 74 68 61 6e 0a 20 20 20 20 20 20 20  ter than.       
1e6f0 20 2a 2a 20 6e 75 6d 62 65 72 73 29 2e 20 54 79   ** numbers). Ty
1e700 70 65 73 20 31 30 20 61 6e 64 20 31 31 20 61 72  pes 10 and 11 ar
1e710 65 20 63 75 72 72 65 6e 74 6c 79 20 22 72 65 73  e currently "res
1e720 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65  erved for future
1e730 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65   .        ** use
1e740 22 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74  ", so it doesn't
1e750 20 72 65 61 6c 6c 79 20 6d 61 74 74 65 72 20 77   really matter w
1e760 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 73 20  hat the results 
1e770 6f 66 20 63 6f 6d 70 61 72 69 6e 67 0a 20 20 20  of comparing.   
1e780 20 20 20 20 20 2a 2a 20 74 68 65 6d 20 74 6f 20       ** them to 
1e790 6e 75 6d 62 65 72 69 63 20 76 61 6c 75 65 73 20  numberic values 
1e7a0 61 72 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  are.  */.       
1e7b0 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20   rc = +1;.      
1e7c0 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c  }else if( serial
1e7d0 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20  _type==0 ){.    
1e7e0 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1e7f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e800 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72    sqlite3VdbeSer
1e810 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31  ialGet(&aKey1[d1
1e820 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  ], serial_type, 
1e830 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20  &mem1);.        
1e840 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
1e850 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =7 ){.          
1e860 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3c 70 52 68  if( mem1.u.r<pRh
1e870 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20 20 20 20  s->u.r ){.      
1e880 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1e890 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
1e8a0 66 28 20 6d 65 6d 31 2e 75 2e 72 3e 70 52 68 73  f( mem1.u.r>pRhs
1e8b0 2d 3e 75 2e 72 20 29 7b 0a 20 20 20 20 20 20 20  ->u.r ){.       
1e8c0 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20       rc = +1;.  
1e8d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e8e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e8f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49     rc = sqlite3I
1e900 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 6d  ntFloatCompare(m
1e910 65 6d 31 2e 75 2e 69 2c 20 70 52 68 73 2d 3e 75  em1.u.i, pRhs->u
1e920 2e 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  .r);.        }. 
1e930 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1e940 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20 73 74    /* RHS is a st
1e950 72 69 6e 67 20 2a 2f 0a 20 20 20 20 65 6c 73 65  ring */.    else
1e960 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73   if( pRhs->flags
1e970 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20   & MEM_Str ){.  
1e980 20 20 20 20 67 65 74 56 61 72 69 6e 74 33 32 28      getVarint32(
1e990 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65  &aKey1[idx1], se
1e9a0 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
1e9b0 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69    testcase( seri
1e9c0 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20  al_type==12 );. 
1e9d0 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
1e9e0 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 20  type<12 ){.     
1e9f0 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
1ea00 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65    }else if( !(se
1ea10 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31  rial_type & 0x01
1ea20 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
1ea30 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = +1;.      }els
1ea40 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 31 2e  e{.        mem1.
1ea50 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  n = (serial_type
1ea60 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20   - 12) / 2;.    
1ea70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64      testcase( (d
1ea80 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69  1+mem1.n)==(unsi
1ea90 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20  gned)nKey1 );.  
1eaa0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1eab0 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28  (d1+mem1.n+1)==(
1eac0 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1ead0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 64  ;.        if( (d
1eae0 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20 28 75 6e 73  1+mem1.n) > (uns
1eaf0 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20  igned)nKey1 ){. 
1eb00 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d           pPKey2-
1eb10 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53  >errCode = (u8)S
1eb20 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1eb30 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  PT;.          re
1eb40 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1eb50 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70         /* Corrup
1eb60 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
1eb70 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79 49 6e  }else if( pKeyIn
1eb80 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a  fo->aColl[i] ){.
1eb90 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 65            mem1.e
1eba0 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  nc = pKeyInfo->e
1ebb0 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  nc;.          me
1ebc0 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m1.db = pKeyInfo
1ebd0 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20  ->db;.          
1ebe0 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 4d 45 4d  mem1.flags = MEM
1ebf0 5f 53 74 72 3b 0a 20 20 20 20 20 20 20 20 20 20  _Str;.          
1ec00 6d 65 6d 31 2e 7a 20 3d 20 28 63 68 61 72 2a 29  mem1.z = (char*)
1ec10 26 61 4b 65 79 31 5b 64 31 5d 3b 0a 20 20 20 20  &aKey1[d1];.    
1ec20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43        rc = vdbeC
1ec30 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28  ompareMemString(
1ec40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  .              &
1ec50 6d 65 6d 31 2c 20 70 52 68 73 2c 20 70 4b 65 79  mem1, pRhs, pKey
1ec60 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c 20  Info->aColl[i], 
1ec70 26 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65  &pPKey2->errCode
1ec80 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
1ec90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1eca0 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20         int nCmp 
1ecb0 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20 70 52  = MIN(mem1.n, pR
1ecc0 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20  hs->n);.        
1ecd0 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61    rc = memcmp(&a
1ece0 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e  Key1[d1], pRhs->
1ecf0 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20  z, nCmp);.      
1ed00 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20      if( rc==0 ) 
1ed10 72 63 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20 70 52  rc = mem1.n - pR
1ed20 68 73 2d 3e 6e 3b 20 0a 20 20 20 20 20 20 20 20  hs->n; .        
1ed30 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1ed40 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61  .    /* RHS is a
1ed50 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 20 65 6c 73   blob */.    els
1ed60 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67  e if( pRhs->flag
1ed70 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a  s & MEM_Blob ){.
1ed80 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 33        getVarint3
1ed90 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20  2(&aKey1[idx1], 
1eda0 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
1edb0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65      testcase( se
1edc0 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b  rial_type==12 );
1edd0 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
1ede0 6c 5f 74 79 70 65 3c 31 32 20 7c 7c 20 28 73 65  l_type<12 || (se
1edf0 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31  rial_type & 0x01
1ee00 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
1ee10 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
1ee20 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  e{.        int n
1ee30 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79  Str = (serial_ty
1ee40 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20  pe - 12) / 2;.  
1ee50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ee60 28 64 31 2b 6e 53 74 72 29 3d 3d 28 75 6e 73 69  (d1+nStr)==(unsi
1ee70 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20  gned)nKey1 );.  
1ee80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ee90 28 64 31 2b 6e 53 74 72 2b 31 29 3d 3d 28 75 6e  (d1+nStr+1)==(un
1eea0 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
1eeb0 20 20 20 20 20 20 20 20 69 66 28 20 28 64 31 2b          if( (d1+
1eec0 6e 53 74 72 29 20 3e 20 28 75 6e 73 69 67 6e 65  nStr) > (unsigne
1eed0 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20  d)nKey1 ){.     
1eee0 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72       pPKey2->err
1eef0 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54  Code = (u8)SQLIT
1ef00 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1ef10 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1ef20 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1ef30 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e     /* Corruption
1ef40 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   */.        }els
1ef50 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e{.          int
1ef60 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 53 74 72   nCmp = MIN(nStr
1ef70 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20  , pRhs->n);.    
1ef80 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d        rc = memcm
1ef90 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52  p(&aKey1[d1], pR
1efa0 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20  hs->z, nCmp);.  
1efb0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1efc0 30 20 29 20 72 63 20 3d 20 6e 53 74 72 20 2d 20  0 ) rc = nStr - 
1efd0 70 52 68 73 2d 3e 6e 3b 0a 20 20 20 20 20 20 20  pRhs->n;.       
1efe0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1eff0 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20  ..    /* RHS is 
1f000 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65  null */.    else
1f010 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74  {.      serial_t
1f020 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31  ype = aKey1[idx1
1f030 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73  ];.      rc = (s
1f040 65 72 69 61 6c 5f 74 79 70 65 21 3d 30 29 3b 0a  erial_type!=0);.
1f050 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
1f060 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  c!=0 ){.      if
1f070 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
1f080 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20  tOrder[i] ){.   
1f090 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20       rc = -rc;. 
1f0a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
1f0b0 65 72 74 28 20 76 64 62 65 52 65 63 6f 72 64 43  ert( vdbeRecordC
1f0c0 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79  ompareDebug(nKey
1f0d0 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1f0e0 2c 20 72 63 29 20 29 3b 0a 20 20 20 20 20 20 61  , rc) );.      a
1f0f0 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61  ssert( mem1.szMa
1f100 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53  lloc==0 );  /* S
1f110 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77  ee comment below
1f120 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1f130 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
1f140 69 2b 2b 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b  i++;.    pRhs++;
1f150 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74  .    d1 += sqlit
1f160 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
1f170 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
1f180 3b 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 73 71  ;.    idx1 += sq
1f190 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 73  lite3VarintLen(s
1f1a0 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 7d  erial_type);.  }
1f1b0 77 68 69 6c 65 28 20 69 64 78 31 3c 28 75 6e 73  while( idx1<(uns
1f1c0 69 67 6e 65 64 29 73 7a 48 64 72 31 20 26 26 20  igned)szHdr1 && 
1f1d0 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  i<pPKey2->nField
1f1e0 20 26 26 20 64 31 3c 3d 28 75 6e 73 69 67 6e 65   && d1<=(unsigne
1f1f0 64 29 6e 4b 65 79 31 20 29 3b 0a 0a 20 20 2f 2a  d)nKey1 );..  /*
1f200 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   No memory alloc
1f210 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73  ation is ever us
1f220 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f  ed on mem1.  Pro
1f230 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20  ve this using.  
1f240 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
1f250 20 61 73 73 65 72 74 28 29 2e 20 20 49 66 20 74   assert().  If t
1f260 68 65 20 61 73 73 65 72 74 28 29 20 66 61 69 6c  he assert() fail
1f270 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73 20  s, it indicates 
1f280 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65  a.  ** memory le
1f290 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f  ak and a need to
1f2a0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62   call sqlite3Vdb
1f2b0 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d  eMemRelease(&mem
1f2c0 31 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  1).  */.  assert
1f2d0 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d  ( mem1.szMalloc=
1f2e0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d  =0 );..  /* rc==
1f2f0 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61  0 here means tha
1f300 74 20 6f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66  t one or both of
1f310 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75   the keys ran ou
1f320 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a  t of fields and.
1f330 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65    ** all the fie
1f340 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70  lds up to that p
1f350 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e  oint were equal.
1f360 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66 61   Return the defa
1f370 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75  ult_rc.  ** valu
1f380 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
1f390 20 43 4f 52 52 55 50 54 5f 44 42 20 0a 20 20 20   CORRUPT_DB .   
1f3a0 20 20 20 20 7c 7c 20 76 64 62 65 52 65 63 6f 72      || vdbeRecor
1f3b0 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b  dCompareDebug(nK
1f3c0 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1f3d0 79 32 2c 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  y2, pPKey2->defa
1f3e0 75 6c 74 5f 72 63 29 20 0a 20 20 20 20 20 20 20  ult_rc) .       
1f3f0 7c 7c 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d  || pKeyInfo->db-
1f400 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20  >mallocFailed.  
1f410 29 3b 0a 20 20 70 50 4b 65 79 32 2d 3e 65 71 53  );.  pPKey2->eqS
1f420 65 65 6e 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  een = 1;.  retur
1f430 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  n pPKey2->defaul
1f440 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  t_rc;.}.int sqli
1f450 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1f460 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79  pare(.  int nKey
1f470 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
1f480 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20  Key1,   /* Left 
1f490 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  key */.  Unpacke
1f4a0 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20  dRecord *pPKey2 
1f4b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68           /* Righ
1f4c0 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 72 65  t key */.){.  re
1f4d0 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
1f4e0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74  RecordCompareWit
1f4f0 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65  hSkip(nKey1, pKe
1f500 79 31 2c 20 70 50 4b 65 79 32 2c 20 30 29 3b 0a  y1, pPKey2, 0);.
1f510 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
1f520 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70  unction is an op
1f530 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20  timized version 
1f540 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  of sqlite3VdbeRe
1f550 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a  cordCompare() .*
1f560 2a 20 74 68 61 74 20 28 61 29 20 74 68 65 20 66  * that (a) the f
1f570 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50  irst field of pP
1f580 4b 65 79 32 20 69 73 20 61 6e 20 69 6e 74 65 67  Key2 is an integ
1f590 65 72 2c 20 61 6e 64 20 28 62 29 20 74 68 65 20  er, and (b) the 
1f5a0 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64  .** size-of-head
1f5b0 65 72 20 76 61 72 69 6e 74 20 61 74 20 74 68 65  er varint at the
1f5c0 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31   start of (pKey1
1f5d0 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20  /nKey1) fits in 
1f5e0 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 62 79 74 65  a single.** byte
1f5f0 20 28 69 2e 65 2e 20 69 73 20 6c 65 73 73 20 74   (i.e. is less t
1f600 68 61 6e 20 31 32 38 29 2e 0a 2a 2a 0a 2a 2a 20  han 128)..**.** 
1f610 54 6f 20 61 76 6f 69 64 20 63 6f 6e 63 65 72 6e  To avoid concern
1f620 73 20 61 62 6f 75 74 20 62 75 66 66 65 72 20 6f  s about buffer o
1f630 76 65 72 72 65 61 64 73 2c 20 74 68 69 73 20 72  verreads, this r
1f640 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75  outine is only u
1f650 73 65 64 0a 2a 2a 20 6f 6e 20 73 63 68 65 6d 61  sed.** on schema
1f660 73 20 77 68 65 72 65 20 74 68 65 20 6d 61 78 69  s where the maxi
1f670 6d 75 6d 20 76 61 6c 69 64 20 68 65 61 64 65 72  mum valid header
1f680 20 73 69 7a 65 20 69 73 20 36 33 20 62 79 74 65   size is 63 byte
1f690 73 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a 73 74  s or less..*/.st
1f6a0 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63  atic int vdbeRec
1f6b0 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 0a 20  ordCompareInt(. 
1f6c0 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
1f6d0 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f  t void *pKey1, /
1f6e0 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
1f6f0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1f700 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a  pPKey2        /*
1f710 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b   Right key */.){
1f720 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65  .  const u8 *aKe
1f730 79 20 3d 20 26 28 28 63 6f 6e 73 74 20 75 38 2a  y = &((const u8*
1f740 29 70 4b 65 79 31 29 5b 2a 28 63 6f 6e 73 74 20  )pKey1)[*(const 
1f750 75 38 2a 29 70 4b 65 79 31 20 26 20 30 78 33 46  u8*)pKey1 & 0x3F
1f760 5d 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f  ];.  int serial_
1f770 74 79 70 65 20 3d 20 28 28 63 6f 6e 73 74 20 75  type = ((const u
1f780 38 2a 29 70 4b 65 79 31 29 5b 31 5d 3b 0a 20 20  8*)pKey1)[1];.  
1f790 69 6e 74 20 72 65 73 3b 0a 20 20 75 33 32 20 79  int res;.  u32 y
1f7a0 3b 0a 20 20 75 36 34 20 78 3b 0a 20 20 69 36 34  ;.  u64 x;.  i64
1f7b0 20 76 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65   v = pPKey2->aMe
1f7c0 6d 5b 30 5d 2e 75 2e 69 3b 0a 20 20 69 36 34 20  m[0].u.i;.  i64 
1f7d0 6c 68 73 3b 0a 0a 20 20 76 64 62 65 41 73 73 65  lhs;..  vdbeAsse
1f7e0 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68  rtFieldCountWith
1f7f0 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20  inLimits(nKey1, 
1f800 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70  pKey1, pPKey2->p
1f810 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65  KeyInfo);.  asse
1f820 72 74 28 20 28 2a 28 75 38 2a 29 70 4b 65 79 31  rt( (*(u8*)pKey1
1f830 29 3c 3d 30 78 33 46 20 7c 7c 20 43 4f 52 52 55  )<=0x3F || CORRU
1f840 50 54 5f 44 42 20 29 3b 0a 20 20 73 77 69 74 63  PT_DB );.  switc
1f850 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
1f860 7b 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20  {.    case 1: { 
1f870 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 1-byte signed
1f880 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1f890 20 20 6c 68 73 20 3d 20 4f 4e 45 5f 42 59 54 45    lhs = ONE_BYTE
1f8a0 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1f8b0 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
1f8c0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1f8d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1f8e0 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20   2: { /* 2-byte 
1f8f0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1f900 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54 57  /.      lhs = TW
1f910 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  O_BYTE_INT(aKey)
1f920 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f930 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
1f940 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1f950 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33    case 3: { /* 3
1f960 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1f970 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68  eger */.      lh
1f980 73 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49  s = THREE_BYTE_I
1f990 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1f9a0 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
1f9b0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1f9c0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34      }.    case 4
1f9d0 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69  : { /* 4-byte si
1f9e0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1f9f0 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42        y = FOUR_B
1fa00 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a  YTE_UINT(aKey);.
1fa10 20 20 20 20 20 20 6c 68 73 20 3d 20 28 69 36 34        lhs = (i64
1fa20 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20  )*(int*)&y;.    
1fa30 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
1fa40 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1fa50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1fa60 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20   5: { /* 6-byte 
1fa70 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1fa80 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 46 4f  /.      lhs = FO
1fa90 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
1faa0 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29  y+2) + (((i64)1)
1fab0 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49  <<32)*TWO_BYTE_I
1fac0 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1fad0 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
1fae0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1faf0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36      }.    case 6
1fb00 3a 20 7b 20 2f 2a 20 38 2d 62 79 74 65 20 73 69  : { /* 8-byte si
1fb10 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1fb20 20 20 20 20 20 20 78 20 3d 20 46 4f 55 52 5f 42        x = FOUR_B
1fb30 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a  YTE_UINT(aKey);.
1fb40 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32        x = (x<<32
1fb50 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  ) | FOUR_BYTE_UI
1fb60 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20  NT(aKey+4);.    
1fb70 20 20 6c 68 73 20 3d 20 2a 28 69 36 34 2a 29 26    lhs = *(i64*)&
1fb80 78 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  x;.      testcas
1fb90 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20  e( lhs<0 );.    
1fba0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1fbb0 20 20 20 63 61 73 65 20 38 3a 20 0a 20 20 20 20     case 8: .    
1fbc0 20 20 6c 68 73 20 3d 20 30 3b 0a 20 20 20 20 20    lhs = 0;.     
1fbd0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1fbe0 20 39 3a 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   9:.      lhs = 
1fbf0 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
1fc00 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73  .    /* This cas
1fc10 65 20 63 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76  e could be remov
1fc20 65 64 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  ed without chang
1fc30 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20  ing the results 
1fc40 6f 66 20 72 75 6e 6e 69 6e 67 0a 20 20 20 20 2a  of running.    *
1fc50 2a 20 74 68 69 73 20 63 6f 64 65 2e 20 49 6e 63  * this code. Inc
1fc60 6c 75 64 69 6e 67 20 69 74 20 63 61 75 73 65 73  luding it causes
1fc70 20 67 63 63 20 74 6f 20 67 65 6e 65 72 61 74 65   gcc to generate
1fc80 20 61 20 66 61 73 74 65 72 20 73 77 69 74 63 68   a faster switch
1fc90 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65   .    ** stateme
1fca0 6e 74 20 28 73 69 6e 63 65 20 74 68 65 20 72 61  nt (since the ra
1fcb0 6e 67 65 20 6f 66 20 73 77 69 74 63 68 20 74 61  nge of switch ta
1fcc0 72 67 65 74 73 20 6e 6f 77 20 73 74 61 72 74 73  rgets now starts
1fcd0 20 61 74 20 7a 65 72 6f 20 61 6e 64 0a 20 20 20   at zero and.   
1fce0 20 2a 2a 20 69 73 20 63 6f 6e 74 69 67 75 6f 75   ** is contiguou
1fcf0 73 29 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20  s) but does not 
1fd00 63 61 75 73 65 20 61 6e 79 20 64 75 70 6c 69 63  cause any duplic
1fd10 61 74 65 20 63 6f 64 65 20 74 6f 20 62 65 20 67  ate code to be g
1fd20 65 6e 65 72 61 74 65 64 0a 20 20 20 20 2a 2a 20  enerated.    ** 
1fd30 28 61 73 20 67 63 63 20 69 73 20 63 6c 65 76 65  (as gcc is cleve
1fd40 72 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6d 62  r enough to comb
1fd50 69 6e 65 20 74 68 65 20 74 77 6f 20 6c 69 6b 65  ine the two like
1fd60 20 63 61 73 65 73 29 2e 20 4f 74 68 65 72 20 0a   cases). Other .
1fd70 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 73      ** compilers
1fd80 20 6d 69 67 68 74 20 62 65 20 73 69 6d 69 6c 61   might be simila
1fd90 72 2e 20 20 2a 2f 20 0a 20 20 20 20 63 61 73 65  r.  */ .    case
1fda0 20 30 3a 20 63 61 73 65 20 37 3a 0a 20 20 20 20   0: case 7:.    
1fdb0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1fdc0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1fdd0 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  e(nKey1, pKey1, 
1fde0 70 50 4b 65 79 32 29 3b 0a 0a 20 20 20 20 64 65  pPKey2);..    de
1fdf0 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74  fault:.      ret
1fe00 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52  urn sqlite3VdbeR
1fe10 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65  ecordCompare(nKe
1fe20 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
1fe30 32 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 76  2);.  }..  if( v
1fe40 3e 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20  >lhs ){.    res 
1fe50 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20  = pPKey2->r1;.  
1fe60 7d 65 6c 73 65 20 69 66 28 20 76 3c 6c 68 73 20  }else if( v<lhs 
1fe70 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b  ){.    res = pPK
1fe80 65 79 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 65  ey2->r2;.  }else
1fe90 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69   if( pPKey2->nFi
1fea0 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  eld>1 ){.    /* 
1feb0 54 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73  The first fields
1fec0 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73   of the two keys
1fed0 20 61 72 65 20 65 71 75 61 6c 2e 20 43 6f 6d 70   are equal. Comp
1fee0 61 72 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67  are the trailing
1fef0 20 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e   .    ** fields.
1ff00 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 73    */.    res = s
1ff10 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1ff20 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28  CompareWithSkip(
1ff30 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1ff40 4b 65 79 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73  Key2, 1);.  }els
1ff50 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69  e{.    /* The fi
1ff60 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  rst fields of th
1ff70 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65  e two keys are e
1ff80 71 75 61 6c 20 61 6e 64 20 74 68 65 72 65 20 61  qual and there a
1ff90 72 65 20 6e 6f 20 74 72 61 69 6c 69 6e 67 0a 20  re no trailing. 
1ffa0 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 52 65     ** fields. Re
1ffb0 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66  turn pPKey2->def
1ffc0 61 75 6c 74 5f 72 63 20 69 6e 20 74 68 69 73 20  ault_rc in this 
1ffd0 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 72 65 73  case. */.    res
1ffe0 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75   = pPKey2->defau
1fff0 6c 74 5f 72 63 3b 0a 20 20 20 20 70 50 4b 65 79  lt_rc;.    pPKey
20000 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20  2->eqSeen = 1;. 
20010 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64   }..  assert( vd
20020 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
20030 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79  ebug(nKey1, pKey
20040 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29 20  1, pPKey2, res) 
20050 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
20060 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
20070 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70  unction is an op
20080 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20  timized version 
20090 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  of sqlite3VdbeRe
200a0 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a  cordCompare() .*
200b0 2a 20 74 68 61 74 20 28 61 29 20 74 68 65 20 66  * that (a) the f
200c0 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50  irst field of pP
200d0 4b 65 79 32 20 69 73 20 61 20 73 74 72 69 6e 67  Key2 is a string
200e0 2c 20 74 68 61 74 20 28 62 29 20 74 68 65 20 66  , that (b) the f
200f0 69 72 73 74 20 66 69 65 6c 64 0a 2a 2a 20 75 73  irst field.** us
20100 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  es the collation
20110 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59   sequence BINARY
20120 20 61 6e 64 20 28 63 29 20 74 68 61 74 20 74 68   and (c) that th
20130 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72  e size-of-header
20140 20 76 61 72 69 6e 74 20 0a 2a 2a 20 61 74 20 74   varint .** at t
20150 68 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65  he start of (pKe
20160 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69  y1/nKey1) fits i
20170 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e  n a single byte.
20180 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
20190 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
201a0 53 74 72 69 6e 67 28 0a 20 20 69 6e 74 20 6e 4b  String(.  int nK
201b0 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
201c0 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20  *pKey1, /* Left 
201d0 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  key */.  Unpacke
201e0 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20  dRecord *pPKey2 
201f0 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
20200 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  key */.){.  cons
20210 74 20 75 38 20 2a 61 4b 65 79 31 20 3d 20 28 63  t u8 *aKey1 = (c
20220 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 3b 0a  onst u8*)pKey1;.
20230 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70    int serial_typ
20240 65 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20  e;.  int res;.. 
20250 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d   assert( pPKey2-
20260 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 20 26  >aMem[0].flags &
20270 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 76 64   MEM_Str );.  vd
20280 62 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75  beAssertFieldCou
20290 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e  ntWithinLimits(n
202a0 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
202b0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a  ey2->pKeyInfo);.
202c0 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61    getVarint32(&a
202d0 4b 65 79 31 5b 31 5d 2c 20 73 65 72 69 61 6c 5f  Key1[1], serial_
202e0 74 79 70 65 29 3b 0a 20 20 69 66 28 20 73 65 72  type);.  if( ser
202f0 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20  ial_type<12 ){. 
20300 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
20310 3e 72 31 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b  >r1;      /* (pK
20320 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20  ey1/nKey1) is a 
20330 6e 75 6d 62 65 72 20 6f 72 20 61 20 6e 75 6c 6c  number or a null
20340 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
20350 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20  !(serial_type & 
20360 30 78 30 31 29 20 29 7b 20 0a 20 20 20 20 72 65  0x01) ){ .    re
20370 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 20  s = pPKey2->r2; 
20380 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e       /* (pKey1/n
20390 4b 65 79 31 29 20 69 73 20 61 20 62 6c 6f 62 20  Key1) is a blob 
203a0 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
203b0 69 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20 69 6e  int nCmp;.    in
203c0 74 20 6e 53 74 72 3b 0a 20 20 20 20 69 6e 74 20  t nStr;.    int 
203d0 73 7a 48 64 72 20 3d 20 61 4b 65 79 31 5b 30 5d  szHdr = aKey1[0]
203e0 3b 0a 0a 20 20 20 20 6e 53 74 72 20 3d 20 28 73  ;..    nStr = (s
203f0 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 20 2f  erial_type-12) /
20400 20 32 3b 0a 20 20 20 20 69 66 28 20 28 73 7a 48   2;.    if( (szH
20410 64 72 20 2b 20 6e 53 74 72 29 20 3e 20 6e 4b 65  dr + nStr) > nKe
20420 79 31 20 29 7b 0a 20 20 20 20 20 20 70 50 4b 65  y1 ){.      pPKe
20430 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75  y2->errCode = (u
20440 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  8)SQLITE_CORRUPT
20450 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74  _BKPT;.      ret
20460 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72  urn 0;    /* Cor
20470 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d  ruption */.    }
20480 0a 20 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28  .    nCmp = MIN(
20490 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
204a0 2e 6e 2c 20 6e 53 74 72 20 29 3b 0a 20 20 20 20  .n, nStr );.    
204b0 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b  res = memcmp(&aK
204c0 65 79 31 5b 73 7a 48 64 72 5d 2c 20 70 50 4b 65  ey1[szHdr], pPKe
204d0 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e  y2->aMem[0].z, n
204e0 43 6d 70 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  Cmp);..    if( r
204f0 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  es==0 ){.      r
20500 65 73 20 3d 20 6e 53 74 72 20 2d 20 70 50 4b 65  es = nStr - pPKe
20510 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20  y2->aMem[0].n;. 
20520 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
20530 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
20540 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20  PKey2->nField>1 
20550 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73  ){.          res
20560 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
20570 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53  cordCompareWithS
20580 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  kip(nKey1, pKey1
20590 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20  , pPKey2, 1);.  
205a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
205b0 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b         res = pPK
205c0 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b  ey2->default_rc;
205d0 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79  .          pPKey
205e0 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20  2->eqSeen = 1;. 
205f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
20600 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29  else if( res>0 )
20610 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  {.        res = 
20620 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20  pPKey2->r2;.    
20630 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20640 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
20650 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
20660 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29  else if( res>0 )
20670 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 50  {.      res = pP
20680 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65  Key2->r2;.    }e
20690 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 73 20 3d  lse{.      res =
206a0 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20   pPKey2->r1;.   
206b0 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
206c0 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  ( vdbeRecordComp
206d0 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20  areDebug(nKey1, 
206e0 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72  pKey1, pPKey2, r
206f0 65 73 29 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f  es).       || CO
20700 52 52 55 50 54 5f 44 42 0a 20 20 20 20 20 20 20  RRUPT_DB.       
20710 7c 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  || pPKey2->pKeyI
20720 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  nfo->db->mallocF
20730 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65 74  ailed.  );.  ret
20740 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
20750 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
20760 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
20770 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
20780 65 28 29 20 63 6f 6d 70 61 74 69 62 6c 65 20 66  e() compatible f
20790 75 6e 63 74 69 6f 6e 0a 2a 2a 20 73 75 69 74 61  unction.** suita
207a0 62 6c 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e  ble for comparin
207b0 67 20 73 65 72 69 61 6c 69 7a 65 64 20 72 65 63  g serialized rec
207c0 6f 72 64 73 20 74 6f 20 74 68 65 20 75 6e 70 61  ords to the unpa
207d0 63 6b 65 64 20 72 65 63 6f 72 64 20 70 61 73 73  cked record pass
207e0 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c  ed.** as the onl
207f0 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52  y argument..*/.R
20800 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 73 71 6c  ecordCompare sql
20810 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70  ite3VdbeFindComp
20820 61 72 65 28 55 6e 70 61 63 6b 65 64 52 65 63 6f  are(UnpackedReco
20830 72 64 20 2a 70 29 7b 0a 20 20 2f 2a 20 76 61 72  rd *p){.  /* var
20840 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  intRecordCompare
20850 49 6e 74 28 29 20 61 6e 64 20 76 61 72 69 6e 74  Int() and varint
20860 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72  RecordCompareStr
20870 69 6e 67 28 29 20 62 6f 74 68 20 61 73 73 75 6d  ing() both assum
20880 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  e.  ** that the 
20890 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76  size-of-header v
208a0 61 72 69 6e 74 20 74 68 61 74 20 6f 63 63 75 72  arint that occur
208b0 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  s at the start o
208c0 66 20 65 61 63 68 20 72 65 63 6f 72 64 0a 20 20  f each record.  
208d0 2a 2a 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e  ** fits in a sin
208e0 67 6c 65 20 62 79 74 65 20 28 69 2e 65 2e 20 69  gle byte (i.e. i
208f0 73 20 31 32 37 20 6f 72 20 6c 65 73 73 29 2e 20  s 127 or less). 
20900 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70  varintRecordComp
20910 61 72 65 49 6e 74 28 29 0a 20 20 2a 2a 20 61 6c  areInt().  ** al
20920 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  so assumes that 
20930 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76  it is safe to ov
20940 65 72 72 65 61 64 20 61 20 62 75 66 66 65 72 20  erread a buffer 
20950 62 79 20 61 74 20 6c 65 61 73 74 20 74 68 65 20  by at least the 
20960 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 6f  .  ** maximum po
20970 73 73 69 62 6c 65 20 6c 65 67 61 6c 20 68 65 61  ssible legal hea
20980 64 65 72 20 73 69 7a 65 20 70 6c 75 73 20 38 20  der size plus 8 
20990 62 79 74 65 73 2e 20 42 65 63 61 75 73 65 20 74  bytes. Because t
209a0 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 67 75 61  here is.  ** gua
209b0 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 74  ranteed to be at
209c0 20 6c 65 61 73 74 20 37 34 20 28 62 75 74 20 6e   least 74 (but n
209d0 6f 74 20 31 33 36 29 20 62 79 74 65 73 20 6f 66  ot 136) bytes of
209e0 20 70 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69   padding followi
209f0 6e 67 20 65 61 63 68 0a 20 20 2a 2a 20 62 75 66  ng each.  ** buf
20a00 66 65 72 20 70 61 73 73 65 64 20 74 6f 20 76 61  fer passed to va
20a10 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72  rintRecordCompar
20a20 65 49 6e 74 28 29 20 74 68 69 73 20 6d 61 6b 65  eInt() this make
20a30 73 20 69 74 20 63 6f 6e 76 65 6e 69 65 6e 74 20  s it convenient 
20a40 74 6f 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 74 68  to.  ** limit th
20a50 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65  e size of the he
20a60 61 64 65 72 20 74 6f 20 36 34 20 62 79 74 65 73  ader to 64 bytes
20a70 20 69 6e 20 63 61 73 65 73 20 77 68 65 72 65 20   in cases where 
20a80 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a  the first field.
20a90 20 20 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67    ** is an integ
20aa0 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  er..  **.  ** Th
20ab0 65 20 65 61 73 69 65 73 74 20 77 61 79 20 74 6f  e easiest way to
20ac0 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 6c 69   enforce this li
20ad0 6d 69 74 20 69 73 20 74 6f 20 63 6f 6e 73 69 64  mit is to consid
20ae0 65 72 20 6f 6e 6c 79 20 72 65 63 6f 72 64 73 20  er only records 
20af0 77 69 74 68 0a 20 20 2a 2a 20 31 33 20 66 69 65  with.  ** 13 fie
20b00 6c 64 73 20 6f 72 20 6c 65 73 73 2e 20 49 66 20  lds or less. If 
20b10 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
20b20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74  is an integer, t
20b30 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c  he maximum legal
20b40 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 73 69 7a  .  ** header siz
20b50 65 20 69 73 20 28 31 32 2a 35 20 2b 20 31 20 2b  e is (12*5 + 1 +
20b60 20 31 29 20 62 79 74 65 73 2e 20 20 2a 2f 0a 20   1) bytes.  */. 
20b70 20 69 66 28 20 28 70 2d 3e 70 4b 65 79 49 6e 66   if( (p->pKeyInf
20b80 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 2d 3e 70  o->nField + p->p
20b90 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64  KeyInfo->nXField
20ba0 29 3c 3d 31 33 20 29 7b 0a 20 20 20 20 69 6e 74  )<=13 ){.    int
20bb0 20 66 6c 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d   flags = p->aMem
20bc0 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69  [0].flags;.    i
20bd0 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  f( p->pKeyInfo->
20be0 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b  aSortOrder[0] ){
20bf0 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 31  .      p->r1 = 1
20c00 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20  ;.      p->r2 = 
20c10 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  -1;.    }else{. 
20c20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 2d 31 3b       p->r1 = -1;
20c30 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 31  .      p->r2 = 1
20c40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
20c50 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  (flags & MEM_Int
20c60 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
20c70 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  n vdbeRecordComp
20c80 61 72 65 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20  areInt;.    }.  
20c90 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67    testcase( flag
20ca0 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a  s & MEM_Real );.
20cb0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c      testcase( fl
20cc0 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
20cd0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
20ce0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62  flags & MEM_Blob
20cf0 20 29 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61   );.    if( (fla
20d00 67 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d  gs & (MEM_Real|M
20d10 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62  EM_Null|MEM_Blob
20d20 29 29 3d 3d 30 20 26 26 20 70 2d 3e 70 4b 65 79  ))==0 && p->pKey
20d30 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d  Info->aColl[0]==
20d40 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
20d50 74 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  t( flags & MEM_S
20d60 74 72 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  tr );.      retu
20d70 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  rn vdbeRecordCom
20d80 70 61 72 65 53 74 72 69 6e 67 3b 0a 20 20 20 20  pareString;.    
20d90 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
20da0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
20db0 64 43 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a  dCompare;.}../*.
20dc0 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61  ** pCur points a
20dd0 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79  t an index entry
20de0 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
20df0 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
20e00 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64   opcode..** Read
20e10 20 74 68 65 20 72 6f 77 69 64 20 28 74 68 65 20   the rowid (the 
20e20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68  last field in th
20e30 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74  e record) and st
20e40 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64  ore it in *rowid
20e50 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  ..** Return SQLI
20e60 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
20e70 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e  ing works, or an
20e80 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
20e90 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75  rwise..**.** pCu
20ea0 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69 6e 74  r might be point
20eb0 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62 74 61  ing to text obta
20ec0 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f 72 72  ined from a corr
20ed0 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
20ee0 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e  e..** So the con
20ef0 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 74  tent cannot be t
20f00 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70 70 72  rusted.  Do appr
20f10 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73 20 6f  opriate checks o
20f20 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a  n the content..*
20f30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
20f40 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65  eIdxRowid(sqlite
20f50 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72 20  3 *db, BtCursor 
20f60 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69  *pCur, i64 *rowi
20f70 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  d){.  i64 nCellK
20f80 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ey = 0;.  int rc
20f90 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20  ;.  u32 szHdr;  
20fa0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
20fb0 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
20fc0 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20   u32 typeRowid; 
20fd0 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
20fe0 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
20ff0 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64  /.  u32 lenRowid
21000 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ;     /* Size of
21010 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
21020 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20  Mem m, v;..  /* 
21030 47 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  Get the size of 
21040 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e  the index entry.
21050 20 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65    Only indices e
21060 6e 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20  ntries of less. 
21070 20 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72   ** than 2GiB ar
21080 65 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74  e support - anyt
21090 68 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20  hing large must 
210a0 62 65 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  be database corr
210b0 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79  uption..  ** Any
210c0 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
210d0 65 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74  etected in sqlit
210e0 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
210f0 50 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73  Ptr(), though, s
21100 6f 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65  o.  ** this code
21110 20 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75   can safely assu
21120 6d 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79  me that nCellKey
21130 20 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20   is 32-bits  .  
21140 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
21150 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
21160 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a  sValid(pCur) );.
21170 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29    VVA_ONLY(rc =)
21180 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
21190 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c  Size(pCur, &nCel
211a0 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28  lKey);.  assert(
211b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
211c0 3b 20 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73  ;     /* pCur is
211d0 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f   always valid so
211e0 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20   KeySize cannot 
211f0 66 61 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74  fail */.  assert
21200 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51  ( (nCellKey & SQ
21210 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28  LITE_MAX_U32)==(
21220 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a  u64)nCellKey );.
21230 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68  .  /* Read in th
21240 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65  e complete conte
21250 6e 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nt of the index 
21260 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74  entry */.  sqlit
21270 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d  e3VdbeMemInit(&m
21280 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d  , db, 0);.  rc =
21290 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
212a0 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30  romBtree(pCur, 0
212b0 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c  , (u32)nCellKey,
212c0 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
212d0 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
212e0 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  rc;.  }..  /* Th
212f0 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75  e index entry mu
21300 73 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  st begin with a 
21310 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20  header size */. 
21320 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74   (void)getVarint
21330 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48  32((u8*)m.z, szH
21340 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  dr);.  testcase(
21350 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74   szHdr==3 );.  t
21360 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d  estcase( szHdr==
21370 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c  m.n );.  if( unl
21380 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c  ikely(szHdr<3 ||
21390 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29   (int)szHdr>m.n)
213a0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
213b0 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
213c0 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  n;.  }..  /* The
213d0 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74   last field of t
213e0 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20  he index should 
213f0 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20  be an integer - 
21400 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20  the ROWID..  ** 
21410 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
21420 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c  last entry reall
21430 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  y is an integer.
21440 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56   */.  (void)getV
21450 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e  arint32((u8*)&m.
21460 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65  z[szHdr-1], type
21470 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61  Rowid);.  testca
21480 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31  se( typeRowid==1
21490 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
214a0 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a  typeRowid==2 );.
214b0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
214c0 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65  Rowid==3 );.  te
214d0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
214e0 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61  d==4 );.  testca
214f0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35  se( typeRowid==5
21500 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
21510 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a  typeRowid==6 );.
21520 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
21530 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65  Rowid==8 );.  te
21540 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
21550 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e  d==9 );.  if( un
21560 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64  likely(typeRowid
21570 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e  <1 || typeRowid>
21580 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d  9 || typeRowid==
21590 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  7) ){.    goto i
215a0 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
215b0 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f  ion;.  }.  lenRo
215c0 77 69 64 20 3d 20 73 71 6c 69 74 65 33 53 6d 61  wid = sqlite3Sma
215d0 6c 6c 54 79 70 65 53 69 7a 65 73 5b 74 79 70 65  llTypeSizes[type
215e0 52 6f 77 69 64 5d 3b 0a 20 20 74 65 73 74 63 61  Rowid];.  testca
215f0 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a  se( (u32)m.n==sz
21600 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a  Hdr+lenRowid );.
21610 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28    if( unlikely((
21620 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65  u32)m.n<szHdr+le
21630 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67  nRowid) ){.    g
21640 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f  oto idx_rowid_co
21650 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20  rruption;.  }.. 
21660 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e   /* Fetch the in
21670 74 65 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e  teger off the en
21680 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72  d of the index r
21690 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74  ecord */.  sqlit
216a0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
216b0 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65  (u8*)&m.z[m.n-le
216c0 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77  nRowid], typeRow
216d0 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69  id, &v);.  *rowi
216e0 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c  d = v.u.i;.  sql
216f0 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
21700 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
21710 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
21720 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64  * Jump here if d
21730 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
21740 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 61  on is detected a
21750 66 74 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a  fter m has been.
21760 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20    ** allocated. 
21770 20 46 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65   Free the m obje
21780 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ct and return SQ
21790 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f  LITE_CORRUPT. */
217a0 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75  .idx_rowid_corru
217b0 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73  ption:.  testcas
217c0 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21 3d 30  e( m.szMalloc!=0
217d0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
217e0 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
217f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
21800 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d  _CORRUPT_BKPT;.}
21810 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
21820 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69  the key of the i
21830 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61 74 20  ndex entry that 
21840 63 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69  cursor pC is poi
21850 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e 73 74  nting to against
21860 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69  .** the key stri
21870 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e  ng in pUnpacked.
21880 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52    Write into *pR
21890 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74  es a number.** t
218a0 68 61 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c  hat is negative,
218b0 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69   zero, or positi
218c0 76 65 20 69 66 20 70 43 20 69 73 20 6c 65 73 73  ve if pC is less
218d0 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c   than, equal to,
218e0 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74  .** or greater t
218f0 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20  han pUnpacked.  
21900 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
21910 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a   on success..**.
21920 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69 73 20  ** pUnpacked is 
21930 65 69 74 68 65 72 20 63 72 65 61 74 65 64 20 77  either created w
21940 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f  ithout a rowid o
21950 72 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 73  r is truncated s
21960 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69  o that it.** omi
21970 74 73 20 74 68 65 20 72 6f 77 69 64 20 61 74 20  ts the rowid at 
21980 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f  the end.  The ro
21990 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  wid at the end o
219a0 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
219b0 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20  y.** is ignored 
219c0 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c  as well.  Hence,
219d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e   this routine on
219e0 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20  ly compares the 
219f0 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20  prefixes .** of 
21a00 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74  the keys prior t
21a10 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69  o the final rowi
21a20 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72  d, not the entir
21a30 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  e key..*/.int sq
21a40 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79 43  lite3VdbeIdxKeyC
21a50 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65  ompare(.  sqlite
21a60 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
21a70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
21a80 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
21a90 6e 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f  n */.  VdbeCurso
21aa0 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20  r *pC,          
21ab0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
21ac0 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65  ursor to compare
21ad0 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e   against */.  Un
21ae0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55  packedRecord *pU
21af0 6e 70 61 63 6b 65 64 2c 20 20 20 20 20 20 20 2f  npacked,       /
21b00 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69  * Unpacked versi
21b10 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a 20 20 69  on of key */.  i
21b20 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20 20 20  nt *res         
21b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b40 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d  /* Write the com
21b50 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68  parison result h
21b60 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20  ere */.){.  i64 
21b70 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
21b80 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73  int rc;.  BtCurs
21b90 6f 72 20 2a 70 43 75 72 3b 0a 20 20 4d 65 6d 20  or *pCur;.  Mem 
21ba0 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  m;..  assert( pC
21bb0 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
21bc0 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 70  YPE_BTREE );.  p
21bd0 43 75 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75  Cur = pC->uc.pCu
21be0 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20  rsor;.  assert( 
21bf0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
21c00 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29 20  orIsValid(pCur) 
21c10 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63  );.  VVA_ONLY(rc
21c20 20 3d 29 20 73 71 6c 69 74 65 33 42 74 72 65 65   =) sqlite3Btree
21c30 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e  KeySize(pCur, &n
21c40 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65  CellKey);.  asse
21c50 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
21c60 4b 20 29 3b 20 20 20 20 2f 2a 20 70 43 75 72 20  K );    /* pCur 
21c70 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20  is always valid 
21c80 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f  so KeySize canno
21c90 74 20 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e  t fail */.  /* n
21ca0 43 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77  CellKey will alw
21cb0 61 79 73 20 62 65 20 62 65 74 77 65 65 6e 20 30  ays be between 0
21cc0 20 61 6e 64 20 30 78 66 66 66 66 66 66 66 66 20   and 0xffffffff 
21cd0 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77  because of the w
21ce0 61 79 0a 20 20 2a 2a 20 74 68 61 74 20 62 74 72  ay.  ** that btr
21cf0 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
21d00 20 61 6e 64 20 73 71 6c 69 74 65 33 47 65 74 56   and sqlite3GetV
21d10 61 72 69 6e 74 33 32 28 29 20 61 72 65 20 69 6d  arint32() are im
21d20 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69  plemented */.  i
21d30 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c  f( nCellKey<=0 |
21d40 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66  | nCellKey>0x7ff
21d50 66 66 66 66 66 20 29 7b 0a 20 20 20 20 2a 72 65  fffff ){.    *re
21d60 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  s = 0;.    retur
21d70 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
21d80 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c  _BKPT;.  }.  sql
21d90 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28  ite3VdbeMemInit(
21da0 26 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63  &m, db, 0);.  rc
21db0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
21dc0 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c  mFromBtree(pCur,
21dd0 20 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65   0, (u32)nCellKe
21de0 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28  y, 1, &m);.  if(
21df0 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
21e00 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 72 65 73  n rc;.  }.  *res
21e10 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
21e20 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c  cordCompare(m.n,
21e30 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29   m.z, pUnpacked)
21e40 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
21e50 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
21e60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
21e70 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
21e80 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
21e90 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65  e value to be re
21ea0 74 75 72 6e 65 64 20 62 79 20 73 75 62 73 65 71  turned by subseq
21eb0 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  uent calls to.**
21ec0 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
21ed0 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  () on the databa
21ee0 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20  se handle 'db'. 
21ef0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
21f00 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 73  VdbeSetChanges(s
21f10 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
21f20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65  nChange){.  asse
21f30 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
21f40 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
21f50 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e  ) );.  db->nChan
21f60 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20  ge = nChange;.  
21f70 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65  db->nTotalChange
21f80 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a   += nChange;.}..
21f90 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67  /*.** Set a flag
21fa0 20 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20   in the vdbe to 
21fb0 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
21fc0 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69  e counter when i
21fd0 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a  t is finalised.*
21fe0 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76  * or reset..*/.v
21ff0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
22000 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65  ountChanges(Vdbe
22010 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67   *v){.  v->chang
22020 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f  eCntOn = 1;.}../
22030 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20  *.** Mark every 
22040 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
22050 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  nt associated wi
22060 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  th a database co
22070 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65  nnection.** as e
22080 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  xpired..**.** An
22090 20 65 78 70 69 72 65 64 20 73 74 61 74 65 6d 65   expired stateme
220a0 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65  nt means that re
220b0 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74  compilation of t
220c0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a  he statement is.
220d0 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53  ** recommend.  S
220e0 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65  tatements expire
220f0 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70   when things hap
22100 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68  pen that make th
22110 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20  eir.** programs 
22120 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76  obsolete.  Remov
22130 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64  ing user-defined
22140 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f   functions or co
22150 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65  llating.** seque
22160 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e  nces, or changin
22170 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  g an authorizati
22180 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20  on function are 
22190 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20  the types of.** 
221a0 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65  things that make
221b0 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
221c0 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a  ents obsolete..*
221d0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
221e0 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
221f0 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a  ements(sqlite3 *
22200 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a  db){.  Vdbe *p;.
22210 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56    for(p = db->pV
22220 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  dbe; p; p=p->pNe
22230 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69  xt){.    p->expi
22240 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  red = 1;.  }.}..
22250 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
22260 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69   database associ
22270 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64  ated with the Vd
22280 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a  be..*/.sqlite3 *
22290 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 56 64  sqlite3VdbeDb(Vd
222a0 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e  be *v){.  return
222b0 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   v->db;.}../*.**
222c0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
222d0 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  r to an sqlite3_
222e0 76 61 6c 75 65 20 73 74 72 75 63 74 75 72 65 20  value structure 
222f0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76  containing the v
22300 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61  alue bound.** pa
22310 72 61 6d 65 74 65 72 20 69 56 61 72 20 6f 66 20  rameter iVar of 
22320 56 4d 20 76 2e 20 45 78 63 65 70 74 2c 20 69 66  VM v. Except, if
22330 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e   the value is an
22340 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72   SQL NULL, retur
22350 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e  n .** 0 instead.
22360 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55   Unless it is NU
22370 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66 69 6e 69  LL, apply affini
22380 74 79 20 61 66 66 20 28 6f 6e 65 20 6f 66 20 74  ty aff (one of t
22390 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a  he SQLITE_AFF_*.
223a0 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f  ** constants) to
223b0 20 74 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72   the value befor
223c0 65 20 72 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a  e returning it..
223d0 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
223e0 65 64 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65  ed value must be
223f0 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
22400 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74  ller using sqlit
22410 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a  e3ValueFree()..*
22420 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  /.sqlite3_value 
22430 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 42  *sqlite3VdbeGetB
22440 6f 75 6e 64 56 61 6c 75 65 28 56 64 62 65 20 2a  oundValue(Vdbe *
22450 76 2c 20 69 6e 74 20 69 56 61 72 2c 20 75 38 20  v, int iVar, u8 
22460 61 66 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20  aff){.  assert( 
22470 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20  iVar>0 );.  if( 
22480 76 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d  v ){.    Mem *pM
22490 65 6d 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56  em = &v->aVar[iV
224a0 61 72 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20 30  ar-1];.    if( 0
224b0 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  ==(pMem->flags &
224c0 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20   MEM_Null) ){.  
224d0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
224e0 65 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65  e *pRet = sqlite
224f0 33 56 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29  3ValueNew(v->db)
22500 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 74  ;.      if( pRet
22510 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
22520 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28  te3VdbeMemCopy((
22530 4d 65 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d  Mem *)pRet, pMem
22540 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
22550 65 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69  e3ValueApplyAffi
22560 6e 69 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20  nity(pRet, aff, 
22570 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
22580 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
22590 72 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20  rn pRet;.    }. 
225a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
225b0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72  ../*.** Configur
225c0 65 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20 69  e SQL variable i
225d0 56 61 72 20 73 6f 20 74 68 61 74 20 62 69 6e 64  Var so that bind
225e0 69 6e 67 20 61 20 6e 65 77 20 76 61 6c 75 65 20  ing a new value 
225f0 74 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a  to it signals.**
22600 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f 70   to sqlite3_reop
22610 74 69 6d 69 7a 65 28 29 20 74 68 61 74 20 72 65  timize() that re
22620 2d 70 72 65 70 61 72 69 6e 67 20 74 68 65 20 73  -preparing the s
22630 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 72 65 73  tatement may res
22640 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74  ult.** in a bett
22650 65 72 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a  er query plan..*
22660 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
22670 62 65 53 65 74 56 61 72 6d 61 73 6b 28 56 64 62  beSetVarmask(Vdb
22680 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 29 7b  e *v, int iVar){
22690 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72 3e  .  assert( iVar>
226a0 30 20 29 3b 0a 20 20 69 66 28 20 69 56 61 72 3e  0 );.  if( iVar>
226b0 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70  32 ){.    v->exp
226c0 6d 61 73 6b 20 3d 20 30 78 66 66 66 66 66 66 66  mask = 0xfffffff
226d0 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  f;.  }else{.    
226e0 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28  v->expmask |= ((
226f0 75 33 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31  u32)1 << (iVar-1
22700 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  ));.  }.}..#ifnd
22710 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
22720 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a  IRTUALTABLE./*.*
22730 2a 20 54 72 61 6e 73 66 65 72 20 65 72 72 6f 72  * Transfer error
22740 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 66 72   message text fr
22750 6f 6d 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74  om an sqlite3_vt
22760 61 62 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74  ab.zErrMsg (text
22770 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65   stored.** in me
22780 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
22790 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
227a0 63 29 20 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a  c) into a Vdbe.z
227b0 45 72 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f  ErrMsg (text sto
227c0 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  red.** in memory
227d0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
227e0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e  qlite3DbMalloc).
227f0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
22800 56 74 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67  VtabImportErrmsg
22810 28 56 64 62 65 20 2a 70 2c 20 73 71 6c 69 74 65  (Vdbe *p, sqlite
22820 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a  3_vtab *pVtab){.
22830 20 20 69 66 28 20 70 56 74 61 62 2d 3e 7a 45 72    if( pVtab->zEr
22840 72 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69  rMsg ){.    sqli
22850 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
22860 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
22870 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
22880 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d  g);.    p->zErrM
22890 73 67 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  sg = sqlite3DbSt
228a0 72 44 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e  rDup(db, pVtab->
228b0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71  zErrMsg);.    sq
228c0 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61 62  lite3_free(pVtab
228d0 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
228e0 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d  pVtab->zErrMsg =
228f0 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   0;.  }.}.#endif
22900 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
22910 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.