/ Hex Artifact Content
Login

Artifact 520bf491dcf75ce8944c9486ac7e2fc68d1ea5a4:


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 61 73 73 65 72 74 28 20 70 41 2d 3e 64  .  assert( pA->d
0800: 62 3d 3d 70 42 2d 3e 64 62 20 29 3b 0a 20 20 74  b==pB->db );.  t
0810: 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20  mp = *pA;.  *pA 
0820: 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74  = *pB;.  *pB = t
0830: 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d  mp;.  pTmp = pA-
0840: 3e 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e  >pNext;.  pA->pN
0850: 65 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b  ext = pB->pNext;
0860: 0a 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70  .  pB->pNext = p
0870: 54 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41  Tmp;.  pTmp = pA
0880: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70  ->pPrev;.  pA->p
0890: 50 72 65 76 20 3d 20 70 42 2d 3e 70 50 72 65 76  Prev = pB->pPrev
08a0: 3b 0a 20 20 70 42 2d 3e 70 50 72 65 76 20 3d 20  ;.  pB->pPrev = 
08b0: 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70  pTmp;.  zTmp = p
08c0: 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a  A->zSql;.  pA->z
08d0: 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a  Sql = pB->zSql;.
08e0: 20 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d    pB->zSql = zTm
08f0: 70 3b 0a 20 20 70 42 2d 3e 69 73 50 72 65 70 61  p;.  pB->isPrepa
0900: 72 65 56 32 20 3d 20 70 41 2d 3e 69 73 50 72 65  reV2 = pA->isPre
0910: 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pareV2;.}../*.**
0920: 20 52 65 73 69 7a 65 20 74 68 65 20 56 64 62 65   Resize the Vdbe
0930: 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68  .aOp array so th
0940: 61 74 20 69 74 20 69 73 20 61 74 20 6c 65 61 73  at it is at leas
0950: 74 20 6e 4f 70 20 65 6c 65 6d 65 6e 74 73 20 6c  t nOp elements l
0960: 61 72 67 65 72 20 0a 2a 2a 20 74 68 61 6e 20 69  arger .** than i
0970: 74 73 20 63 75 72 72 65 6e 74 20 73 69 7a 65 2e  ts current size.
0980: 20 6e 4f 70 20 69 73 20 67 75 61 72 61 6e 74 65   nOp is guarante
0990: 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68  ed to be less th
09a0: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74  an or equal.** t
09b0: 6f 20 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70  o 1024/sizeof(Op
09c0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f  )..**.** If an o
09d0: 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72  ut-of-memory err
09e0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
09f0: 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72 72  resizing the arr
0a00: 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51  ay, return.** SQ
0a10: 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74  LITE_NOMEM. In t
0a20: 68 69 73 20 63 61 73 65 20 56 64 62 65 2e 61 4f  his case Vdbe.aO
0a30: 70 20 61 6e 64 20 50 61 72 73 65 2e 6e 4f 70 41  p and Parse.nOpA
0a40: 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20  lloc remain .** 
0a50: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20  unchanged (this 
0a60: 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79 20 6f  is so that any o
0a70: 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61  pcodes already a
0a80: 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20  llocated can be 
0a90: 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 64 65  .** correctly de
0aa0: 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
0ab0: 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66  with the rest of
0ac0: 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73   the Vdbe)..*/.s
0ad0: 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77 4f 70  tatic int growOp
0ae0: 41 72 72 61 79 28 56 64 62 65 20 2a 76 2c 20 69  Array(Vdbe *v, i
0af0: 6e 74 20 6e 4f 70 29 7b 0a 20 20 56 64 62 65 4f  nt nOp){.  VdbeO
0b00: 70 20 2a 70 4e 65 77 3b 0a 20 20 50 61 72 73 65  p *pNew;.  Parse
0b10: 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b   *p = v->pParse;
0b20: 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c 49 54  ..  /* The SQLIT
0b30: 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53  E_TEST_REALLOC_S
0b40: 54 52 45 53 53 20 63 6f 6d 70 69 6c 65 2d 74 69  TRESS compile-ti
0b50: 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 64 65 73  me option is des
0b60: 69 67 6e 65 64 20 74 6f 20 66 6f 72 63 65 0a 20  igned to force. 
0b70: 20 2a 2a 20 6d 6f 72 65 20 66 72 65 71 75 65 6e   ** more frequen
0b80: 74 20 72 65 61 6c 6c 6f 63 73 20 61 6e 64 20 68  t reallocs and h
0b90: 65 6e 63 65 20 70 72 6f 76 69 64 65 20 6d 6f 72  ence provide mor
0ba0: 65 20 6f 70 70 6f 72 74 75 6e 69 74 69 65 73 20  e opportunities 
0bb0: 66 6f 72 20 0a 20 20 2a 2a 20 73 69 6d 75 6c 61  for .  ** simula
0bc0: 74 65 64 20 4f 4f 4d 20 66 61 75 6c 74 73 2e 20  ted OOM faults. 
0bd0: 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41   SQLITE_TEST_REA
0be0: 4c 4c 4f 43 5f 53 54 52 45 53 53 20 69 73 20 67  LLOC_STRESS is g
0bf0: 65 6e 65 72 61 6c 6c 79 20 75 73 65 64 0a 20 20  enerally used.  
0c00: 2a 2a 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ** during testin
0c10: 67 20 6f 6e 6c 79 2e 20 20 57 69 74 68 20 53 51  g only.  With SQ
0c20: 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f  LITE_TEST_REALLO
0c30: 43 5f 53 54 52 45 53 53 20 67 72 6f 77 20 74 68  C_STRESS grow th
0c40: 65 20 6f 70 20 61 72 72 61 79 0a 20 20 2a 2a 20  e op array.  ** 
0c50: 62 79 20 74 68 65 20 6d 69 6e 69 6d 75 6d 2a 20  by the minimum* 
0c60: 61 6d 6f 75 6e 74 20 72 65 71 75 69 72 65 64 20  amount required 
0c70: 75 6e 74 69 6c 20 74 68 65 20 73 69 7a 65 20 72  until the size r
0c80: 65 61 63 68 65 73 20 35 31 32 2e 20 20 4e 6f 72  eaches 512.  Nor
0c90: 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69  mal.  ** operati
0ca0: 6f 6e 20 28 77 69 74 68 6f 75 74 20 53 51 4c 49  on (without SQLI
0cb0: 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f  TE_TEST_REALLOC_
0cc0: 53 54 52 45 53 53 29 20 69 73 20 74 6f 20 64 6f  STRESS) is to do
0cd0: 75 62 6c 65 20 74 68 65 20 63 75 72 72 65 6e 74  uble the current
0ce0: 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68  .  ** size of th
0cf0: 65 20 6f 70 20 61 72 72 61 79 20 6f 72 20 61 64  e op array or ad
0d00: 64 20 31 4b 42 20 6f 66 20 73 70 61 63 65 2c 20  d 1KB of space, 
0d10: 77 68 69 63 68 65 76 65 72 20 69 73 20 73 6d 61  whichever is sma
0d20: 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66 64 65 66 20  ller. */.#ifdef 
0d30: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
0d40: 4c 4f 43 5f 53 54 52 45 53 53 0a 20 20 69 6e 74  LOC_STRESS.  int
0d50: 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41   nNew = (p->nOpA
0d60: 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20 70 2d 3e 6e  lloc>=512 ? p->n
0d70: 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 70 2d 3e 6e  OpAlloc*2 : p->n
0d80: 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 3b 0a 23 65  OpAlloc+nOp);.#e
0d90: 6c 73 65 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d  lse.  int nNew =
0da0: 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20   (p->nOpAlloc ? 
0db0: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20  p->nOpAlloc*2 : 
0dc0: 28 69 6e 74 29 28 31 30 32 34 2f 73 69 7a 65 6f  (int)(1024/sizeo
0dd0: 66 28 4f 70 29 29 29 3b 0a 20 20 55 4e 55 53 45  f(Op)));.  UNUSE
0de0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4f 70 29  D_PARAMETER(nOp)
0df0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
0e00: 72 74 28 20 6e 4f 70 3c 3d 28 31 30 32 34 2f 73  rt( nOp<=(1024/s
0e10: 69 7a 65 6f 66 28 4f 70 29 29 20 29 3b 0a 20 20  izeof(Op)) );.  
0e20: 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 3d 28 70  assert( nNew>=(p
0e30: 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 20  ->nOpAlloc+nOp) 
0e40: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
0e50: 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e  te3DbRealloc(p->
0e60: 64 62 2c 20 76 2d 3e 61 4f 70 2c 20 6e 4e 65 77  db, v->aOp, nNew
0e70: 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20  *sizeof(Op));.  
0e80: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
0e90: 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 20 3d 20 73  p->szOpAlloc = s
0ea0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69  qlite3DbMallocSi
0eb0: 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29 3b  ze(p->db, pNew);
0ec0: 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63  .    p->nOpAlloc
0ed0: 20 3d 20 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 2f   = p->szOpAlloc/
0ee0: 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20 20  sizeof(Op);.    
0ef0: 76 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a 20  v->aOp = pNew;. 
0f00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e 65   }.  return (pNe
0f10: 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  w ? SQLITE_OK : 
0f20: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 7d  SQLITE_NOMEM);.}
0f30: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
0f40: 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 72 6f  DEBUG./* This ro
0f50: 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20 61 20  utine is just a 
0f60: 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65  convenient place
0f70: 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70   to set a breakp
0f80: 6f 69 6e 74 20 74 68 61 74 20 77 69 6c 6c 0a 2a  oint that will.*
0f90: 2a 20 66 69 72 65 20 61 66 74 65 72 20 65 61 63  * fire after eac
0fa0: 68 20 6f 70 63 6f 64 65 20 69 73 20 69 6e 73 65  h opcode is inse
0fb0: 72 74 65 64 20 61 6e 64 20 64 69 73 70 6c 61 79  rted and display
0fc0: 65 64 20 75 73 69 6e 67 0a 2a 2a 20 22 50 52 41  ed using.** "PRA
0fd0: 47 4d 41 20 76 64 62 65 5f 61 64 64 6f 70 74 72  GMA vdbe_addoptr
0fe0: 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73 74 61 74  ace=on"..*/.stat
0ff0: 69 63 20 76 6f 69 64 20 74 65 73 74 5f 61 64 64  ic void test_add
1000: 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 76 6f  op_breakpoint(vo
1010: 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e  id){.  static in
1020: 74 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b 2b 3b 0a  t n = 0;.  n++;.
1030: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1040: 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74 72 75  Add a new instru
1050: 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69 73  ction to the lis
1060: 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e  t of instruction
1070: 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74 68 65  s current in the
1080: 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74 75 72  .** VDBE.  Retur
1090: 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  n the address of
10a0: 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63   the new instruc
10b0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61  tion..**.** Para
10c0: 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  meters:.**.**   
10d0: 20 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20   p              
10e0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
10f0: 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 70  VDBE.**.**    op
1100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68                Th
1110: 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 68 69  e opcode for thi
1120: 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a  s instruction.**
1130: 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c 20 70  .**    p1, p2, p
1140: 33 20 20 20 20 20 20 4f 70 65 72 61 6e 64 73 0a  3      Operands.
1150: 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71  **.** Use the sq
1160: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1170: 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e  Label() function
1180: 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64 72 65   to fix an addre
1190: 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 71  ss and.** the sq
11a0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
11b0: 34 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  4() function to 
11c0: 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  change the value
11d0: 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20 6f 70   of the P4.** op
11e0: 65 72 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  erand..*/.static
11f0: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
1200: 20 69 6e 74 20 67 72 6f 77 4f 70 33 28 56 64 62   int growOp3(Vdb
1210: 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
1220: 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20 69 6e  t p1, int p2, in
1230: 74 20 70 33 29 7b 0a 20 20 61 73 73 65 72 74 28  t p3){.  assert(
1240: 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41   p->pParse->nOpA
1250: 6c 6c 6f 63 3c 3d 70 2d 3e 6e 4f 70 20 29 3b 0a  lloc<=p->nOp );.
1260: 20 20 69 66 28 20 67 72 6f 77 4f 70 41 72 72 61    if( growOpArra
1270: 79 28 70 2c 20 31 29 20 29 20 72 65 74 75 72 6e  y(p, 1) ) return
1280: 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   1;.  assert( p-
1290: 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f  >pParse->nOpAllo
12a0: 63 3e 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 72 65  c>p->nOp );.  re
12b0: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
12c0: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31  AddOp3(p, op, p1
12d0: 2c 20 70 32 2c 20 70 33 29 3b 0a 7d 0a 69 6e 74  , p2, p3);.}.int
12e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12f0: 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  p3(Vdbe *p, int 
1300: 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20  op, int p1, int 
1310: 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20 69  p2, int p3){.  i
1320: 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a  nt i;.  VdbeOp *
1330: 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e  pOp;..  i = p->n
1340: 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  Op;.  assert( p-
1350: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
1360: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73  IC_INIT );.  ass
1370: 65 72 74 28 20 6f 70 3e 3d 30 20 26 26 20 6f 70  ert( op>=0 && op
1380: 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20 70  <0xff );.  if( p
1390: 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c  ->pParse->nOpAll
13a0: 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20 72 65 74  oc<=i ){.    ret
13b0: 75 72 6e 20 67 72 6f 77 4f 70 33 28 70 2c 20 6f  urn growOp3(p, o
13c0: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a  p, p1, p2, p3);.
13d0: 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a    }.  p->nOp++;.
13e0: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
13f0: 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64  i];.  pOp->opcod
1400: 65 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 70 4f  e = (u8)op;.  pO
1410: 70 2d 3e 70 35 20 3d 20 30 3b 0a 20 20 70 4f 70  p->p5 = 0;.  pOp
1420: 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70 4f 70  ->p1 = p1;.  pOp
1430: 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70 4f 70  ->p2 = p2;.  pOp
1440: 2d 3e 70 33 20 3d 20 70 33 3b 0a 20 20 70 4f 70  ->p3 = p3;.  pOp
1450: 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 70 4f  ->p4.p = 0;.  pO
1460: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e  p->p4type = P4_N
1470: 4f 54 55 53 45 44 3b 0a 23 69 66 64 65 66 20 53  OTUSED;.#ifdef S
1480: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50  QLITE_ENABLE_EXP
1490: 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20  LAIN_COMMENTS.  
14a0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20  pOp->zComment = 
14b0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  0;.#endif.#ifdef
14c0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
14d0: 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  if( p->db->flags
14e0: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64   & SQLITE_VdbeAd
14f0: 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
1500: 69 6e 74 20 6a 6a 2c 20 6b 6b 3b 0a 20 20 20 20  int jj, kk;.    
1510: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
1520: 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 66  p->pParse;.    f
1530: 6f 72 28 6a 6a 3d 6b 6b 3d 30 3b 20 6a 6a 3c 53  or(jj=kk=0; jj<S
1540: 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
1550: 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73  ; jj++){.      s
1560: 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
1570: 2a 78 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f  *x = pParse->aCo
1580: 6c 43 61 63 68 65 20 2b 20 6a 6a 3b 0a 20 20 20  lCache + jj;.   
1590: 20 20 20 69 66 28 20 78 2d 3e 69 4c 65 76 65 6c     if( x->iLevel
15a0: 3e 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c  >pParse->iCacheL
15b0: 65 76 65 6c 20 7c 7c 20 78 2d 3e 69 52 65 67 3d  evel || x->iReg=
15c0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
15d0: 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 72 5b       printf(" r[
15e0: 25 64 5d 3d 7b 25 64 3a 25 64 7d 22 2c 20 78 2d  %d]={%d:%d}", x-
15f0: 3e 69 52 65 67 2c 20 78 2d 3e 69 54 61 62 6c 65  >iReg, x->iTable
1600: 2c 20 78 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  , x->iColumn);. 
1610: 20 20 20 20 20 6b 6b 2b 2b 3b 0a 20 20 20 20 7d       kk++;.    }
1620: 0a 20 20 20 20 69 66 28 20 6b 6b 20 29 20 70 72  .    if( kk ) pr
1630: 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20  intf("\n");.    
1640: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
1650: 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f 70  Op(0, i, &p->aOp
1660: 5b 69 5d 29 3b 0a 20 20 20 20 74 65 73 74 5f 61  [i]);.    test_a
1670: 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28  ddop_breakpoint(
1680: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  );.  }.#endif.#i
1690: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
16a0: 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20  E.  pOp->cycles 
16b0: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74 20  = 0;.  pOp->cnt 
16c0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  = 0;.#endif.#ifd
16d0: 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  ef SQLITE_VDBE_C
16e0: 4f 56 45 52 41 47 45 0a 20 20 70 4f 70 2d 3e 69  OVERAGE.  pOp->i
16f0: 53 72 63 4c 69 6e 65 20 3d 20 30 3b 0a 23 65 6e  SrcLine = 0;.#en
1700: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  dif.  return i;.
1710: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
1720: 65 41 64 64 4f 70 30 28 56 64 62 65 20 2a 70 2c  eAddOp0(Vdbe *p,
1730: 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74 75   int op){.  retu
1740: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
1750: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30  dOp3(p, op, 0, 0
1760: 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
1770: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 56 64  te3VdbeAddOp1(Vd
1780: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
1790: 6e 74 20 70 31 29 7b 0a 20 20 72 65 74 75 72 6e  nt p1){.  return
17a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17b0: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c  p3(p, op, p1, 0,
17c0: 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   0);.}.int sqlit
17d0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 56 64 62  e3VdbeAddOp2(Vdb
17e0: 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
17f0: 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20  t p1, int p2){. 
1800: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1810: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
1820: 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a   p1, p2, 0);.}..
1830: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1840: 20 66 6f 72 20 61 6e 20 75 6e 63 6f 6e 64 69 74   for an uncondit
1850: 69 6f 6e 61 6c 20 6a 75 6d 70 20 74 6f 20 69 6e  ional jump to in
1860: 73 74 72 75 63 74 69 6f 6e 20 69 44 65 73 74 0a  struction iDest.
1870: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1880: 62 65 47 6f 74 6f 28 56 64 62 65 20 2a 70 2c 20  beGoto(Vdbe *p, 
1890: 69 6e 74 20 69 44 65 73 74 29 7b 0a 20 20 72 65  int iDest){.  re
18a0: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
18b0: 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f 47 6f 74  AddOp3(p, OP_Got
18c0: 6f 2c 20 30 2c 20 69 44 65 73 74 2c 20 30 29 3b  o, 0, iDest, 0);
18d0: 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20  .}../* Generate 
18e0: 63 6f 64 65 20 74 6f 20 63 61 75 73 65 20 74 68  code to cause th
18f0: 65 20 73 74 72 69 6e 67 20 7a 53 74 72 20 74 6f  e string zStr to
1900: 20 62 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f 0a   be loaded into.
1910: 2a 2a 20 72 65 67 69 73 74 65 72 20 69 44 65 73  ** register iDes
1920: 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  t.*/.int sqlite3
1930: 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 56  VdbeLoadString(V
1940: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65 73  dbe *p, int iDes
1950: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
1960: 53 74 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  Str){.  return s
1970: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1980: 28 70 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (p, OP_String8, 
1990: 30 2c 20 69 44 65 73 74 2c 20 30 2c 20 7a 53 74  0, iDest, 0, zSt
19a0: 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r, 0);.}../*.** 
19b0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
19c0: 61 74 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 6d  at initializes m
19d0: 75 6c 74 69 70 6c 65 20 72 65 67 69 73 74 65 72  ultiple register
19e0: 73 20 74 6f 20 73 74 72 69 6e 67 20 6f 72 20 69  s to string or i
19f0: 6e 74 65 67 65 72 0a 2a 2a 20 63 6f 6e 73 74 61  nteger.** consta
1a00: 6e 74 73 2e 20 20 54 68 65 20 72 65 67 69 73 74  nts.  The regist
1a10: 65 72 73 20 62 65 67 69 6e 20 77 69 74 68 20 69  ers begin with i
1a20: 44 65 73 74 20 61 6e 64 20 69 6e 63 72 65 61 73  Dest and increas
1a30: 65 20 63 6f 6e 73 65 63 75 74 69 76 65 6c 79 2e  e consecutively.
1a40: 0a 2a 2a 20 4f 6e 65 20 72 65 67 69 73 74 65 72  .** One register
1a50: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
1a60: 66 6f 72 20 65 61 63 68 20 63 68 61 72 61 63 67  for each characg
1a70: 74 65 72 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2e  ter in zTypes[].
1a80: 20 20 46 6f 72 20 65 61 63 68 0a 2a 2a 20 22 73    For each.** "s
1a90: 22 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a  " character in z
1aa0: 54 79 70 65 73 5b 5d 2c 20 74 68 65 20 72 65 67  Types[], the reg
1ab0: 69 73 74 65 72 20 69 73 20 61 20 73 74 72 69 6e  ister is a strin
1ac0: 67 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e  g if the argumen
1ad0: 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 4e 55 4c 4c  t is.** not NULL
1ae0: 2c 20 6f 72 20 4f 50 5f 4e 75 6c 6c 20 69 66 20  , or OP_Null if 
1af0: 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 20 6e  the value is a n
1b00: 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 20 46 6f  ull pointer.  Fo
1b10: 72 20 65 61 63 68 20 22 69 22 20 63 68 61 72 61  r each "i" chara
1b20: 63 74 65 72 0a 2a 2a 20 69 6e 20 7a 54 79 70 65  cter.** in zType
1b30: 73 5b 5d 2c 20 74 68 65 20 72 65 67 69 73 74 65  s[], the registe
1b40: 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  r is initialized
1b50: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a   to an integer..
1b60: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
1b70: 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 56 64 62  dbeMultiLoad(Vdb
1b80: 65 20 2a 70 2c 20 69 6e 74 20 69 44 65 73 74 2c  e *p, int iDest,
1b90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
1ba0: 70 65 73 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  pes, ...){.  va_
1bb0: 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 69  list ap;.  int i
1bc0: 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 76 61  ;.  char c;.  va
1bd0: 5f 73 74 61 72 74 28 61 70 2c 20 7a 54 79 70 65  _start(ap, zType
1be0: 73 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28  s);.  for(i=0; (
1bf0: 63 20 3d 20 7a 54 79 70 65 73 5b 69 5d 29 21 3d  c = zTypes[i])!=
1c00: 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  0; i++){.    if(
1c10: 20 63 3d 3d 27 73 27 20 29 7b 0a 20 20 20 20 20   c=='s' ){.     
1c20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
1c30: 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73   va_arg(ap, cons
1c40: 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20  t char*);.      
1c50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1c60: 34 28 70 2c 20 7a 3d 3d 30 20 3f 20 4f 50 5f 4e  4(p, z==0 ? OP_N
1c70: 75 6c 6c 20 3a 20 4f 50 5f 53 74 72 69 6e 67 38  ull : OP_String8
1c80: 2c 20 30 2c 20 69 44 65 73 74 2b 2b 2c 20 30 2c  , 0, iDest++, 0,
1c90: 20 7a 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73   z, 0);.    }els
1ca0: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
1cb0: 20 63 3d 3d 27 69 27 20 29 3b 0a 20 20 20 20 20   c=='i' );.     
1cc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1cd0: 70 32 28 70 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(p, OP_Integer
1ce0: 2c 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  , va_arg(ap, int
1cf0: 29 2c 20 69 44 65 73 74 2b 2b 29 3b 0a 20 20 20  ), iDest++);.   
1d00: 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28   }.  }.  va_end(
1d10: 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  ap);.}../*.** Ad
1d20: 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74  d an opcode that
1d30: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34   includes the p4
1d40: 20 76 61 6c 75 65 20 61 73 20 61 20 70 6f 69 6e   value as a poin
1d50: 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ter..*/.int sqli
1d60: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20  te3VdbeAddOp4(. 
1d70: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
1d80: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
1d90: 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  opcode to this V
1da0: 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  M */.  int op,  
1db0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1dc0: 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a  e new opcode */.
1dd0: 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20    int p1,       
1de0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20        /* The P1 
1df0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1e00: 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20   p2,            
1e10: 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61   /* The P2 opera
1e20: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20  nd */.  int p3, 
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e40: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f  he P3 operand */
1e50: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1e60: 50 34 2c 20 20 20 20 2f 2a 20 54 68 65 20 50 34  P4,    /* The P4
1e70: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
1e80: 74 20 70 34 74 79 70 65 20 20 20 20 20 20 20 20  t p4type        
1e90: 20 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e 64 20    /* P4 operand 
1ea0: 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  type */.){.  int
1eb0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
1ec0: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
1ed0: 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20   p1, p2, p3);.  
1ee0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1ef0: 65 50 34 28 70 2c 20 61 64 64 72 2c 20 7a 50 34  eP4(p, addr, zP4
1f00: 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 72 65 74  , p4type);.  ret
1f10: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
1f20: 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65  ** Add an opcode
1f30: 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74   that includes t
1f40: 68 65 20 70 34 20 76 61 6c 75 65 20 77 69 74 68  he p4 value with
1f50: 20 61 20 50 34 5f 49 4e 54 36 34 20 6f 72 0a 2a   a P4_INT64 or.*
1f60: 2a 20 50 34 5f 52 45 41 4c 20 74 79 70 65 2e 0a  * P4_REAL type..
1f70: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1f80: 62 65 41 64 64 4f 70 34 44 75 70 38 28 0a 20 20  beAddOp4Dup8(.  
1f90: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
1fa0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f      /* Add the o
1fb0: 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d  pcode to this VM
1fc0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
1fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1fe0: 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20   new opcode */. 
1ff0: 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20   int p1,        
2000: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f       /* The P1 o
2010: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
2020: 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p2,             
2030: 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e  /* The P2 operan
2040: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20  d */.  int p3,  
2050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2060: 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P3 operand */.
2070: 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 50 34 2c    const u8 *zP4,
2080: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20        /* The P4 
2090: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
20a0: 20 70 34 74 79 70 65 20 20 20 20 20 20 20 20 20   p4type         
20b0: 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e 64 20 74   /* P4 operand t
20c0: 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  ype */.){.  char
20d0: 20 2a 70 34 63 6f 70 79 20 3d 20 73 71 6c 69 74   *p4copy = sqlit
20e0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
20f0: 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 70 29  sqlite3VdbeDb(p)
2100: 2c 20 38 29 3b 0a 20 20 69 66 28 20 70 34 63 6f  , 8);.  if( p4co
2110: 70 79 20 29 20 6d 65 6d 63 70 79 28 70 34 63 6f  py ) memcpy(p4co
2120: 70 79 2c 20 7a 50 34 2c 20 38 29 3b 0a 20 20 72  py, zP4, 8);.  r
2130: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
2140: 65 41 64 64 4f 70 34 28 70 2c 20 6f 70 2c 20 70  eAddOp4(p, op, p
2150: 31 2c 20 70 32 2c 20 70 33 2c 20 70 34 63 6f 70  1, p2, p3, p4cop
2160: 79 2c 20 70 34 74 79 70 65 29 3b 0a 7d 0a 0a 2f  y, p4type);.}../
2170: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 4f 50 5f 50  *.** Add an OP_P
2180: 61 72 73 65 53 63 68 65 6d 61 20 6f 70 63 6f 64  arseSchema opcod
2190: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
21a0: 20 69 73 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66   is broken out f
21b0: 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  rom.** sqlite3Vd
21c0: 62 65 41 64 64 4f 70 34 28 29 20 73 69 6e 63 65  beAddOp4() since
21d0: 20 69 74 20 6e 65 65 64 73 20 74 6f 20 61 6c 73   it needs to als
21e0: 6f 20 6e 65 65 64 73 20 74 6f 20 6d 61 72 6b 20  o needs to mark 
21f0: 61 6c 6c 20 62 74 72 65 65 73 0a 2a 2a 20 61 73  all btrees.** as
2200: 20 68 61 76 69 6e 67 20 62 65 65 6e 20 75 73 65   having been use
2210: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 57 68  d..**.** The zWh
2220: 65 72 65 20 73 74 72 69 6e 67 20 6d 75 73 74 20  ere string must 
2230: 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e  have been obtain
2240: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
2250: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 69  malloc()..** Thi
2260: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 74  s routine will t
2270: 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66  ake ownership of
2280: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d   the allocated m
2290: 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  emory..*/.void s
22a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72  qlite3VdbeAddPar
22b0: 73 65 53 63 68 65 6d 61 4f 70 28 56 64 62 65 20  seSchemaOp(Vdbe 
22c0: 2a 70 2c 20 69 6e 74 20 69 44 62 2c 20 63 68 61  *p, int iDb, cha
22d0: 72 20 2a 7a 57 68 65 72 65 29 7b 0a 20 20 69 6e  r *zWhere){.  in
22e0: 74 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  t j;.  sqlite3Vd
22f0: 62 65 41 64 64 4f 70 34 28 70 2c 20 4f 50 5f 50  beAddOp4(p, OP_P
2300: 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c  arseSchema, iDb,
2310: 20 30 2c 20 30 2c 20 7a 57 68 65 72 65 2c 20 50   0, 0, zWhere, P
2320: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f  4_DYNAMIC);.  fo
2330: 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e  r(j=0; j<p->db->
2340: 6e 44 62 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65  nDb; j++) sqlite
2350: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 70  3VdbeUsesBtree(p
2360: 2c 20 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  , j);.}../*.** A
2370: 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61  dd an opcode tha
2380: 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70  t includes the p
2390: 34 20 76 61 6c 75 65 20 61 73 20 61 6e 20 69 6e  4 value as an in
23a0: 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  teger..*/.int sq
23b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
23c0: 6e 74 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  nt(.  Vdbe *p,  
23d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
23e0: 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74   the opcode to t
23f0: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
2400: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
2410: 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64  /* The new opcod
2420: 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20  e */.  int p1,  
2430: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2440: 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P1 operand */.
2450: 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20    int p2,       
2460: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20        /* The P2 
2470: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
2480: 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20   p3,            
2490: 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61   /* The P3 opera
24a0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20  nd */.  int p4  
24b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
24c0: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 61 73  he P4 operand as
24d0: 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29   an integer */.)
24e0: 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73  {.  int addr = s
24f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2500: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
2510: 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  p3);.  sqlite3Vd
2520: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64  beChangeP4(p, ad
2530: 64 72 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54  dr, SQLITE_INT_T
2540: 4f 5f 50 54 52 28 70 34 29 2c 20 50 34 5f 49 4e  O_PTR(p4), P4_IN
2550: 54 33 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  T32);.  return a
2560: 64 64 72 3b 0a 7d 0a 0a 2f 2a 20 49 6e 73 65 72  ddr;.}../* Inser
2570: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 63  t the end of a c
2580: 6f 2d 72 6f 75 74 69 6e 65 0a 2a 2f 0a 76 6f 69  o-routine.*/.voi
2590: 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64  d sqlite3VdbeEnd
25a0: 43 6f 72 6f 75 74 69 6e 65 28 56 64 62 65 20 2a  Coroutine(Vdbe *
25b0: 76 2c 20 69 6e 74 20 72 65 67 59 69 65 6c 64 29  v, int regYield)
25c0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  {.  sqlite3VdbeA
25d0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43  ddOp1(v, OP_EndC
25e0: 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65  oroutine, regYie
25f0: 6c 64 29 3b 0a 0a 20 20 2f 2a 20 43 6c 65 61 72  ld);..  /* Clear
2600: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 72   the temporary r
2610: 65 67 69 73 74 65 72 20 63 61 63 68 65 2c 20 74  egister cache, t
2620: 68 65 72 65 62 79 20 65 6e 73 75 72 69 6e 67 20  hereby ensuring 
2630: 74 68 61 74 20 65 61 63 68 0a 20 20 2a 2a 20 63  that each.  ** c
2640: 6f 2d 72 6f 75 74 69 6e 65 20 68 61 73 20 69 74  o-routine has it
2650: 73 20 6f 77 6e 20 69 6e 64 65 70 65 6e 64 65 6e  s own independen
2660: 74 20 73 65 74 20 6f 66 20 72 65 67 69 73 74 65  t set of registe
2670: 72 73 2c 20 62 65 63 61 75 73 65 20 63 6f 2d 72  rs, because co-r
2680: 6f 75 74 69 6e 65 73 0a 20 20 2a 2a 20 6d 69 67  outines.  ** mig
2690: 68 74 20 65 78 70 65 63 74 20 74 68 65 69 72 20  ht expect their 
26a0: 72 65 67 69 73 74 65 72 73 20 74 6f 20 62 65 20  registers to be 
26b0: 70 72 65 73 65 72 76 65 64 20 61 63 72 6f 73 73  preserved across
26c0: 20 61 6e 20 4f 50 5f 59 69 65 6c 64 2c 20 61 6e   an OP_Yield, an
26d0: 64 0a 20 20 2a 2a 20 74 68 61 74 20 63 6f 75 6c  d.  ** that coul
26e0: 64 20 63 61 75 73 65 20 70 72 6f 62 6c 65 6d 73  d cause problems
26f0: 20 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   if two or more 
2700: 63 6f 2d 72 6f 75 74 69 6e 65 73 20 61 72 65 20  co-routines are 
2710: 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 0a 20  using the same. 
2720: 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 72 65   ** temporary re
2730: 67 69 73 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 76  gister..  */.  v
2740: 2d 3e 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  ->pParse->nTempR
2750: 65 67 20 3d 20 30 3b 0a 20 20 76 2d 3e 70 50 61  eg = 0;.  v->pPa
2760: 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d  rse->nRangeReg =
2770: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65   0;.}../*.** Cre
2780: 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c  ate a new symbol
2790: 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20  ic label for an 
27a0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
27b0: 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a   has yet to be.*
27c0: 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79  * coded.  The sy
27d0: 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20  mbolic label is 
27e0: 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65  really just a ne
27f0: 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20  gative number.  
2800: 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e  The.** label can
2810: 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20   be used as the 
2820: 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f  P2 value of an o
2830: 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72  peration.  Later
2840: 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61  , when.** the la
2850: 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20  bel is resolved 
2860: 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 61 64  to a specific ad
2870: 64 72 65 73 73 2c 20 74 68 65 20 56 44 42 45 20  dress, the VDBE 
2880: 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72  will scan.** thr
2890: 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61 74 69  ough its operati
28a0: 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e  on list and chan
28b0: 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66  ge all values of
28c0: 20 50 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a   P2 which match.
28d0: 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74  ** the label int
28e0: 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61  o the resolved a
28f0: 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ddress..**.** Th
2900: 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61  e VDBE knows tha
2910: 74 20 61 20 50 32 20 76 61 6c 75 65 20 69 73 20  t a P2 value is 
2920: 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20  a label because 
2930: 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c  labels are.** al
2940: 77 61 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e  ways negative an
2950: 64 20 50 32 20 76 61 6c 75 65 73 20 61 72 65 20  d P2 values are 
2960: 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f  suppose to be no
2970: 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48  n-negative..** H
2980: 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65  ence, a negative
2990: 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c   P2 value is a l
29a0: 61 62 65 6c 20 74 68 61 74 20 68 61 73 20 79 65  abel that has ye
29b0: 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64  t to be resolved
29c0: 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20  ..**.** Zero is 
29d0: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61  returned if a ma
29e0: 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f  lloc() fails..*/
29f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
2a00: 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a  MakeLabel(Vdbe *
2a10: 76 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d  v){.  Parse *p =
2a20: 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e   v->pParse;.  in
2a30: 74 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b  t i = p->nLabel+
2a40: 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e  +;.  assert( v->
2a50: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
2a60: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
2a70: 28 69 20 26 20 28 69 2d 31 29 29 3d 3d 30 20 29  (i & (i-1))==0 )
2a80: 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20  {.    p->aLabel 
2a90: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
2aa0: 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20  ocOrFree(p->db, 
2ab0: 70 2d 3e 61 4c 61 62 65 6c 2c 20 0a 20 20 20 20  p->aLabel, .    
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae0: 20 20 20 28 69 2a 32 2b 31 29 2a 73 69 7a 65 6f     (i*2+1)*sizeo
2af0: 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29  f(p->aLabel[0]))
2b00: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  ;.  }.  if( p->a
2b10: 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e  Label ){.    p->
2b20: 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a  aLabel[i] = -1;.
2b30: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 41 44 44    }.  return ADD
2b40: 52 28 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  R(i);.}../*.** R
2b50: 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22  esolve label "x"
2b60: 20 74 6f 20 62 65 20 74 68 65 20 61 64 64 72 65   to be the addre
2b70: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69  ss of the next i
2b80: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a  nstruction to.**
2b90: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54   be inserted.  T
2ba0: 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 78 22  he parameter "x"
2bb0: 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
2bc0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
2bd0: 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f   a prior call to
2be0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
2bf0: 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64  Label()..*/.void
2c00: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
2c10: 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76  lveLabel(Vdbe *v
2c20: 2c 20 69 6e 74 20 78 29 7b 0a 20 20 50 61 72 73  , int x){.  Pars
2c30: 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65  e *p = v->pParse
2c40: 3b 0a 20 20 69 6e 74 20 6a 20 3d 20 41 44 44 52  ;.  int j = ADDR
2c50: 28 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  (x);.  assert( v
2c60: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
2c70: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73  GIC_INIT );.  as
2c80: 73 65 72 74 28 20 6a 3c 70 2d 3e 6e 4c 61 62 65  sert( j<p->nLabe
2c90: 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a  l );.  assert( j
2ca0: 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  >=0 );.  if( p->
2cb0: 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d  aLabel ){.    p-
2cc0: 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76 2d 3e  >aLabel[j] = v->
2cd0: 6e 4f 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 46  nOp;.  }.  p->iF
2ce0: 69 78 65 64 4f 70 20 3d 20 76 2d 3e 6e 4f 70 20  ixedOp = v->nOp 
2cf0: 2d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  - 1;.}../*.** Ma
2d00: 72 6b 20 74 68 65 20 56 44 42 45 20 61 73 20 6f  rk the VDBE as o
2d10: 6e 65 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79  ne that can only
2d20: 20 62 65 20 72 75 6e 20 6f 6e 65 20 74 69 6d 65   be run one time
2d30: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2d40: 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65  3VdbeRunOnlyOnce
2d50: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e  (Vdbe *p){.  p->
2d60: 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 31 3b  runOnlyOnce = 1;
2d70: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
2d80: 45 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c 69 74  E_DEBUG /* sqlit
2d90: 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74  e3AssertMayAbort
2da0: 28 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f 2a 0a  () logic */../*.
2db0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
2dc0: 20 74 79 70 65 20 61 6e 64 20 66 75 6e 63 74 69   type and functi
2dd0: 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f 20 69  on are used to i
2de0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61  terate through a
2df0: 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 69 6e  ll opcodes.** in
2e00: 20 61 20 56 64 62 65 20 6d 61 69 6e 20 70 72 6f   a Vdbe main pro
2e10: 67 72 61 6d 20 61 6e 64 20 65 61 63 68 20 6f 66  gram and each of
2e20: 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d   the sub-program
2e30: 73 20 28 74 72 69 67 67 65 72 73 29 20 69 74 20  s (triggers) it 
2e40: 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 64  may .** invoke d
2e50: 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 72  irectly or indir
2e60: 65 63 74 6c 79 2e 20 49 74 20 73 68 6f 75 6c 64  ectly. It should
2e70: 20 62 65 20 75 73 65 64 20 61 73 20 66 6f 6c 6c   be used as foll
2e80: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70 20  ows:.**.**   Op 
2e90: 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62 65 4f  *pOp;.**   VdbeO
2ea0: 70 49 74 65 72 20 73 49 74 65 72 3b 0a 2a 2a 0a  pIter sIter;.**.
2eb0: 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26 73 49 74  **   memset(&sIt
2ec0: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49  er, 0, sizeof(sI
2ed0: 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49 74 65  ter));.**   sIte
2ee0: 72 2e 76 20 3d 20 76 3b 20 20 20 20 20 20 20 20  r.v = v;        
2ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f00: 20 20 20 20 2f 2f 20 76 20 69 73 20 6f 66 20 74      // v is of t
2f10: 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20 20 20  ype Vdbe* .**   
2f20: 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70  while( (pOp = op
2f30: 49 74 65 72 4e 65 78 74 28 26 73 49 74 65 72 29  IterNext(&sIter)
2f40: 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20 44  ) ){.**     // D
2f50: 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 74 68  o something with
2f60: 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20   pOp.**   }.**  
2f70: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76   sqlite3DbFree(v
2f80: 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53 75  ->db, sIter.apSu
2f90: 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70 65 64  b);.** .*/.typed
2fa0: 65 66 20 73 74 72 75 63 74 20 56 64 62 65 4f 70  ef struct VdbeOp
2fb0: 49 74 65 72 20 56 64 62 65 4f 70 49 74 65 72 3b  Iter VdbeOpIter;
2fc0: 0a 73 74 72 75 63 74 20 56 64 62 65 4f 70 49 74  .struct VdbeOpIt
2fd0: 65 72 20 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20  er {.  Vdbe *v; 
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff0: 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 69 74 65    /* Vdbe to ite
3000: 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65  rate through the
3010: 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f 0a 20   opcodes of */. 
3020: 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70   SubProgram **ap
3030: 53 75 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  Sub;        /* A
3040: 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72  rray of subprogr
3050: 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75  ams */.  int nSu
3060: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
3070: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3080: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 70 53 75   entries in apSu
3090: 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64 64 72  b */.  int iAddr
30a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30b0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
30c0: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
30d0: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
30e0: 69 6e 74 20 69 53 75 62 3b 20 20 20 20 20 20 20  int iSub;       
30f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
3100: 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20  = main program, 
3110: 31 20 3d 20 66 69 72 73 74 20 73 75 62 2d 70 72  1 = first sub-pr
3120: 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a 7d 3b  ogram etc. */.};
3130: 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f 70 49 74  .static Op *opIt
3140: 65 72 4e 65 78 74 28 56 64 62 65 4f 70 49 74 65  erNext(VdbeOpIte
3150: 72 20 2a 70 29 7b 0a 20 20 56 64 62 65 20 2a 76  r *p){.  Vdbe *v
3160: 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20 2a 70   = p->v;.  Op *p
3170: 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 61  Ret = 0;.  Op *a
3180: 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b 0a 0a  Op;.  int nOp;..
3190: 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3c 3d 70    if( p->iSub<=p
31a0: 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20 20 69  ->nSub ){..    i
31b0: 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20 29 7b  f( p->iSub==0 ){
31c0: 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 76 2d 3e  .      aOp = v->
31d0: 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d  aOp;.      nOp =
31e0: 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 65 6c   v->nOp;.    }el
31f0: 73 65 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20  se{.      aOp = 
3200: 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62  p->apSub[p->iSub
3210: 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20  -1]->aOp;.      
3220: 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70  nOp = p->apSub[p
3230: 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70 3b 0a  ->iSub-1]->nOp;.
3240: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
3250: 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70 20 29  ( p->iAddr<nOp )
3260: 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d 20 26 61  ;..    pRet = &a
3270: 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a 20 20  Op[p->iAddr];.  
3280: 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a 20 20    p->iAddr++;.  
3290: 20 20 69 66 28 20 70 2d 3e 69 41 64 64 72 3d 3d    if( p->iAddr==
32a0: 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  nOp ){.      p->
32b0: 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20 70 2d  iSub++;.      p-
32c0: 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20  >iAddr = 0;.    
32d0: 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 70 52 65  }.  .    if( pRe
32e0: 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55  t->p4type==P4_SU
32f0: 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20  BPROGRAM ){.    
3300: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70    int nByte = (p
3310: 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66  ->nSub+1)*sizeof
3320: 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20  (SubProgram*);. 
3330: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
3340: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e    for(j=0; j<p->
3350: 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nSub; j++){.    
3360: 20 20 20 20 69 66 28 20 70 2d 3e 61 70 53 75 62      if( p->apSub
3370: 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e 70 50  [j]==pRet->p4.pP
3380: 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a  rogram ) break;.
3390: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
33a0: 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a  ( j==p->nSub ){.
33b0: 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62          p->apSub
33c0: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
33d0: 6c 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64 62 2c  locOrFree(v->db,
33e0: 20 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79 74 65   p->apSub, nByte
33f0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
3400: 70 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20 20 20  p->apSub ){.    
3410: 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a        pRet = 0;.
3420: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
3430: 20 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75           p->apSu
3440: 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d 20 70  b[p->nSub++] = p
3450: 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d  Ret->p4.pProgram
3460: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3470: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
3480: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
3490: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20  ./*.** Check if 
34a0: 74 68 65 20 70 72 6f 67 72 61 6d 20 73 74 6f 72  the program stor
34b0: 65 64 20 69 6e 20 74 68 65 20 56 4d 20 61 73 73  ed in the VM ass
34c0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50 61  ociated with pPa
34d0: 72 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72 6f 77  rse may.** throw
34e0: 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65 70 74   an ABORT except
34f0: 69 6f 6e 20 28 63 61 75 73 69 6e 67 20 74 68 65  ion (causing the
3500: 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20   statement, but 
3510: 6e 6f 74 20 65 6e 74 69 72 65 20 74 72 61 6e 73  not entire trans
3520: 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20  action.** to be 
3530: 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 20 54 68  rolled back). Th
3540: 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  is condition is 
3550: 74 72 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e  true if the main
3560: 20 70 72 6f 67 72 61 6d 20 6f 72 20 61 6e 79 0a   program or any.
3570: 2a 2a 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20  ** sub-programs 
3580: 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6f 66 20  contains any of 
3590: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
35a0: 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c  *.**   *  OP_Hal
35b0: 74 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45  t with P1=SQLITE
35c0: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20  _CONSTRAINT and 
35d0: 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20  P2=OE_Abort..** 
35e0: 20 20 2a 20 20 4f 50 5f 48 61 6c 74 49 66 4e 75    *  OP_HaltIfNu
35f0: 6c 6c 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54  ll with P1=SQLIT
3600: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64  E_CONSTRAINT and
3610: 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a   P2=OE_Abort..**
3620: 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f 79     *  OP_Destroy
3630: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70 64  .**   *  OP_VUpd
3640: 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56  ate.**   *  OP_V
3650: 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20 20 4f  Rename.**   *  O
3660: 50 5f 46 6b 43 6f 75 6e 74 65 72 20 77 69 74 68  P_FkCounter with
3670: 20 50 32 3d 3d 30 20 28 69 6d 6d 65 64 69 61 74   P2==0 (immediat
3680: 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  e foreign key co
3690: 6e 73 74 72 61 69 6e 74 29 0a 2a 2a 20 20 20 2a  nstraint).**   *
36a0: 20 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65    OP_CreateTable
36b0: 20 61 6e 64 20 4f 50 5f 49 6e 69 74 43 6f 72 6f   and OP_InitCoro
36c0: 75 74 69 6e 65 20 28 66 6f 72 20 43 52 45 41 54  utine (for CREAT
36d0: 45 20 54 41 42 4c 45 20 41 53 20 53 45 4c 45 43  E TABLE AS SELEC
36e0: 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65  T ...).**.** The
36f0: 6e 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  n check that the
3700: 20 76 61 6c 75 65 20 6f 66 20 50 61 72 73 65 2e   value of Parse.
3710: 6d 61 79 41 62 6f 72 74 20 69 73 20 74 72 75 65  mayAbort is true
3720: 20 69 66 20 61 6e 0a 2a 2a 20 41 42 4f 52 54 20   if an.** ABORT 
3730: 6d 61 79 20 62 65 20 74 68 72 6f 77 6e 2c 20 6f  may be thrown, o
3740: 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73  r false otherwis
3750: 65 2e 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  e. Return true i
3760: 66 20 69 74 20 64 6f 65 73 0a 2a 2a 20 6d 61 74  f it does.** mat
3770: 63 68 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68  ch, or false oth
3780: 65 72 77 69 73 65 2e 20 54 68 69 73 20 66 75 6e  erwise. This fun
3790: 63 74 69 6f 6e 20 69 73 20 69 6e 74 65 6e 64 65  ction is intende
37a0: 64 20 74 6f 20 62 65 20 75 73 65 64 20 61 73 0a  d to be used as.
37b0: 2a 2a 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  ** part of an as
37c0: 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 20 69  sert statement i
37d0: 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20  n the compiler. 
37e0: 53 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a  Similar to:.**.*
37f0: 2a 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  *   assert( sqli
3800: 74 65 33 56 64 62 65 41 73 73 65 72 74 4d 61 79  te3VdbeAssertMay
3810: 41 62 6f 72 74 28 70 50 61 72 73 65 2d 3e 70 56  Abort(pParse->pV
3820: 64 62 65 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79  dbe, pParse->may
3830: 41 62 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69 6e 74  Abort) );.*/.int
3840: 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73 65   sqlite3VdbeAsse
3850: 72 74 4d 61 79 41 62 6f 72 74 28 56 64 62 65 20  rtMayAbort(Vdbe 
3860: 2a 76 2c 20 69 6e 74 20 6d 61 79 41 62 6f 72 74  *v, int mayAbort
3870: 29 7b 0a 20 20 69 6e 74 20 68 61 73 41 62 6f 72  ){.  int hasAbor
3880: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73  t = 0;.  int has
3890: 46 6b 43 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20  FkCounter = 0;. 
38a0: 20 69 6e 74 20 68 61 73 43 72 65 61 74 65 54 61   int hasCreateTa
38b0: 62 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68  ble = 0;.  int h
38c0: 61 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20  asInitCoroutine 
38d0: 3d 20 30 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a  = 0;.  Op *pOp;.
38e0: 20 20 56 64 62 65 4f 70 49 74 65 72 20 73 49 74    VdbeOpIter sIt
38f0: 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 49  er;.  memset(&sI
3900: 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ter, 0, sizeof(s
3910: 49 74 65 72 29 29 3b 0a 20 20 73 49 74 65 72 2e  Iter));.  sIter.
3920: 76 20 3d 20 76 3b 0a 0a 20 20 77 68 69 6c 65 28  v = v;..  while(
3930: 20 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65   (pOp = opIterNe
3940: 78 74 28 26 73 49 74 65 72 29 29 21 3d 30 20 29  xt(&sIter))!=0 )
3950: 7b 0a 20 20 20 20 69 6e 74 20 6f 70 63 6f 64 65  {.    int opcode
3960: 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a   = pOp->opcode;.
3970: 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d      if( opcode==
3980: 4f 50 5f 44 65 73 74 72 6f 79 20 7c 7c 20 6f 70  OP_Destroy || op
3990: 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65  code==OP_VUpdate
39a0: 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56   || opcode==OP_V
39b0: 52 65 6e 61 6d 65 20 0a 20 20 20 20 20 7c 7c 20  Rename .     || 
39c0: 28 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c  ((opcode==OP_Hal
39d0: 74 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f  t || opcode==OP_
39e0: 48 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20  HaltIfNull) .   
39f0: 20 20 20 26 26 20 28 28 70 4f 70 2d 3e 70 31 26     && ((pOp->p1&
3a00: 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f  0xff)==SQLITE_CO
3a10: 4e 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d  NSTRAINT && pOp-
3a20: 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29 0a  >p2==OE_Abort)).
3a30: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 68 61 73      ){.      has
3a40: 41 62 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20  Abort = 1;.     
3a50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3a60: 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50    if( opcode==OP
3a70: 5f 43 72 65 61 74 65 54 61 62 6c 65 20 29 20 68  _CreateTable ) h
3a80: 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 3d 20  asCreateTable = 
3a90: 31 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64  1;.    if( opcod
3aa0: 65 3d 3d 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74  e==OP_InitCorout
3ab0: 69 6e 65 20 29 20 68 61 73 49 6e 69 74 43 6f 72  ine ) hasInitCor
3ac0: 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 23 69 66 6e  outine = 1;.#ifn
3ad0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3ae0: 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20  FOREIGN_KEY.    
3af0: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46  if( opcode==OP_F
3b00: 6b 43 6f 75 6e 74 65 72 20 26 26 20 70 4f 70 2d  kCounter && pOp-
3b10: 3e 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1==0 && pOp->p
3b20: 32 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 68 61  2==1 ){.      ha
3b30: 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 31 3b 0a  sFkCounter = 1;.
3b40: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
3b50: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
3b60: 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70  (v->db, sIter.ap
3b70: 53 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75  Sub);..  /* Retu
3b80: 72 6e 20 74 72 75 65 20 69 66 20 68 61 73 41 62  rn true if hasAb
3b90: 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20 4f  ort==mayAbort. O
3ba0: 72 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61  r if a malloc fa
3bb0: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a  ilure occurred..
3bc0: 20 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20 66    ** If malloc f
3bd0: 61 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  ailed, then the 
3be0: 77 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62 6f  while() loop abo
3bf0: 76 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  ve may not have 
3c00: 69 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74 68  iterated.  ** th
3c10: 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65  rough all opcode
3c20: 73 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20 6d  s and hasAbort m
3c30: 61 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72 72  ay be set incorr
3c40: 65 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20 20  ectly. Return.  
3c50: 2a 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69 73  ** true for this
3c60: 20 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e 74   case to prevent
3c70: 20 74 68 65 20 61 73 73 65 72 74 28 29 20 69 6e   the assert() in
3c80: 20 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72 61   the callers fra
3c90: 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61 69  me.  ** from fai
3ca0: 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74 75  ling.  */.  retu
3cb0: 72 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c 6c  rn ( v->db->mall
3cc0: 6f 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73 41  ocFailed || hasA
3cd0: 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20 7c  bort==mayAbort |
3ce0: 7c 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 0a 20  | hasFkCounter. 
3cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
3d00: 28 68 61 73 43 72 65 61 74 65 54 61 62 6c 65 20  (hasCreateTable 
3d10: 26 26 20 68 61 73 49 6e 69 74 43 6f 72 6f 75 74  && hasInitCorout
3d20: 69 6e 65 29 20 29 3b 0a 7d 0a 23 65 6e 64 69 66  ine) );.}.#endif
3d30: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
3d40: 20 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41 73   - the sqlite3As
3d50: 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20 66  sertMayAbort() f
3d60: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a  unction */../*.*
3d70: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3d80: 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61  s called after a
3d90: 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20  ll opcodes have 
3da0: 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 20 20  been inserted.  
3db0: 49 74 20 6c 6f 6f 70 73 0a 2a 2a 20 74 68 72 6f  It loops.** thro
3dc0: 75 67 68 20 61 6c 6c 20 74 68 65 20 6f 70 63 6f  ugh all the opco
3dd0: 64 65 73 20 61 6e 64 20 66 69 78 65 73 20 75 70  des and fixes up
3de0: 20 73 6f 6d 65 20 64 65 74 61 69 6c 73 2e 0a 2a   some details..*
3df0: 2a 0a 2a 2a 20 28 31 29 20 46 6f 72 20 65 61 63  *.** (1) For eac
3e00: 68 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69  h jump instructi
3e10: 6f 6e 20 77 69 74 68 20 61 20 6e 65 67 61 74 69  on with a negati
3e20: 76 65 20 50 32 20 76 61 6c 75 65 20 28 61 20 6c  ve P2 value (a l
3e30: 61 62 65 6c 29 0a 2a 2a 20 20 20 20 20 72 65 73  abel).**     res
3e40: 6f 6c 76 65 20 74 68 65 20 50 32 20 76 61 6c 75  olve the P2 valu
3e50: 65 20 74 6f 20 61 6e 20 61 63 74 75 61 6c 20 61  e to an actual a
3e60: 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 28 32  ddress..**.** (2
3e70: 29 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6d 61  ) Compute the ma
3e80: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
3e90: 61 72 67 75 6d 65 6e 74 73 20 75 73 65 64 20 62  arguments used b
3ea0: 79 20 61 6e 79 20 53 51 4c 20 66 75 6e 63 74 69  y any SQL functi
3eb0: 6f 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 73 74  on.**     and st
3ec0: 6f 72 65 20 74 68 61 74 20 76 61 6c 75 65 20 69  ore that value i
3ed0: 6e 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 2e  n *pMaxFuncArgs.
3ee0: 0a 2a 2a 0a 2a 2a 20 28 33 29 20 55 70 64 61 74  .**.** (3) Updat
3ef0: 65 20 74 68 65 20 56 64 62 65 2e 72 65 61 64 4f  e the Vdbe.readO
3f00: 6e 6c 79 20 61 6e 64 20 56 64 62 65 2e 62 49 73  nly and Vdbe.bIs
3f10: 52 65 61 64 65 72 20 66 6c 61 67 73 20 74 6f 20  Reader flags to 
3f20: 61 63 63 75 72 61 74 65 6c 79 0a 2a 2a 20 20 20  accurately.**   
3f30: 20 20 69 6e 64 69 63 61 74 65 20 77 68 61 74 20    indicate what 
3f40: 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
3f50: 74 65 6d 65 6e 74 20 61 63 74 75 61 6c 6c 79 20  tement actually 
3f60: 64 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 34 29 20  does..**.** (4) 
3f70: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 70  Initialize the p
3f80: 34 2e 78 41 64 76 61 6e 63 65 20 70 6f 69 6e 74  4.xAdvance point
3f90: 65 72 20 6f 6e 20 6f 70 63 6f 64 65 73 20 74 68  er on opcodes th
3fa0: 61 74 20 75 73 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  at use it..**.**
3fb0: 20 28 35 29 20 52 65 63 6c 61 69 6d 20 74 68 65   (5) Reclaim the
3fc0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65   memory allocate
3fd0: 64 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 6c 61  d for storing la
3fe0: 62 65 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bels..*/.static 
3ff0: 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32 56 61  void resolveP2Va
4000: 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20 69 6e  lues(Vdbe *p, in
4010: 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 29  t *pMaxFuncArgs)
4020: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
4030: 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a 70 4d 61   nMaxArgs = *pMa
4040: 78 46 75 6e 63 41 72 67 73 3b 0a 20 20 4f 70 20  xFuncArgs;.  Op 
4050: 2a 70 4f 70 3b 0a 20 20 50 61 72 73 65 20 2a 70  *pOp;.  Parse *p
4060: 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73  Parse = p->pPars
4070: 65 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c  e;.  int *aLabel
4080: 20 3d 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65   = pParse->aLabe
4090: 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79  l;.  p->readOnly
40a0: 20 3d 20 31 3b 0a 20 20 70 2d 3e 62 49 73 52 65   = 1;.  p->bIsRe
40b0: 61 64 65 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28  ader = 0;.  for(
40c0: 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d  pOp=p->aOp, i=p-
40d0: 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  >nOp-1; i>=0; i-
40e0: 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 75  -, pOp++){.    u
40f0: 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e  8 opcode = pOp->
4100: 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 2f 2a 20  opcode;..    /* 
4110: 4e 4f 54 45 3a 20 42 65 20 73 75 72 65 20 74 6f  NOTE: Be sure to
4120: 20 75 70 64 61 74 65 20 6d 6b 6f 70 63 6f 64 65   update mkopcode
4130: 68 2e 74 63 6c 20 77 68 65 6e 20 61 64 64 69 6e  h.tcl when addin
4140: 67 20 6f 72 20 72 65 6d 6f 76 69 6e 67 0a 20 20  g or removing.  
4150: 20 20 2a 2a 20 63 61 73 65 73 20 66 72 6f 6d 20    ** cases from 
4160: 74 68 69 73 20 73 77 69 74 63 68 21 20 2a 2f 0a  this switch! */.
4170: 20 20 20 20 73 77 69 74 63 68 28 20 6f 70 63 6f      switch( opco
4180: 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  de ){.      case
4190: 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a   OP_Transaction:
41a0: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   {.        if( p
41b0: 4f 70 2d 3e 70 32 21 3d 30 20 29 20 70 2d 3e 72  Op->p2!=0 ) p->r
41c0: 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20  eadOnly = 0;.   
41d0: 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20 74 68 72       /* fall thr
41e0: 75 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  u */.      }.   
41f0: 20 20 20 63 61 73 65 20 4f 50 5f 41 75 74 6f 43     case OP_AutoC
4200: 6f 6d 6d 69 74 3a 0a 20 20 20 20 20 20 63 61 73  ommit:.      cas
4210: 65 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 3a 20  e OP_Savepoint: 
4220: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 62 49 73  {.        p->bIs
4230: 52 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20  Reader = 1;.    
4240: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4250: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
4260: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20  E_OMIT_WAL.     
4270: 20 63 61 73 65 20 4f 50 5f 43 68 65 63 6b 70 6f   case OP_Checkpo
4280: 69 6e 74 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20  int:.#endif.    
4290: 20 20 63 61 73 65 20 4f 50 5f 56 61 63 75 75 6d    case OP_Vacuum
42a0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  :.      case OP_
42b0: 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b 0a 20  JournalMode: {. 
42c0: 20 20 20 20 20 20 20 70 2d 3e 72 65 61 64 4f 6e         p->readOn
42d0: 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ly = 0;.        
42e0: 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 31  p->bIsReader = 1
42f0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
4300: 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
4310: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
4320: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
4330: 63 61 73 65 20 4f 50 5f 56 55 70 64 61 74 65 3a  case OP_VUpdate:
4340: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   {.        if( p
4350: 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20  Op->p2>nMaxArgs 
4360: 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70  ) nMaxArgs = pOp
4370: 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 62 72  ->p2;.        br
4380: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4390: 20 20 20 63 61 73 65 20 4f 50 5f 56 46 69 6c 74     case OP_VFilt
43a0: 65 72 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e  er: {.        in
43b0: 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73  t n;.        ass
43c0: 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d 20 69 20  ert( p->nOp - i 
43d0: 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20 20 20 20  >= 3 );.        
43e0: 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e  assert( pOp[-1].
43f0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67  opcode==OP_Integ
4400: 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20 6e 20  er );.        n 
4410: 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20  = pOp[-1].p1;.  
4420: 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78        if( n>nMax
4430: 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20  Args ) nMaxArgs 
4440: 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = n;.        bre
4450: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ak;.      }.#end
4460: 69 66 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  if.      case OP
4470: 5f 4e 65 78 74 3a 0a 20 20 20 20 20 20 63 61 73  _Next:.      cas
4480: 65 20 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 3a  e OP_NextIfOpen:
4490: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53  .      case OP_S
44a0: 6f 72 74 65 72 4e 65 78 74 3a 20 7b 0a 20 20 20  orterNext: {.   
44b0: 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64       pOp->p4.xAd
44c0: 76 61 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42  vance = sqlite3B
44d0: 74 72 65 65 4e 65 78 74 3b 0a 20 20 20 20 20 20  treeNext;.      
44e0: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
44f0: 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20  P4_ADVANCE;.    
4500: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4510: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50   }.      case OP
4520: 5f 50 72 65 76 3a 0a 20 20 20 20 20 20 63 61 73  _Prev:.      cas
4530: 65 20 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e 3a  e OP_PrevIfOpen:
4540: 20 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e   {.        pOp->
4550: 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73 71  p4.xAdvance = sq
4560: 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
4570: 75 73 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  us;.        pOp-
4580: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56  >p4type = P4_ADV
4590: 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 62 72  ANCE;.        br
45a0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
45b0: 20 7d 0a 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 66   }..    pOp->opf
45c0: 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33 4f 70  lags = sqlite3Op
45d0: 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 6f 70 63  codeProperty[opc
45e0: 6f 64 65 5d 3b 0a 20 20 20 20 69 66 28 20 28 70  ode];.    if( (p
45f0: 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50  Op->opflags & OP
4600: 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20  FLG_JUMP)!=0 && 
4610: 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20  pOp->p2<0 ){.   
4620: 20 20 20 61 73 73 65 72 74 28 20 41 44 44 52 28     assert( ADDR(
4630: 70 4f 70 2d 3e 70 32 29 3c 70 50 61 72 73 65 2d  pOp->p2)<pParse-
4640: 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20  >nLabel );.     
4650: 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65   pOp->p2 = aLabe
4660: 6c 5b 41 44 44 52 28 70 4f 70 2d 3e 70 32 29 5d  l[ADDR(pOp->p2)]
4670: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
4680: 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64  lite3DbFree(p->d
4690: 62 2c 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65  b, pParse->aLabe
46a0: 6c 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 4c  l);.  pParse->aL
46b0: 61 62 65 6c 20 3d 20 30 3b 0a 20 20 70 50 61 72  abel = 0;.  pPar
46c0: 73 65 2d 3e 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a  se->nLabel = 0;.
46d0: 20 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20    *pMaxFuncArgs 
46e0: 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 20 20 61 73  = nMaxArgs;.  as
46f0: 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64  sert( p->bIsRead
4700: 65 72 21 3d 30 20 7c 7c 20 44 62 4d 61 73 6b 41  er!=0 || DbMaskA
4710: 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d  llZero(p->btreeM
4720: 61 73 6b 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ask) );.}../*.**
4730: 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72   Return the addr
4740: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
4750: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  instruction to b
4760: 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69  e inserted..*/.i
4770: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  nt sqlite3VdbeCu
4780: 72 72 65 6e 74 41 64 64 72 28 56 64 62 65 20 2a  rrentAddr(Vdbe *
4790: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
47a0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
47b0: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65 74  IC_INIT );.  ret
47c0: 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f  urn p->nOp;.}../
47d0: 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74  *.** Verify that
47e0: 20 61 74 20 6c 65 61 73 74 20 4e 20 6f 70 63 6f   at least N opco
47f0: 64 65 20 73 6c 6f 74 73 20 61 72 65 20 61 76 61  de slots are ava
4800: 69 6c 61 62 6c 65 20 69 6e 20 70 20 77 69 74 68  ilable in p with
4810: 6f 75 74 0a 2a 2a 20 68 61 76 69 6e 67 20 74 6f  out.** having to
4820: 20 6d 61 6c 6c 6f 63 20 66 6f 72 20 6d 6f 72 65   malloc for more
4830: 20 73 70 61 63 65 20 28 65 78 63 65 70 74 20 77   space (except w
4840: 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20 75 73 69  hen compiled usi
4850: 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53  ng.** SQLITE_TES
4860: 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  T_REALLOC_STRESS
4870: 29 2e 20 20 54 68 69 73 20 69 6e 74 65 72 66 61  ).  This interfa
4880: 63 65 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  ce is used durin
4890: 67 20 74 65 73 74 69 6e 67 0a 2a 2a 20 74 6f 20  g testing.** to 
48a0: 76 65 72 69 66 79 20 74 68 61 74 20 63 65 72 74  verify that cert
48b0: 61 69 6e 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ain calls to sql
48c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
48d0: 74 28 29 20 63 61 6e 20 6e 65 76 65 72 0a 2a 2a  t() can never.**
48e0: 20 66 61 69 6c 20 64 75 65 20 74 6f 20 61 20 4f   fail due to a O
48f0: 4f 4d 20 66 61 75 6c 74 20 61 6e 64 20 68 65 6e  OM fault and hen
4900: 63 65 20 74 68 61 74 20 74 68 65 20 72 65 74 75  ce that the retu
4910: 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a  rn value from.**
4920: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4930: 70 4c 69 73 74 28 29 20 77 69 6c 6c 20 61 6c 77  pList() will alw
4940: 61 79 73 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e  ays be non-NULL.
4950: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
4960: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26  SQLITE_DEBUG) &&
4970: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
4980: 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54  _TEST_REALLOC_ST
4990: 52 45 53 53 29 0a 76 6f 69 64 20 73 71 6c 69 74  RESS).void sqlit
49a0: 65 33 56 64 62 65 56 65 72 69 66 79 4e 6f 4d 61  e3VdbeVerifyNoMa
49b0: 6c 6c 6f 63 52 65 71 75 69 72 65 64 28 56 64 62  llocRequired(Vdb
49c0: 65 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  e *p, int N){.  
49d0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2b  assert( p->nOp +
49e0: 20 4e 20 3c 3d 20 70 2d 3e 70 50 61 72 73 65 2d   N <= p->pParse-
49f0: 3e 6e 4f 70 41 6c 6c 6f 63 20 29 3b 0a 7d 0a 23  >nOpAlloc );.}.#
4a00: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
4a10: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
4a20: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
4a30: 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63  the array of opc
4a40: 6f 64 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  odes associated 
4a50: 77 69 74 68 0a 2a 2a 20 74 68 65 20 56 64 62 65  with.** the Vdbe
4a60: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
4a70: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49  irst argument. I
4a80: 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73  t is the callers
4a90: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a   responsibility.
4aa0: 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65 20 66 6f  ** to arrange fo
4ab0: 72 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 61  r the returned a
4ac0: 72 72 61 79 20 74 6f 20 62 65 20 65 76 65 6e 74  rray to be event
4ad0: 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e  ually freed usin
4ae0: 67 20 74 68 65 20 0a 2a 2a 20 76 64 62 65 46 72  g the .** vdbeFr
4af0: 65 65 4f 70 41 72 72 61 79 28 29 20 66 75 6e 63  eeOpArray() func
4b00: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f  tion..**.** Befo
4b10: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70  re returning, *p
4b20: 6e 4f 70 20 69 73 20 73 65 74 20 74 6f 20 74 68  nOp is set to th
4b30: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
4b40: 69 65 73 20 69 6e 20 74 68 65 20 72 65 74 75 72  ies in the retur
4b50: 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c  ned.** array. Al
4b60: 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69 73  so, *pnMaxArg is
4b70: 20 73 65 74 20 74 6f 20 74 68 65 20 6c 61 72 67   set to the larg
4b80: 65 72 20 6f 66 20 69 74 73 20 63 75 72 72 65 6e  er of its curren
4b90: 74 20 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20  t value and .** 
4ba0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
4bb0: 74 72 69 65 73 20 69 6e 20 74 68 65 20 56 64 62  tries in the Vdb
4bc0: 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 20  e.apArg[] array 
4bd0: 72 65 71 75 69 72 65 64 20 74 6f 20 65 78 65 63  required to exec
4be0: 75 74 65 20 74 68 65 20 0a 2a 2a 20 72 65 74 75  ute the .** retu
4bf0: 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  rned program..*/
4c00: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33  .VdbeOp *sqlite3
4c10: 56 64 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28  VdbeTakeOpArray(
4c20: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  Vdbe *p, int *pn
4c30: 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72  Op, int *pnMaxAr
4c40: 67 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f  g){.  VdbeOp *aO
4c50: 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73  p = p->aOp;.  as
4c60: 73 65 72 74 28 20 61 4f 70 20 26 26 20 21 70 2d  sert( aOp && !p-
4c70: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
4c80: 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  d );..  /* Check
4c90: 20 74 68 61 74 20 73 71 6c 69 74 65 33 56 64 62   that sqlite3Vdb
4ca0: 65 55 73 65 73 42 74 72 65 65 28 29 20 77 61 73  eUsesBtree() was
4cb0: 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74   not called on t
4cc0: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65  his VM */.  asse
4cd0: 72 74 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72  rt( DbMaskAllZer
4ce0: 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20  o(p->btreeMask) 
4cf0: 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56  );..  resolveP2V
4d00: 61 6c 75 65 73 28 70 2c 20 70 6e 4d 61 78 41 72  alues(p, pnMaxAr
4d10: 67 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d  g);.  *pnOp = p-
4d20: 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d  >nOp;.  p->aOp =
4d30: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f 70   0;.  return aOp
4d40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
4d50: 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f   whole list of o
4d60: 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65  perations to the
4d70: 20 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b   operation stack
4d80: 2e 20 20 52 65 74 75 72 6e 20 61 0a 2a 2a 20 70  .  Return a.** p
4d90: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66 69  ointer to the fi
4da0: 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e  rst operation in
4db0: 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  serted..**.** No
4dc0: 6e 2d 7a 65 72 6f 20 50 32 20 61 72 67 75 6d 65  n-zero P2 argume
4dd0: 6e 74 73 20 74 6f 20 6a 75 6d 70 20 69 6e 73 74  nts to jump inst
4de0: 72 75 63 74 69 6f 6e 73 20 61 72 65 20 61 75 74  ructions are aut
4df0: 6f 6d 61 74 69 63 61 6c 6c 79 20 61 64 6a 75 73  omatically adjus
4e00: 74 65 64 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74  ted.** so that t
4e10: 68 65 20 6a 75 6d 70 20 74 61 72 67 65 74 20 69  he jump target i
4e20: 73 20 72 65 6c 61 74 69 76 65 20 74 6f 20 74 68  s relative to th
4e30: 65 20 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f  e first operatio
4e40: 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 56  n inserted..*/.V
4e50: 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64  dbeOp *sqlite3Vd
4e60: 62 65 41 64 64 4f 70 4c 69 73 74 28 0a 20 20 56  beAddOpList(.  V
4e70: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
4e80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
4e90: 64 64 20 6f 70 63 6f 64 65 73 20 74 6f 20 74 68  dd opcodes to th
4ea0: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
4eb0: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  ment */.  int nO
4ec0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
4ed0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4ee0: 20 6f 66 20 6f 70 63 6f 64 65 73 20 74 6f 20 61   of opcodes to a
4ef0: 64 64 20 2a 2f 0a 20 20 56 64 62 65 4f 70 4c 69  dd */.  VdbeOpLi
4f00: 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70 2c 20 20  st const *aOp,  
4f10: 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f       /* The opco
4f20: 64 65 73 20 74 6f 20 62 65 20 61 64 64 65 64 20  des to be added 
4f30: 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 6e 6f  */.  int iLineno
4f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f50: 20 20 2f 2a 20 53 6f 75 72 63 65 2d 66 69 6c 65    /* Source-file
4f60: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20   line number of 
4f70: 66 69 72 73 74 20 6f 70 63 6f 64 65 20 2a 2f 0a  first opcode */.
4f80: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64  ){.  int i;.  Vd
4f90: 62 65 4f 70 20 2a 70 4f 75 74 2c 20 2a 70 46 69  beOp *pOut, *pFi
4fa0: 72 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  rst;.  assert( n
4fb0: 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  Op>0 );.  assert
4fc0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
4fd0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
4fe0: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f   if( p->nOp + nO
4ff0: 70 20 3e 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e  p > p->pParse->n
5000: 4f 70 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f  OpAlloc && growO
5010: 70 41 72 72 61 79 28 70 2c 20 6e 4f 70 29 20 29  pArray(p, nOp) )
5020: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
5030: 20 20 7d 0a 20 20 70 46 69 72 73 74 20 3d 20 70    }.  pFirst = p
5040: 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d  Out = &p->aOp[p-
5050: 3e 6e 4f 70 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  >nOp];.  for(i=0
5060: 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 61 4f  ; i<nOp; i++, aO
5070: 70 2b 2b 2c 20 70 4f 75 74 2b 2b 29 7b 0a 20 20  p++, pOut++){.  
5080: 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d    pOut->opcode =
5090: 20 61 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20   aOp->opcode;.  
50a0: 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20 61 4f 70    pOut->p1 = aOp
50b0: 2d 3e 70 31 3b 0a 20 20 20 20 70 4f 75 74 2d 3e  ->p1;.    pOut->
50c0: 70 32 20 3d 20 61 4f 70 2d 3e 70 32 3b 0a 20 20  p2 = aOp->p2;.  
50d0: 20 20 61 73 73 65 72 74 28 20 61 4f 70 2d 3e 70    assert( aOp->p
50e0: 32 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  2>=0 );.    if( 
50f0: 28 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72  (sqlite3OpcodePr
5100: 6f 70 65 72 74 79 5b 61 4f 70 2d 3e 6f 70 63 6f  operty[aOp->opco
5110: 64 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50  de] & OPFLG_JUMP
5120: 29 21 3d 30 20 26 26 20 61 4f 70 2d 3e 70 32 3e  )!=0 && aOp->p2>
5130: 30 20 29 7b 0a 20 20 20 20 20 20 70 4f 75 74 2d  0 ){.      pOut-
5140: 3e 70 32 20 2b 3d 20 70 2d 3e 6e 4f 70 3b 0a 20  >p2 += p->nOp;. 
5150: 20 20 20 7d 0a 20 20 20 20 70 4f 75 74 2d 3e 70     }.    pOut->p
5160: 33 20 3d 20 61 4f 70 2d 3e 70 33 3b 0a 20 20 20  3 = aOp->p3;.   
5170: 20 70 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d 20   pOut->p4type = 
5180: 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20  P4_NOTUSED;.    
5190: 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a  pOut->p4.p = 0;.
51a0: 20 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30      pOut->p5 = 0
51b0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
51c0: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
51d0: 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 70 4f 75 74  OMMENTS.    pOut
51e0: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a  ->zComment = 0;.
51f0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
5200: 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41  LITE_VDBE_COVERA
5210: 47 45 0a 20 20 20 20 70 4f 75 74 2d 3e 69 53 72  GE.    pOut->iSr
5220: 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 6e 6f 2b  cLine = iLineno+
5230: 69 3b 0a 23 65 6c 73 65 0a 20 20 20 20 28 76 6f  i;.#else.    (vo
5240: 69 64 29 69 4c 69 6e 65 6e 6f 3b 0a 23 65 6e 64  id)iLineno;.#end
5250: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
5260: 5f 44 45 42 55 47 0a 20 20 20 20 69 66 28 20 70  _DEBUG.    if( p
5270: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
5280: 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
5290: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ace ){.      sql
52a0: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
52b0: 30 2c 20 69 2b 70 2d 3e 6e 4f 70 2c 20 26 70 2d  0, i+p->nOp, &p-
52c0: 3e 61 4f 70 5b 69 2b 70 2d 3e 6e 4f 70 5d 29 3b  >aOp[i+p->nOp]);
52d0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
52e0: 7d 0a 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f  }.  p->nOp += nO
52f0: 70 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 69 72  p;.  return pFir
5300: 73 74 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  st;.}..#if defin
5310: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
5320: 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
5330: 29 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65  )./*.** Add an e
5340: 6e 74 72 79 20 74 6f 20 74 68 65 20 61 72 72 61  ntry to the arra
5350: 79 20 6f 66 20 63 6f 75 6e 74 65 72 73 20 6d 61  y of counters ma
5360: 6e 61 67 65 64 20 62 79 20 73 71 6c 69 74 65 33  naged by sqlite3
5370: 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73  _stmt_scanstatus
5380: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
5390: 74 65 33 56 64 62 65 53 63 61 6e 53 74 61 74 75  te3VdbeScanStatu
53a0: 73 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  s(.  Vdbe *p,   
53b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53c0: 20 20 20 20 20 2f 2a 20 56 4d 20 74 6f 20 61 64       /* VM to ad
53d0: 64 20 73 63 61 6e 73 74 61 74 75 73 28 29 20 74  d scanstatus() t
53e0: 6f 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45  o */.  int addrE
53f0: 78 70 6c 61 69 6e 2c 20 20 20 20 20 20 20 20 20  xplain,         
5400: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
5410: 73 20 6f 66 20 4f 50 5f 45 78 70 6c 61 69 6e 20  s of OP_Explain 
5420: 28 6f 72 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20  (or 0) */.  int 
5430: 61 64 64 72 4c 6f 6f 70 2c 20 20 20 20 20 20 20  addrLoop,       
5440: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
5450: 64 64 72 65 73 73 20 6f 66 20 6c 6f 6f 70 20 63  ddress of loop c
5460: 6f 75 6e 74 65 72 20 2a 2f 20 0a 20 20 69 6e 74  ounter */ .  int
5470: 20 61 64 64 72 56 69 73 69 74 2c 20 20 20 20 20   addrVisit,     
5480: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5490: 41 64 64 72 65 73 73 20 6f 66 20 72 6f 77 73 20  Address of rows 
54a0: 76 69 73 69 74 65 64 20 63 6f 75 6e 74 65 72 20  visited counter 
54b0: 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 45 73 74  */.  LogEst nEst
54c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
54d0: 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65       /* Estimate
54e0: 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  d number of outp
54f0: 75 74 20 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6e  ut rows */.  con
5500: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
5510: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5520: 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 6f 72  Name of table or
5530: 20 69 6e 64 65 78 20 62 65 69 6e 67 20 73 63 61   index being sca
5540: 6e 6e 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  nned */.){.  int
5550: 20 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 63   nByte = (p->nSc
5560: 61 6e 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28 53  an+1) * sizeof(S
5570: 63 61 6e 53 74 61 74 75 73 29 3b 0a 20 20 53 63  canStatus);.  Sc
5580: 61 6e 53 74 61 74 75 73 20 2a 61 4e 65 77 3b 0a  anStatus *aNew;.
5590: 20 20 61 4e 65 77 20 3d 20 28 53 63 61 6e 53 74    aNew = (ScanSt
55a0: 61 74 75 73 2a 29 73 71 6c 69 74 65 33 44 62 52  atus*)sqlite3DbR
55b0: 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d  ealloc(p->db, p-
55c0: 3e 61 53 63 61 6e 2c 20 6e 42 79 74 65 29 3b 0a  >aScan, nByte);.
55d0: 20 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20    if( aNew ){.  
55e0: 20 20 53 63 61 6e 53 74 61 74 75 73 20 2a 70 4e    ScanStatus *pN
55f0: 65 77 20 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e 53  ew = &aNew[p->nS
5600: 63 61 6e 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65 77  can++];.    pNew
5610: 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20  ->addrExplain = 
5620: 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20  addrExplain;.   
5630: 20 70 4e 65 77 2d 3e 61 64 64 72 4c 6f 6f 70 20   pNew->addrLoop 
5640: 3d 20 61 64 64 72 4c 6f 6f 70 3b 0a 20 20 20 20  = addrLoop;.    
5650: 70 4e 65 77 2d 3e 61 64 64 72 56 69 73 69 74 20  pNew->addrVisit 
5660: 3d 20 61 64 64 72 56 69 73 69 74 3b 0a 20 20 20  = addrVisit;.   
5670: 20 70 4e 65 77 2d 3e 6e 45 73 74 20 3d 20 6e 45   pNew->nEst = nE
5680: 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4e  st;.    pNew->zN
5690: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
56a0: 74 72 44 75 70 28 70 2d 3e 64 62 2c 20 7a 4e 61  trDup(p->db, zNa
56b0: 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 61 53 63 61  me);.    p->aSca
56c0: 6e 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a  n = aNew;.  }.}.
56d0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43  #endif.../*.** C
56e0: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
56f0: 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 2c 20 6f  of the opcode, o
5700: 72 20 50 31 2c 20 50 32 2c 20 50 33 2c 20 6f 72  r P1, P2, P3, or
5710: 20 50 35 20 6f 70 65 72 61 6e 64 73 0a 2a 2a 20   P5 operands.** 
5720: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
5730: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
5740: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
5750: 68 61 6e 67 65 4f 70 63 6f 64 65 28 56 64 62 65  hangeOpcode(Vdbe
5760: 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 75   *p, u32 addr, u
5770: 38 20 69 4e 65 77 4f 70 63 6f 64 65 29 7b 0a 20  8 iNewOpcode){. 
5780: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
5790: 70 28 70 2c 61 64 64 72 29 2d 3e 6f 70 63 6f 64  p(p,addr)->opcod
57a0: 65 20 3d 20 69 4e 65 77 4f 70 63 6f 64 65 3b 0a  e = iNewOpcode;.
57b0: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
57c0: 62 65 43 68 61 6e 67 65 50 31 28 56 64 62 65 20  beChangeP1(Vdbe 
57d0: 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e  *p, u32 addr, in
57e0: 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65  t val){.  sqlite
57f0: 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64  3VdbeGetOp(p,add
5800: 72 29 2d 3e 70 31 20 3d 20 76 61 6c 3b 0a 7d 0a  r)->p1 = val;.}.
5810: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
5820: 43 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70  ChangeP2(Vdbe *p
5830: 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20  , u32 addr, int 
5840: 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  val){.  sqlite3V
5850: 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29  dbeGetOp(p,addr)
5860: 2d 3e 70 32 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f  ->p2 = val;.}.vo
5870: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
5880: 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20  angeP3(Vdbe *p, 
5890: 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61  u32 addr, int va
58a0: 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  l){.  sqlite3Vdb
58b0: 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e  eGetOp(p,addr)->
58c0: 70 33 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64  p3 = val;.}.void
58d0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
58e0: 67 65 50 35 28 56 64 62 65 20 2a 70 2c 20 75 38  geP5(Vdbe *p, u8
58f0: 20 70 35 29 7b 0a 20 20 69 66 28 20 21 70 2d 3e   p5){.  if( !p->
5900: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
5910: 20 29 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70   ) p->aOp[p->nOp
5920: 2d 31 5d 2e 70 35 20 3d 20 70 35 3b 0a 7d 0a 0a  -1].p5 = p5;.}..
5930: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
5940: 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 69   P2 operand of i
5950: 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72 20  nstruction addr 
5960: 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
5970: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72  s to.** the addr
5980: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
5990: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  instruction to b
59a0: 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64  e coded..*/.void
59b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
59c0: 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69 6e  Here(Vdbe *p, in
59d0: 74 20 61 64 64 72 29 7b 0a 20 20 70 2d 3e 70 50  t addr){.  p->pP
59e0: 61 72 73 65 2d 3e 69 46 69 78 65 64 4f 70 20 3d  arse->iFixedOp =
59f0: 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 73   p->nOp - 1;.  s
5a00: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
5a10: 50 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e  P2(p, addr, p->n
5a20: 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  Op);.}.../*.** I
5a30: 66 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e 63  f the input Func
5a40: 44 65 66 20 73 74 72 75 63 74 75 72 65 20 69 73  Def structure is
5a50: 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65 6e   ephemeral, then
5a60: 20 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a 2a   free it.  If.**
5a70: 20 74 68 65 20 46 75 6e 63 44 65 66 20 69 73 20   the FuncDef is 
5a80: 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74 68  not ephermal, th
5a90: 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a  en do nothing..*
5aa0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
5ab0: 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74  eeEphemeralFunct
5ac0: 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ion(sqlite3 *db,
5ad0: 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29 7b   FuncDef *pDef){
5ae0: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 44  .  if( ALWAYS(pD
5af0: 65 66 29 20 26 26 20 28 70 44 65 66 2d 3e 66 75  ef) && (pDef->fu
5b00: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
5b10: 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30 20  _FUNC_EPHEM)!=0 
5b20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
5b30: 46 72 65 65 28 64 62 2c 20 70 44 65 66 29 3b 0a  Free(db, pDef);.
5b40: 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
5b50: 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  id vdbeFreeOpArr
5b60: 61 79 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f 70  ay(sqlite3 *, Op
5b70: 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a   *, int);../*.**
5b80: 20 44 65 6c 65 74 65 20 61 20 50 34 20 76 61 6c   Delete a P4 val
5b90: 75 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ue if necessary.
5ba0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5bb0: 66 72 65 65 50 34 28 73 71 6c 69 74 65 33 20 2a  freeP4(sqlite3 *
5bc0: 64 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c 20  db, int p4type, 
5bd0: 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20 69 66 28  void *p4){.  if(
5be0: 20 70 34 20 29 7b 0a 20 20 20 20 61 73 73 65 72   p4 ){.    asser
5bf0: 74 28 20 64 62 20 29 3b 0a 20 20 20 20 73 77 69  t( db );.    swi
5c00: 74 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a 20  tch( p4type ){. 
5c10: 20 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e       case P4_FUN
5c20: 43 43 54 58 3a 20 7b 0a 20 20 20 20 20 20 20 20  CCTX: {.        
5c30: 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e  freeEphemeralFun
5c40: 63 74 69 6f 6e 28 64 62 2c 20 28 28 73 71 6c 69  ction(db, ((sqli
5c50: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 70 34 29  te3_context*)p4)
5c60: 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 20 20 20 20  ->pFunc);.      
5c70: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
5c80: 68 20 69 6e 74 6f 20 74 68 65 20 6e 65 78 74 20  h into the next 
5c90: 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  case */.      }.
5ca0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 52 45        case P4_RE
5cb0: 41 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  AL:.      case P
5cc0: 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20 20 63  4_INT64:.      c
5cd0: 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a  ase P4_DYNAMIC:.
5ce0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e        case P4_IN
5cf0: 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20  TARRAY: {.      
5d00: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5d10: 64 62 2c 20 70 34 29 3b 0a 20 20 20 20 20 20 20  db, p4);.       
5d20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
5d30: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45        case P4_KE
5d40: 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 20  YINFO: {.       
5d50: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
5d60: 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74  Freed==0 ) sqlit
5d70: 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 28  e3KeyInfoUnref((
5d80: 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a 20 20  KeyInfo*)p4);.  
5d90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5da0: 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
5db0: 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52  TE_ENABLE_CURSOR
5dc0: 5f 48 49 4e 54 53 0a 20 20 20 20 20 20 63 61 73  _HINTS.      cas
5dd0: 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20 20  e P4_EXPR: {.   
5de0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
5df0: 44 65 6c 65 74 65 28 64 62 2c 20 28 45 78 70 72  Delete(db, (Expr
5e00: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62  *)p4);.        b
5e10: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65  reak;.      }.#e
5e20: 6e 64 69 66 0a 20 20 20 20 20 20 63 61 73 65 20  ndif.      case 
5e30: 50 34 5f 4d 50 52 49 4e 54 46 3a 20 7b 0a 20 20  P4_MPRINTF: {.  
5e40: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e        if( db->pn
5e50: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20  BytesFreed==0 ) 
5e60: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 34 29  sqlite3_free(p4)
5e70: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
5e80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
5e90: 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20  ase P4_FUNCDEF: 
5ea0: 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 45 70  {.        freeEp
5eb0: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
5ec0: 64 62 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34  db, (FuncDef*)p4
5ed0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
5ee0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5ef0: 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20  case P4_MEM: {. 
5f00: 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70         if( db->p
5f10: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29  nBytesFreed==0 )
5f20: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
5f30: 74 65 33 56 61 6c 75 65 46 72 65 65 28 28 73 71  te3ValueFree((sq
5f40: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 34 29  lite3_value*)p4)
5f50: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
5f60: 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 20 2a  .          Mem *
5f70: 70 20 3d 20 28 4d 65 6d 2a 29 70 34 3b 0a 20 20  p = (Mem*)p4;.  
5f80: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73          if( p->s
5f90: 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65  zMalloc ) sqlite
5fa0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
5fb0: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20  Malloc);.       
5fc0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
5fd0: 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20  (db, p);.       
5fe0: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
5ff0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6000: 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a 20 7b  case P4_VTAB : {
6010: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
6020: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
6030: 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e   ) sqlite3VtabUn
6040: 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 70  lock((VTable *)p
6050: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  4);.        brea
6060: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
6070: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
6080: 65 65 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c  ee the space all
6090: 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70 20 61  ocated for aOp a
60a0: 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75 65 73  nd any p4 values
60b0: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
60c0: 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63 6f  he.** opcodes co
60d0: 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 2e 20  ntained within. 
60e0: 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e 55  If aOp is not NU
60f0: 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  LL it is assumed
6100: 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a 20   to contain .** 
6110: 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a 2f  nOp entries. .*/
6120: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
6130: 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c  eFreeOpArray(sql
6140: 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61 4f  ite3 *db, Op *aO
6150: 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 69  p, int nOp){.  i
6160: 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f 70  f( aOp ){.    Op
6170: 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28 70   *pOp;.    for(p
6180: 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61 4f 70  Op=aOp; pOp<&aOp
6190: 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a 20  [nOp]; pOp++){. 
61a0: 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34       if( pOp->p4
61b0: 74 79 70 65 20 29 20 66 72 65 65 50 34 28 64 62  type ) freeP4(db
61c0: 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70  , pOp->p4type, p
61d0: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65  Op->p4.p);.#ifde
61e0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
61f0: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
6200: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
6210: 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43  Free(db, pOp->zC
6220: 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20  omment);.#endif 
6230: 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20      .    }.  }. 
6240: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
6250: 62 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  b, aOp);.}../*.*
6260: 2a 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72  * Link the SubPr
6270: 6f 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73  ogram object pas
6280: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
6290: 64 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20  d argument into 
62a0: 74 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69  the linked.** li
62b0: 73 74 20 61 74 20 56 64 62 65 2e 70 53 75 62 50  st at Vdbe.pSubP
62c0: 72 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73  rogram. This lis
62d0: 74 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c  t is used to del
62e0: 65 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67  ete all sub-prog
62f0: 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77  ram.** objects w
6300: 68 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f  hen the VM is no
6310: 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64   longer required
6320: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
6330: 33 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67  3VdbeLinkSubProg
6340: 72 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c  ram(Vdbe *pVdbe,
6350: 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b   SubProgram *p){
6360: 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56  .  p->pNext = pV
6370: 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20  dbe->pProgram;. 
6380: 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d   pVdbe->pProgram
6390: 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = p;.}../*.** C
63a0: 68 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64 65  hange the opcode
63b0: 20 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f 50   at addr into OP
63c0: 5f 4e 6f 6f 70 0a 2a 2f 0a 69 6e 74 20 73 71 6c  _Noop.*/.int sql
63d0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
63e0: 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  Noop(Vdbe *p, in
63f0: 74 20 61 64 64 72 29 7b 0a 20 20 56 64 62 65 4f  t addr){.  VdbeO
6400: 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 70 2d  p *pOp;.  if( p-
6410: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
6420: 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  d ) return 0;.  
6430: 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20  assert( addr>=0 
6440: 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29  && addr<p->nOp )
6450: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
6460: 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65 65 50  p[addr];.  freeP
6470: 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70 34  4(p->db, pOp->p4
6480: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29  type, pOp->p4.p)
6490: 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ;.  pOp->p4type 
64a0: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20  = P4_NOTUSED;.  
64b0: 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 30 3b 0a 20  pOp->p4.z = 0;. 
64c0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
64d0: 50 5f 4e 6f 6f 70 3b 0a 20 20 72 65 74 75 72 6e  P_Noop;.  return
64e0: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   1;.}../*.** If 
64f0: 74 68 65 20 6c 61 73 74 20 6f 70 63 6f 64 65 20  the last opcode 
6500: 69 73 20 22 6f 70 22 20 61 6e 64 20 69 74 20 69  is "op" and it i
6510: 73 20 6e 6f 74 20 61 20 6a 75 6d 70 20 64 65 73  s not a jump des
6520: 74 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65  tination,.** the
6530: 6e 20 72 65 6d 6f 76 65 20 69 74 2e 20 20 52 65  n remove it.  Re
6540: 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 64  turn true if and
6550: 20 6f 6e 6c 79 20 69 66 20 61 6e 20 6f 70 63 6f   only if an opco
6560: 64 65 20 77 61 73 20 72 65 6d 6f 76 65 64 2e 0a  de was removed..
6570: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
6580: 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f 70 63  beDeletePriorOpc
6590: 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75 38 20  ode(Vdbe *p, u8 
65a0: 6f 70 29 7b 0a 20 20 69 66 28 20 28 70 2d 3e 6e  op){.  if( (p->n
65b0: 4f 70 2d 31 29 3e 28 70 2d 3e 70 50 61 72 73 65  Op-1)>(p->pParse
65c0: 2d 3e 69 46 69 78 65 64 4f 70 29 20 26 26 20 70  ->iFixedOp) && p
65d0: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
65e0: 6f 70 63 6f 64 65 3d 3d 6f 70 20 29 7b 0a 20 20  opcode==op ){.  
65f0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
6600: 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
6610: 28 70 2c 20 70 2d 3e 6e 4f 70 2d 31 29 3b 0a 20  (p, p->nOp-1);. 
6620: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
6630: 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 0;.  }.}../*.
6640: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
6650: 6c 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f 70  lue of the P4 op
6660: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
6670: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
6680: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
6690: 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e  e is useful when
66a0: 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d   a large program
66b0: 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20   is loaded from 
66c0: 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61  a.** static arra
66d0: 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  y using sqlite3V
66e0: 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74  dbeAddOpList but
66f0: 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65   we want to make
6700: 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20   a.** few minor 
6710: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70  changes to the p
6720: 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66  rogram..**.** If
6730: 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50   n>=0 then the P
6740: 34 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e  4 operand is dyn
6750: 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68  amic, meaning th
6760: 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20  at a copy of.** 
6770: 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61  the string is ma
6780: 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f  de into memory o
6790: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
67a0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
67b0: 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d  * A value of n==
67c0: 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74  0 means copy byt
67d0: 65 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f 20  es of zP4 up to 
67e0: 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  and including th
67f0: 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20  e.** first null 
6800: 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68  byte.  If n>0 th
6810: 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65  en copy n+1 byte
6820: 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 20 0a 2a 2a  s of zP4..** .**
6830: 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66   Other values of
6840: 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20 50   n (P4_STATIC, P
6850: 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20  4_COLLSEQ etc.) 
6860: 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a 50  indicate that zP
6870: 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61  4 points.** to a
6880: 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63   string or struc
6890: 74 75 72 65 20 74 68 61 74 20 69 73 20 67 75 61  ture that is gua
68a0: 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74  ranteed to exist
68b0: 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d   for the lifetim
68c0: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65  e of.** the Vdbe
68d0: 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73  . In these cases
68e0: 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70   we can just cop
68f0: 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a  y the pointer..*
6900: 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74  *.** If addr<0 t
6910: 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f 6e  hen change P4 on
6920: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
6930: 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74  ly inserted inst
6940: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruction..*/.stat
6950: 69 63 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 4e  ic void SQLITE_N
6960: 4f 49 4e 4c 49 4e 45 20 76 64 62 65 43 68 61 6e  OINLINE vdbeChan
6970: 67 65 50 34 46 75 6c 6c 28 0a 20 20 56 64 62 65  geP4Full(.  Vdbe
6980: 20 2a 70 2c 0a 20 20 4f 70 20 2a 70 4f 70 2c 0a   *p,.  Op *pOp,.
6990: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
69a0: 34 2c 0a 20 20 69 6e 74 20 6e 0a 29 7b 0a 20 20  4,.  int n.){.  
69b0: 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  if( pOp->p4type 
69c0: 29 7b 0a 20 20 20 20 66 72 65 65 50 34 28 70 2d  ){.    freeP4(p-
69d0: 3e 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65  >db, pOp->p4type
69e0: 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20  , pOp->p4.p);.  
69f0: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
6a00: 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  0;.    pOp->p4.p
6a10: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
6a20: 6e 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  n<0 ){.    sqlit
6a30: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 70  e3VdbeChangeP4(p
6a40: 2c 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 70 2d  , (int)(pOp - p-
6a50: 3e 61 4f 70 29 2c 20 7a 50 34 2c 20 6e 29 3b 0a  >aOp), zP4, n);.
6a60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
6a70: 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69   n==0 ) n = sqli
6a80: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 34 29  te3Strlen30(zP4)
6a90: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20  ;.    pOp->p4.z 
6aa0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
6ab0: 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e  up(p->db, zP4, n
6ac0: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  );.    pOp->p4ty
6ad0: 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b  pe = P4_DYNAMIC;
6ae0: 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
6af0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
6b00: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
6b10: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
6b20: 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70  P4, int n){.  Op
6b30: 20 2a 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33   *pOp;.  sqlite3
6b40: 20 2a 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20   *db;.  assert( 
6b50: 70 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70  p!=0 );.  db = p
6b60: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
6b70: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
6b80: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
6b90: 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 21 3d 30  ssert( p->aOp!=0
6ba0: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
6bb0: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62  iled );.  if( db
6bc0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6bd0: 7b 0a 20 20 20 20 69 66 28 20 6e 21 3d 50 34 5f  {.    if( n!=P4_
6be0: 56 54 41 42 20 29 20 66 72 65 65 50 34 28 64 62  VTAB ) freeP4(db
6bf0: 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68  , n, (void*)*(ch
6c00: 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20  ar**)&zP4);.    
6c10: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
6c20: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29  sert( p->nOp>0 )
6c30: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72  ;.  assert( addr
6c40: 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28  <p->nOp );.  if(
6c50: 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61   addr<0 ){.    a
6c60: 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31  ddr = p->nOp - 1
6c70: 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70  ;.  }.  pOp = &p
6c80: 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 69  ->aOp[addr];.  i
6c90: 66 28 20 6e 3e 3d 30 20 7c 7c 20 70 4f 70 2d 3e  f( n>=0 || pOp->
6ca0: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 76 64  p4type ){.    vd
6cb0: 62 65 43 68 61 6e 67 65 50 34 46 75 6c 6c 28 70  beChangeP4Full(p
6cc0: 2c 20 70 4f 70 2c 20 7a 50 34 2c 20 6e 29 3b 0a  , pOp, zP4, n);.
6cd0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
6ce0: 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33    if( n==P4_INT3
6cf0: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65  2 ){.    /* Note
6d00: 3a 20 74 68 69 73 20 63 61 73 74 20 69 73 20 73  : this cast is s
6d10: 61 66 65 2c 20 62 65 63 61 75 73 65 20 74 68 65  afe, because the
6d20: 20 6f 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69   origin data poi
6d30: 6e 74 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20  nt was an int.  
6d40: 20 20 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61    ** that was ca
6d50: 73 74 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63  st to a (const c
6d60: 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70  har *). */.    p
6d70: 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54  Op->p4.i = SQLIT
6d80: 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34  E_PTR_TO_INT(zP4
6d90: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  );.    pOp->p4ty
6da0: 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20  pe = P4_INT32;. 
6db0: 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 34 21 3d   }else if( zP4!=
6dc0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
6dd0: 20 6e 3c 30 20 29 3b 0a 20 20 20 20 70 4f 70 2d   n<0 );.    pOp-
6de0: 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a  >p4.p = (void*)z
6df0: 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  P4;.    pOp->p4t
6e00: 79 70 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68  ype = (signed ch
6e10: 61 72 29 6e 3b 0a 20 20 20 20 69 66 28 20 6e 3d  ar)n;.    if( n=
6e20: 3d 50 34 5f 56 54 41 42 20 29 20 73 71 6c 69 74  =P4_VTAB ) sqlit
6e30: 65 33 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62  e3VtabLock((VTab
6e40: 6c 65 2a 29 7a 50 34 29 3b 0a 20 20 7d 0a 7d 0a  le*)zP4);.  }.}.
6e50: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 50  ./*.** Set the P
6e60: 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  4 on the most re
6e70: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 6f 70 63  cently added opc
6e80: 6f 64 65 20 74 6f 20 74 68 65 20 4b 65 79 49 6e  ode to the KeyIn
6e90: 66 6f 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e  fo for the.** in
6ea0: 64 65 78 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f  dex given..*/.vo
6eb0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
6ec0: 74 50 34 4b 65 79 49 6e 66 6f 28 50 61 72 73 65  tP4KeyInfo(Parse
6ed0: 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20   *pParse, Index 
6ee0: 2a 70 49 64 78 29 7b 0a 20 20 56 64 62 65 20 2a  *pIdx){.  Vdbe *
6ef0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
6f00: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
6f10: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
6f20: 49 64 78 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  Idx!=0 );.  sqli
6f30: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
6f40: 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 73 71  v, -1, (char*)sq
6f50: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e  lite3KeyInfoOfIn
6f60: 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 64 78  dex(pParse, pIdx
6f70: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
6f80: 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49           P4_KEYI
6f90: 4e 46 4f 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  NFO);.}..#ifdef 
6fa0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
6fb0: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 2f  PLAIN_COMMENTS./
6fc0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
6fd0: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6d  comment on the m
6fe0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64  ost recently cod
6ff0: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  ed instruction. 
7000: 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20   Or.** insert a 
7010: 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20 74 68  No-op and add th
7020: 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61  e comment to tha
7030: 74 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f  t new instructio
7040: 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65  n.  This.** make
7050: 73 20 74 68 65 20 63 6f 64 65 20 65 61 73 69 65  s the code easie
7060: 72 20 74 6f 20 72 65 61 64 20 64 75 72 69 6e 67  r to read during
7070: 20 64 65 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e   debugging.  Non
7080: 65 20 6f 66 20 74 68 69 73 20 68 61 70 70 65 6e  e of this happen
7090: 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64 75 63  s.** in a produc
70a0: 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73  tion build..*/.s
70b0: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 56  tatic void vdbeV
70c0: 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  Comment(Vdbe *p,
70d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
70e0: 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20 61 70  rmat, va_list ap
70f0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
7100: 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d  nOp>0 || p->aOp=
7110: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
7120: 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e  p->aOp==0 || p->
7130: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43  aOp[p->nOp-1].zC
7140: 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e  omment==0 || p->
7150: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7160: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
7170: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
7180: 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20 20 73 71  p->aOp );.    sq
7190: 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64  lite3DbFree(p->d
71a0: 62 2c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  b, p->aOp[p->nOp
71b0: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20  -1].zComment);. 
71c0: 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70     p->aOp[p->nOp
71d0: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73  -1].zComment = s
71e0: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70  qlite3VMPrintf(p
71f0: 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  ->db, zFormat, a
7200: 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73  p);.  }.}.void s
7210: 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e  qlite3VdbeCommen
7220: 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74  t(Vdbe *p, const
7230: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
7240: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
7250: 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ap;.  if( p ){. 
7260: 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20     va_start(ap, 
7270: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64  zFormat);.    vd
7280: 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46  beVComment(p, zF
7290: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20  ormat, ap);.    
72a0: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a  va_end(ap);.  }.
72b0: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
72c0: 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64  beNoopComment(Vd
72d0: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
72e0: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
72f0: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
7300: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73    if( p ){.    s
7310: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
7320: 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20  (p, OP_Noop);.  
7330: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
7340: 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62  Format);.    vdb
7350: 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f  eVComment(p, zFo
7360: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76  rmat, ap);.    v
7370: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d  a_end(ap);.  }.}
7380: 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42  .#endif  /* NDEB
7390: 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  UG */..#ifdef SQ
73a0: 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41  LITE_VDBE_COVERA
73b0: 47 45 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  GE./*.** Set the
73c0: 20 76 61 6c 75 65 20 69 66 20 74 68 65 20 69 53   value if the iS
73d0: 72 63 4c 69 6e 65 20 66 69 65 6c 64 20 66 6f 72  rcLine field for
73e0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20   the previously 
73f0: 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f  coded instructio
7400: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
7410: 65 33 56 64 62 65 53 65 74 4c 69 6e 65 4e 75 6d  e3VdbeSetLineNum
7420: 62 65 72 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  ber(Vdbe *v, int
7430: 20 69 4c 69 6e 65 29 7b 0a 20 20 73 71 6c 69 74   iLine){.  sqlit
7440: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 2d 31  e3VdbeGetOp(v,-1
7450: 29 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c  )->iSrcLine = iL
7460: 69 6e 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  ine;.}.#endif /*
7470: 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56   SQLITE_VDBE_COV
7480: 45 52 41 47 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ERAGE */../*.** 
7490: 52 65 74 75 72 6e 20 74 68 65 20 6f 70 63 6f 64  Return the opcod
74a0: 65 20 66 6f 72 20 61 20 67 69 76 65 6e 20 61 64  e for a given ad
74b0: 64 72 65 73 73 2e 20 20 49 66 20 74 68 65 20 61  dress.  If the a
74c0: 64 64 72 65 73 73 20 69 73 20 2d 31 2c 20 74 68  ddress is -1, th
74d0: 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65  en.** return the
74e0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69   most recently i
74f0: 6e 73 65 72 74 65 64 20 6f 70 63 6f 64 65 2e 0a  nserted opcode..
7500: 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
7510: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
7520: 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 20  or has occurred 
7530: 70 72 69 6f 72 20 74 6f 20 74 68 65 20 63 61 6c  prior to the cal
7540: 6c 69 6e 67 20 6f 66 20 74 68 69 73 0a 2a 2a 20  ling of this.** 
7550: 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20 61 20  routine, then a 
7560: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 64 75 6d  pointer to a dum
7570: 6d 79 20 56 64 62 65 4f 70 20 77 69 6c 6c 20 62  my VdbeOp will b
7580: 65 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68 61  e returned.  Tha
7590: 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 72  t opcode.** is r
75a0: 65 61 64 61 62 6c 65 20 62 75 74 20 6e 6f 74 20  eadable but not 
75b0: 77 72 69 74 61 62 6c 65 2c 20 74 68 6f 75 67 68  writable, though
75c0: 20 69 74 20 69 73 20 63 61 73 74 20 74 6f 20 61   it is cast to a
75d0: 20 77 72 69 74 61 62 6c 65 20 76 61 6c 75 65 2e   writable value.
75e0: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 6f  .** The return o
75f0: 66 20 61 20 64 75 6d 6d 79 20 6f 70 63 6f 64 65  f a dummy opcode
7600: 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 61 6c 6c   allows the call
7610: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 66 75 6e   to continue fun
7620: 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61 66 74 65  ctioning.** afte
7630: 72 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 77  r an OOM fault w
7640: 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
7650: 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
7660: 20 74 68 65 20 72 65 74 75 72 6e 20 66 72 6f 6d   the return from
7670: 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e   .** this routin
7680: 65 20 69 73 20 61 20 76 61 6c 69 64 20 70 6f 69  e is a valid poi
7690: 6e 74 65 72 2e 20 20 42 75 74 20 62 65 63 61 75  nter.  But becau
76a0: 73 65 20 74 68 65 20 64 75 6d 6d 79 2e 6f 70 63  se the dummy.opc
76b0: 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20 64 75 6d  ode is 0,.** dum
76c0: 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  my will never be
76d0: 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 20 54 68   written to.  Th
76e0: 69 73 20 69 73 20 76 65 72 69 66 69 65 64 20 62  is is verified b
76f0: 79 20 63 6f 64 65 20 69 6e 73 70 65 63 74 69 6f  y code inspectio
7700: 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72 75 6e 6e  n and.** by runn
7710: 69 6e 67 20 77 69 74 68 20 56 61 6c 67 72 69 6e  ing with Valgrin
7720: 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71  d..*/.VdbeOp *sq
7730: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 56  lite3VdbeGetOp(V
7740: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
7750: 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73 70 65 63  ){.  /* C89 spec
7760: 69 66 69 65 73 20 74 68 61 74 20 74 68 65 20 63  ifies that the c
7770: 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d 79 22 20  onstant "dummy" 
7780: 77 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69  will be initiali
7790: 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20 2a 2a 20  zed to all.  ** 
77a0: 7a 65 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20  zeros, which is 
77b0: 63 6f 72 72 65 63 74 2e 20 20 4d 53 56 43 20 67  correct.  MSVC g
77c0: 65 6e 65 72 61 74 65 73 20 61 20 77 61 72 6e 69  enerates a warni
77d0: 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c 65 73 73  ng, nevertheless
77e0: 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 56 64  . */.  static Vd
77f0: 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20 2f 2a 20  beOp dummy;  /* 
7800: 49 67 6e 6f 72 65 20 74 68 65 20 4d 53 56 43 20  Ignore the MSVC 
7810: 77 61 72 6e 69 6e 67 20 61 62 6f 75 74 20 6e 6f  warning about no
7820: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 2a 2f 0a   initializer */.
7830: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
7840: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
7850: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 61 64 64  NIT );.  if( add
7860: 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20  r<0 ){.    addr 
7870: 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20  = p->nOp - 1;.  
7880: 7d 0a 20 20 61 73 73 65 72 74 28 20 28 61 64 64  }.  assert( (add
7890: 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e  r>=0 && addr<p->
78a0: 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  nOp) || p->db->m
78b0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
78c0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
78d0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
78e0: 72 65 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29  return (VdbeOp*)
78f0: 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b  &dummy;.  }else{
7900: 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e  .    return &p->
7910: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d  aOp[addr];.  }.}
7920: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
7930: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
7940: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 29 0a 2f 2a  AIN_COMMENTS)./*
7950: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  .** Return an in
7960: 74 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20  teger value for 
7970: 6f 6e 65 20 6f 66 20 74 68 65 20 70 61 72 61 6d  one of the param
7980: 65 74 65 72 73 20 74 6f 20 74 68 65 20 6f 70 63  eters to the opc
7990: 6f 64 65 20 70 4f 70 0a 2a 2a 20 64 65 74 65 72  ode pOp.** deter
79a0: 6d 69 6e 65 64 20 62 79 20 63 68 61 72 61 63 74  mined by charact
79b0: 65 72 20 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  er c..*/.static 
79c0: 69 6e 74 20 74 72 61 6e 73 6c 61 74 65 50 28 63  int translateP(c
79d0: 68 61 72 20 63 2c 20 63 6f 6e 73 74 20 4f 70 20  har c, const Op 
79e0: 2a 70 4f 70 29 7b 0a 20 20 69 66 28 20 63 3d 3d  *pOp){.  if( c==
79f0: 27 31 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70  '1' ) return pOp
7a00: 2d 3e 70 31 3b 0a 20 20 69 66 28 20 63 3d 3d 27  ->p1;.  if( c=='
7a10: 32 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d  2' ) return pOp-
7a20: 3e 70 32 3b 0a 20 20 69 66 28 20 63 3d 3d 27 33  >p2;.  if( c=='3
7a30: 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e  ' ) return pOp->
7a40: 70 33 3b 0a 20 20 69 66 28 20 63 3d 3d 27 34 27  p3;.  if( c=='4'
7a50: 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70   ) return pOp->p
7a60: 34 2e 69 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f  4.i;.  return pO
7a70: 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p->p5;.}../*.** 
7a80: 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67  Compute a string
7a90: 20 66 6f 72 20 74 68 65 20 22 63 6f 6d 6d 65 6e   for the "commen
7aa0: 74 22 20 66 69 65 6c 64 20 6f 66 20 61 20 56 44  t" field of a VD
7ab0: 42 45 20 6f 70 63 6f 64 65 20 6c 69 73 74 69 6e  BE opcode listin
7ac0: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 79 6e  g..**.** The Syn
7ad0: 6f 70 73 69 73 3a 20 66 69 65 6c 64 20 69 6e 20  opsis: field in 
7ae0: 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  comments in the 
7af0: 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20 66 69  vdbe.c source fi
7b00: 6c 65 20 67 65 74 73 20 63 6f 6e 76 65 72 74 65  le gets converte
7b10: 64 0a 2a 2a 20 74 6f 20 61 6e 20 65 78 74 72 61  d.** to an extra
7b20: 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20   string that is 
7b30: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
7b40: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
7b50: 65 28 29 2e 20 20 49 6e 20 74 68 65 0a 2a 2a 20  e().  In the.** 
7b60: 61 62 73 65 6e 63 65 20 6f 66 20 6f 74 68 65 72  absence of other
7b70: 20 63 6f 6d 6d 65 6e 74 73 2c 20 74 68 69 73 20   comments, this 
7b80: 73 79 6e 6f 70 73 69 73 20 62 65 63 6f 6d 65 73  synopsis becomes
7b90: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20   the comment on 
7ba0: 74 68 65 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 53  the opcode..** S
7bb0: 6f 6d 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20  ome translation 
7bc0: 6f 63 63 75 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  occurs:.**.**   
7bd0: 20 20 20 20 22 50 58 22 20 20 20 20 20 20 2d 3e      "PX"      ->
7be0: 20 20 22 72 5b 58 5d 22 0a 2a 2a 20 20 20 20 20    "r[X]".**     
7bf0: 20 20 22 50 58 40 50 59 22 20 20 20 2d 3e 20 20    "PX@PY"   ->  
7c00: 22 72 5b 58 2e 2e 58 2b 59 2d 31 5d 22 20 20 6f  "r[X..X+Y-1]"  o
7c10: 72 20 22 72 5b 78 5d 22 20 69 66 20 79 20 69 73  r "r[x]" if y is
7c20: 20 30 20 6f 72 20 31 0a 2a 2a 20 20 20 20 20 20   0 or 1.**      
7c30: 20 22 50 58 40 50 59 2b 31 22 20 2d 3e 20 20 22   "PX@PY+1" ->  "
7c40: 72 5b 58 2e 2e 58 2b 59 5d 22 20 20 20 20 6f 72  r[X..X+Y]"    or
7c50: 20 22 72 5b 78 5d 22 20 69 66 20 79 20 69 73 20   "r[x]" if y is 
7c60: 30 0a 2a 2a 20 20 20 20 20 20 20 22 50 59 2e 2e  0.**       "PY..
7c70: 50 59 22 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 59  PY"  ->  "r[X..Y
7c80: 5d 22 20 20 20 20 20 20 6f 72 20 22 72 5b 78 5d  ]"      or "r[x]
7c90: 22 20 69 66 20 79 3c 3d 78 0a 2a 2f 0a 73 74 61  " if y<=x.*/.sta
7ca0: 74 69 63 20 69 6e 74 20 64 69 73 70 6c 61 79 43  tic int displayC
7cb0: 6f 6d 6d 65 6e 74 28 0a 20 20 63 6f 6e 73 74 20  omment(.  const 
7cc0: 4f 70 20 2a 70 4f 70 2c 20 20 20 20 20 2f 2a 20  Op *pOp,     /* 
7cd0: 54 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 62 65  The opcode to be
7ce0: 20 63 6f 6d 6d 65 6e 74 65 64 20 2a 2f 0a 20 20   commented */.  
7cf0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c  const char *zP4,
7d00: 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 6c 79     /* Previously
7d10: 20 6f 62 74 61 69 6e 65 64 20 76 61 6c 75 65 20   obtained value 
7d20: 66 6f 72 20 50 34 20 2a 2f 0a 20 20 63 68 61 72  for P4 */.  char
7d30: 20 2a 7a 54 65 6d 70 2c 20 20 20 20 20 20 20 2f   *zTemp,       /
7d40: 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74 20 68  * Write result h
7d50: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65  ere */.  int nTe
7d60: 6d 70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  mp          /* S
7d70: 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 69  pace available i
7d80: 6e 20 7a 54 65 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a  n zTemp[] */.){.
7d90: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
7da0: 70 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63  pName;.  const c
7db0: 68 61 72 20 2a 7a 53 79 6e 6f 70 73 69 73 3b 0a  har *zSynopsis;.
7dc0: 20 20 69 6e 74 20 6e 4f 70 4e 61 6d 65 3b 0a 20    int nOpName;. 
7dd0: 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 7a   int ii, jj;.  z
7de0: 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  OpName = sqlite3
7df0: 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e  OpcodeName(pOp->
7e00: 6f 70 63 6f 64 65 29 3b 0a 20 20 6e 4f 70 4e 61  opcode);.  nOpNa
7e10: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
7e20: 65 6e 33 30 28 7a 4f 70 4e 61 6d 65 29 3b 0a 20  en30(zOpName);. 
7e30: 20 69 66 28 20 7a 4f 70 4e 61 6d 65 5b 6e 4f 70   if( zOpName[nOp
7e40: 4e 61 6d 65 2b 31 5d 20 29 7b 0a 20 20 20 20 69  Name+1] ){.    i
7e50: 6e 74 20 73 65 65 6e 43 6f 6d 20 3d 20 30 3b 0a  nt seenCom = 0;.
7e60: 20 20 20 20 63 68 61 72 20 63 3b 0a 20 20 20 20      char c;.    
7e70: 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a 4f 70 4e  zSynopsis = zOpN
7e80: 61 6d 65 20 2b 3d 20 6e 4f 70 4e 61 6d 65 20 2b  ame += nOpName +
7e90: 20 31 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 6a   1;.    for(ii=j
7ea0: 6a 3d 30 3b 20 6a 6a 3c 6e 54 65 6d 70 2d 31 20  j=0; jj<nTemp-1 
7eb0: 26 26 20 28 63 20 3d 20 7a 53 79 6e 6f 70 73 69  && (c = zSynopsi
7ec0: 73 5b 69 69 5d 29 21 3d 30 3b 20 69 69 2b 2b 29  s[ii])!=0; ii++)
7ed0: 7b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  {.      if( c=='
7ee0: 50 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  P' ){.        c 
7ef0: 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 2b 2b 69 69  = zSynopsis[++ii
7f00: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ];.        if( c
7f10: 3d 3d 27 34 27 20 29 7b 0a 20 20 20 20 20 20 20  =='4' ){.       
7f20: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
7f30: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
7f40: 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 7a 50  emp+jj, "%s", zP
7f50: 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  4);.        }els
7f60: 65 20 69 66 28 20 63 3d 3d 27 58 27 20 29 7b 0a  e if( c=='X' ){.
7f70: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
7f80: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
7f90: 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22  -jj, zTemp+jj, "
7fa0: 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  %s", pOp->zComme
7fb0: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  nt);.          s
7fc0: 65 65 6e 43 6f 6d 20 3d 20 31 3b 0a 20 20 20 20  eenCom = 1;.    
7fd0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7fe0: 20 20 20 20 20 69 6e 74 20 76 31 20 3d 20 74 72       int v1 = tr
7ff0: 61 6e 73 6c 61 74 65 50 28 63 2c 20 70 4f 70 29  anslateP(c, pOp)
8000: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
8010: 76 32 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  v2;.          sq
8020: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
8030: 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a  Temp-jj, zTemp+j
8040: 6a 2c 20 22 25 64 22 2c 20 76 31 29 3b 0a 20 20  j, "%d", v1);.  
8050: 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 6e          if( strn
8060: 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69  cmp(zSynopsis+ii
8070: 2b 31 2c 20 22 40 50 22 2c 20 32 29 3d 3d 30 20  +1, "@P", 2)==0 
8080: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
8090: 69 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 20 20  i += 3;.        
80a0: 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65      jj += sqlite
80b0: 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b  3Strlen30(zTemp+
80c0: 6a 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  jj);.           
80d0: 20 76 32 20 3d 20 74 72 61 6e 73 6c 61 74 65 50   v2 = translateP
80e0: 28 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 2c 20  (zSynopsis[ii], 
80f0: 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pOp);.          
8100: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53    if( strncmp(zS
8110: 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 22 2b 31  ynopsis+ii+1,"+1
8120: 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ",2)==0 ){.     
8130: 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 32           ii += 2
8140: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8150: 76 32 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  v2++;.          
8160: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
8170: 69 66 28 20 76 32 3e 31 20 29 7b 0a 20 20 20 20  if( v2>1 ){.    
8180: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
8190: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
81a0: 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22  -jj, zTemp+jj, "
81b0: 2e 2e 25 64 22 2c 20 76 31 2b 76 32 2d 31 29 3b  ..%d", v1+v2-1);
81c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
81d0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
81e0: 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f  f( strncmp(zSyno
81f0: 70 73 69 73 2b 69 69 2b 31 2c 20 22 2e 2e 50 33  psis+ii+1, "..P3
8200: 22 2c 20 34 29 3d 3d 30 20 26 26 20 70 4f 70 2d  ", 4)==0 && pOp-
8210: 3e 70 33 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  >p3==0 ){.      
8220: 20 20 20 20 20 20 69 69 20 2b 3d 20 34 3b 0a 20        ii += 4;. 
8230: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8240: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6a 6a 20     }.        jj 
8250: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
8260: 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20  30(zTemp+jj);.  
8270: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8280: 20 20 20 7a 54 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d     zTemp[jj++] =
8290: 20 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   c;.      }.    
82a0: 7d 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e 43  }.    if( !seenC
82b0: 6f 6d 20 26 26 20 6a 6a 3c 6e 54 65 6d 70 2d 35  om && jj<nTemp-5
82c0: 20 26 26 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e   && pOp->zCommen
82d0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
82e0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
82f0: 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20  p-jj, zTemp+jj, 
8300: 22 3b 20 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f  "; %s", pOp->zCo
8310: 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 6a 6a  mment);.      jj
8320: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
8330: 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20  n30(zTemp+jj);. 
8340: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 6a 3c     }.    if( jj<
8350: 6e 54 65 6d 70 20 29 20 7a 54 65 6d 70 5b 6a 6a  nTemp ) zTemp[jj
8360: 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  ] = 0;.  }else i
8370: 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  f( pOp->zComment
8380: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
8390: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
83a0: 7a 54 65 6d 70 2c 20 22 25 73 22 2c 20 70 4f 70  zTemp, "%s", pOp
83b0: 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20  ->zComment);.   
83c0: 20 6a 6a 20 3d 20 73 71 6c 69 74 65 33 53 74 72   jj = sqlite3Str
83d0: 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20  len30(zTemp);.  
83e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 54 65 6d 70  }else{.    zTemp
83f0: 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 6a 6a 20  [0] = 0;.    jj 
8400: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
8410: 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n jj;.}.#endif /
8420: 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  * SQLITE_DEBUG *
8430: 2f 0a 0a 23 69 66 20 56 44 42 45 5f 44 49 53 50  /..#if VDBE_DISP
8440: 4c 41 59 5f 50 34 20 26 26 20 64 65 66 69 6e 65  LAY_P4 && define
8450: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
8460: 43 55 52 53 4f 52 5f 48 49 4e 54 53 29 0a 2f 2a  CURSOR_HINTS)./*
8470: 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 74 68  .** Translate th
8480: 65 20 50 34 2e 70 45 78 70 72 20 76 61 6c 75 65  e P4.pExpr value
8490: 20 66 6f 72 20 61 6e 20 4f 50 5f 43 75 72 73 6f   for an OP_Curso
84a0: 72 48 69 6e 74 20 6f 70 63 6f 64 65 20 69 6e 74  rHint opcode int
84b0: 6f 20 74 65 78 74 0a 2a 2a 20 74 68 61 74 20 63  o text.** that c
84c0: 61 6e 20 62 65 20 64 69 73 70 6c 61 79 65 64 20  an be displayed 
84d0: 69 6e 20 74 68 65 20 50 34 20 63 6f 6c 75 6d 6e  in the P4 column
84e0: 20 6f 66 20 45 58 50 4c 41 49 4e 20 6f 75 74 70   of EXPLAIN outp
84f0: 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ut..*/.static vo
8500: 69 64 20 64 69 73 70 6c 61 79 50 34 45 78 70 72  id displayP4Expr
8510: 28 53 74 72 41 63 63 75 6d 20 2a 70 2c 20 45 78  (StrAccum *p, Ex
8520: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 6f  pr *pExpr){.  co
8530: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20  nst char *zOp = 
8540: 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  0;.  switch( pEx
8550: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
8560: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20  se TK_STRING:.  
8570: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
8580: 74 66 28 70 2c 20 22 25 51 22 2c 20 70 45 78 70  tf(p, "%Q", pExp
8590: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
85a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
85b0: 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a  ase TK_INTEGER:.
85c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
85d0: 69 6e 74 66 28 70 2c 20 22 25 64 22 2c 20 70 45  intf(p, "%d", pE
85e0: 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 29 3b 0a  xpr->u.iValue);.
85f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8600: 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20   case TK_NULL:. 
8610: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
8620: 6e 74 66 28 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a  ntf(p, "NULL");.
8630: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8640: 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
8650: 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
8660: 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22 72 5b  e3XPrintf(p, "r[
8670: 25 64 5d 22 2c 20 70 45 78 70 72 2d 3e 69 54 61  %d]", pExpr->iTa
8680: 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ble);.      brea
8690: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
86a0: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
86b0: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
86c0: 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  iColumn<0 ){.   
86d0: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
86e0: 6e 74 66 28 70 2c 20 22 72 6f 77 69 64 22 29 3b  ntf(p, "rowid");
86f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8700: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
8710: 69 6e 74 66 28 70 2c 20 22 63 25 64 22 2c 20 28  intf(p, "c%d", (
8720: 69 6e 74 29 70 45 78 70 72 2d 3e 69 43 6f 6c 75  int)pExpr->iColu
8730: 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  mn);.      }.   
8740: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8750: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20      case TK_LT: 
8760: 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c 54 22 3b       zOp = "LT";
8770: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8780: 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20   case TK_LE:    
8790: 20 20 7a 4f 70 20 3d 20 22 4c 45 22 3b 20 20 20    zOp = "LE";   
87a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
87b0: 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20 20 7a  se TK_GT:      z
87c0: 4f 70 20 3d 20 22 47 54 22 3b 20 20 20 20 20 20  Op = "GT";      
87d0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
87e0: 54 4b 5f 47 45 3a 20 20 20 20 20 20 7a 4f 70 20  TK_GE:      zOp 
87f0: 3d 20 22 47 45 22 3b 20 20 20 20 20 20 62 72 65  = "GE";      bre
8800: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8810: 4e 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22  NE:      zOp = "
8820: 4e 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  NE";      break;
8830: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
8840: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 45 51 22        zOp = "EQ"
8850: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
8860: 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 20 20 20    case TK_IS:   
8870: 20 20 20 7a 4f 70 20 3d 20 22 49 53 22 3b 20 20     zOp = "IS";  
8880: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
8890: 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 20 20  ase TK_ISNOT:   
88a0: 7a 4f 70 20 3d 20 22 49 53 4e 4f 54 22 3b 20 20  zOp = "ISNOT";  
88b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
88c0: 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20 7a 4f 70   TK_AND:     zOp
88d0: 20 3d 20 22 41 4e 44 22 3b 20 20 20 20 20 62 72   = "AND";     br
88e0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
88f0: 5f 4f 52 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20  _OR:      zOp = 
8900: 22 4f 52 22 3b 20 20 20 20 20 20 62 72 65 61 6b  "OR";      break
8910: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c  ;.    case TK_PL
8920: 55 53 3a 20 20 20 20 7a 4f 70 20 3d 20 22 41 44  US:    zOp = "AD
8930: 44 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  D";     break;. 
8940: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a     case TK_STAR:
8950: 20 20 20 20 7a 4f 70 20 3d 20 22 4d 55 4c 22 3b      zOp = "MUL";
8960: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8970: 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 20 20  case TK_MINUS:  
8980: 20 7a 4f 70 20 3d 20 22 53 55 42 22 3b 20 20 20   zOp = "SUB";   
8990: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
89a0: 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20 20 7a 4f  e TK_REM:     zO
89b0: 70 20 3d 20 22 52 45 4d 22 3b 20 20 20 20 20 62  p = "REM";     b
89c0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
89d0: 4b 5f 42 49 54 41 4e 44 3a 20 20 7a 4f 70 20 3d  K_BITAND:  zOp =
89e0: 20 22 42 49 54 41 4e 44 22 3b 20 20 62 72 65 61   "BITAND";  brea
89f0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  k;.    case TK_B
8a00: 49 54 4f 52 3a 20 20 20 7a 4f 70 20 3d 20 22 42  ITOR:   zOp = "B
8a10: 49 54 4f 52 22 3b 20 20 20 62 72 65 61 6b 3b 0a  ITOR";   break;.
8a20: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53      case TK_SLAS
8a30: 48 3a 20 20 20 7a 4f 70 20 3d 20 22 44 49 56 22  H:   zOp = "DIV"
8a40: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
8a50: 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a   case TK_LSHIFT:
8a60: 20 20 7a 4f 70 20 3d 20 22 4c 53 48 49 46 54 22    zOp = "LSHIFT"
8a70: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
8a80: 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 20 7a  se TK_RSHIFT:  z
8a90: 4f 70 20 3d 20 22 52 53 48 49 46 54 22 3b 20 20  Op = "RSHIFT";  
8aa0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8ab0: 54 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a 4f 70 20  TK_CONCAT:  zOp 
8ac0: 3d 20 22 43 4f 4e 43 41 54 22 3b 20 20 62 72 65  = "CONCAT";  bre
8ad0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8ae0: 55 4d 49 4e 55 53 3a 20 20 7a 4f 70 20 3d 20 22  UMINUS:  zOp = "
8af0: 4d 49 4e 55 53 22 3b 20 20 20 62 72 65 61 6b 3b  MINUS";   break;
8b00: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
8b10: 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22 50 4c 55  US:   zOp = "PLU
8b20: 53 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  S";    break;.  
8b30: 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54    case TK_BITNOT
8b40: 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54 4e 4f 54  :  zOp = "BITNOT
8b50: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";  break;.    c
8b60: 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20 20 20  ase TK_NOT:     
8b70: 7a 4f 70 20 3d 20 22 4e 4f 54 22 3b 20 20 20 20  zOp = "NOT";    
8b80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8b90: 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 7a 4f 70   TK_ISNULL:  zOp
8ba0: 20 3d 20 22 49 53 4e 55 4c 4c 22 3b 20 20 62 72   = "ISNULL";  br
8bb0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8bc0: 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4f 70 20 3d 20  _NOTNULL: zOp = 
8bd0: 22 4e 4f 54 4e 55 4c 4c 22 3b 20 62 72 65 61 6b  "NOTNULL"; break
8be0: 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  ;..    default:.
8bf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
8c00: 69 6e 74 66 28 70 2c 20 22 25 73 22 2c 20 22 65  intf(p, "%s", "e
8c10: 78 70 72 22 29 3b 0a 20 20 20 20 20 20 62 72 65  xpr");.      bre
8c20: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a  ak;.  }..  if( z
8c30: 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Op ){.    sqlite
8c40: 33 58 50 72 69 6e 74 66 28 70 2c 20 22 25 73 28  3XPrintf(p, "%s(
8c50: 22 2c 20 7a 4f 70 29 3b 0a 20 20 20 20 64 69 73  ", zOp);.    dis
8c60: 70 6c 61 79 50 34 45 78 70 72 28 70 2c 20 70 45  playP4Expr(p, pE
8c70: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
8c80: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67   if( pExpr->pRig
8c90: 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ht ){.      sqli
8ca0: 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
8cb0: 64 28 70 2c 20 22 2c 22 2c 20 31 29 3b 0a 20 20  d(p, ",", 1);.  
8cc0: 20 20 20 20 64 69 73 70 6c 61 79 50 34 45 78 70      displayP4Exp
8cd0: 72 28 70 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  r(p, pExpr->pRig
8ce0: 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ht);.    }.    s
8cf0: 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
8d00: 70 65 6e 64 28 70 2c 20 22 29 22 2c 20 31 29 3b  pend(p, ")", 1);
8d10: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
8d20: 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34   VDBE_DISPLAY_P4
8d30: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
8d40: 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52  TE_ENABLE_CURSOR
8d50: 5f 48 49 4e 54 53 29 20 2a 2f 0a 0a 0a 23 69 66  _HINTS) */...#if
8d60: 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34   VDBE_DISPLAY_P4
8d70: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
8d80: 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73   string that des
8d90: 63 72 69 62 65 73 20 74 68 65 20 50 34 20 70 61  cribes the P4 pa
8da0: 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f  rameter for an o
8db0: 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54  pcode..** Use zT
8dc0: 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75  emp for any requ
8dd0: 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62  ired temporary b
8de0: 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a  uffer space..*/.
8df0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 69 73  static char *dis
8e00: 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20  playP4(Op *pOp, 
8e10: 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74  char *zTemp, int
8e20: 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20   nTemp){.  char 
8e30: 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20  *zP4 = zTemp;.  
8e40: 53 74 72 41 63 63 75 6d 20 78 3b 0a 20 20 61 73  StrAccum x;.  as
8e50: 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20  sert( nTemp>=20 
8e60: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41  );.  sqlite3StrA
8e70: 63 63 75 6d 49 6e 69 74 28 26 78 2c 20 30 2c 20  ccumInit(&x, 0, 
8e80: 7a 54 65 6d 70 2c 20 6e 54 65 6d 70 2c 20 30 29  zTemp, nTemp, 0)
8e90: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d  ;.  switch( pOp-
8ea0: 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63  >p4type ){.    c
8eb0: 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20  ase P4_KEYINFO: 
8ec0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  {.      int j;. 
8ed0: 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
8ee0: 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34  eyInfo = pOp->p4
8ef0: 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20  .pKeyInfo;.     
8f00: 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
8f10: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30  o->aSortOrder!=0
8f20: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
8f30: 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 6b 28  3XPrintf(&x, "k(
8f40: 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  %d", pKeyInfo->n
8f50: 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 66 6f  Field);.      fo
8f60: 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66  r(j=0; j<pKeyInf
8f70: 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b  o->nField; j++){
8f80: 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
8f90: 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e   *pColl = pKeyIn
8fa0: 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  fo->aColl[j];.  
8fb0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
8fc0: 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 20   *zColl = pColl 
8fd0: 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a  ? pColl->zName :
8fe0: 20 22 22 3b 0a 20 20 20 20 20 20 20 20 69 66 28   "";.        if(
8ff0: 20 73 74 72 63 6d 70 28 7a 43 6f 6c 6c 2c 20 22   strcmp(zColl, "
9000: 42 49 4e 41 52 59 22 29 3d 3d 30 20 29 20 7a 43  BINARY")==0 ) zC
9010: 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20 20 20  oll = "B";.     
9020: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
9030: 66 28 26 78 2c 20 22 2c 25 73 25 73 22 2c 20 70  f(&x, ",%s%s", p
9040: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
9050: 64 65 72 5b 6a 5d 20 3f 20 22 2d 22 20 3a 20 22  der[j] ? "-" : "
9060: 22 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  ", zColl);.     
9070: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
9080: 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26  StrAccumAppend(&
9090: 78 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 20 20  x, ")", 1);.    
90a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
90b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
90c0: 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53  BLE_CURSOR_HINTS
90d0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 45 58 50  .    case P4_EXP
90e0: 52 3a 20 7b 0a 20 20 20 20 20 20 64 69 73 70 6c  R: {.      displ
90f0: 61 79 50 34 45 78 70 72 28 26 78 2c 20 70 4f 70  ayP4Expr(&x, pOp
9100: 2d 3e 70 34 2e 70 45 78 70 72 29 3b 0a 20 20 20  ->p4.pExpr);.   
9110: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9120: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
9130: 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20  P4_COLLSEQ: {.  
9140: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
9150: 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f  ll = pOp->p4.pCo
9160: 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ll;.      sqlite
9170: 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 28 25  3XPrintf(&x, "(%
9180: 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a  .20s)", pColl->z
9190: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Name);.      bre
91a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
91b0: 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b  se P4_FUNCDEF: {
91c0: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
91d0: 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  pDef = pOp->p4.p
91e0: 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  Func;.      sqli
91f0: 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22  te3XPrintf(&x, "
9200: 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a  %s(%d)", pDef->z
9210: 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67  Name, pDef->nArg
9220: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
9230: 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
9240: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 63 61  ITE_DEBUG.    ca
9250: 73 65 20 50 34 5f 46 55 4e 43 43 54 58 3a 20 7b  se P4_FUNCCTX: {
9260: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
9270: 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  pDef = pOp->p4.p
9280: 43 74 78 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20  Ctx->pFunc;.    
9290: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
92a0: 28 26 78 2c 20 22 25 73 28 25 64 29 22 2c 20 70  (&x, "%s(%d)", p
92b0: 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66  Def->zName, pDef
92c0: 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62  ->nArg);.      b
92d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
92e0: 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49  if.    case P4_I
92f0: 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 73 71  NT64: {.      sq
9300: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c  lite3XPrintf(&x,
9310: 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70   "%lld", *pOp->p
9320: 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62  4.pI64);.      b
9330: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
9340: 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b  case P4_INT32: {
9350: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50  .      sqlite3XP
9360: 72 69 6e 74 66 28 26 78 2c 20 22 25 64 22 2c 20  rintf(&x, "%d", 
9370: 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20  pOp->p4.i);.    
9380: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
9390: 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a     case P4_REAL:
93a0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
93b0: 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25 2e 31  XPrintf(&x, "%.1
93c0: 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52  6g", *pOp->p4.pR
93d0: 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  eal);.      brea
93e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
93f0: 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20  e P4_MEM: {.    
9400: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f    Mem *pMem = pO
9410: 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20  p->p4.pMem;.    
9420: 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67    if( pMem->flag
9430: 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  s & MEM_Str ){. 
9440: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d 65         zP4 = pMe
9450: 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73  m->z;.      }els
9460: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  e if( pMem->flag
9470: 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  s & MEM_Int ){. 
9480: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50         sqlite3XP
9490: 72 69 6e 74 66 28 26 78 2c 20 22 25 6c 6c 64 22  rintf(&x, "%lld"
94a0: 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20  , pMem->u.i);.  
94b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
94c0: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
94d0: 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Real ){.        
94e0: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
94f0: 78 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d  x, "%.16g", pMem
9500: 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65  ->u.r);.      }e
9510: 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c  lse if( pMem->fl
9520: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
9530: 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  {.        zP4 = 
9540: 22 4e 55 4c 4c 22 3b 0a 20 20 20 20 20 20 7d 65  "NULL";.      }e
9550: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
9560: 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  ert( pMem->flags
9570: 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20   & MEM_Blob );. 
9580: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 22 28 62         zP4 = "(b
9590: 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20 7d 0a 20  lob)";.      }. 
95a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
95b0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
95c0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
95d0: 4c 45 0a 20 20 20 20 63 61 73 65 20 50 34 5f 56  LE.    case P4_V
95e0: 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TAB: {.      sql
95f0: 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
9600: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62   = pOp->p4.pVtab
9610: 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 20 20 73  ->pVtab;.      s
9620: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78  qlite3XPrintf(&x
9630: 2c 20 22 76 74 61 62 3a 25 70 22 2c 20 70 56 74  , "vtab:%p", pVt
9640: 61 62 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ab);.      break
9650: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
9660: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52     case P4_INTAR
9670: 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  RAY: {.      int
9680: 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61   i;.      int *a
9690: 69 20 3d 20 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a  i = pOp->p4.ai;.
96a0: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 61 69        int n = ai
96b0: 5b 30 5d 3b 20 20 20 2f 2a 20 54 68 65 20 66 69  [0];   /* The fi
96c0: 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61  rst element of a
96d0: 6e 20 49 4e 54 41 52 52 41 59 20 69 73 20 61 6c  n INTARRAY is al
96e0: 77 61 79 73 20 74 68 65 0a 20 20 20 20 20 20 20  ways the.       
96f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9700: 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20  ** count of the 
9710: 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
9720: 74 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a  ts to follow */.
9730: 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
9740: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; i++){.      
9750: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
9760: 28 26 78 2c 20 22 2c 25 64 22 2c 20 61 69 5b 69  (&x, ",%d", ai[i
9770: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
9780: 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 27 5b 27    zTemp[0] = '['
9790: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
97a0: 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 78  trAccumAppend(&x
97b0: 2c 20 22 5d 22 2c 20 31 29 3b 0a 20 20 20 20 20  , "]", 1);.     
97c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
97d0: 20 20 63 61 73 65 20 50 34 5f 53 55 42 50 52 4f    case P4_SUBPRO
97e0: 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71  GRAM: {.      sq
97f0: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c  lite3XPrintf(&x,
9800: 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20   "program");.   
9810: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9820: 20 20 20 20 63 61 73 65 20 50 34 5f 41 44 56 41      case P4_ADVA
9830: 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65  NCE: {.      zTe
9840: 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[0] = 0;.     
9850: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9860: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
9870: 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34     zP4 = pOp->p4
9880: 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50  .z;.      if( zP
9890: 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  4==0 ){.        
98a0: 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20  zP4 = zTemp;.   
98b0: 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20       zTemp[0] = 
98c0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
98d0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74  .  }.  sqlite3St
98e0: 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 78 29  rAccumFinish(&x)
98f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 50 34 21  ;.  assert( zP4!
9900: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  =0 );.  return z
9910: 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  P4;.}.#endif /* 
9920: 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20  VDBE_DISPLAY_P4 
9930: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72  */../*.** Declar
9940: 65 20 74 6f 20 74 68 65 20 56 64 62 65 20 74 68  e to the Vdbe th
9950: 61 74 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a  at the BTree obj
9960: 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69  ect at db->aDb[i
9970: 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a  ] is used..**.**
9980: 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74   The prepared st
9990: 61 74 65 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f  atements need to
99a0: 20 6b 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63 65   know in advance
99b0: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65   the complete se
99c0: 74 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65 64  t of.** attached
99d0: 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
99e0: 77 69 6c 6c 20 62 65 20 75 73 65 2e 20 20 41 20  will be use.  A 
99f0: 6d 61 73 6b 20 6f 66 20 74 68 65 73 65 20 64 61  mask of these da
9a00: 74 61 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61  tabases.** is ma
9a10: 69 6e 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62  intained in p->b
9a20: 74 72 65 65 4d 61 73 6b 2e 20 20 54 68 65 20 70  treeMask.  The p
9a30: 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 76 61 6c 75 65  ->lockMask value
9a40: 20 69 73 20 74 68 65 20 73 75 62 73 65 74 20 6f   is the subset o
9a50: 66 0a 2a 2a 20 70 2d 3e 62 74 72 65 65 4d 61 73  f.** p->btreeMas
9a60: 6b 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 74  k of databases t
9a70: 68 61 74 20 77 69 6c 6c 20 72 65 71 75 69 72 65  hat will require
9a80: 20 61 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64   a lock..*/.void
9a90: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
9aa0: 42 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20 69  Btree(Vdbe *p, i
9ab0: 6e 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28  nt i){.  assert(
9ac0: 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62   i>=0 && i<p->db
9ad0: 2d 3e 6e 44 62 20 26 26 20 69 3c 28 69 6e 74 29  ->nDb && i<(int)
9ae0: 73 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a  sizeof(yDbMask)*
9af0: 38 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  8 );.  assert( i
9b00: 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e  <(int)sizeof(p->
9b10: 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a  btreeMask)*8 );.
9b20: 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 62    DbMaskSet(p->b
9b30: 74 72 65 65 4d 61 73 6b 2c 20 69 29 3b 0a 20 20  treeMask, i);.  
9b40: 69 66 28 20 69 21 3d 31 20 26 26 20 73 71 6c 69  if( i!=1 && sqli
9b50: 74 65 33 42 74 72 65 65 53 68 61 72 61 62 6c 65  te3BtreeSharable
9b60: 28 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  (p->db->aDb[i].p
9b70: 42 74 29 20 29 7b 0a 20 20 20 20 44 62 4d 61 73  Bt) ){.    DbMas
9b80: 6b 53 65 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  kSet(p->lockMask
9b90: 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  , i);.  }.}..#if
9ba0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
9bb0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
9bc0: 48 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c  HE)./*.** If SQL
9bd0: 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20  ite is compiled 
9be0: 74 6f 20 73 75 70 70 6f 72 74 20 73 68 61 72 65  to support share
9bf0: 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64  d-cache mode and
9c00: 20 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 66   to be threadsaf
9c10: 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  e,.** this routi
9c20: 6e 65 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d  ne obtains the m
9c30: 75 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  utex associated 
9c40: 77 69 74 68 20 65 61 63 68 20 42 74 53 68 61 72  with each BtShar
9c50: 65 64 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  ed structure.** 
9c60: 74 68 61 74 20 6d 61 79 20 62 65 20 61 63 63 65  that may be acce
9c70: 73 73 65 64 20 62 79 20 74 68 65 20 56 4d 20 70  ssed by the VM p
9c80: 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
9c90: 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73  ment. In doing s
9ca0: 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74  o it also.** set
9cb0: 73 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64  s the BtShared.d
9cc0: 62 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68  b member of each
9cd0: 20 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64   of the BtShared
9ce0: 20 73 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73   structures, ens
9cf0: 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68  uring.** that th
9d00: 65 20 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68  e correct busy-h
9d10: 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
9d20: 69 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65  is invoked if re
9d30: 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  quired..**.** If
9d40: 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74   SQLite is not t
9d50: 68 72 65 61 64 73 61 66 65 20 62 75 74 20 64 6f  hreadsafe but do
9d60: 65 73 20 73 75 70 70 6f 72 74 20 73 68 61 72 65  es support share
9d70: 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d-cache mode, th
9d80: 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  en.** sqlite3Btr
9d90: 65 65 45 6e 74 65 72 28 29 20 69 73 20 69 6e 76  eeEnter() is inv
9da0: 6f 6b 65 64 20 74 6f 20 73 65 74 20 74 68 65 20  oked to set the 
9db0: 42 74 53 68 61 72 65 64 2e 64 62 20 76 61 72 69  BtShared.db vari
9dc0: 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20  ables.** of all 
9dd0: 6f 66 20 42 74 53 68 61 72 65 64 20 73 74 72 75  of BtShared stru
9de0: 63 74 75 72 65 73 20 61 63 63 65 73 73 69 62 6c  ctures accessibl
9df0: 65 20 76 69 61 20 74 68 65 20 64 61 74 61 62 61  e via the databa
9e00: 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73  se handle .** as
9e10: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
9e20: 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  e VM..**.** If S
9e30: 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72  QLite is not thr
9e40: 65 61 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73  eadsafe and does
9e50: 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61   not support sha
9e60: 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20  red-cache mode, 
9e70: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
9e80: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
9e90: 2a 2a 20 54 68 65 20 70 2d 3e 62 74 72 65 65 4d  ** The p->btreeM
9ea0: 61 73 6b 20 66 69 65 6c 64 20 69 73 20 61 20 62  ask field is a b
9eb0: 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74  itmask of all bt
9ec0: 72 65 65 73 20 74 68 61 74 20 74 68 65 20 70 72  rees that the pr
9ed0: 65 70 61 72 65 64 20 0a 2a 2a 20 73 74 61 74 65  epared .** state
9ee0: 6d 65 6e 74 20 70 20 77 69 6c 6c 20 65 76 65 72  ment p will ever
9ef0: 20 75 73 65 2e 20 20 4c 65 74 20 4e 20 62 65 20   use.  Let N be 
9f00: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69  the number of bi
9f10: 74 73 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61  ts in p->btreeMa
9f20: 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  sk.** correspond
9f30: 69 6e 67 20 74 6f 20 62 74 72 65 65 73 20 74 68  ing to btrees th
9f40: 61 74 20 75 73 65 20 73 68 61 72 65 64 20 63 61  at use shared ca
9f50: 63 68 65 2e 20 20 54 68 65 6e 20 74 68 65 20 72  che.  Then the r
9f60: 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69  untime of.** thi
9f70: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e  s routine is N*N
9f80: 2e 20 20 42 75 74 20 61 73 20 4e 20 69 73 20 72  .  But as N is r
9f90: 61 72 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20  arely more than 
9fa0: 31 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e  1, this should n
9fb0: 6f 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c  ot.** be a probl
9fc0: 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  em..*/.void sqli
9fd0: 74 65 33 56 64 62 65 45 6e 74 65 72 28 56 64 62  te3VdbeEnter(Vdb
9fe0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
9ff0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
a000: 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20   Db *aDb;.  int 
a010: 6e 44 62 3b 0a 20 20 69 66 28 20 44 62 4d 61 73  nDb;.  if( DbMas
a020: 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b  kAllZero(p->lock
a030: 4d 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20  Mask) ) return; 
a040: 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63   /* The common c
a050: 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d  ase */.  db = p-
a060: 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d  >db;.  aDb = db-
a070: 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62  >aDb;.  nDb = db
a080: 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30  ->nDb;.  for(i=0
a090: 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  ; i<nDb; i++){. 
a0a0: 20 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 44     if( i!=1 && D
a0b0: 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63  bMaskTest(p->loc
a0c0: 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41  kMask,i) && ALWA
a0d0: 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30  YS(aDb[i].pBt!=0
a0e0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
a0f0: 65 33 42 74 72 65 65 45 6e 74 65 72 28 61 44 62  e3BtreeEnter(aDb
a100: 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a  [i].pBt);.    }.
a110: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69    }.}.#endif..#i
a120: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
a130: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
a140: 43 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54  CHE) && SQLITE_T
a150: 48 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a  HREADSAFE>0./*.*
a160: 2a 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20  * Unlock all of 
a170: 74 68 65 20 62 74 72 65 65 73 20 70 72 65 76 69  the btrees previ
a180: 6f 75 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20  ously locked by 
a190: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
a1a0: 33 56 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f  3VdbeEnter()..*/
a1b0: 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
a1c0: 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 76 64 62  OINLINE void vdb
a1d0: 65 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b  eLeave(Vdbe *p){
a1e0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
a1f0: 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61  te3 *db;.  Db *a
a200: 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20  Db;.  int nDb;. 
a210: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
a220: 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20  Db = db->aDb;.  
a230: 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20  nDb = db->nDb;. 
a240: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b   for(i=0; i<nDb;
a250: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69   i++){.    if( i
a260: 21 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73  !=1 && DbMaskTes
a270: 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29  t(p->lockMask,i)
a280: 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69   && ALWAYS(aDb[i
a290: 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20  ].pBt!=0) ){.   
a2a0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
a2b0: 65 61 76 65 28 61 44 62 5b 69 5d 2e 70 42 74 29  eave(aDb[i].pBt)
a2c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f  ;.    }.  }.}.vo
a2d0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65  id sqlite3VdbeLe
a2e0: 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ave(Vdbe *p){.  
a2f0: 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72  if( DbMaskAllZer
a300: 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29  o(p->lockMask) )
a310: 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65   return;  /* The
a320: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a   common case */.
a330: 20 20 76 64 62 65 4c 65 61 76 65 28 70 29 3b 0a    vdbeLeave(p);.
a340: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  }.#endif..#if de
a350: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
a360: 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  LE) || defined(S
a370: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
a380: 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c  ** Print a singl
a390: 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20  e opcode.  This 
a3a0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
a3b0: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  for debugging on
a3c0: 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
a3d0: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46  te3VdbePrintOp(F
a3e0: 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70  ILE *pOut, int p
a3f0: 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63  c, Op *pOp){.  c
a400: 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72  har *zP4;.  char
a410: 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 63 68 61   zPtr[50];.  cha
a420: 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20 73  r zCom[100];.  s
a430: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
a440: 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34   *zFormat1 = "%4
a450: 64 20 25 2d 31 33 73 20 25 34 64 20 25 34 64 20  d %-13s %4d %4d 
a460: 25 34 64 20 25 2d 31 33 73 20 25 2e 32 58 20 25  %4d %-13s %.2X %
a470: 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74  s\n";.  if( pOut
a480: 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64  ==0 ) pOut = std
a490: 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73  out;.  zP4 = dis
a4a0: 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74 72  playP4(pOp, zPtr
a4b0: 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b  , sizeof(zPtr));
a4c0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
a4d0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
a4e0: 4d 4d 45 4e 54 53 0a 20 20 64 69 73 70 6c 61 79  MMENTS.  display
a4f0: 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34  Comment(pOp, zP4
a500: 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f 66 28 7a  , zCom, sizeof(z
a510: 43 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a 20 20 7a  Com));.#else.  z
a520: 43 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64  Com[0] = 0;.#end
a530: 69 66 0a 20 20 2f 2a 20 4e 42 3a 20 20 54 68 65  if.  /* NB:  The
a540: 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61   sqlite3OpcodeNa
a550: 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73  me() function is
a560: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
a570: 63 6f 64 65 20 63 72 65 61 74 65 64 0a 20 20 2a  code created.  *
a580: 2a 20 62 79 20 74 68 65 20 6d 6b 6f 70 63 6f 64  * by the mkopcod
a590: 65 68 2e 61 77 6b 20 61 6e 64 20 6d 6b 6f 70 63  eh.awk and mkopc
a5a0: 6f 64 65 63 2e 61 77 6b 20 73 63 72 69 70 74 73  odec.awk scripts
a5b0: 20 77 68 69 63 68 20 65 78 74 72 61 63 74 20 74   which extract t
a5c0: 68 65 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74  he.  ** informat
a5d0: 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 76 64 62  ion from the vdb
a5e0: 65 2e 63 20 73 6f 75 72 63 65 20 74 65 78 74 20  e.c source text 
a5f0: 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75  */.  fprintf(pOu
a600: 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c  t, zFormat1, pc,
a610: 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f   .      sqlite3O
a620: 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f  pcodeName(pOp->o
a630: 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c  pcode), pOp->p1,
a640: 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70   pOp->p2, pOp->p
a650: 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c  3, zP4, pOp->p5,
a660: 0a 20 20 20 20 20 20 7a 43 6f 6d 0a 20 20 29 3b  .      zCom.  );
a670: 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b  .  fflush(pOut);
a680: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
a690: 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61   Release an arra
a6a0: 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65  y of N Mem eleme
a6b0: 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nts.*/.static vo
a6c0: 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  id releaseMemArr
a6d0: 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e  ay(Mem *p, int N
a6e0: 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20  ){.  if( p && N 
a6f0: 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64  ){.    Mem *pEnd
a700: 20 3d 20 26 70 5b 4e 5d 3b 0a 20 20 20 20 73 71   = &p[N];.    sq
a710: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
a720: 62 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70  b;.    if( db->p
a730: 6e 42 79 74 65 73 46 72 65 65 64 20 29 7b 0a 20  nBytesFreed ){. 
a740: 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
a750: 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63   if( p->szMalloc
a760: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
a770: 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29  (db, p->zMalloc)
a780: 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
a790: 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20  (++p)<pEnd );.  
a7a0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
a7b0: 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  }.    do{.      
a7c0: 61 73 73 65 72 74 28 20 28 26 70 5b 31 5d 29 3d  assert( (&p[1])=
a7d0: 3d 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62  =pEnd || p[0].db
a7e0: 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 20 20 20  ==p[1].db );.   
a7f0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
a800: 65 33 56 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e  e3VdbeCheckMemIn
a810: 76 61 72 69 61 6e 74 73 28 70 29 20 29 3b 0a 0a  variants(p) );..
a820: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c        /* This bl
a830: 6f 63 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e  ock is really an
a840: 20 69 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e   inlined version
a850: 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d   of sqlite3VdbeM
a860: 65 6d 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20  emRelease().    
a870: 20 20 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20    ** that takes 
a880: 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65  advantage of the
a890: 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20 6d   fact that the m
a8a0: 65 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65  emory cell value
a8b0: 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65   is .      ** be
a8c0: 69 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20  ing set to NULL 
a8d0: 61 66 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20  after releasing 
a8e0: 61 6e 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f  any dynamic reso
a8f0: 75 72 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a  urces..      **.
a900: 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73        ** The jus
a910: 74 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64  tification for d
a920: 75 70 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20  uplicating code 
a930: 69 73 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e  is that accordin
a940: 67 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63  g to .      ** c
a950: 61 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63  allgrind, this c
a960: 61 75 73 65 73 20 61 20 63 65 72 74 61 69 6e 20  auses a certain 
a970: 74 65 73 74 20 63 61 73 65 20 74 6f 20 68 69 74  test case to hit
a980: 20 74 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20   the CPU 4.7 .  
a990: 20 20 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c      ** percent l
a9a0: 65 73 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20  ess (x86 linux, 
a9b0: 67 63 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e  gcc version 4.1.
a9c0: 32 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20  2, -O6) than if 
a9d0: 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
a9e0: 33 4d 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65  3MemRelease() we
a9f0: 72 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68  re called from h
aa00: 65 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74  ere. With -O2, t
aa10: 68 69 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20  his jumps.      
aa20: 2a 2a 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e  ** to 6.6 percen
aa30: 74 2e 20 54 68 65 20 74 65 73 74 20 63 61 73 65  t. The test case
aa40: 20 69 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30   is inserting 10
aa50: 30 30 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74  00 rows into a t
aa60: 61 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77  able .      ** w
aa70: 69 74 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75  ith no indexes u
aa80: 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72  sing a single pr
aa90: 65 70 61 72 65 64 20 49 4e 53 45 52 54 20 73 74  epared INSERT st
aaa0: 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20  atement, bind() 
aab0: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  .      ** and re
aac0: 73 65 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61  set(). Inserts a
aad0: 72 65 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20  re grouped into 
aae0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  a transaction.. 
aaf0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 65       */.      te
ab00: 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73  stcase( p->flags
ab10: 20 26 20 4d 45 4d 5f 41 67 67 20 29 3b 0a 20 20   & MEM_Agg );.  
ab20: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
ab30: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e  >flags & MEM_Dyn
ab40: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
ab50: 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  se( p->flags & M
ab60: 45 4d 5f 46 72 61 6d 65 20 29 3b 0a 20 20 20 20  EM_Frame );.    
ab70: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66    testcase( p->f
ab80: 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65  lags & MEM_RowSe
ab90: 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t );.      if( p
aba0: 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67  ->flags&(MEM_Agg
abb0: 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61  |MEM_Dyn|MEM_Fra
abc0: 6d 65 7c 4d 45 4d 5f 52 6f 77 53 65 74 29 20 29  me|MEM_RowSet) )
abd0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
abe0: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
abf0: 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  p);.      }else 
ac00: 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20  if( p->szMalloc 
ac10: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
ac20: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
ac30: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  zMalloc);.      
ac40: 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20    p->szMalloc = 
ac50: 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  0;.      }..    
ac60: 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d    p->flags = MEM
ac70: 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20  _Undefined;.    
ac80: 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45  }while( (++p)<pE
ac90: 6e 64 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  nd );.  }.}../*.
aca0: 2a 2a 20 44 65 6c 65 74 65 20 61 20 56 64 62 65  ** Delete a Vdbe
acb0: 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64  Frame object and
acc0: 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56   its contents. V
acd0: 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73  dbeFrame objects
ace0: 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65   are.** allocate
acf0: 64 20 62 79 20 74 68 65 20 4f 50 5f 50 72 6f 67  d by the OP_Prog
ad00: 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73 71  ram opcode in sq
ad10: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
ad20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
ad30: 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28  VdbeFrameDelete(
ad40: 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20  VdbeFrame *p){. 
ad50: 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61   int i;.  Mem *a
ad60: 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d 65 4d  Mem = VdbeFrameM
ad70: 65 6d 28 70 29 3b 0a 20 20 56 64 62 65 43 75 72  em(p);.  VdbeCur
ad80: 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20 28 56  sor **apCsr = (V
ad90: 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d  dbeCursor **)&aM
ada0: 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d  em[p->nChildMem]
adb0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
adc0: 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b  ->nChildCsr; i++
add0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
ade0: 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2d 3e  beFreeCursor(p->
adf0: 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20  v, apCsr[i]);.  
ae00: 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  }.  releaseMemAr
ae10: 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68  ray(aMem, p->nCh
ae20: 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74  ildMem);.  sqlit
ae30: 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64  e3DbFree(p->v->d
ae40: 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  b, p);.}..#ifnde
ae50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
ae60: 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65  PLAIN./*.** Give
ae70: 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68   a listing of th
ae80: 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65  e program in the
ae90: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
aea0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65  ..**.** The inte
aeb0: 72 66 61 63 65 20 69 73 20 74 68 65 20 73 61 6d  rface is the sam
aec0: 65 20 61 73 20 73 71 6c 69 74 65 33 56 64 62 65  e as sqlite3Vdbe
aed0: 45 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73  Exec().  But ins
aee0: 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69  tead of.** runni
aef0: 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20  ng the code, it 
af00: 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c  invokes the call
af10: 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61  back once for ea
af20: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ch instruction..
af30: 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72 65 20  ** This feature 
af40: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
af50: 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a  ment "EXPLAIN"..
af60: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78  **.** When p->ex
af70: 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69  plain==1, each i
af80: 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69  nstruction is li
af90: 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70  sted.  When.** p
afa0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e  ->explain==2, on
afb0: 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e  ly OP_Explain in
afc0: 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c  structions are l
afd0: 69 73 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a  isted and these.
afe0: 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20  ** are shown in 
aff0: 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d  a different form
b000: 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  at.  p->explain=
b010: 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d  =2 is used to im
b020: 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41  plement.** EXPLA
b030: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a  IN QUERY PLAN..*
b040: 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70  *.** When p->exp
b050: 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74  lain==1, first t
b060: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20  he main program 
b070: 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e 20  is listed, then 
b080: 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74  each of.** the t
b090: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
b0a0: 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f 6e  ms are listed on
b0b0: 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74  e by one..*/.int
b0c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74   sqlite3VdbeList
b0d0: 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20 20  (.  Vdbe *p     
b0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b0f0: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a   The VDBE */.){.
b100: 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20    int nRow;     
b110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b120: 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20 77         /* Stop w
b130: 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72 65  hen row count re
b140: 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20 20  aches this */.  
b150: 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20 20  int nSub = 0;   
b160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b170: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
b180: 66 20 73 75 62 2d 76 64 62 65 73 20 73 65 65 6e  f sub-vdbes seen
b190: 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75 62   so far */.  Sub
b1a0: 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 20  Program **apSub 
b1b0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
b1c0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75    /* Array of su
b1d0: 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d  b-vdbes */.  Mem
b1e0: 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20   *pSub = 0;     
b1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b200: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
b210: 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20 73   hold array of s
b220: 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c  ubprogs */.  sql
b230: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
b240: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b250: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
b260: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
b270: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
b280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b290: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
b2a0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
b2b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
b2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2d0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
b2e0: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  */.  Mem *pMem =
b2f0: 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20   &p->aMem[1];   
b300: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
b310: 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c 74  st Mem of result
b320: 20 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72   set */..  asser
b330: 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b  t( p->explain );
b340: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
b350: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
b360: 52 55 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  RUN );.  assert(
b370: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
b380: 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  K || p->rc==SQLI
b390: 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63  TE_BUSY || p->rc
b3a0: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
b3b0: 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f  ;..  /* Even tho
b3c0: 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20  ugh this opcode 
b3d0: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 79 6e  does not use dyn
b3e0: 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66 6f 72  amic strings for
b3f0: 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  .  ** the result
b400: 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  , result columns
b410: 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61   may become dyna
b420: 6d 69 63 20 69 66 20 74 68 65 20 75 73 65 72 20  mic if the user 
b430: 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74  calls.  ** sqlit
b440: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36  e3_column_text16
b450: 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72  (), causing a tr
b460: 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46  anslation to UTF
b470: 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20  -16 encoding..  
b480: 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  */.  releaseMemA
b490: 72 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 20  rray(pMem, 8);. 
b4a0: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
b4b0: 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63   0;..  if( p->rc
b4c0: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
b4d0: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61  {.    /* This ha
b4e0: 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f  ppens if a mallo
b4f0: 63 28 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c  c() inside a cal
b500: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c  l to sqlite3_col
b510: 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20  umn_text() or.  
b520: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c    ** sqlite3_col
b530: 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69  umn_text16() fai
b540: 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c  led.  */.    sql
b550: 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
b560: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
b570: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
b580: 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75    /* When the nu
b590: 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72  mber of output r
b5a0: 6f 77 73 20 72 65 61 63 68 65 73 20 6e 52 6f 77  ows reaches nRow
b5b0: 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65  , that means the
b5c0: 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61  .  ** listing ha
b5d0: 73 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20 73  s finished and s
b5e0: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 73 68  qlite3_step() sh
b5f0: 6f 75 6c 64 20 72 65 74 75 72 6e 20 53 51 4c 49  ould return SQLI
b600: 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52  TE_DONE..  ** nR
b610: 6f 77 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66  ow is the sum of
b620: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
b630: 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  ows in the main 
b640: 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20  program, plus.  
b650: 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  ** the sum of th
b660: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
b670: 20 69 6e 20 61 6c 6c 20 74 72 69 67 67 65 72 20   in all trigger 
b680: 73 75 62 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f  subprograms enco
b690: 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20  untered.  ** so 
b6a0: 66 61 72 2e 20 20 54 68 65 20 6e 52 6f 77 20 76  far.  The nRow v
b6b0: 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72 65 61  alue will increa
b6c0: 73 65 20 61 73 20 6e 65 77 20 74 72 69 67 67 65  se as new trigge
b6d0: 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72  r subprograms ar
b6e0: 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72  e.  ** encounter
b6f0: 65 64 2c 20 62 75 74 20 70 2d 3e 70 63 20 77 69  ed, but p->pc wi
b700: 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61  ll eventually ca
b710: 74 63 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a  tch up to nRow..
b720: 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d    */.  nRow = p-
b730: 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65  >nOp;.  if( p->e
b740: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20  xplain==1 ){.   
b750: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 38 20   /* The first 8 
b760: 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72 65  memory cells are
b770: 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 72 65   used for the re
b780: 73 75 6c 74 20 73 65 74 2e 20 20 53 6f 20 77 65  sult set.  So we
b790: 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d   will.    ** com
b7a0: 6d 61 6e 64 65 65 72 20 74 68 65 20 39 74 68 20  mandeer the 9th 
b7b0: 63 65 6c 6c 20 74 6f 20 75 73 65 20 61 73 20 73  cell to use as s
b7c0: 74 6f 72 61 67 65 20 66 6f 72 20 61 6e 20 61 72  torage for an ar
b7d0: 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a  ray of pointers.
b7e0: 20 20 20 20 2a 2a 20 74 6f 20 74 72 69 67 67 65      ** to trigge
b7f0: 72 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20  r subprograms.  
b800: 54 68 65 20 56 44 42 45 20 69 73 20 67 75 61 72  The VDBE is guar
b810: 61 6e 74 65 65 64 20 74 6f 20 68 61 76 65 20 61  anteed to have a
b820: 74 20 6c 65 61 73 74 20 39 0a 20 20 20 20 2a 2a  t least 9.    **
b830: 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20   cells.  */.    
b840: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e  assert( p->nMem>
b850: 39 20 29 3b 0a 20 20 20 20 70 53 75 62 20 3d 20  9 );.    pSub = 
b860: 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20  &p->aMem[9];.   
b870: 20 69 66 28 20 70 53 75 62 2d 3e 66 6c 61 67 73   if( pSub->flags
b880: 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20  &MEM_Blob ){.   
b890: 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72     /* On the fir
b8a0: 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  st call to sqlit
b8b0: 65 33 5f 73 74 65 70 28 29 2c 20 70 53 75 62 20  e3_step(), pSub 
b8c0: 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c  will hold a NULL
b8d0: 2e 20 20 49 74 20 69 73 0a 20 20 20 20 20 20 2a  .  It is.      *
b8e0: 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  * initialized to
b8f0: 20 61 20 42 4c 4f 42 20 62 79 20 74 68 65 20 50   a BLOB by the P
b900: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 70 72 6f  4_SUBPROGRAM pro
b910: 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 62 65  cessing logic be
b920: 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75  low */.      nSu
b930: 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65  b = pSub->n/size
b940: 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20 20 20 20  of(Vdbe*);.     
b950: 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f   apSub = (SubPro
b960: 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b  gram **)pSub->z;
b970: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
b980: 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29  =0; i<nSub; i++)
b990: 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20  {.      nRow += 
b9a0: 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20  apSub[i]->nOp;. 
b9b0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a     }.  }..  do{.
b9c0: 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b      i = p->pc++;
b9d0: 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f  .  }while( i<nRo
b9e0: 77 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  w && p->explain=
b9f0: 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e  =2 && p->aOp[i].
ba00: 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61  opcode!=OP_Expla
ba10: 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e  in );.  if( i>=n
ba20: 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  Row ){.    p->rc
ba30: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
ba40: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
ba50: 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  NE;.  }else if( 
ba60: 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75  db->u1.isInterru
ba70: 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72  pted ){.    p->r
ba80: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  c = SQLITE_INTER
ba90: 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53  RUPT;.    rc = S
baa0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
bab0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f   sqlite3VdbeErro
bac0: 72 28 70 2c 20 73 71 6c 69 74 65 33 45 72 72 53  r(p, sqlite3ErrS
bad0: 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65  tr(p->rc));.  }e
bae0: 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
baf0: 50 34 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b  P4;.    Op *pOp;
bb00: 0a 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f  .    if( i<p->nO
bb10: 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  p ){.      /* Th
bb20: 65 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e 75  e output line nu
bb30: 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e  mber is small en
bb40: 6f 75 67 68 20 74 68 61 74 20 77 65 20 61 72 65  ough that we are
bb50: 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20   still in the.  
bb60: 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67      ** main prog
bb70: 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f  ram. */.      pO
bb80: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a  p = &p->aOp[i];.
bb90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
bba0: 20 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72 65   /* We are curre
bbb0: 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75 62  ntly listing sub
bbc0: 70 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75 72  programs.  Figur
bbd0: 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20  e out which one 
bbe0: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69 63  and.      ** pic
bbf0: 6b 20 75 70 20 74 68 65 20 61 70 70 72 6f 70 72  k up the appropr
bc00: 69 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a  iate opcode. */.
bc10: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
bc20: 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a     i -= p->nOp;.
bc30: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69        for(j=0; i
bc40: 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b  >=apSub[j]->nOp;
bc50: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
bc60: 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f   -= apSub[j]->nO
bc70: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
bc80: 20 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d   pOp = &apSub[j]
bc90: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a  ->aOp[i];.    }.
bca0: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
bcb0: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70  in==1 ){.      p
bcc0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
bcd0: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d  _Int;.      pMem
bce0: 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20  ->u.i = i;      
bcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f            /* Pro
bd10: 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  gram counter */.
bd20: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20        pMem++;.  
bd30: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
bd40: 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c  gs = MEM_Static|
bd50: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
bd60: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20  ;.      pMem->z 
bd70: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
bd80: 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e  OpcodeName(pOp->
bd90: 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70 63 6f  opcode); /* Opco
bda0: 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  de */.      asse
bdb0: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
bdc0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
bdd0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
bde0: 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  0(pMem->z);.    
bdf0: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
be00: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20  LITE_UTF8;.     
be10: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20   pMem++;..      
be20: 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72  /* When an OP_Pr
be30: 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 73 20  ogram opcode is 
be40: 65 6e 63 6f 75 6e 74 65 72 20 28 74 68 65 20 6f  encounter (the o
be50: 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20  nly opcode that 
be60: 68 61 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 50  has.      ** a P
be70: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 61 72 67  4_SUBPROGRAM arg
be80: 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64 20 74  ument), expand t
be90: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
bea0: 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72  rray of subprogr
beb0: 61 6d 73 0a 20 20 20 20 20 20 2a 2a 20 6b 65 70  ams.      ** kep
bec0: 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e  t in p->aMem[9].
bed0: 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65  z to hold the ne
bee0: 77 20 70 72 6f 67 72 61 6d 20 2d 20 61 73 73 75  w program - assu
bef0: 6d 69 6e 67 20 74 68 69 73 20 73 75 62 70 72 6f  ming this subpro
bf00: 67 72 61 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61  gram.      ** ha
bf10: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  s not already be
bf20: 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20 20 20 2a  en seen..      *
bf30: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  /.      if( pOp-
bf40: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50  >p4type==P4_SUBP
bf50: 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20  ROGRAM ){.      
bf60: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e    int nByte = (n
bf70: 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75  Sub+1)*sizeof(Su
bf80: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
bf90: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
bfa0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53     for(j=0; j<nS
bfb0: 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ub; j++){.      
bfc0: 20 20 20 20 69 66 28 20 61 70 53 75 62 5b 6a 5d      if( apSub[j]
bfd0: 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72  ==pOp->p4.pProgr
bfe0: 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  am ) break;.    
bff0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
c000: 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20 53 51 4c  ( j==nSub && SQL
c010: 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56  ITE_OK==sqlite3V
c020: 64 62 65 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c  dbeMemGrow(pSub,
c030: 20 6e 42 79 74 65 2c 20 6e 53 75 62 21 3d 30 29   nByte, nSub!=0)
c040: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70   ){.          ap
c050: 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61  Sub = (SubProgra
c060: 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20  m **)pSub->z;.  
c070: 20 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e 53          apSub[nS
c080: 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e  ub++] = pOp->p4.
c090: 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20  pProgram;.      
c0a0: 20 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73 20      pSub->flags 
c0b0: 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20  |= MEM_Blob;.   
c0c0: 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d         pSub->n =
c0d0: 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75 62   nSub*sizeof(Sub
c0e0: 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20  Program*);.     
c0f0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
c100: 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c   }..    pMem->fl
c110: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
c120: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70     pMem->u.i = p
c130: 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20  Op->p1;         
c140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c150: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d   /* P1 */.    pM
c160: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d  em++;..    pMem-
c170: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
c180: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  ;.    pMem->u.i 
c190: 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20  = pOp->p2;      
c1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1b0: 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20      /* P2 */.   
c1c0: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d   pMem++;..    pM
c1d0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
c1e0: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  Int;.    pMem->u
c1f0: 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20  .i = pOp->p3;   
c200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c210: 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a         /* P3 */.
c220: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
c230: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
c240: 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a  MemClearAndResiz
c250: 65 28 70 4d 65 6d 2c 20 31 30 30 29 20 29 7b 20  e(pMem, 100) ){ 
c260: 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 61  /* P4 */.      a
c270: 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61  ssert( p->db->ma
c280: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
c290: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c2a0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
c2b0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
c2c0: 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72   MEM_Str|MEM_Ter
c2d0: 6d 3b 0a 20 20 20 20 7a 50 34 20 3d 20 64 69 73  m;.    zP4 = dis
c2e0: 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d  playP4(pOp, pMem
c2f0: 2d 3e 7a 2c 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c  ->z, pMem->szMal
c300: 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 7a 50  loc);.    if( zP
c310: 34 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20  4!=pMem->z ){.  
c320: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
c330: 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a  emSetStr(pMem, z
c340: 50 34 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  P4, -1, SQLITE_U
c350: 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  TF8, 0);.    }el
c360: 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
c370: 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a  ( pMem->z!=0 );.
c380: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
c390: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
c3a0: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  pMem->z);.      
c3b0: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
c3c0: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20  TE_UTF8;.    }. 
c3d0: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
c3e0: 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  if( p->explain==
c3f0: 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  1 ){.      if( s
c400: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65  qlite3VdbeMemCle
c410: 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d  arAndResize(pMem
c420: 2c 20 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 4) ){.        
c430: 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d  assert( p->db->m
c440: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
c450: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
c460: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
c470: 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e    }.      pMem->
c480: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c  flags = MEM_Str|
c490: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20  MEM_Term;.      
c4a0: 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20  pMem->n = 2;.   
c4b0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
c4c0: 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  ntf(3, pMem->z, 
c4d0: 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29  "%.2x", pOp->p5)
c4e0: 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20  ;   /* P5 */.   
c4f0: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53     pMem->enc = S
c500: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20  QLITE_UTF8;.    
c510: 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66    pMem++;.  .#if
c520: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
c530: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
c540: 54 53 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  TS.      if( sql
c550: 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72  ite3VdbeMemClear
c560: 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20  AndResize(pMem, 
c570: 35 30 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  500) ){.        
c580: 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d  assert( p->db->m
c590: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
c5a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
c5b0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
c5c0: 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e    }.      pMem->
c5d0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c  flags = MEM_Str|
c5e0: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20  MEM_Term;.      
c5f0: 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69 73 70 6c 61  pMem->n = displa
c600: 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50  yComment(pOp, zP
c610: 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29  4, pMem->z, 500)
c620: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ;.      pMem->en
c630: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
c640: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70 4d 65  .#else.      pMe
c650: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  m->flags = MEM_N
c660: 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ull;            
c670: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
c680: 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64 69 66 0a  mment */.#endif.
c690: 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52      }..    p->nR
c6a0: 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 34  esColumn = 8 - 4
c6b0: 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b  *(p->explain-1);
c6c0: 0a 20 20 20 20 70 2d 3e 70 52 65 73 75 6c 74 53  .    p->pResultS
c6d0: 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d  et = &p->aMem[1]
c6e0: 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  ;.    p->rc = SQ
c6f0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20  LITE_OK;.    rc 
c700: 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20  = SQLITE_ROW;.  
c710: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
c720: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
c730: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a  E_OMIT_EXPLAIN *
c740: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
c750: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69  _DEBUG./*.** Pri
c760: 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61 74 20  nt the SQL that 
c770: 77 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65  was used to gene
c780: 72 61 74 65 20 61 20 56 44 42 45 20 70 72 6f 67  rate a VDBE prog
c790: 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ram..*/.void sql
c7a0: 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c  ite3VdbePrintSql
c7b0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 63 6f 6e  (Vdbe *p){.  con
c7c0: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a  st char *z = 0;.
c7d0: 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b    if( p->zSql ){
c7e0: 0a 20 20 20 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c  .    z = p->zSql
c7f0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
c800: 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20 20 20 63  >nOp>=1 ){.    c
c810: 6f 6e 73 74 20 56 64 62 65 4f 70 20 2a 70 4f 70  onst VdbeOp *pOp
c820: 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20   = &p->aOp[0];. 
c830: 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
c840: 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70  de==OP_Init && p
c850: 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20  Op->p4.z!=0 ){. 
c860: 20 20 20 20 20 7a 20 3d 20 70 4f 70 2d 3e 70 34       z = pOp->p4
c870: 2e 7a 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  .z;.      while(
c880: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
c890: 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d  *z) ) z++;.    }
c8a0: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 20 70  .  }.  if( z ) p
c8b0: 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d  rintf("SQL: [%s]
c8c0: 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69  \n", z);.}.#endi
c8d0: 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
c8e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
c8f0: 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  E) && defined(SQ
c900: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
c910: 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  ACE)./*.** Print
c920: 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73   an IOTRACE mess
c930: 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20  age showing SQL 
c940: 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  content..*/.void
c950: 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72   sqlite3VdbeIOTr
c960: 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b  aceSql(Vdbe *p){
c970: 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e  .  int nOp = p->
c980: 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  nOp;.  VdbeOp *p
c990: 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  Op;.  if( sqlite
c9a0: 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65  3IoTrace==0 ) re
c9b0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c  turn;.  if( nOp<
c9c0: 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f  1 ) return;.  pO
c9d0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a  p = &p->aOp[0];.
c9e0: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
c9f0: 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f  e==OP_Init && pO
ca00: 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20  p->p4.z!=0 ){.  
ca10: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
ca20: 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20  char z[1000];.  
ca30: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
ca40: 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c  tf(sizeof(z), z,
ca50: 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a   "%s", pOp->p4.z
ca60: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
ca70: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
ca80: 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20  [i]); i++){}.   
ca90: 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20   for(j=0; z[i]; 
caa0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
cab0: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
cac0: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
cad0: 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20  if( z[i-1]!=' ' 
cae0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a  ){.          z[j
caf0: 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20  ++] = ' ';.     
cb00: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
cb10: 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d  {.        z[j++]
cb20: 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d   = z[i];.      }
cb30: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20  .    }.    z[j] 
cb40: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
cb50: 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c  IoTrace("SQL %s\
cb60: 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65  n", z);.  }.}.#e
cb70: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
cb80: 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53 51  OMIT_TRACE && SQ
cb90: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
cba0: 41 43 45 20 2a 2f 0a 0a 2f 2a 20 41 6e 20 69 6e  ACE */../* An in
cbb0: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f  stance of this o
cbc0: 62 6a 65 63 74 20 64 65 73 63 72 69 62 65 73 20  bject describes 
cbd0: 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 61 76 61 69  bulk memory avai
cbe0: 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 0a 2a 2a  lable for use.**
cbf0: 20 62 79 20 73 75 62 63 6f 6d 70 6f 6e 65 6e 74   by subcomponent
cc00: 73 20 6f 66 20 61 20 70 72 65 70 61 72 65 64 20  s of a prepared 
cc10: 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 70 61 63  statement.  Spac
cc20: 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f  e is allocated o
cc30: 75 74 0a 2a 2a 20 6f 66 20 61 20 52 65 75 73 61  ut.** of a Reusa
cc40: 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74 20  bleSpace object 
cc50: 62 79 20 74 68 65 20 61 6c 6c 6f 63 53 70 61 63  by the allocSpac
cc60: 65 28 29 20 72 6f 75 74 69 6e 65 20 62 65 6c 6f  e() routine belo
cc70: 77 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52 65 75  w..*/.struct Reu
cc80: 73 61 62 6c 65 53 70 61 63 65 20 7b 0a 20 20 75  sableSpace {.  u
cc90: 38 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20  8 *pSpace;      
cca0: 20 20 20 20 2f 2a 20 41 76 61 69 6c 61 62 6c 65      /* Available
ccb0: 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74   memory */.  int
ccc0: 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
ccd0: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 61 76    /* Bytes of av
cce0: 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79 20 2a  ailable memory *
ccf0: 2f 0a 20 20 69 6e 74 20 6e 4e 65 65 64 65 64 3b  /.  int nNeeded;
cd00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
cd10: 6c 20 62 79 74 65 73 20 74 68 61 74 20 63 6f 75  l bytes that cou
cd20: 6c 64 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61  ld not be alloca
cd30: 74 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 72  ted */.};../* Tr
cd40: 79 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6e 42  y to allocate nB
cd50: 79 74 65 20 62 79 74 65 73 20 6f 66 20 38 2d 62  yte bytes of 8-b
cd60: 79 74 65 20 61 6c 69 67 6e 65 64 20 62 75 6c 6b  yte aligned bulk
cd70: 20 6d 65 6d 6f 72 79 20 66 6f 72 20 70 42 75 66   memory for pBuf
cd80: 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 52 65 75  .** from the Reu
cd90: 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63  sableSpace objec
cda0: 74 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  t.  Return a poi
cdb0: 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f  nter to the allo
cdc0: 63 61 74 65 64 0a 2a 2a 20 6d 65 6d 6f 72 79 20  cated.** memory 
cdd0: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
cde0: 69 6e 73 75 66 66 69 63 69 65 6e 74 20 6d 65 6d  insufficient mem
cdf0: 6f 72 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ory is available
ce00: 20 69 6e 20 74 68 65 0a 2a 2a 20 52 65 75 73 61   in the.** Reusa
ce10: 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74 2c  bleSpace object,
ce20: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 52 65   increase the Re
ce30: 75 73 61 62 6c 65 53 70 61 63 65 2e 6e 4e 65 65  usableSpace.nNee
ce40: 64 65 64 0a 2a 2a 20 76 61 6c 75 65 20 62 79 20  ded.** value by 
ce50: 74 68 65 20 61 6d 6f 75 6e 74 20 6e 65 65 64 65  the amount neede
ce60: 64 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  d and return NUL
ce70: 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 66  L..**.** If pBuf
ce80: 20 69 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c 6c   is not initiall
ce90: 79 20 4e 55 4c 4c 2c 20 74 68 61 74 20 6d 65 61  y NULL, that mea
cea0: 6e 73 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f  ns that the memo
ceb0: 72 79 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a  ry has already.*
cec0: 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  * been allocated
ced0: 20 62 79 20 61 20 70 72 69 6f 72 20 63 61 6c 6c   by a prior call
cee0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
cef0: 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e  , so just return
cf00: 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 70 42   a copy.** of pB
cf10: 75 66 20 61 6e 64 20 6c 65 61 76 65 20 52 65 75  uf and leave Reu
cf20: 73 61 62 6c 65 53 70 61 63 65 20 75 6e 63 68 61  sableSpace uncha
cf30: 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  nged..**.** This
cf40: 20 61 6c 6c 6f 63 61 74 6f 72 20 69 73 20 65 6d   allocator is em
cf50: 70 6c 6f 79 65 64 20 74 6f 20 72 65 70 75 72 70  ployed to repurp
cf60: 6f 73 65 20 75 6e 75 73 65 64 20 73 6c 6f 74 73  ose unused slots
cf70: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
cf80: 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 20 61 72 72  he.** opcode arr
cf90: 61 79 20 6f 66 20 70 72 65 70 61 72 65 64 20 73  ay of prepared s
cfa0: 74 61 74 65 20 66 6f 72 20 6f 74 68 65 72 20 6d  tate for other m
cfb0: 65 6d 6f 72 79 20 6e 65 65 64 73 20 6f 66 20 74  emory needs of t
cfc0: 68 65 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73  he prepared.** s
cfd0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  tatement..*/.sta
cfe0: 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53  tic void *allocS
cff0: 70 61 63 65 28 0a 20 20 73 74 72 75 63 74 20 52  pace(.  struct R
d000: 65 75 73 61 62 6c 65 53 70 61 63 65 20 2a 70 2c  eusableSpace *p,
d010: 20 20 2f 2a 20 42 75 6c 6b 20 6d 65 6d 6f 72 79    /* Bulk memory
d020: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61   available for a
d030: 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 76  llocation */.  v
d040: 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
d050: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
d060: 74 65 72 20 74 6f 20 61 20 70 72 69 6f 72 20 61  ter to a prior a
d070: 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  llocation */.  i
d080: 6e 74 20 6e 42 79 74 65 20 20 20 20 20 20 20 20  nt nByte        
d090: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
d0a0: 73 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64  s of memory need
d0b0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  ed */.){.  asser
d0c0: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
d0d0: 49 47 4e 4d 45 4e 54 28 70 2d 3e 70 53 70 61 63  IGNMENT(p->pSpac
d0e0: 65 29 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66  e) );.  if( pBuf
d0f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65  ==0 ){.    nByte
d100: 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29   = ROUND8(nByte)
d110: 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 20  ;.    if( nByte 
d120: 3c 3d 20 70 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  <= p->nFree ){. 
d130: 20 20 20 20 20 70 2d 3e 6e 46 72 65 65 20 2d 3d       p->nFree -=
d140: 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 70 42   nByte;.      pB
d150: 75 66 20 3d 20 26 70 2d 3e 70 53 70 61 63 65 5b  uf = &p->pSpace[
d160: 70 2d 3e 6e 46 72 65 65 5d 3b 0a 20 20 20 20 7d  p->nFree];.    }
d170: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  else{.      p->n
d180: 4e 65 65 64 65 64 20 2b 3d 20 6e 42 79 74 65 3b  Needed += nByte;
d190: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
d1a0: 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
d1b0: 41 4c 49 47 4e 4d 45 4e 54 28 70 42 75 66 29 20  ALIGNMENT(pBuf) 
d1c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66  );.  return pBuf
d1d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e  ;.}../*.** Rewin
d1e0: 64 20 74 68 65 20 56 44 42 45 20 62 61 63 6b 20  d the VDBE back 
d1f0: 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
d200: 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20   in preparation 
d210: 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69  for.** running i
d220: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
d230: 65 33 56 64 62 65 52 65 77 69 6e 64 28 56 64 62  e3VdbeRewind(Vdb
d240: 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e  e *p){.#if defin
d250: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
d260: 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45   || defined(VDBE
d270: 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20  _PROFILE).  int 
d280: 69 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  i;.#endif.  asse
d290: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
d2a0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
d2b0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
d2c0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73  );..  /* There s
d2d0: 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73  hould be at leas
d2e0: 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20  t one opcode..  
d2f0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
d300: 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53  nOp>0 );..  /* S
d310: 65 74 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20  et the magic to 
d320: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73  VDBE_MAGIC_RUN s
d330: 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61  ooner rather tha
d340: 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d  n later. */.  p-
d350: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
d360: 47 49 43 5f 52 55 4e 3b 0a 0a 23 69 66 64 65 66  GIC_RUN;..#ifdef
d370: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
d380: 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 4d  for(i=1; i<p->nM
d390: 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  em; i++){.    as
d3a0: 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d  sert( p->aMem[i]
d3b0: 2e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20  .db==p->db );.  
d3c0: 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70 63  }.#endif.  p->pc
d3d0: 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d   = -1;.  p->rc =
d3e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d   SQLITE_OK;.  p-
d3f0: 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f  >errorAction = O
d400: 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 6e 43  E_Abort;.  p->nC
d410: 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e  hange = 0;.  p->
d420: 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20  cacheCtr = 1;.  
d430: 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46  p->minWriteFileF
d440: 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70  ormat = 255;.  p
d450: 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->iStatement = 0
d460: 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72  ;.  p->nFkConstr
d470: 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66  aint = 0;.#ifdef
d480: 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
d490: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
d4a0: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e  p; i++){.    p->
d4b0: 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a  aOp[i].cnt = 0;.
d4c0: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79      p->aOp[i].cy
d4d0: 63 6c 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 23 65  cles = 0;.  }.#e
d4e0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  ndif.}../*.** Pr
d4f0: 65 70 61 72 65 20 61 20 76 69 72 74 75 61 6c 20  epare a virtual 
d500: 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63  machine for exec
d510: 75 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 66 69  ution for the fi
d520: 72 73 74 20 74 69 6d 65 20 61 66 74 65 72 0a 2a  rst time after.*
d530: 2a 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 76  * creating the v
d540: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20  irtual machine. 
d550: 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74   This involves t
d560: 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73  hings such.** as
d570: 20 61 6c 6c 6f 63 61 74 69 6e 67 20 72 65 67 69   allocating regi
d580: 73 74 65 72 73 20 61 6e 64 20 69 6e 69 74 69 61  sters and initia
d590: 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72  lizing the progr
d5a0: 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41  am counter..** A
d5b0: 66 74 65 72 20 74 68 65 20 56 44 42 45 20 68 61  fter the VDBE ha
d5c0: 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 69 74  s be prepped, it
d5d0: 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 65 64   can be executed
d5e0: 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a   by one or more.
d5f0: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
d600: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20  te3VdbeExec().  
d610: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
d620: 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c  tion may be call
d630: 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20  ed exactly once 
d640: 6f 6e 20 65 61 63 68 20 76 69 72 74 75 61 6c 20  on each virtual 
d650: 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66 74 65  machine..** Afte
d660: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  r this routine i
d670: 73 20 63 61 6c 6c 65 64 20 74 68 65 20 56 4d 20  s called the VM 
d680: 68 61 73 20 62 65 65 6e 20 22 70 61 63 6b 61 67  has been "packag
d690: 65 64 22 20 61 6e 64 20 69 73 20 72 65 61 64 79  ed" and is ready
d6a0: 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41 66 74  .** to run.  Aft
d6b0: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
d6c0: 69 73 20 63 61 6c 6c 65 64 2c 20 66 75 72 74 68  is called, furth
d6d0: 65 72 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20  er calls to .** 
d6e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d6f0: 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65  () functions are
d700: 20 70 72 6f 68 69 62 69 74 65 64 2e 20 20 54 68   prohibited.  Th
d710: 69 73 20 72 6f 75 74 69 6e 65 20 64 69 73 63 6f  is routine disco
d720: 6e 6e 65 63 74 73 0a 2a 2a 20 74 68 65 20 56 64  nnects.** the Vd
d730: 62 65 20 66 72 6f 6d 20 74 68 65 20 50 61 72 73  be from the Pars
d740: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 68 65  e object that he
d750: 6c 70 65 64 20 67 65 6e 65 72 61 74 65 20 69 74  lped generate it
d760: 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20   so that the.** 
d770: 74 68 65 20 56 64 62 65 20 62 65 63 6f 6d 65 73  the Vdbe becomes
d780: 20 61 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74 20   an independent 
d790: 65 6e 74 69 74 79 20 61 6e 64 20 74 68 65 20 50  entity and the P
d7a0: 61 72 73 65 20 6f 62 6a 65 63 74 20 63 61 6e 20  arse object can 
d7b0: 62 65 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e  be.** destroyed.
d7c0: 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73  .**.** Use the s
d7d0: 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64  qlite3VdbeRewind
d7e0: 28 29 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20  () procedure to 
d7f0: 72 65 73 74 6f 72 65 20 61 20 76 69 72 74 75 61  restore a virtua
d800: 6c 20 6d 61 63 68 69 6e 65 20 62 61 63 6b 0a 2a  l machine back.*
d810: 2a 20 74 6f 20 69 74 73 20 69 6e 69 74 69 61 6c  * to its initial
d820: 20 73 74 61 74 65 20 61 66 74 65 72 20 69 74 20   state after it 
d830: 68 61 73 20 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f  has been run..*/
d840: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
d850: 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64  eMakeReady(.  Vd
d860: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
d870: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d880: 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 50 61  The VDBE */.  Pa
d890: 72 73 65 20 2a 70 50 61 72 73 65 20 20 20 20 20  rse *pParse     
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d8b0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
d8c0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
d8d0: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
d8e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
d8f0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
d900: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b  n */.  int nVar;
d910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d920: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
d930: 6f 66 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f  of parameters */
d940: 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20  .  int nMem;    
d950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d960: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 56    /* Number of V
d970: 4d 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  M memory registe
d980: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72  rs */.  int nCur
d990: 73 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  sor;            
d9a0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
d9b0: 20 6f 66 20 63 75 72 73 6f 72 73 20 72 65 71 75   of cursors requ
d9c0: 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  ired */.  int nA
d9d0: 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rg;             
d9e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
d9f0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
da00: 69 6e 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a  in subprograms *
da10: 2f 0a 20 20 69 6e 74 20 6e 4f 6e 63 65 3b 20 20  /.  int nOnce;  
da20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da30: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
da40: 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63 74  OP_Once instruct
da50: 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  ions */.  int n;
da60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
da80: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 74   counter */.  st
da90: 72 75 63 74 20 52 65 75 73 61 62 6c 65 53 70 61  ruct ReusableSpa
daa0: 63 65 20 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  ce x;        /* 
dab0: 52 65 75 73 61 62 6c 65 20 62 75 6c 6b 20 6d 65  Reusable bulk me
dac0: 6d 6f 72 79 20 2a 2f 0a 0a 20 20 61 73 73 65 72  mory */..  asser
dad0: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
dae0: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
daf0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
db00: 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
db10: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
db20: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
db30: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 3d   assert( pParse=
db40: 3d 70 2d 3e 70 50 61 72 73 65 20 29 3b 0a 20 20  =p->pParse );.  
db50: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
db60: 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
db70: 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 6e  Failed==0 );.  n
db80: 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 56  Var = pParse->nV
db90: 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70 50 61  ar;.  nMem = pPa
dba0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e 43 75  rse->nMem;.  nCu
dbb0: 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
dbc0: 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20 70 50  Tab;.  nArg = pP
dbd0: 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b 0a 20  arse->nMaxArg;. 
dbe0: 20 6e 4f 6e 63 65 20 3d 20 70 50 61 72 73 65 2d   nOnce = pParse-
dbf0: 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20 6e 4f  >nOnce;.  if( nO
dc00: 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e 63 65 20 3d  nce==0 ) nOnce =
dc10: 20 31 3b 20 2f 2a 20 45 6e 73 75 72 65 20 61 74   1; /* Ensure at
dc20: 20 6c 65 61 73 74 20 6f 6e 65 20 62 79 74 65 20   least one byte 
dc30: 69 6e 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 5b  in p->aOnceFlag[
dc40: 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 46 6f 72  ] */.  .  /* For
dc50: 20 65 61 63 68 20 63 75 72 73 6f 72 20 72 65 71   each cursor req
dc60: 75 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f  uired, also allo
dc70: 63 61 74 65 20 61 20 6d 65 6d 6f 72 79 20 63 65  cate a memory ce
dc80: 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20  ll. Memory.  ** 
dc90: 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43  cells (nMem+1-nC
dca0: 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e  ursor)..nMem, in
dcb0: 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20 6e 65  clusive, will ne
dcc0: 76 65 72 20 62 65 20 75 73 65 64 20 62 79 0a 20  ver be used by. 
dcd0: 20 2a 2a 20 74 68 65 20 76 64 62 65 20 70 72 6f   ** the vdbe pro
dce0: 67 72 61 6d 2e 20 49 6e 73 74 65 61 64 20 74 68  gram. Instead th
dcf0: 65 79 20 61 72 65 20 75 73 65 64 20 74 6f 20 61  ey are used to a
dd00: 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
dd10: 6f 72 0a 20 20 2a 2a 20 56 64 62 65 43 75 72 73  or.  ** VdbeCurs
dd20: 6f 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72 75  or/BtCursor stru
dd30: 63 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f 62  ctures. The blob
dd40: 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63   of memory assoc
dd50: 69 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a 2a  iated with .  **
dd60: 20 63 75 72 73 6f 72 20 30 20 69 73 20 73 74 6f   cursor 0 is sto
dd70: 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65  red in memory ce
dd80: 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20  ll nMem. Memory 
dd90: 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20 20  cell (nMem-1).  
dda0: 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62 6c  ** stores the bl
ddb0: 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73  ob of memory ass
ddc0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
ddd0: 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a 2a  sor 1, etc..  **
dde0: 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  .  ** See also: 
ddf0: 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29  allocateCursor()
de00: 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d  ..  */.  nMem +=
de10: 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20   nCursor;..  /* 
de20: 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
de30: 75 63 68 20 72 65 75 73 61 62 6c 65 20 6d 65 6d  uch reusable mem
de40: 6f 72 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ory is available
de50: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
de60: 68 65 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 20 61  he.  ** opcode a
de70: 72 72 61 79 2e 20 20 54 68 69 73 20 65 78 74 72  rray.  This extr
de80: 61 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65  a memory will be
de90: 20 72 65 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72   reallocated for
dea0: 20 6f 74 68 65 72 20 65 6c 65 6d 65 6e 74 73 0a   other elements.
deb0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 72 65 70    ** of the prep
dec0: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
ded0: 20 20 2a 2f 0a 20 20 6e 20 3d 20 52 4f 55 4e 44    */.  n = ROUND
dee0: 38 28 73 69 7a 65 6f 66 28 4f 70 29 2a 70 2d 3e  8(sizeof(Op)*p->
def0: 6e 4f 70 29 3b 20 20 20 20 20 20 20 20 20 20 20  nOp);           
df00: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6f     /* Bytes of o
df10: 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20 75 73 65  pcode memory use
df20: 64 20 2a 2f 0a 20 20 78 2e 70 53 70 61 63 65 20  d */.  x.pSpace 
df30: 3d 20 26 28 28 75 38 2a 29 70 2d 3e 61 4f 70 29  = &((u8*)p->aOp)
df40: 5b 6e 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [n];            
df50: 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 6f 70 63     /* Unused opc
df60: 6f 64 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  ode memory */.  
df70: 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
df80: 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 78 2e 70  TE_ALIGNMENT(x.p
df90: 53 70 61 63 65 29 20 29 3b 0a 20 20 78 2e 6e 46  Space) );.  x.nF
dfa0: 72 65 65 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38  ree = ROUNDDOWN8
dfb0: 28 70 50 61 72 73 65 2d 3e 73 7a 4f 70 41 6c 6c  (pParse->szOpAll
dfc0: 6f 63 20 2d 20 6e 29 3b 20 20 2f 2a 20 42 79 74  oc - n);  /* Byt
dfd0: 65 73 20 6f 66 20 75 6e 75 73 65 64 20 6d 65 6d  es of unused mem
dfe0: 6f 72 79 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ory */.  assert(
dff0: 20 78 2e 6e 46 72 65 65 3e 3d 30 20 29 3b 0a 20   x.nFree>=0 );. 
e000: 20 69 66 28 20 78 2e 6e 46 72 65 65 3e 30 20 29   if( x.nFree>0 )
e010: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 78 2e 70  {.    memset(x.p
e020: 53 70 61 63 65 2c 20 30 2c 20 78 2e 6e 46 72 65  Space, 0, x.nFre
e030: 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
e040: 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
e050: 4d 45 4e 54 28 26 78 2e 70 53 70 61 63 65 5b 78  MENT(&x.pSpace[x
e060: 2e 6e 46 72 65 65 5d 29 20 29 3b 0a 20 20 7d 0a  .nFree]) );.  }.
e070: 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75  .  resolveP2Valu
e080: 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20  es(p, &nArg);.  
e090: 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e  p->usesStmtJourn
e0a0: 61 6c 20 3d 20 28 75 38 29 28 70 50 61 72 73 65  al = (u8)(pParse
e0b0: 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 26  ->isMultiWrite &
e0c0: 26 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f  & pParse->mayAbo
e0d0: 72 74 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  rt);.  if( pPars
e0e0: 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20 6e 4d  e->explain && nM
e0f0: 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 6e 4d 65  em<10 ){.    nMe
e100: 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 70 2d  m = 10;.  }.  p-
e110: 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 0a 20  >expired = 0;.. 
e120: 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20 72   /* Memory for r
e130: 65 67 69 73 74 65 72 73 2c 20 70 61 72 61 6d 65  egisters, parame
e140: 74 65 72 73 2c 20 63 75 72 73 6f 72 2c 20 65 74  ters, cursor, et
e150: 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  c, is allocated 
e160: 69 6e 20 6f 6e 65 20 6f 72 20 74 77 6f 0a 20 20  in one or two.  
e170: 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f 6e 20 74  ** passes.  On t
e180: 68 65 20 66 69 72 73 74 20 70 61 73 73 2c 20 77  he first pass, w
e190: 65 20 74 72 79 20 74 6f 20 72 65 75 73 65 20 75  e try to reuse u
e1a0: 6e 75 73 65 64 20 6d 65 6d 6f 72 79 20 61 74 20  nused memory at 
e1b0: 74 68 65 20 0a 20 20 2a 2a 20 65 6e 64 20 6f 66  the .  ** end of
e1c0: 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61   the opcode arra
e1d0: 79 2e 20 20 49 66 20 77 65 20 61 72 65 20 75 6e  y.  If we are un
e1e0: 61 62 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20  able to satisfy 
e1f0: 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20  all memory.  ** 
e200: 72 65 71 75 69 72 65 6d 65 6e 74 73 20 62 79 20  requirements by 
e210: 72 65 75 73 69 6e 67 20 74 68 65 20 6f 70 63 6f  reusing the opco
e220: 64 65 20 61 72 72 61 79 20 74 61 69 6c 2c 20 74  de array tail, t
e230: 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 20  hen the second. 
e240: 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20 66 69   ** pass will fi
e250: 6c 6c 20 69 6e 20 74 68 65 20 72 65 6d 61 69 6e  ll in the remain
e260: 64 65 72 20 75 73 69 6e 67 20 61 20 66 72 65 73  der using a fres
e270: 68 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  h memory allocat
e280: 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ion.  .  **.  **
e290: 20 54 68 69 73 20 74 77 6f 2d 70 61 73 73 20 61   This two-pass a
e2a0: 70 70 72 6f 61 63 68 20 74 68 61 74 20 72 65 75  pproach that reu
e2b0: 73 65 73 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f  ses as much memo
e2c0: 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66  ry as possible f
e2d0: 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 6c 65 66  rom.  ** the lef
e2e0: 74 6f 76 65 72 20 6d 65 6d 6f 72 79 20 61 74 20  tover memory at 
e2f0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f  the end of the o
e300: 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20 54 68  pcode array.  Th
e310: 69 73 20 63 61 6e 20 73 69 67 6e 69 66 69 63 61  is can significa
e320: 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64 75 63 65  ntly.  ** reduce
e330: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d   the amount of m
e340: 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 61 20  emory held by a 
e350: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
e360: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a  nt..  */.  do {.
e370: 20 20 20 20 78 2e 6e 4e 65 65 64 65 64 20 3d 20      x.nNeeded = 
e380: 30 3b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d  0;.    p->aMem =
e390: 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20   allocSpace(&x, 
e3a0: 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69  p->aMem, nMem*si
e3b0: 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 20 20  zeof(Mem));.    
e3c0: 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53  p->aVar = allocS
e3d0: 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 56 61 72  pace(&x, p->aVar
e3e0: 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65  , nVar*sizeof(Me
e3f0: 6d 29 29 3b 0a 20 20 20 20 70 2d 3e 61 70 41 72  m));.    p->apAr
e400: 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26  g = allocSpace(&
e410: 78 2c 20 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72  x, p->apArg, nAr
e420: 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 29 3b  g*sizeof(Mem*));
e430: 0a 20 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20  .    p->apCsr = 
e440: 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70  allocSpace(&x, p
e450: 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72 73 6f 72  ->apCsr, nCursor
e460: 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73  *sizeof(VdbeCurs
e470: 6f 72 2a 29 29 3b 0a 20 20 20 20 70 2d 3e 61 4f  or*));.    p->aO
e480: 6e 63 65 46 6c 61 67 20 3d 20 61 6c 6c 6f 63 53  nceFlag = allocS
e490: 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 4f 6e 63  pace(&x, p->aOnc
e4a0: 65 46 6c 61 67 2c 20 6e 4f 6e 63 65 29 3b 0a 23  eFlag, nOnce);.#
e4b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
e4c0: 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
e4d0: 54 55 53 0a 20 20 20 20 70 2d 3e 61 6e 45 78 65  TUS.    p->anExe
e4e0: 63 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26  c = allocSpace(&
e4f0: 78 2c 20 70 2d 3e 61 6e 45 78 65 63 2c 20 70 2d  x, p->anExec, p-
e500: 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34 29  >nOp*sizeof(i64)
e510: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  );.#endif.    if
e520: 28 20 78 2e 6e 4e 65 65 64 65 64 3d 3d 30 20 29  ( x.nNeeded==0 )
e530: 20 62 72 65 61 6b 3b 0a 20 20 20 20 78 2e 70 53   break;.    x.pS
e540: 70 61 63 65 20 3d 20 70 2d 3e 70 46 72 65 65 20  pace = p->pFree 
e550: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
e560: 63 5a 65 72 6f 28 64 62 2c 20 78 2e 6e 4e 65 65  cZero(db, x.nNee
e570: 64 65 64 29 3b 0a 20 20 20 20 78 2e 6e 46 72 65  ded);.    x.nFre
e580: 65 20 3d 20 78 2e 6e 4e 65 65 64 65 64 3b 0a 20  e = x.nNeeded;. 
e590: 20 7d 77 68 69 6c 65 28 20 21 64 62 2d 3e 6d 61   }while( !db->ma
e5a0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20  llocFailed );.. 
e5b0: 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43   p->nCursor = nC
e5c0: 75 72 73 6f 72 3b 0a 20 20 70 2d 3e 6e 4f 6e 63  ursor;.  p->nOnc
e5d0: 65 46 6c 61 67 20 3d 20 6e 4f 6e 63 65 3b 0a 20  eFlag = nOnce;. 
e5e0: 20 69 66 28 20 70 2d 3e 61 56 61 72 20 29 7b 0a   if( p->aVar ){.
e5f0: 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 28 79      p->nVar = (y
e600: 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20 20 20 66  nVar)nVar;.    f
e610: 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20  or(n=0; n<nVar; 
e620: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  n++){.      p->a
e630: 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d  Var[n].flags = M
e640: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 70  EM_Null;.      p
e650: 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d 20 64  ->aVar[n].db = d
e660: 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  b;.    }.  }.  p
e670: 2d 3e 6e 7a 56 61 72 20 3d 20 70 50 61 72 73 65  ->nzVar = pParse
e680: 2d 3e 6e 7a 56 61 72 3b 0a 20 20 70 2d 3e 61 7a  ->nzVar;.  p->az
e690: 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 61 7a  Var = pParse->az
e6a0: 56 61 72 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  Var;.  pParse->n
e6b0: 7a 56 61 72 20 3d 20 20 30 3b 0a 20 20 70 50 61  zVar =  0;.  pPa
e6c0: 72 73 65 2d 3e 61 7a 56 61 72 20 3d 20 30 3b 0a  rse->azVar = 0;.
e6d0: 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b    if( p->aMem ){
e6e0: 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20  .    p->aMem--; 
e6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e700: 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67       /* aMem[] g
e710: 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d  oes from 1..nMem
e720: 20 2a 2f 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20   */.    p->nMem 
e730: 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20  = nMem;         
e740: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 20 20          /*      
e750: 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65   not from 0..nMe
e760: 6d 2d 31 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6e  m-1 */.    for(n
e770: 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b  =1; n<=nMem; n++
e780: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d  ){.      p->aMem
e790: 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  [n].flags = MEM_
e7a0: 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 20  Undefined;.     
e7b0: 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d   p->aMem[n].db =
e7c0: 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   db;.    }.  }. 
e7d0: 20 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 70 50   p->explain = pP
e7e0: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a 20  arse->explain;. 
e7f0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69   sqlite3VdbeRewi
e800: 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nd(p);.}../*.** 
e810: 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75 72  Close a VDBE cur
e820: 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20  sor and release 
e830: 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65  all the resource
e840: 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a  s that cursor .*
e850: 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c  * happens to hol
e860: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
e870: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
e880: 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75  (Vdbe *p, VdbeCu
e890: 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66  rsor *pCx){.  if
e8a0: 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pCx==0 ){.    
e8b0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
e8c0: 73 65 72 74 28 20 70 43 78 2d 3e 70 42 74 3d 3d  sert( pCx->pBt==
e8d0: 30 20 7c 7c 20 70 43 78 2d 3e 65 43 75 72 54 79  0 || pCx->eCurTy
e8e0: 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
e8f0: 45 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70  E );.  switch( p
e900: 43 78 2d 3e 65 43 75 72 54 79 70 65 20 29 7b 0a  Cx->eCurType ){.
e910: 20 20 20 20 63 61 73 65 20 43 55 52 54 59 50 45      case CURTYPE
e920: 5f 53 4f 52 54 45 52 3a 20 7b 0a 20 20 20 20 20  _SORTER: {.     
e930: 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74   sqlite3VdbeSort
e940: 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20 70  erClose(p->db, p
e950: 43 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  Cx);.      break
e960: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
e970: 20 43 55 52 54 59 50 45 5f 42 54 52 45 45 3a 20   CURTYPE_BTREE: 
e980: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 78 2d  {.      if( pCx-
e990: 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  >pBt ){.        
e9a0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
e9b0: 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20  e(pCx->pBt);.   
e9c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 43 78 2d       /* The pCx-
e9d0: 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c 20 62 65  >pCursor will be
e9e0: 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69 63   close automatic
e9f0: 61 6c 6c 79 2c 20 69 66 20 69 74 20 65 78 69 73  ally, if it exis
ea00: 74 73 2c 20 62 79 0a 20 20 20 20 20 20 20 20 2a  ts, by.        *
ea10: 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65  * the call above
ea20: 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  . */.      }else
ea30: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
ea40: 28 20 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f  ( pCx->uc.pCurso
ea50: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r!=0 );.        
ea60: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
ea70: 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 75 63 2e  eCursor(pCx->uc.
ea80: 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  pCursor);.      
ea90: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
eaa0: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
eab0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
eac0: 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 43  TABLE.    case C
ead0: 55 52 54 59 50 45 5f 56 54 41 42 3a 20 7b 0a 20  URTYPE_VTAB: {. 
eae0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61       sqlite3_vta
eaf0: 62 5f 63 75 72 73 6f 72 20 2a 70 56 43 75 72 20  b_cursor *pVCur 
eb00: 3d 20 70 43 78 2d 3e 75 63 2e 70 56 43 75 72 3b  = pCx->uc.pVCur;
eb10: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 73 71 6c  .      const sql
eb20: 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f  ite3_module *pMo
eb30: 64 75 6c 65 20 3d 20 70 56 43 75 72 2d 3e 70 56  dule = pVCur->pV
eb40: 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20  tab->pModule;.  
eb50: 20 20 20 20 61 73 73 65 72 74 28 20 70 56 43 75      assert( pVCu
eb60: 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 3e 30  r->pVtab->nRef>0
eb70: 20 29 3b 0a 20 20 20 20 20 20 70 56 43 75 72 2d   );.      pVCur-
eb80: 3e 70 56 74 61 62 2d 3e 6e 52 65 66 2d 2d 3b 0a  >pVtab->nRef--;.
eb90: 20 20 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78        pModule->x
eba0: 43 6c 6f 73 65 28 70 56 43 75 72 29 3b 0a 20 20  Close(pVCur);.  
ebb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ebc0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f  .#endif.  }.}../
ebd0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63  *.** Close all c
ebe0: 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 63 75  ursors in the cu
ebf0: 72 72 65 6e 74 20 66 72 61 6d 65 2e 0a 2a 2f 0a  rrent frame..*/.
ec00: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73  static void clos
ec10: 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28  eCursorsInFrame(
ec20: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20  Vdbe *p){.  if( 
ec30: 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20  p->apCsr ){.    
ec40: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
ec50: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72  =0; i<p->nCursor
ec60: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64  ; i++){.      Vd
ec70: 62 65 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70  beCursor *pC = p
ec80: 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20  ->apCsr[i];.    
ec90: 20 20 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20    if( pC ){.    
eca0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
ecb0: 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29  reeCursor(p, pC)
ecc0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43  ;.        p->apC
ecd0: 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  sr[i] = 0;.     
ece0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
ecf0: 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 76  /*.** Copy the v
ed00: 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20  alues stored in 
ed10: 74 68 65 20 56 64 62 65 46 72 61 6d 65 20 73 74  the VdbeFrame st
ed20: 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 56  ructure to its V
ed30: 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20  dbe. This.** is 
ed40: 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c  used, for exampl
ed50: 65 2c 20 77 68 65 6e 20 61 20 74 72 69 67 67 65  e, when a trigge
ed60: 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73  r sub-program is
ed70: 20 68 61 6c 74 65 64 20 74 6f 20 72 65 73 74 6f   halted to resto
ed80: 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f  re.** control to
ed90: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
eda0: 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  m..*/.int sqlite
edb0: 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72  3VdbeFrameRestor
edc0: 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72  e(VdbeFrame *pFr
edd0: 61 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ame){.  Vdbe *v 
ede0: 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 63  = pFrame->v;.  c
edf0: 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61  loseCursorsInFra
ee00: 6d 65 28 76 29 3b 0a 23 69 66 64 65 66 20 53 51  me(v);.#ifdef SQ
ee10: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54  LITE_ENABLE_STMT
ee20: 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 76 2d  _SCANSTATUS.  v-
ee30: 3e 61 6e 45 78 65 63 20 3d 20 70 46 72 61 6d 65  >anExec = pFrame
ee40: 2d 3e 61 6e 45 78 65 63 3b 0a 23 65 6e 64 69 66  ->anExec;.#endif
ee50: 0a 20 20 76 2d 3e 61 4f 6e 63 65 46 6c 61 67 20  .  v->aOnceFlag 
ee60: 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 6e 63 65 46  = pFrame->aOnceF
ee70: 6c 61 67 3b 0a 20 20 76 2d 3e 6e 4f 6e 63 65 46  lag;.  v->nOnceF
ee80: 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f  lag = pFrame->nO
ee90: 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 61 4f  nceFlag;.  v->aO
eea0: 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b  p = pFrame->aOp;
eeb0: 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61  .  v->nOp = pFra
eec0: 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d  me->nOp;.  v->aM
eed0: 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65  em = pFrame->aMe
eee0: 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70  m;.  v->nMem = p
eef0: 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76  Frame->nMem;.  v
ef00: 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61 6d 65  ->apCsr = pFrame
ef10: 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43  ->apCsr;.  v->nC
ef20: 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e  ursor = pFrame->
ef30: 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62  nCursor;.  v->db
ef40: 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 46  ->lastRowid = pF
ef50: 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b  rame->lastRowid;
ef60: 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20  .  v->nChange = 
ef70: 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b  pFrame->nChange;
ef80: 0a 20 20 76 2d 3e 64 62 2d 3e 6e 43 68 61 6e 67  .  v->db->nChang
ef90: 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 44 62 43  e = pFrame->nDbC
efa0: 68 61 6e 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  hange;.  return 
efb0: 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f  pFrame->pc;.}../
efc0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63  *.** Close all c
efd0: 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c  ursors..**.** Al
efe0: 73 6f 20 72 65 6c 65 61 73 65 20 61 6e 79 20 64  so release any d
eff0: 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65  ynamic memory he
f000: 6c 64 20 62 79 20 74 68 65 20 56 4d 20 69 6e 20  ld by the VM in 
f010: 74 68 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65  the Vdbe.aMem me
f020: 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72  mory .** cell ar
f030: 72 61 79 2e 20 54 68 69 73 20 69 73 20 6e 65 63  ray. This is nec
f040: 65 73 73 61 72 79 20 61 73 20 74 68 65 20 6d 65  essary as the me
f050: 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 61 79 20  mory cell array 
f060: 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70  may contain.** p
f070: 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 62 65 46  ointers to VdbeF
f080: 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77 68  rame objects, wh
f090: 69 63 68 20 6d 61 79 20 69 6e 20 74 75 72 6e 20  ich may in turn 
f0a0: 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73  contain pointers
f0b0: 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73   to.** open curs
f0c0: 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ors..*/.static v
f0d0: 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  oid closeAllCurs
f0e0: 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ors(Vdbe *p){.  
f0f0: 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b  if( p->pFrame ){
f100: 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a  .    VdbeFrame *
f110: 70 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28  pFrame;.    for(
f120: 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65  pFrame=p->pFrame
f130: 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e  ; pFrame->pParen
f140: 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65  t; pFrame=pFrame
f150: 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  ->pParent);.    
f160: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
f170: 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b  Restore(pFrame);
f180: 0a 20 20 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d  .    p->pFrame =
f190: 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 46 72 61 6d   0;.    p->nFram
f1a0: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  e = 0;.  }.  ass
f1b0: 65 72 74 28 20 70 2d 3e 6e 46 72 61 6d 65 3d 3d  ert( p->nFrame==
f1c0: 30 20 29 3b 0a 20 20 63 6c 6f 73 65 43 75 72 73  0 );.  closeCurs
f1d0: 6f 72 73 49 6e 46 72 61 6d 65 28 70 29 3b 0a 20  orsInFrame(p);. 
f1e0: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a   if( p->aMem ){.
f1f0: 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72      releaseMemAr
f200: 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c  ray(&p->aMem[1],
f210: 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20   p->nMem);.  }. 
f220: 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46   while( p->pDelF
f230: 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65  rame ){.    Vdbe
f240: 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d  Frame *pDel = p-
f250: 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20  >pDelFrame;.    
f260: 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70  p->pDelFrame = p
f270: 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  Del->pParent;.  
f280: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61    sqlite3VdbeFra
f290: 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a  meDelete(pDel);.
f2a0: 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65    }..  /* Delete
f2b0: 20 61 6e 79 20 61 75 78 64 61 74 61 20 61 6c 6c   any auxdata all
f2c0: 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 62 79  ocations made by
f2d0: 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20 69 66 28   the VM */.  if(
f2e0: 20 70 2d 3e 70 41 75 78 44 61 74 61 20 29 20 73   p->pAuxData ) s
f2f0: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
f300: 41 75 78 44 61 74 61 28 70 2c 20 2d 31 2c 20 30  AuxData(p, -1, 0
f310: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
f320: 70 41 75 78 44 61 74 61 3d 3d 30 20 29 3b 0a 7d  pAuxData==0 );.}
f330: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70  ../*.** Clean up
f340: 20 74 68 65 20 56 4d 20 61 66 74 65 72 20 61 20   the VM after a 
f350: 73 69 6e 67 6c 65 20 72 75 6e 2e 0a 2a 2f 0a 73  single run..*/.s
f360: 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e  tatic void Clean
f370: 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  up(Vdbe *p){.  s
f380: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
f390: 64 62 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  db;..#ifdef SQLI
f3a0: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45 78  TE_DEBUG.  /* Ex
f3b0: 65 63 75 74 65 20 61 73 73 65 72 74 28 29 20 73  ecute assert() s
f3c0: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73  tatements to ens
f3d0: 75 72 65 20 74 68 61 74 20 74 68 65 20 56 64 62  ure that the Vdb
f3e0: 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20  e.apCsr[] and . 
f3f0: 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20   ** Vdbe.aMem[] 
f400: 61 72 72 61 79 73 20 68 61 76 65 20 61 6c 72 65  arrays have alre
f410: 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e 65 64  ady been cleaned
f420: 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69   up.  */.  int i
f430: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72  ;.  if( p->apCsr
f440: 20 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d   ) for(i=0; i<p-
f450: 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61  >nCursor; i++) a
f460: 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b  ssert( p->apCsr[
f470: 69 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  i]==0 );.  if( p
f480: 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f  ->aMem ){.    fo
f490: 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65  r(i=1; i<=p->nMe
f4a0: 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20  m; i++) assert( 
f4b0: 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73  p->aMem[i].flags
f4c0: 3d 3d 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 20  ==MEM_Undefined 
f4d0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
f4e0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
f4f0: 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
f500: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
f510: 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65  ;.  p->pResultSe
f520: 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
f530: 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Set the number o
f540: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
f550: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
f560: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53  turned by this S
f570: 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e  QL.** statement.
f580: 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74   This is now set
f590: 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
f5a0: 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75  , rather than du
f5b0: 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f  ring.** executio
f5c0: 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72  n of the vdbe pr
f5d0: 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71  ogram so that sq
f5e0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
f5f0: 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63  nt() can.** be c
f600: 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20  alled on an SQL 
f610: 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65  statement before
f620: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e   sqlite3_step().
f630: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
f640: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56  VdbeSetNumCols(V
f650: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73  dbe *p, int nRes
f660: 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a  Column){.  Mem *
f670: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20  pColName;.  int 
f680: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n;.  sqlite3 *db
f690: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c   = p->db;..  rel
f6a0: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
f6b0: 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65  aColName, p->nRe
f6c0: 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f  sColumn*COLNAME_
f6d0: 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  N);.  sqlite3DbF
f6e0: 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e  ree(db, p->aColN
f6f0: 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73  ame);.  n = nRes
f700: 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
f710: 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  ;.  p->nResColum
f720: 6e 20 3d 20 28 75 31 36 29 6e 52 65 73 43 6f 6c  n = (u16)nResCol
f730: 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61  umn;.  p->aColNa
f740: 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  me = pColName = 
f750: 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d  (Mem*)sqlite3DbM
f760: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
f770: 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20  zeof(Mem)*n );. 
f780: 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65   if( p->aColName
f790: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
f7a0: 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29  while( n-- > 0 )
f7b0: 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e  {.    pColName->
f7c0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
f7d0: 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e  ;.    pColName->
f7e0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  db = p->db;.    
f7f0: 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a  pColName++;.  }.
f800: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
f810: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78   name of the idx
f820: 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65  'th column to be
f830: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
f840: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
f850: 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65  ** zName must be
f860: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
f870: 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73  nul terminated s
f880: 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tring..**.** Thi
f890: 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d  s call must be m
f8a0: 61 64 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ade after a call
f8b0: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53   to sqlite3VdbeS
f8c0: 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a  etNumCols()..**.
f8d0: 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70 61 72  ** The final par
f8e0: 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75  ameter, xDel, mu
f8f0: 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c  st be one of SQL
f900: 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c  ITE_DYNAMIC, SQL
f910: 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72  ITE_STATIC.** or
f920: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
f930: 54 2e 20 49 66 20 69 74 20 69 73 20 53 51 4c 49  T. If it is SQLI
f940: 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e  TE_DYNAMIC, then
f950: 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
f960: 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61  ted.** to by zNa
f970: 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  me will be freed
f980: 20 62 79 20 73 71 6c 69 74 65 33 44 62 46 72 65   by sqlite3DbFre
f990: 65 28 29 20 77 68 65 6e 20 74 68 65 20 76 64 62  e() when the vdb
f9a0: 65 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e 0a  e is destroyed..
f9b0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
f9c0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20  beSetColName(.  
f9d0: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
f9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9f0: 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67 20 63   /* Vdbe being c
fa00: 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20 20 69  onfigured */.  i
fa10: 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20 20 20  nt idx,         
fa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa30: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
fa40: 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73  mn zName applies
fa50: 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72   to */.  int var
fa60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
fa70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
fa80: 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f   of the COLNAME_
fa90: 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20  * constants */. 
faa0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
fab0: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  me,             
fac0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
fad0: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
fae0: 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64  g name */.  void
faf0: 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20   (*xDel)(void*) 
fb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fb10: 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e  Memory managemen
fb20: 74 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 7a  t strategy for z
fb30: 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  Name */.){.  int
fb40: 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c   rc;.  Mem *pCol
fb50: 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Name;.  assert( 
fb60: 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  idx<p->nResColum
fb70: 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  n );.  assert( v
fb80: 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a  ar<COLNAME_N );.
fb90: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
fba0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
fbb0: 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d 65 20   assert( !zName 
fbc0: 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f  || xDel!=SQLITE_
fbd0: 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 72  DYNAMIC );.    r
fbe0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
fbf0: 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  EM;.  }.  assert
fc00: 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30  ( p->aColName!=0
fc10: 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d   );.  pColName =
fc20: 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69   &(p->aColName[i
fc30: 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f  dx+var*p->nResCo
fc40: 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73  lumn]);.  rc = s
fc50: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
fc60: 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e  Str(pColName, zN
fc70: 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  ame, -1, SQLITE_
fc80: 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61  UTF8, xDel);.  a
fc90: 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20  ssert( rc!=0 || 
fca0: 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e  !zName || (pColN
fcb0: 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54  ame->flags&MEM_T
fcc0: 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74  erm)!=0 );.  ret
fcd0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
fce0: 20 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65   A read or write
fcf0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
fd00: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61   or may not be a
fd10: 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73  ctive on databas
fd20: 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20  e handle.** db. 
fd30: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
fd40: 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d   is active, comm
fd50: 69 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20  it it. If there 
fd60: 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72  is a.** write-tr
fd70: 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69  ansaction spanni
fd80: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ng more than one
fd90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
fda0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
fdb0: 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68  takes care of th
fdc0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
fdd0: 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74   trickery..*/.st
fde0: 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d  atic int vdbeCom
fdf0: 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  mit(sqlite3 *db,
fe00: 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74   Vdbe *p){.  int
fe10: 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73   i;.  int nTrans
fe20: 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72   = 0;  /* Number
fe30: 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69   of databases wi
fe40: 74 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69  th an active wri
fe50: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  te-transaction *
fe60: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
fe70: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65  ITE_OK;.  int ne
fe80: 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a  edXcommit = 0;..
fe90: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
fea0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
feb0: 20 20 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f    /* With this o
fec0: 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74  ption, sqlite3Vt
fed0: 61 62 53 79 6e 63 28 29 20 69 73 20 64 65 66 69  abSync() is defi
fee0: 6e 65 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79  ned to be simply
fef0: 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b   .  ** SQLITE_OK
ff00: 20 73 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65   so p is not use
ff10: 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45  d. .  */.  UNUSE
ff20: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a  D_PARAMETER(p);.
ff30: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66  #endif..  /* Bef
ff40: 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  ore doing anythi
ff50: 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68  ng else, call th
ff60: 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61  e xSync() callba
ff70: 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20  ck for any.  ** 
ff80: 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74  virtual module t
ff90: 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e  ables written in
ffa0: 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
ffb0: 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20  n. This has to. 
ffc0: 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f   ** be done befo
ffd0: 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77  re determining w
ffe0: 68 65 74 68 65 72 20 61 20 6d 61 73 74 65 72 20  hether a master 
fff0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
10000 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20  .  ** required, 
10010 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61  as an xSync() ca
10020 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61  llback may add a
10030 6e 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  n attached datab
10040 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ase.  ** to the 
10050 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
10060 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
10070 56 74 61 62 53 79 6e 63 28 64 62 2c 20 70 29 3b  VtabSync(db, p);
10080 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
10090 20 64 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20   determines (a) 
100a0 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f  if the commit ho
100b0 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76  ok should be inv
100c0 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62  oked and.  ** (b
100d0 29 20 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62  ) how many datab
100e0 61 73 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f  ase files have o
100f0 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
10100 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a  ctions, not .  *
10110 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  * including the 
10120 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28  temp database. (
10130 62 29 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  b) is important 
10140 62 65 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20  because if more 
10150 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64  than .  ** one d
10160 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
10170 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74   an open write t
10180 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61  ransaction, a ma
10190 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a  ster journal.  *
101a0 2a 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72  * file is requir
101b0 65 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63  ed for an atomic
101c0 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20   commit..  */ . 
101d0 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
101e0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
101f0 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
10200 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
10210 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
10220 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
10230 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
10240 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64 58 63   ){.      needXc
10250 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
10260 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54 72 61   if( i!=1 ) nTra
10270 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  ns++;.      sqli
10280 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
10290 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  t);.      rc = s
102a0 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75  qlite3PagerExclu
102b0 73 69 76 65 4c 6f 63 6b 28 73 71 6c 69 74 65 33  siveLock(sqlite3
102c0 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29 29  BtreePager(pBt))
102d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
102e0 74 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a  treeLeave(pBt);.
102f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
10300 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10310 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
10320 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
10330 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74 65  re are any write
10340 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74  -transactions at
10350 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65   all, invoke the
10360 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a   commit hook */.
10370 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69    if( needXcommi
10380 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  t && db->xCommit
10390 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
103a0 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  rc = db->xCommit
103b0 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f  Callback(db->pCo
103c0 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66  mmitArg);.    if
103d0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
103e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
103f0 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f  TRAINT_COMMITHOO
10400 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
10410 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61  /* The simple ca
10420 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61  se - no more tha
10430 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  n one database f
10440 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e  ile (not countin
10450 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20  g the.  ** TEMP 
10460 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20  database) has a 
10470 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
10480 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e  ve.   There is n
10490 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20  o need for the. 
104a0 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
104b0 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  al..  **.  ** If
104c0 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
104d0 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  e of sqlite3Btre
104e0 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69  eGetFilename() i
104f0 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a  s a zero length.
10500 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20    ** string, it 
10510 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64  means the main d
10520 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f  atabase is :memo
10530 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69  ry: or a temp fi
10540 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68  le.  In .  ** th
10550 61 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f  at case we do no
10560 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63  t support atomic
10570 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d   multi-file comm
10580 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20  its, so use the 
10590 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73  .  ** simple cas
105a0 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f  e then too..  */
105b0 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65  .  if( 0==sqlite
105c0 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65  3Strlen30(sqlite
105d0 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
105e0 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
105f0 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c  )).   || nTrans<
10600 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28  =1.  ){.    for(
10610 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
10620 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
10630 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
10640 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
10650 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
10660 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
10670 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
10680 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
10690 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20  ne(pBt, 0);.    
106a0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
106b0 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20  * Do the commit 
106c0 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61  only if all data
106d0 62 61 73 65 73 20 73 75 63 63 65 73 73 66 75 6c  bases successful
106e0 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73  ly complete phas
106f0 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20  e 1. .    ** If 
10700 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65 65  one of the Btree
10710 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
10720 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68   calls fails, th
10730 69 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a  is indicates an.
10740 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20      ** IO error 
10750 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f  while deleting o
10760 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a  r truncating a j
10770 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20  ournal file. It 
10780 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20  is unlikely,.   
10790 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61   ** but could ha
107a0 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61  ppen. In this ca
107b0 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65  se abandon proce
107c0 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  ssing and return
107d0 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20   the error..    
107e0 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
107f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
10800 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
10810 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
10820 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
10830 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
10840 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
10850 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
10860 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
10870 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
10880 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
10890 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
108a0 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43      sqlite3VtabC
108b0 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d  ommit(db);.    }
108c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63  .  }..  /* The c
108d0 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68  omplex case - Th
108e0 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66  ere is a multi-f
108f0 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ile write-transa
10900 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20  ction active..  
10910 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73  ** This requires
10920 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
10930 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65  l file to ensure
10940 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
10950 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74   is.  ** committ
10960 65 64 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  ed atomically.. 
10970 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
10980 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20  TE_OMIT_DISKIO. 
10990 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74   else{.    sqlit
109a0 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64  e3_vfs *pVfs = d
109b0 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74  b->pVfs;.    int
109c0 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20   needSync = 0;. 
109d0 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72     char *zMaster
109e0 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d   = 0;   /* File-
109f0 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73  name for the mas
10a00 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ter journal */. 
10a10 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
10a20 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74  MainFile = sqlit
10a30 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
10a40 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  me(db->aDb[0].pB
10a50 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
10a60 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20  file *pMaster = 
10a70 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  0;.    i64 offse
10a80 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  t = 0;.    int r
10a90 65 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 72  es;.    int retr
10aa0 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20  yCount = 0;.    
10ab0 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a  int nMainFile;..
10ac0 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20      /* Select a 
10ad0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
10ae0 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ile name */.    
10af0 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69  nMainFile = sqli
10b00 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69  te3Strlen30(zMai
10b10 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73  nFile);.    zMas
10b20 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ter = sqlite3MPr
10b30 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58  intf(db, "%s-mjX
10b40 58 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69  XXXXX9XXz", zMai
10b50 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  nFile);.    if( 
10b60 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20 72 65 74  zMaster==0 ) ret
10b70 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
10b80 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  ;.    do {.     
10b90 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20   u32 iRandom;.  
10ba0 20 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75      if( retryCou
10bb0 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  nt ){.        if
10bc0 28 20 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 30  ( retryCount>100
10bd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
10be0 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
10bf0 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74  _FULL, "MJ delet
10c00 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29  e: %s", zMaster)
10c10 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
10c20 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
10c30 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
10c40 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
10c50 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
10c60 28 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20  ( retryCount==1 
10c70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
10c80 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
10c90 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64  FULL, "MJ collid
10ca0 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29  e: %s", zMaster)
10cb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10cc0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 72 79 43    }.      retryC
10cd0 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71  ount++;.      sq
10ce0 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
10cf0 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29  (sizeof(iRandom)
10d00 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20  , &iRandom);.   
10d10 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
10d20 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 72  ntf(13, &zMaster
10d30 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d  [nMainFile], "-m
10d40 6a 25 30 36 58 39 25 30 32 58 22 2c 0a 20 20 20  j%06X9%02X",.   
10d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d60 20 20 20 20 20 20 20 20 20 20 20 20 28 69 52 61              (iRa
10d70 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 66  ndom>>8)&0xfffff
10d80 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 29  f, iRandom&0xff)
10d90 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61  ;.      /* The a
10da0 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 63  ntipenultimate c
10db0 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20  haracter of the 
10dc0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
10dd0 61 6d 65 20 6d 75 73 74 0a 20 20 20 20 20 20 2a  ame must.      *
10de0 2a 20 62 65 20 22 39 22 20 74 6f 20 61 76 6f 69  * be "9" to avoi
10df0 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e  d name collision
10e00 73 20 77 68 65 6e 20 75 73 69 6e 67 20 38 2b 33  s when using 8+3
10e10 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20   filenames. */. 
10e20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d 61       assert( zMa
10e30 73 74 65 72 5b 73 71 6c 69 74 65 33 53 74 72 6c  ster[sqlite3Strl
10e40 65 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d  en30(zMaster)-3]
10e50 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20 20 20 73  =='9' );.      s
10e60 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78  qlite3FileSuffix
10e70 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61  3(zMainFile, zMa
10e80 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20  ster);.      rc 
10e90 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
10ea0 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  s(pVfs, zMaster,
10eb0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
10ec0 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20  XISTS, &res);.  
10ed0 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
10ee0 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29  LITE_OK && res )
10ef0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
10f00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10f10 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73   /* Open the mas
10f20 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  ter journal. */.
10f30 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10f40 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70  e3OsOpenMalloc(p
10f50 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70  Vfs, zMaster, &p
10f60 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20  Master, .       
10f70 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
10f80 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
10f90 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20  OPEN_CREATE|.   
10fa0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
10fb0 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c  EN_EXCLUSIVE|SQL
10fc0 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
10fd0 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20  JOURNAL, 0.     
10fe0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   );.    }.    if
10ff0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11000 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11010 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
11020 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
11030 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20  n rc;.    }. .  
11040 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
11050 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61  ame of each data
11060 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65  base file in the
11070 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74   transaction int
11080 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a  o the new.    **
11090 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
110a0 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  file. If an erro
110b0 72 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73  r occurs at this
110c0 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20   point close.   
110d0 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74   ** and delete t
110e0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
110f0 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20  l file. All the 
11100 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
11110 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20  al files.    ** 
11120 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c  still have 'null
11130 27 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20  ' as the master 
11140 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c  journal pointer,
11150 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f   so they will ro
11160 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69  ll.    ** back i
11170 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20  ndependently if 
11180 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  a failure occurs
11190 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
111a0 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
111b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
111c0 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
111d0 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
111e0 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
111f0 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
11200 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63  {.        char c
11210 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71  onst *zFile = sq
11220 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75  lite3BtreeGetJou
11230 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20  rnalname(pBt);. 
11240 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65         if( zFile
11250 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
11260 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49   continue;  /* I
11270 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a  gnore TEMP and :
11280 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65  memory: database
11290 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  s */.        }. 
112a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a         assert( z
112b0 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  File[0]!=0 );.  
112c0 20 20 20 20 20 20 69 66 28 20 21 6e 65 65 64 53        if( !needS
112d0 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33 42  ync && !sqlite3B
112e0 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64  treeSyncDisabled
112f0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
11300 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b     needSync = 1;
11310 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11320 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
11330 73 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20  sWrite(pMaster, 
11340 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53 74  zFile, sqlite3St
11350 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c  rlen30(zFile)+1,
11360 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20   offset);.      
11370 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c 69    offset += sqli
11380 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
11390 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66  e)+1;.        if
113a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
113b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
113c0 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
113d0 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  pMaster);.      
113e0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
113f0 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
11400 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 0);.         
11410 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
11420 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
11430 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
11440 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11450 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
11460 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65  * Sync the maste
11470 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
11480 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51  If the IOCAP_SEQ
11490 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20  UENTIAL device. 
114a0 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65     ** flag is se
114b0 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65  t this is not re
114c0 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
114d0 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20     if( needSync 
114e0 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 73 71 6c  .     && 0==(sql
114f0 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
11500 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73  acteristics(pMas
11510 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  ter)&SQLITE_IOCA
11520 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20  P_SEQUENTIAL).  
11530 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21     && SQLITE_OK!
11540 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
11550 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51  Sync(pMaster, SQ
11560 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
11570 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
11580 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
11590 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
115a0 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
115b0 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
115c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
115d0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
115e0 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
115f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
11600 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20      /* Sync all 
11610 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76  the db files inv
11620 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61  olved in the tra
11630 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61  nsaction. The sa
11640 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  me call.    ** s
11650 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ets the master j
11660 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69  ournal pointer i
11670 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61  n each individua
11680 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  l journal. If.  
11690 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63    ** an error oc
116a0 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f  curs here, do no
116b0 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
116c0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
116d0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
116e0 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63  If the error occ
116f0 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66  urs during the f
11700 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20  irst call to.   
11710 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65   ** sqlite3Btree
11720 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
11730 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
11740 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  a chance that th
11750 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20  e.    ** master 
11760 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
11770 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42  l be orphaned. B
11780 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c  ut we cannot del
11790 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69  ete it,.    ** i
117a0 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65  n case the maste
117b0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
117c0 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ame was written 
117d0 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
117e0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66  .    ** file bef
117f0 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20  ore the failure 
11800 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f  occurred..    */
11810 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
11820 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
11830 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
11840 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
11850 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
11860 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
11870 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
11880 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
11890 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
118a0 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
118b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
118c0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
118d0 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61  (pMaster);.    a
118e0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
118f0 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66  E_BUSY );.    if
11900 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11910 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11920 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
11930 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
11940 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
11950 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d   /* Delete the m
11960 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
11970 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73  le. This commits
11980 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
11990 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64  . After.    ** d
119a0 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69  oing this the di
119b0 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65  rectory is synce
119c0 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61  d again before a
119d0 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20  ny individual.  
119e0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
119f0 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74   files are delet
11a00 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ed..    */.    r
11a10 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
11a20 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
11a30 72 2c 20 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20  r, needSync);.  
11a40 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
11a50 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
11a60 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20    zMaster = 0;. 
11a70 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
11a80 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11a90 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20    }..    /* All 
11aa0 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74  files and direct
11ab0 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72 65 61  ories have alrea
11ac0 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20  dy been synced, 
11ad0 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  so the following
11ae0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f  .    ** calls to
11af0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
11b00 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 72  mitPhaseTwo() ar
11b10 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66  e only closing f
11b20 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20  iles and.    ** 
11b30 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e  deleting or trun
11b40 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e  cating journals.
11b50 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   If something go
11b60 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20  es wrong while. 
11b70 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61     ** this is ha
11b80 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74  ppening we don't
11b90 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68   really care. Th
11ba0 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74  e integrity of t
11bb0 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
11bc0 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79  ction is already
11bd0 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62 75 74   guaranteed, but
11be0 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c   some stray 'col
11bf0 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20  d' journals.    
11c00 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20  ** may be lying 
11c10 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e  around. Returnin
11c20 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  g an error code 
11c30 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65  won't help matte
11c40 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  rs..    */.    d
11c50 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
11c60 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
11c70 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
11c80 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
11c90 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
11ca0 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
11cb0 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
11cc0 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
11cd0 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
11ce0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11cf0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
11d00 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20 20  Two(pBt, 1);.   
11d10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
11d20 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
11d30 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61  alloc();.    ena
11d40 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
11d50 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20  _errors();..    
11d60 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69  sqlite3VtabCommi
11d70 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
11d80 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  f..  return rc;.
11d90 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72  }../* .** This r
11da0 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68  outine checks th
11db0 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e 6e  at the sqlite3.n
11dc0 56 64 62 65 41 63 74 69 76 65 20 63 6f 75 6e 74  VdbeActive count
11dd0 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74   variable.** mat
11de0 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  ches the number 
11df0 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74 68 65  of vdbe's in the
11e00 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56   list sqlite3.pV
11e10 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20  dbe that are.** 
11e20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
11e30 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66  . An assertion f
11e40 61 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20  ails if the two 
11e50 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61  counts do not ma
11e60 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  tch..** This is 
11e70 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66  an internal self
11e80 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74  -check only - it
11e90 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e   is not an essen
11ea0 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a  tial processing.
11eb0 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54  ** step..**.** T
11ec0 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  his is a no-op i
11ed0 66 20 4e 44 45 42 55 47 20 69 73 20 64 65 66 69  f NDEBUG is defi
11ee0 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ned..*/.#ifndef 
11ef0 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f  NDEBUG.static vo
11f00 69 64 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  id checkActiveVd
11f10 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  beCnt(sqlite3 *d
11f20 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20  b){.  Vdbe *p;. 
11f30 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
11f40 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a  int nWrite = 0;.
11f50 20 20 69 6e 74 20 6e 52 65 61 64 20 3d 20 30 3b    int nRead = 0;
11f60 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65  .  p = db->pVdbe
11f70 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
11f80 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
11f90 73 74 6d 74 5f 62 75 73 79 28 28 73 71 6c 69 74  stmt_busy((sqlit
11fa0 65 33 5f 73 74 6d 74 2a 29 70 29 20 29 7b 0a 20  e3_stmt*)p) ){. 
11fb0 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
11fc0 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c    if( p->readOnl
11fd0 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b  y==0 ) nWrite++;
11fe0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 49  .      if( p->bI
11ff0 73 52 65 61 64 65 72 20 29 20 6e 52 65 61 64 2b  sReader ) nRead+
12000 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d  +;.    }.    p =
12010 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20   p->pNext;.  }. 
12020 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62   assert( cnt==db
12030 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 3b  ->nVdbeActive );
12040 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72 69 74  .  assert( nWrit
12050 65 3d 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74  e==db->nVdbeWrit
12060 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  e );.  assert( n
12070 52 65 61 64 3d 3d 64 62 2d 3e 6e 56 64 62 65 52  Read==db->nVdbeR
12080 65 61 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  ead );.}.#else.#
12090 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69  define checkActi
120a0 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e  veVdbeCnt(x).#en
120b0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
120c0 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73  e Vdbe passed as
120d0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
120e0 65 6e 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61  ent opened a sta
120f0 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69  tement-transacti
12100 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20  on,.** close it 
12110 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f  now. Argument eO
12120 70 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  p must be either
12130 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
12140 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f  ACK or.** SAVEPO
12150 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20  INT_RELEASE. If 
12160 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f  it is SAVEPOINT_
12170 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74  ROLLBACK, then t
12180 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  he statement.** 
12190 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
121a0 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65  olled back. If e
121b0 4f 70 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f  Op is SAVEPOINT_
121c0 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68  RELEASE, then th
121d0 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  e .** statement 
121e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
121f0 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
12200 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
12210 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45  ccurs, an SQLITE
12220 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72  _IOERR_XXX error
12230 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
12240 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  d. .** Otherwise
12250 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
12260 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c  nt sqlite3VdbeCl
12270 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62  oseStatement(Vdb
12280 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a  e *p, int eOp){.
12290 20 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74    sqlite3 *const
122a0 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69   db = p->db;.  i
122b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
122c0 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 2d 3e 69  K;..  /* If p->i
122d0 53 74 61 74 65 6d 65 6e 74 20 69 73 20 67 72 65  Statement is gre
122e0 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
122f0 74 68 65 6e 20 74 68 69 73 20 56 64 62 65 20 6f  then this Vdbe o
12300 70 65 6e 65 64 20 61 20 0a 20 20 2a 2a 20 73 74  pened a .  ** st
12310 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
12320 69 6f 6e 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ion that should 
12330 62 65 20 63 6c 6f 73 65 64 20 68 65 72 65 2e 20  be closed here. 
12340 54 68 65 20 6f 6e 6c 79 20 65 78 63 65 70 74 69  The only excepti
12350 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 68 61 74 20  on.  ** is that 
12360 61 6e 20 49 4f 20 65 72 72 6f 72 20 6d 61 79 20  an IO error may 
12370 68 61 76 65 20 6f 63 63 75 72 72 65 64 2c 20 63  have occurred, c
12380 61 75 73 69 6e 67 20 61 6e 20 65 6d 65 72 67 65  ausing an emerge
12390 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20  ncy rollback..  
123a0 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
123b0 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d  (db->nStatement=
123c0 3d 30 29 2c 20 61 6e 64 20 74 68 65 72 65 20 69  =0), and there i
123d0 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e  s nothing to do.
123e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
123f0 6e 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70 2d  nStatement && p-
12400 3e 69 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20  >iStatement ){. 
12410 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f     int i;.    co
12420 6e 73 74 20 69 6e 74 20 69 53 61 76 65 70 6f 69  nst int iSavepoi
12430 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65  nt = p->iStateme
12440 6e 74 2d 31 3b 0a 0a 20 20 20 20 61 73 73 65 72  nt-1;..    asser
12450 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  t( eOp==SAVEPOIN
12460 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f  T_ROLLBACK || eO
12470 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p==SAVEPOINT_REL
12480 45 41 53 45 29 3b 0a 20 20 20 20 61 73 73 65 72  EASE);.    asser
12490 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  t( db->nStatemen
124a0 74 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  t>0 );.    asser
124b0 74 28 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  t( p->iStatement
124c0 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  ==(db->nStatemen
124d0 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  t+db->nSavepoint
124e0 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  ) );..    for(i=
124f0 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
12500 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74 20 72  +){ .      int r
12510 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  c2 = SQLITE_OK;.
12520 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
12530 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
12540 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
12550 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
12560 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
12570 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
12580 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
12590 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
125a0 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f  (pBt, SAVEPOINT_
125b0 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70  ROLLBACK, iSavep
125c0 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  oint);.        }
125d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 32  .        if( rc2
125e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
125f0 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73           rc2 = s
12600 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
12610 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f  oint(pBt, SAVEPO
12620 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61  INT_RELEASE, iSa
12630 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
12640 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
12650 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
12660 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
12670 72 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rc2;.        }. 
12680 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
12690 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d   db->nStatement-
126a0 2d 3b 0a 20 20 20 20 70 2d 3e 69 53 74 61 74 65  -;.    p->iState
126b0 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69  ment = 0;..    i
126c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
126d0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 4f   ){.      if( eO
126e0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
126f0 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  LBACK ){.       
12700 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
12710 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53  bSavepoint(db, S
12720 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
12730 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  K, iSavepoint);.
12740 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
12750 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
12760 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
12770 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70  sqlite3VtabSavep
12780 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49  oint(db, SAVEPOI
12790 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76  NT_RELEASE, iSav
127a0 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d  epoint);.      }
127b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
127c0 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
127d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62  transaction is b
127e0 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
127f0 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74  , also restore t
12800 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  he .    ** datab
12810 61 73 65 20 68 61 6e 64 6c 65 73 20 64 65 66 65  ase handles defe
12820 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20  rred constraint 
12830 63 6f 75 6e 74 65 72 20 74 6f 20 74 68 65 20 76  counter to the v
12840 61 6c 75 65 20 69 74 20 68 61 64 20 77 68 65 6e  alue it had when
12850 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61   .    ** the sta
12860 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
12870 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 20  on was opened.  
12880 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d  */.    if( eOp==
12890 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
128a0 43 4b 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  CK ){.      db->
128b0 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20  nDeferredCons = 
128c0 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b  p->nStmtDefCons;
128d0 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65  .      db->nDefe
128e0 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d  rredImmCons = p-
128f0 3e 6e 53 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73  >nStmtDefImmCons
12900 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
12910 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
12920 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
12930 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
12940 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
12950 6e 65 64 20 62 79 20 74 68 65 20 64 61 74 61 62  ned by the datab
12960 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61  ase .** handle a
12970 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
12980 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20  he VM passed as 
12990 61 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  an argument is a
129a0 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63  bout to be .** c
129b0 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65  ommitted. If the
129c0 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
129d0 6e 67 20 64 65 66 65 72 72 65 64 20 66 6f 72 65  ng deferred fore
129e0 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
129f0 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73  nt.** violations
12a00 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
12a10 45 52 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65  ERROR. Otherwise
12a20 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  , SQLITE_OK..**.
12a30 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
12a40 6f 75 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76  outstanding FK v
12a50 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68  iolations and th
12a60 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
12a70 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45  rns .** SQLITE_E
12a80 52 52 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65  RROR, set the re
12a90 73 75 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74  sult of the VM t
12aa0 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  o SQLITE_CONSTRA
12ab0 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a  INT_FOREIGNKEY.*
12ac0 2a 20 61 6e 64 20 77 72 69 74 65 20 61 6e 20 65  * and write an e
12ad0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20  rror message to 
12ae0 69 74 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20  it. Then return 
12af0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f  SQLITE_ERROR..*/
12b00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12b10 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
12b20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
12b30 43 68 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c  CheckFk(Vdbe *p,
12b40 20 69 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a   int deferred){.
12b50 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
12b60 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65  p->db;.  if( (de
12b70 66 65 72 72 65 64 20 26 26 20 28 64 62 2d 3e 6e  ferred && (db->n
12b80 44 65 66 65 72 72 65 64 43 6f 6e 73 2b 64 62 2d  DeferredCons+db-
12b90 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
12ba0 73 29 3e 30 29 20 0a 20 20 20 7c 7c 20 28 21 64  s)>0) .   || (!d
12bb0 65 66 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46  eferred && p->nF
12bc0 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 0a  kConstraint>0) .
12bd0 20 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d    ){.    p->rc =
12be0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
12bf0 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20  NT_FOREIGNKEY;. 
12c00 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f     p->errorActio
12c10 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  n = OE_Abort;.  
12c20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72    sqlite3VdbeErr
12c30 6f 72 28 70 2c 20 22 46 4f 52 45 49 47 4e 20 4b  or(p, "FOREIGN K
12c40 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  EY constraint fa
12c50 69 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75  iled");.    retu
12c60 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
12c70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
12c80 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
12c90 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
12ca0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
12cb0 74 68 65 20 77 68 65 6e 20 61 20 56 44 42 45 20  the when a VDBE 
12cc0 74 72 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20  tries to halt.  
12cd0 49 66 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68  If the VDBE.** h
12ce0 61 73 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20  as made changes 
12cf0 61 6e 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f  and is in autoco
12d00 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20  mmit mode, then 
12d10 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20  commit those.** 
12d20 63 68 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72  changes.  If a r
12d30 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65  ollback is neede
12d40 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72  d, then do the r
12d50 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ollback..**.** T
12d60 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
12d70 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d  he only way to m
12d80 6f 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ove the state of
12d90 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51   a VM from.** SQ
12da0 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74  LITE_MAGIC_RUN t
12db0 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48  o SQLITE_MAGIC_H
12dc0 41 4c 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d  ALT.  It is harm
12dd0 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20  less to.** call 
12de0 74 68 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61  this on a VM tha
12df0 74 20 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49  t is in the SQLI
12e00 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74  TE_MAGIC_HALT st
12e10 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ate..**.** Retur
12e20 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
12e30 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20    If the commit 
12e40 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65  could not comple
12e50 74 65 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a  te because of.**
12e60 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
12e70 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
12e80 42 55 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45  BUSY.  If SQLITE
12e90 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
12ea0 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74  d, it.** means t
12eb0 68 65 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74  he close did not
12ec0 20 68 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64   happen and need
12ed0 73 20 74 6f 20 62 65 20 72 65 70 65 61 74 65 64  s to be repeated
12ee0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12ef0 56 64 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70  VdbeHalt(Vdbe *p
12f00 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
12f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
12f30 73 74 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20  store transient 
12f40 72 65 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a  return codes */.
12f50 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
12f60 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69  p->db;..  /* Thi
12f70 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61  s function conta
12f80 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68  ins the logic th
12f90 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66  at determines if
12fa0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a   a statement or.
12fb0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
12fc0 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74   will be committ
12fd0 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
12fe0 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  k as a result of
12ff0 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74   the.  ** execut
13000 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74  ion of this virt
13010 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20  ual machine. .  
13020 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f  **.  ** If any o
13030 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
13040 65 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20  errors occur:.  
13050 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  **.  **     SQLI
13060 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20  TE_NOMEM.  **   
13070 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20    SQLITE_IOERR. 
13080 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46   **     SQLITE_F
13090 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  ULL.  **     SQL
130a0 49 54 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20  ITE_INTERRUPT.  
130b0 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65  **.  ** Then the
130c0 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20   internal cache 
130d0 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
130e0 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e  left in an incon
130f0 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61  sistent.  ** sta
13100 74 65 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20  te.  We need to 
13110 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61  rollback the sta
13120 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
13130 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a  on, if there is.
13140 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65    ** one, or the
13150 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61   complete transa
13160 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69  ction if there i
13170 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74  s no statement t
13180 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
13190 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ..  if( db->mall
131a0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
131b0 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
131c0 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OMEM;.  }.  if( 
131d0 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 29 20 6d  p->aOnceFlag ) m
131e0 65 6d 73 65 74 28 70 2d 3e 61 4f 6e 63 65 46 6c  emset(p->aOnceFl
131f0 61 67 2c 20 30 2c 20 70 2d 3e 6e 4f 6e 63 65 46  ag, 0, p->nOnceF
13200 6c 61 67 29 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c  lag);.  closeAll
13210 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20 69 66  Cursors(p);.  if
13220 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45  ( p->magic!=VDBE
13230 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20  _MAGIC_RUN ){.  
13240 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13250 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b 41  OK;.  }.  checkA
13260 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
13270 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69  ;..  /* No commi
13280 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65  t or rollback ne
13290 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f 67  eded if the prog
132a0 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65  ram never starte
132b0 64 20 6f 72 20 69 66 20 74 68 65 0a 20 20 2a 2a  d or if the.  **
132c0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 64   SQL statement d
132d0 6f 65 73 20 6e 6f 74 20 72 65 61 64 20 6f 72 20  oes not read or 
132e0 77 72 69 74 65 20 61 20 64 61 74 61 62 61 73 65  write a database
132f0 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28   file.  */.  if(
13300 20 70 2d 3e 70 63 3e 3d 30 20 26 26 20 70 2d 3e   p->pc>=0 && p->
13310 62 49 73 52 65 61 64 65 72 20 29 7b 0a 20 20 20  bIsReader ){.   
13320 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50   int mrc;   /* P
13330 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64  rimary error cod
13340 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a  e from p->rc */.
13350 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d 65      int eStateme
13360 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ntOp = 0;.    in
13370 74 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72  t isSpecialError
13380 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
13390 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61  Set to true if a
133a0 20 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f 72   'special' error
133b0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b   */..    /* Lock
133c0 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64   all btrees used
133d0 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e   by the statemen
133e0 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  t */.    sqlite3
133f0 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20  VdbeEnter(p);.. 
13400 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
13410 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  one of the speci
13420 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20  al errors */.   
13430 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30   mrc = p->rc & 0
13440 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65 63 69  xff;.    isSpeci
13450 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53  alError = mrc==S
13460 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d  QLITE_NOMEM || m
13470 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
13480 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13490 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51        || mrc==SQ
134a0 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c  LITE_INTERRUPT |
134b0 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55  | mrc==SQLITE_FU
134c0 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70  LL;.    if( isSp
134d0 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20  ecialError ){.  
134e0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75      /* If the qu
134f0 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c  ery was read-onl
13500 79 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20  y and the error 
13510 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 49  code is SQLITE_I
13520 4e 54 45 52 52 55 50 54 2c 20 0a 20 20 20 20 20  NTERRUPT, .     
13530 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20   ** no rollback 
13540 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20 4f 74  is necessary. Ot
13550 68 65 72 77 69 73 65 2c 20 61 74 20 6c 65 61 73  herwise, at leas
13560 74 20 61 20 73 61 76 65 70 6f 69 6e 74 20 0a 20  t a savepoint . 
13570 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
13580 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c  ion must be roll
13590 65 64 20 62 61 63 6b 20 74 6f 20 72 65 73 74 6f  ed back to resto
135a0 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
135b0 74 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63  to a .      ** c
135c0 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e  onsistent state.
135d0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
135e0 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65 20 73  ** Even if the s
135f0 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65 61 64  tatement is read
13600 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d 70  -only, it is imp
13610 6f 72 74 61 6e 74 20 74 6f 20 70 65 72 66 6f 72  ortant to perfor
13620 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 74 61  m.      ** a sta
13630 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73 61  tement or transa
13640 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f  ction rollback o
13650 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65  peration. If the
13660 20 65 72 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a   error .      **
13670 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
13680 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a  writing to the j
13690 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75 72  ournal, sub-jour
136a0 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73 65 0a  nal or database.
136b0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73        ** file as
136c0 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66 66 6f   part of an effo
136d0 72 74 20 74 6f 20 66 72 65 65 20 75 70 20 63 61  rt to free up ca
136e0 63 68 65 20 73 70 61 63 65 20 28 73 65 65 20 66  che space (see f
136f0 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  unction.      **
13700 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20 69   pagerStress() i
13710 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68 65 20  n pager.c), the 
13720 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65 71 75  rollback is requ
13730 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20  ired to restore 
13740 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 61  .      ** the pa
13750 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69 73 74  ger to a consist
13760 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20  ent state..     
13770 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70   */.      if( !p
13780 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72  ->readOnly || mr
13790 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  c!=SQLITE_INTERR
137a0 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69  UPT ){.        i
137b0 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f  f( (mrc==SQLITE_
137c0 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51  NOMEM || mrc==SQ
137d0 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d  LITE_FULL) && p-
137e0 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c  >usesStmtJournal
137f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53   ){.          eS
13800 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56  tatementOp = SAV
13810 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b  EPOINT_ROLLBACK;
13820 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
13830 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
13840 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72 6f  are forced to ro
13850 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74 69  ll back the acti
13860 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ve transaction. 
13870 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20  Before doing.   
13880 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62         ** so, ab
13890 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73 74  ort any other st
138a0 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68 61  atements this ha
138b0 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 68  ndle currently h
138c0 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20  as active..     
138d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
138e0 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
138f0 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
13900 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b  ABORT_ROLLBACK);
13910 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
13920 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
13930 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  s(db);.         
13940 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
13950 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 1;.          p
13960 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
13970 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13980 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
13990 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61  heck for immedia
139a0 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 76  te foreign key v
139b0 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20  iolations. */.  
139c0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
139d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
139e0 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
139f0 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Fk(p, 0);.    }.
13a00 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
13a10 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
13a20 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 69  g is set and thi
13a30 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63  s is the only ac
13a40 74 69 76 65 20 77 72 69 74 65 72 20 0a 20 20 20  tive writer .   
13a50 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65 20   ** VM, then we 
13a60 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d  do either a comm
13a70 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f  it or rollback o
13a80 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  f the current tr
13a90 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20  ansaction. .    
13aa0 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20  **.    ** Note: 
13ab0 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20  This block also 
13ac0 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74  runs if one of t
13ad0 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72  he special error
13ae0 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a  s handled .    *
13af0 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75  * above has occu
13b00 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rred. .    */.  
13b10 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56 74    if( !sqlite3Vt
13b20 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20  abInSync(db) .  
13b30 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f     && db->autoCo
13b40 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64 62  mmit .     && db
13b50 2d 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d 28 70  ->nVdbeWrite==(p
13b60 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a  ->readOnly==0) .
13b70 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28      ){.      if(
13b80 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
13b90 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63  K || (p->errorAc
13ba0 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26  tion==OE_Fail &&
13bb0 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72   !isSpecialError
13bc0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
13bd0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  = sqlite3VdbeChe
13be0 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20  ckFk(p, 1);.    
13bf0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
13c00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
13c10 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e     if( NEVER(p->
13c20 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  readOnly) ){.   
13c30 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13c40 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  VdbeLeave(p);.  
13c50 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
13c60 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
13c70 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
13c80 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
13c90 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
13ca0 49 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20 20  IGNKEY;.        
13cb0 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 20  }else{ .        
13cc0 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f    /* The auto-co
13cd0 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 75  mmit flag is tru
13ce0 65 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f 67  e, the vdbe prog
13cf0 72 61 6d 20 77 61 73 20 73 75 63 63 65 73 73 66  ram was successf
13d00 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ul .          **
13d10 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46   or hit an 'OR F
13d20 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20  AIL' constraint 
13d30 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f  and there are no
13d40 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67   deferred foreig
13d50 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b  n.          ** k
13d60 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  ey constraints t
13d70 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72  o hold up the tr
13d80 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20  ansaction. This 
13d90 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a  means a commit .
13da0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20            ** is 
13db0 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
13dc0 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65         rc = vdbe
13dd0 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20  Commit(db, p);. 
13de0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13df0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13e00 42 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64 4f  BUSY && p->readO
13e10 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nly ){.         
13e20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
13e30 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
13e40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
13e50 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  SY;.        }els
13e60 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45  e if( rc!=SQLITE
13e70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
13e80 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
13e90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
13ea0 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
13eb0 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20  LITE_OK);.      
13ec0 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
13ed0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
13ee0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  e{.          db-
13ef0 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d  >nDeferredCons =
13f00 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62   0;.          db
13f10 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f  ->nDeferredImmCo
13f20 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ns = 0;.        
13f30 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
13f40 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b  SQLITE_DeferFKs;
13f50 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
13f60 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c  e3CommitInternal
13f70 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20  Changes(db);.   
13f80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
13f90 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
13fa0 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
13fb0 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  b, SQLITE_OK);. 
13fc0 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67         p->nChang
13fd0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
13fe0 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d       db->nStatem
13ff0 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ent = 0;.    }el
14000 73 65 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e  se if( eStatemen
14010 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tOp==0 ){.      
14020 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
14030 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72  E_OK || p->error
14040 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20  Action==OE_Fail 
14050 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74  ){.        eStat
14060 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f  ementOp = SAVEPO
14070 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20  INT_RELEASE;.   
14080 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
14090 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
140a0 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Abort ){.       
140b0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
140c0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
140d0 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  CK;.      }else{
140e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
140f0 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
14100 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
14110 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  LBACK);.        
14120 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
14130 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  points(db);.    
14140 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
14150 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  it = 1;.        
14160 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
14170 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14180 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74 61 74  .    /* If eStat
14190 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a  ementOp is non-z
141a0 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74 61 74  ero, then a stat
141b0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
141c0 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a  n needs to.    *
141d0 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f  * be committed o
141e0 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43  r rolled back. C
141f0 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 43  all sqlite3VdbeC
14200 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20  loseStatement() 
14210 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e  to.    ** do so.
14220 20 49 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   If this operati
14230 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  on returns an er
14240 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63 75 72  ror, and the cur
14250 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a 20  rent statement. 
14260 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65     ** error code
14270 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72   is SQLITE_OK or
14280 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
14290 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65  NT, then promote
142a0 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72   the.    ** curr
142b0 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 65 72  ent statement er
142c0 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f  ror code..    */
142d0 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d  .    if( eStatem
142e0 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20 20 72  entOp ){.      r
142f0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  c = sqlite3VdbeC
14300 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c  loseStatement(p,
14310 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a   eStatementOp);.
14320 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
14330 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
14340 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
14350 28 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53 51  (p->rc&0xff)==SQ
14360 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
14370 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
14380 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20  rc = rc;.       
14390 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
143a0 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
143b0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a  ;.          p->z
143c0 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
143d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
143e0 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
143f0 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52  (db, SQLITE_ABOR
14400 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20  T_ROLLBACK);.   
14410 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73       sqlite3Clos
14420 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
14430 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74  .        db->aut
14440 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
14450 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
14460 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
14470 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
14480 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45  this was an INSE
14490 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45  RT, UPDATE or DE
144a0 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73 74 61 74  LETE and no stat
144b0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
144c0 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65  n.    ** has bee
144d0 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75  n rolled back, u
144e0 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61  pdate the databa
144f0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68  se connection ch
14500 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20  ange-counter. . 
14510 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
14520 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a  >changeCntOn ){.
14530 20 20 20 20 20 20 69 66 28 20 65 53 74 61 74 65        if( eState
14540 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e  mentOp!=SAVEPOIN
14550 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
14560 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14570 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20  eSetChanges(db, 
14580 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20  p->nChange);.   
14590 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
145a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
145b0 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a  Changes(db, 0);.
145c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
145d0 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
145e0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65    }..    /* Rele
145f0 61 73 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f  ase the locks */
14600 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14610 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20  Leave(p);.  }.. 
14620 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63 63   /* We have succ
14630 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20  essfully halted 
14640 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56  and closed the V
14650 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73 20  M.  Record this 
14660 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  fact. */.  if( p
14670 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64  ->pc>=0 ){.    d
14680 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 2d 2d  b->nVdbeActive--
14690 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65  ;.    if( !p->re
146a0 61 64 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e 56 64  adOnly ) db->nVd
146b0 62 65 57 72 69 74 65 2d 2d 3b 0a 20 20 20 20 69  beWrite--;.    i
146c0 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  f( p->bIsReader 
146d0 29 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d  ) db->nVdbeRead-
146e0 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  -;.    assert( d
146f0 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 3d  b->nVdbeActive>=
14700 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b  db->nVdbeRead );
14710 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
14720 3e 6e 56 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e  >nVdbeRead>=db->
14730 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20  nVdbeWrite );.  
14740 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56    assert( db->nV
14750 64 62 65 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20  dbeWrite>=0 );. 
14760 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20   }.  p->magic = 
14770 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b  VDBE_MAGIC_HALT;
14780 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  .  checkActiveVd
14790 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28  beCnt(db);.  if(
147a0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
147b0 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
147c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
147d0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
147e0 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
147f0 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 2c   is set to true,
14800 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20   then any locks 
14810 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a 20  that were held. 
14820 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f   ** by connectio
14830 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62 65  n db have now be
14840 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61 6c  en released. Cal
14850 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74  l sqlite3Connect
14860 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20  ionUnlocked() . 
14870 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e   ** to invoke an
14880 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f 63  y required unloc
14890 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63  k-notify callbac
148a0 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ks..  */.  if( d
148b0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b  b->autoCommit ){
148c0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  .    sqlite3Conn
148d0 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64  ectionUnlocked(d
148e0 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  b);.  }..  asser
148f0 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  t( db->nVdbeActi
14900 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f  ve>0 || db->auto
14910 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d  Commit==0 || db-
14920 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29  >nStatement==0 )
14930 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72  ;.  return (p->r
14940 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 3f  c==SQLITE_BUSY ?
14950 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 53   SQLITE_BUSY : S
14960 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f  QLITE_OK);.}.../
14970 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68  *.** Each VDBE h
14980 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74 20  olds the result 
14990 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
149a0 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  nt sqlite3_step(
149b0 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e  ) call.** in p->
149c0 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  rc.  This routin
149d0 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73 75  e sets that resu
149e0 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54  lt back to SQLIT
149f0 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  E_OK..*/.void sq
14a00 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53 74  lite3VdbeResetSt
14a10 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70  epResult(Vdbe *p
14a20 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  ){.  p->rc = SQL
14a30 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
14a40 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f 72 20   Copy the error 
14a50 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d  code and error m
14a60 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67  essage belonging
14a70 20 74 6f 20 74 68 65 20 56 44 42 45 20 70 61 73   to the VDBE pas
14a80 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
14a90 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
14aa0 69 74 73 20 64 61 74 61 62 61 73 65 20 68 61 6e  its database han
14ab0 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74 68 65  dle (so that the
14ac0 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65  y will be .** re
14ad0 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c 73 20  turned by calls 
14ae0 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  to sqlite3_errco
14af0 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  de() and sqlite3
14b00 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a  _errmsg())..**.*
14b10 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
14b20 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72 20 74  does not clear t
14b30 68 65 20 56 44 42 45 20 65 72 72 6f 72 20 63 6f  he VDBE error co
14b40 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a  de or message, j
14b50 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68  ust.** copies th
14b60 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  em to the databa
14b70 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e  se handle..*/.in
14b80 74 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61  t sqlite3VdbeTra
14b90 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62 65 20  nsferError(Vdbe 
14ba0 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
14bb0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e  db = p->db;.  in
14bc0 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20  t rc = p->rc;.  
14bd0 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29  if( p->zErrMsg )
14be0 7b 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e 69 67  {.    db->bBenig
14bf0 6e 4d 61 6c 6c 6f 63 2b 2b 3b 0a 20 20 20 20 73  nMalloc++;.    s
14c00 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
14c10 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69  nMalloc();.    i
14c20 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29  f( db->pErr==0 )
14c30 20 64 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c 69   db->pErr = sqli
14c40 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b  te3ValueNew(db);
14c50 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
14c60 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72  eSetStr(db->pErr
14c70 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  , -1, p->zErrMsg
14c80 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
14c90 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
14ca0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  ;.    sqlite3End
14cb0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
14cc0 20 20 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e 4d      db->bBenignM
14cd0 61 6c 6c 6f 63 2d 2d 3b 0a 20 20 20 20 64 62 2d  alloc--;.    db-
14ce0 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20  >errCode = rc;. 
14cf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
14d00 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29  te3Error(db, rc)
14d10 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
14d20 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
14d30 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f  ITE_ENABLE_SQLLO
14d40 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 53 51  G./*.** If an SQ
14d50 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c  LITE_CONFIG_SQLL
14d60 4f 47 20 68 6f 6f 6b 20 69 73 20 72 65 67 69 73  OG hook is regis
14d70 74 65 72 65 64 20 61 6e 64 20 74 68 65 20 56 4d  tered and the VM
14d80 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2c 20 0a   has been run, .
14d90 2a 2a 20 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f  ** invoke it..*/
14da0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
14db0 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 56 64  eInvokeSqllog(Vd
14dc0 62 65 20 2a 76 29 7b 0a 20 20 69 66 28 20 73 71  be *v){.  if( sq
14dd0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
14de0 67 2e 78 53 71 6c 6c 6f 67 20 26 26 20 76 2d 3e  g.xSqllog && v->
14df0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
14e00 20 76 2d 3e 7a 53 71 6c 20 26 26 20 76 2d 3e 70   v->zSql && v->p
14e10 63 3e 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  c>=0 ){.    char
14e20 20 2a 7a 45 78 70 61 6e 64 65 64 20 3d 20 73 71   *zExpanded = sq
14e30 6c 69 74 65 33 56 64 62 65 45 78 70 61 6e 64 53  lite3VdbeExpandS
14e40 71 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a  ql(v, v->zSql);.
14e50 20 20 20 20 61 73 73 65 72 74 28 20 76 2d 3e 64      assert( v->d
14e60 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20  b->init.busy==0 
14e70 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 78 70 61  );.    if( zExpa
14e80 6e 64 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71  nded ){.      sq
14e90 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
14ea0 67 2e 78 53 71 6c 6c 6f 67 28 0a 20 20 20 20 20  g.xSqllog(.     
14eb0 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
14ec0 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67  alConfig.pSqllog
14ed0 41 72 67 2c 20 76 2d 3e 64 62 2c 20 7a 45 78 70  Arg, v->db, zExp
14ee0 61 6e 64 65 64 2c 20 31 0a 20 20 20 20 20 20 29  anded, 1.      )
14ef0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
14f00 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 7a 45 78  bFree(v->db, zEx
14f10 70 61 6e 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20  panded);.    }. 
14f20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
14f30 69 6e 65 20 76 64 62 65 49 6e 76 6f 6b 65 53 71  ine vdbeInvokeSq
14f40 6c 6c 6f 67 28 78 29 0a 23 65 6e 64 69 66 0a 0a  llog(x).#endif..
14f50 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61  /*.** Clean up a
14f60 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63   VDBE after exec
14f70 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74  ution but do not
14f80 20 64 65 6c 65 74 65 20 74 68 65 20 56 44 42 45   delete the VDBE
14f90 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72   just yet..** Wr
14fa0 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ite any error me
14fb0 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45  ssages into *pzE
14fc0 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74  rrMsg.  Return t
14fd0 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a  he result code..
14fe0 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73  **.** After this
14ff0 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c   routine is run,
15000 20 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64   the VDBE should
15010 20 62 65 20 72 65 61 64 79 20 74 6f 20 62 65 20   be ready to be 
15020 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69  executed.** agai
15030 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b  n..**.** To look
15040 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77   at it another w
15050 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ay, this routine
15060 20 72 65 73 65 74 73 20 74 68 65 20 73 74 61 74   resets the stat
15070 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74  e of the.** virt
15080 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d  ual machine from
15090 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20   VDBE_MAGIC_RUN 
150a0 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41  or VDBE_MAGIC_HA
150b0 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44  LT back to.** VD
150c0 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a  BE_MAGIC_INIT..*
150d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
150e0 65 52 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b  eReset(Vdbe *p){
150f0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
15100 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20    db = p->db;.. 
15110 20 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69   /* If the VM di
15120 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d  d not run to com
15130 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74  pletion or if it
15140 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a   encountered an.
15150 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e    ** error, then
15160 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61   it might not ha
15170 76 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70  ve been halted p
15180 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c  roperly.  So hal
15190 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20  t.  ** it now.. 
151a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
151b0 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20  eHalt(p);..  /* 
151c0 49 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  If the VDBE has 
151d0 62 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74  be run even part
151e0 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e  ially, then tran
151f0 73 66 65 72 20 74 68 65 20 65 72 72 6f 72 20 63  sfer the error c
15200 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72  ode.  ** and err
15210 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20  or message from 
15220 74 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68  the VDBE into th
15230 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
15240 73 74 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a  structure.  But.
15250 20 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45    ** if the VDBE
15260 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73   has just been s
15270 65 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61  et to run but ha
15280 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65  s not actually e
15290 78 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a  xecuted any.  **
152a0 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65   instructions ye
152b0 74 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69  t, leave the mai
152c0 6e 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72  n database error
152d0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63   information unc
152e0 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  hanged..  */.  i
152f0 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  f( p->pc>=0 ){. 
15300 20 20 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c     vdbeInvokeSql
15310 6c 6f 67 28 70 29 3b 0a 20 20 20 20 73 71 6c 69  log(p);.    sqli
15320 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72 45  te3VdbeTransferE
15330 72 72 6f 72 28 70 29 3b 0a 20 20 20 20 73 71 6c  rror(p);.    sql
15340 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
15350 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
15360 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
15370 20 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e      if( p->runOn
15380 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 69  lyOnce ) p->expi
15390 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  red = 1;.  }else
153a0 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d   if( p->rc && p-
153b0 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20  >expired ){.    
153c0 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 66  /* The expired f
153d0 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74  lag was set on t
153e0 68 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 74  he VDBE before t
153f0 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20  he first call.  
15400 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f    ** to sqlite3_
15410 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73  step(). For cons
15420 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73  istency (since s
15430 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 61  qlite3_step() wa
15440 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29  s.    ** called)
15450 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61  , set the databa
15460 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73  se error in this
15470 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20   case as well.. 
15480 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
15490 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62  3ErrorWithMsg(db
154a0 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a 45 72 72  , p->rc, p->zErr
154b0 4d 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20  Msg ? "%s" : 0, 
154c0 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
154d0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
154e0 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
154f0 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
15500 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
15510 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79  claim all memory
15520 20 75 73 65 64 20 62 79 20 74 68 65 20 56 44 42   used by the VDB
15530 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70  E.  */.  Cleanup
15540 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20  (p);..  /* Save 
15550 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d  profiling inform
15560 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20  ation from this 
15570 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23  VDBE run..  */.#
15580 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
15590 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20  LE.  {.    FILE 
155a0 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64  *out = fopen("vd
155b0 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c  be_profile.out",
155c0 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f   "a");.    if( o
155d0 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ut ){.      int 
155e0 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  i;.      fprintf
155f0 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a  (out, "---- ");.
15600 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
15610 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
15620 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
15630 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61  ut, "%02x", p->a
15640 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20  Op[i].opcode);. 
15650 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72       }.      fpr
15660 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
15670 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a 53  .      if( p->zS
15680 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  ql ){.        ch
15690 61 72 20 63 2c 20 70 63 20 3d 20 30 3b 0a 20 20  ar c, pc = 0;.  
156a0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
156b0 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20  t, "-- ");.     
156c0 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d     for(i=0; (c =
156d0 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21 3d 30 3b   p->zSql[i])!=0;
156e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
156f0 20 69 66 28 20 70 63 3d 3d 27 5c 6e 27 20 29 20   if( pc=='\n' ) 
15700 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  fprintf(out, "--
15710 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   ");.          p
15720 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20  utc(c, out);.   
15730 20 20 20 20 20 20 20 70 63 20 3d 20 63 3b 0a 20         pc = c;. 
15740 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15750 20 69 66 28 20 70 63 21 3d 27 5c 6e 27 20 29 20   if( pc!='\n' ) 
15760 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
15770 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
15780 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
15790 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
157a0 20 20 20 63 68 61 72 20 7a 48 64 72 5b 31 30 30     char zHdr[100
157b0 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ];.        sqlit
157c0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
157d0 6f 66 28 7a 48 64 72 29 2c 20 7a 48 64 72 2c 20  of(zHdr), zHdr, 
157e0 22 25 36 75 20 25 31 32 6c 6c 75 20 25 38 6c 6c  "%6u %12llu %8ll
157f0 75 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  u ",.           
15800 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20  p->aOp[i].cnt,. 
15810 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
15820 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20  [i].cycles,.    
15830 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
15840 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b  .cnt>0 ? p->aOp[
15850 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70  i].cycles/p->aOp
15860 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20  [i].cnt : 0.    
15870 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 66      );.        f
15880 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22  printf(out, "%s"
15890 2c 20 7a 48 64 72 29 3b 0a 20 20 20 20 20 20 20  , zHdr);.       
158a0 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
158b0 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e  tOp(out, i, &p->
158c0 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d  aOp[i]);.      }
158d0 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75  .      fclose(ou
158e0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  t);.    }.  }.#e
158f0 6e 64 69 66 0a 20 20 70 2d 3e 69 43 75 72 72 65  ndif.  p->iCurre
15900 6e 74 54 69 6d 65 20 3d 20 30 3b 0a 20 20 70 2d  ntTime = 0;.  p-
15910 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
15920 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75  GIC_INIT;.  retu
15930 72 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65  rn p->rc & db->e
15940 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a  rrMask;.}. ./*.*
15950 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64  * Clean up and d
15960 65 6c 65 74 65 20 61 20 56 44 42 45 20 61 66 74  elete a VDBE aft
15970 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52  er execution.  R
15980 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
15990 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65   which is.** the
159a0 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57   result code.  W
159b0 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d  rite any error m
159c0 65 73 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f  essage text into
159d0 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69   *pzErrMsg..*/.i
159e0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 69  nt sqlite3VdbeFi
159f0 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b  nalize(Vdbe *p){
15a00 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
15a10 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e  TE_OK;.  if( p->
15a20 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
15a30 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69  C_RUN || p->magi
15a40 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41  c==VDBE_MAGIC_HA
15a50 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  LT ){.    rc = s
15a60 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28  qlite3VdbeReset(
15a70 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  p);.    assert( 
15a80 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72  (rc & p->db->err
15a90 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d  Mask)==rc );.  }
15aa0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  .  sqlite3VdbeDe
15ab0 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75 72  lete(p);.  retur
15ac0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
15ad0 66 20 70 61 72 61 6d 65 74 65 72 20 69 4f 70 20  f parameter iOp 
15ae0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
15af0 6f 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74  o, then invoke t
15b00 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f  he destructor fo
15b10 72 0a 2a 2a 20 61 6c 6c 20 61 75 78 69 6c 69 61  r.** all auxilia
15b20 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73  ry data pointers
15b30 20 63 75 72 72 65 6e 74 6c 79 20 63 61 63 68 65   currently cache
15b40 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73  d by the VM pass
15b50 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 66 69 72  ed as.** the fir
15b60 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  st argument..**.
15b70 2a 2a 20 4f 72 2c 20 69 66 20 69 4f 70 20 69 73  ** Or, if iOp is
15b80 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
15b90 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20   equal to zero, 
15ba0 74 68 65 6e 20 74 68 65 20 64 65 73 74 72 75 63  then the destruc
15bb0 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 69  tor is.** only i
15bc0 6e 76 6f 6b 65 64 20 66 6f 72 20 74 68 6f 73 65  nvoked for those
15bd0 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 20   auxiliary data 
15be0 70 6f 69 6e 74 65 72 73 20 63 72 65 61 74 65 64  pointers created
15bf0 20 62 79 20 74 68 65 20 75 73 65 72 20 0a 2a 2a   by the user .**
15c00 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65   function invoke
15c10 64 20 62 79 20 74 68 65 20 4f 50 5f 46 75 6e 63  d by the OP_Func
15c20 74 69 6f 6e 20 6f 70 63 6f 64 65 20 61 74 20 69  tion opcode at i
15c30 6e 73 74 72 75 63 74 69 6f 6e 20 69 4f 70 20 6f  nstruction iOp o
15c40 66 20 0a 2a 2a 20 56 4d 20 70 56 64 62 65 2c 20  f .** VM pVdbe, 
15c50 61 6e 64 20 6f 6e 6c 79 20 74 68 65 6e 20 69 66  and only then if
15c60 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65  :.**.**    * the
15c70 20 61 73 73 6f 63 69 61 74 65 64 20 66 75 6e 63   associated func
15c80 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 69  tion parameter i
15c90 73 20 74 68 65 20 33 32 6e 64 20 6f 72 20 6c 61  s the 32nd or la
15ca0 74 65 72 20 28 63 6f 75 6e 74 69 6e 67 0a 2a 2a  ter (counting.**
15cb0 20 20 20 20 20 20 66 72 6f 6d 20 6c 65 66 74 20        from left 
15cc0 74 6f 20 72 69 67 68 74 29 2c 20 6f 72 0a 2a 2a  to right), or.**
15cd0 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 63 6f 72  .**    * the cor
15ce0 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69  responding bit i
15cf0 6e 20 61 72 67 75 6d 65 6e 74 20 6d 61 73 6b 20  n argument mask 
15d00 69 73 20 63 6c 65 61 72 20 28 77 68 65 72 65 20  is clear (where 
15d10 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 20  the first.**    
15d20 20 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d    function param
15d30 65 74 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 73  eter corresponds
15d40 20 74 6f 20 62 69 74 20 30 20 65 74 63 2e 29 2e   to bit 0 etc.).
15d50 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
15d60 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74  VdbeDeleteAuxDat
15d70 61 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 69  a(Vdbe *pVdbe, i
15d80 6e 74 20 69 4f 70 2c 20 69 6e 74 20 6d 61 73 6b  nt iOp, int mask
15d90 29 7b 0a 20 20 41 75 78 44 61 74 61 20 2a 2a 70  ){.  AuxData **p
15da0 70 20 3d 20 26 70 56 64 62 65 2d 3e 70 41 75 78  p = &pVdbe->pAux
15db0 44 61 74 61 3b 0a 20 20 77 68 69 6c 65 28 20 2a  Data;.  while( *
15dc0 70 70 20 29 7b 0a 20 20 20 20 41 75 78 44 61 74  pp ){.    AuxDat
15dd0 61 20 2a 70 41 75 78 20 3d 20 2a 70 70 3b 0a 20  a *pAux = *pp;. 
15de0 20 20 20 69 66 28 20 28 69 4f 70 3c 30 29 0a 20     if( (iOp<0). 
15df0 20 20 20 20 7c 7c 20 28 70 41 75 78 2d 3e 69 4f      || (pAux->iO
15e00 70 3d 3d 69 4f 70 20 26 26 20 28 70 41 75 78 2d  p==iOp && (pAux-
15e10 3e 69 41 72 67 3e 33 31 20 7c 7c 20 21 28 6d 61  >iArg>31 || !(ma
15e20 73 6b 20 26 20 4d 41 53 4b 42 49 54 33 32 28 70  sk & MASKBIT32(p
15e30 41 75 78 2d 3e 69 41 72 67 29 29 29 29 0a 20 20  Aux->iArg)))).  
15e40 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63    ){.      testc
15e50 61 73 65 28 20 70 41 75 78 2d 3e 69 41 72 67 3d  ase( pAux->iArg=
15e60 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  =31 );.      if(
15e70 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 29   pAux->xDelete )
15e80 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e  {.        pAux->
15e90 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 41  xDelete(pAux->pA
15ea0 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ux);.      }.   
15eb0 20 20 20 2a 70 70 20 3d 20 70 41 75 78 2d 3e 70     *pp = pAux->p
15ec0 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Next;.      sqli
15ed0 74 65 33 44 62 46 72 65 65 28 70 56 64 62 65 2d  te3DbFree(pVdbe-
15ee0 3e 64 62 2c 20 70 41 75 78 29 3b 0a 20 20 20 20  >db, pAux);.    
15ef0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 3d  }else{.      pp=
15f00 20 26 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20   &pAux->pNext;. 
15f10 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
15f20 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72  * Free all memor
15f30 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
15f40 68 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65  h the Vdbe passe
15f50 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
15f60 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78 63  argument,.** exc
15f70 65 70 74 20 66 6f 72 20 6f 62 6a 65 63 74 20 69  ept for object i
15f80 74 73 65 6c 66 2c 20 77 68 69 63 68 20 69 73 20  tself, which is 
15f90 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a  preserved..**.**
15fa0 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
15fb0 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e  between this fun
15fc0 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74 65  ction and sqlite
15fd0 33 56 64 62 65 44 65 6c 65 74 65 28 29 20 69 73  3VdbeDelete() is
15fe0 20 74 68 61 74 0a 2a 2a 20 56 64 62 65 44 65 6c   that.** VdbeDel
15ff0 65 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69 6e  ete() also unlin
16000 6b 73 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d  ks the Vdbe from
16010 20 74 68 65 20 6c 69 73 74 20 6f 66 20 56 4d 73   the list of VMs
16020 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
16030 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
16040 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20   connection and 
16050 66 72 65 65 73 20 74 68 65 20 6f 62 6a 65 63 74  frees the object
16060 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69 64   itself..*/.void
16070 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61   sqlite3VdbeClea
16080 72 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20  rObject(sqlite3 
16090 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20  *db, Vdbe *p){. 
160a0 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53 75   SubProgram *pSu
160b0 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 6e 74  b, *pNext;.  int
160c0 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   i;.  assert( p-
160d0 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d  >db==0 || p->db=
160e0 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73 65  =db );.  release
160f0 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72  MemArray(p->aVar
16100 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 72 65  , p->nVar);.  re
16110 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
16120 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52  >aColName, p->nR
16130 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
16140 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d  _N);.  for(pSub=
16150 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53 75  p->pProgram; pSu
16160 62 3b 20 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a  b; pSub=pNext){.
16170 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53 75 62      pNext = pSub
16180 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76 64 62  ->pNext;.    vdb
16190 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c  eFreeOpArray(db,
161a0 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62   pSub->aOp, pSub
161b0 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69  ->nOp);.    sqli
161c0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
161d0 75 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ub);.  }.  for(i
161e0 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20 69 3e 3d  =p->nzVar-1; i>=
161f0 30 3b 20 69 2d 2d 29 20 73 71 6c 69 74 65 33 44  0; i--) sqlite3D
16200 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a 56  bFree(db, p->azV
16210 61 72 5b 69 5d 29 3b 0a 20 20 73 71 6c 69 74 65  ar[i]);.  sqlite
16220 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
16230 7a 56 61 72 29 3b 0a 20 20 76 64 62 65 46 72 65  zVar);.  vdbeFre
16240 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e  eOpArray(db, p->
16250 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20  aOp, p->nOp);.  
16260 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
16270 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  , p->aColName);.
16280 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
16290 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20  db, p->zSql);.  
162a0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
162b0 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 23 69 66  , p->pFree);.#if
162c0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
162d0 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
162e0 53 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  S.  for(i=0; i<p
162f0 2d 3e 6e 53 63 61 6e 3b 20 69 2b 2b 29 7b 0a 20  ->nScan; i++){. 
16300 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
16310 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 5b 69 5d  (db, p->aScan[i]
16320 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73  .zName);.  }.  s
16330 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
16340 20 70 2d 3e 61 53 63 61 6e 29 3b 0a 23 65 6e 64   p->aScan);.#end
16350 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  if.}../*.** Dele
16360 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42  te an entire VDB
16370 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  E..*/.void sqlit
16380 65 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62  e3VdbeDelete(Vdb
16390 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
163a0 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e 45 56   *db;..  if( NEV
163b0 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(p==0) ) retur
163c0 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  n;.  db = p->db;
163d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
163e0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
163f0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
16400 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62  lite3VdbeClearOb
16410 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 20 20 69  ject(db, p);.  i
16420 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20  f( p->pPrev ){. 
16430 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65     p->pPrev->pNe
16440 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
16450 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
16460 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70  rt( db->pVdbe==p
16470 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62   );.    db->pVdb
16480 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  e = p->pNext;.  
16490 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  }.  if( p->pNext
164a0 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74   ){.    p->pNext
164b0 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
164c0 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67  ev;.  }.  p->mag
164d0 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
164e0 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  DEAD;.  p->db = 
164f0 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  0;.  sqlite3DbFr
16500 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
16510 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20 22  .** The cursor "
16520 70 22 20 68 61 73 20 61 20 70 65 6e 64 69 6e 67  p" has a pending
16530 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 20   seek operation 
16540 74 68 61 74 20 68 61 73 20 6e 6f 74 20 79 65 74  that has not yet
16550 20 62 65 65 6e 0a 2a 2a 20 63 61 72 72 69 65 64   been.** carried
16560 20 6f 75 74 2e 20 20 53 65 65 6b 20 74 68 65 20   out.  Seek the 
16570 63 75 72 73 6f 72 20 6e 6f 77 2e 20 20 49 66 20  cursor now.  If 
16580 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
16590 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 61   return.** the a
165a0 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
165b0 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
165c0 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
165d0 4c 49 4e 45 20 68 61 6e 64 6c 65 44 65 66 65 72  LINE handleDefer
165e0 72 65 64 4d 6f 76 65 74 6f 28 56 64 62 65 43 75  redMoveto(VdbeCu
165f0 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  rsor *p){.  int 
16600 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66 20  res, rc;.#ifdef 
16610 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 65 78  SQLITE_TEST.  ex
16620 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
16630 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23  _search_count;.#
16640 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
16650 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
16660 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  o );.  assert( p
16670 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 61  ->isTable );.  a
16680 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79  ssert( p->eCurTy
16690 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
166a0 45 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  E );.  rc = sqli
166b0 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
166c0 70 61 63 6b 65 64 28 70 2d 3e 75 63 2e 70 43 75  packed(p->uc.pCu
166d0 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65  rsor, 0, p->move
166e0 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72 65  toTarget, 0, &re
166f0 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  s);.  if( rc ) r
16700 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20  eturn rc;.  if( 
16710 72 65 73 21 3d 30 20 29 20 72 65 74 75 72 6e 20  res!=0 ) return 
16720 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
16730 4b 50 54 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  KPT;.#ifdef SQLI
16740 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65  TE_TEST.  sqlite
16750 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b  3_search_count++
16760 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 64 65  ;.#endif.  p->de
16770 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30  ferredMoveto = 0
16780 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74  ;.  p->cacheStat
16790 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
167a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
167b0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
167c0 6f 6d 65 74 68 69 6e 67 20 68 61 73 20 6d 6f 76  omething has mov
167d0 65 64 20 63 75 72 73 6f 72 20 22 70 22 20 6f 75  ed cursor "p" ou
167e0 74 20 6f 66 20 70 6c 61 63 65 2e 20 20 4d 61 79  t of place.  May
167f0 62 65 20 74 68 65 20 72 6f 77 20 69 74 20 77 61  be the row it wa
16800 73 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20  s.** pointed to 
16810 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20  was deleted out 
16820 66 72 6f 6d 20 75 6e 64 65 72 20 69 74 2e 20 20  from under it.  
16830 4f 72 20 6d 61 79 62 65 20 74 68 65 20 62 74 72  Or maybe the btr
16840 65 65 20 77 61 73 0a 2a 2a 20 72 65 62 61 6c 61  ee was.** rebala
16850 6e 63 65 64 2e 20 20 57 68 61 74 65 76 65 72 20  nced.  Whatever 
16860 74 68 65 20 63 61 75 73 65 2c 20 74 72 79 20 74  the cause, try t
16870 6f 20 72 65 73 74 6f 72 65 20 22 70 22 20 74 6f  o restore "p" to
16880 20 74 68 65 20 70 6c 61 63 65 20 69 74 0a 2a 2a   the place it.**
16890 20 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f 20   is supposed to 
168a0 62 65 20 70 6f 69 6e 74 69 6e 67 2e 20 20 49 66  be pointing.  If
168b0 20 74 68 65 20 72 6f 77 20 77 61 73 20 64 65 6c   the row was del
168c0 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
168d0 64 65 72 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f  der the.** curso
168e0 72 2c 20 73 65 74 20 74 68 65 20 63 75 72 73 6f  r, set the curso
168f0 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  r to point to a 
16900 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61  NULL row..*/.sta
16910 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e  tic int SQLITE_N
16920 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 4d 6f  OINLINE handleMo
16930 76 65 64 43 75 72 73 6f 72 28 56 64 62 65 43 75  vedCursor(VdbeCu
16940 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  rsor *p){.  int 
16950 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 2c 20  isDifferentRow, 
16960 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  rc;.  assert( p-
16970 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
16980 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 61 73  PE_BTREE );.  as
16990 73 65 72 74 28 20 70 2d 3e 75 63 2e 70 43 75 72  sert( p->uc.pCur
169a0 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  sor!=0 );.  asse
169b0 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
169c0 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70  CursorHasMoved(p
169d0 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29 3b  ->uc.pCursor) );
169e0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
169f0 74 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72  treeCursorRestor
16a00 65 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c  e(p->uc.pCursor,
16a10 20 26 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77   &isDifferentRow
16a20 29 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74 61  );.  p->cacheSta
16a30 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
16a40 45 3b 0a 20 20 69 66 28 20 69 73 44 69 66 66 65  E;.  if( isDiffe
16a50 72 65 6e 74 52 6f 77 20 29 20 70 2d 3e 6e 75 6c  rentRow ) p->nul
16a60 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72 65 74 75  lRow = 1;.  retu
16a70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
16a80 43 68 65 63 6b 20 74 6f 20 65 6e 73 75 72 65 20  Check to ensure 
16a90 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
16aa0 69 73 20 76 61 6c 69 64 2e 20 20 52 65 73 74 6f  is valid.  Resto
16ab0 72 65 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  re the cursor.**
16ac0 20 69 66 20 6e 65 65 64 20 62 65 2e 20 20 52 65   if need be.  Re
16ad0 74 75 72 6e 20 61 6e 79 20 49 2f 4f 20 65 72 72  turn any I/O err
16ae0 6f 72 20 66 72 6f 6d 20 74 68 65 20 72 65 73 74  or from the rest
16af0 6f 72 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  ore operation..*
16b00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
16b10 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 56  eCursorRestore(V
16b20 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  dbeCursor *p){. 
16b30 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72   assert( p->eCur
16b40 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
16b50 52 45 45 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  REE );.  if( sql
16b60 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
16b70 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43  asMoved(p->uc.pC
16b80 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 72 65  ursor) ){.    re
16b90 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64  turn handleMoved
16ba0 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a 20  Cursor(p);.  }. 
16bb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16bc0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  K;.}../*.** Make
16bd0 20 73 75 72 65 20 74 68 65 20 63 75 72 73 6f 72   sure the cursor
16be0 20 70 20 69 73 20 72 65 61 64 79 20 74 6f 20 72   p is ready to r
16bf0 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65  ead or write the
16c00 20 72 6f 77 20 74 6f 20 77 68 69 63 68 20 69 74   row to which it
16c10 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6f 73  .** was last pos
16c20 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e  itioned.  Return
16c30 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
16c40 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f  f an OOM fault o
16c50 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70  r I/O error.** p
16c60 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20  revents us from 
16c70 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68 65 20  positioning the 
16c80 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20 63 6f  cursor to its co
16c90 72 72 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a  rrect position..
16ca0 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54  **.** If a MoveT
16cb0 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70  o operation is p
16cc0 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69  ending on the gi
16cd0 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  ven cursor, then
16ce0 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65   do that.** Move
16cf0 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d  To now.  If no m
16d00 6f 76 65 20 69 73 20 70 65 6e 64 69 6e 67 2c 20  ove is pending, 
16d10 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
16d20 74 68 65 20 72 6f 77 20 68 61 73 20 62 65 65 6e  the row has been
16d30 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75 74 20  .** deleted out 
16d40 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63  from under the c
16d50 75 72 73 6f 72 20 61 6e 64 20 69 66 20 69 74 20  ursor and if it 
16d60 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f  has, mark the ro
16d70 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72  w as.** a NULL r
16d80 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ow..**.** If the
16d90 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
16da0 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
16db0 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77 20 61  he correct row a
16dc0 6e 64 20 74 68 61 74 20 72 6f 77 20 68 61 73 0a  nd that row has.
16dd0 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65  ** not been dele
16de0 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
16df0 65 72 20 74 68 65 20 63 75 72 73 6f 72 2c 20 74  er the cursor, t
16e00 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
16e10 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
16e20 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
16e30 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65  ursorMoveto(Vdbe
16e40 43 75 72 73 6f 72 20 2a 2a 70 70 2c 20 69 6e 74  Cursor **pp, int
16e50 20 2a 70 69 43 6f 6c 29 7b 0a 20 20 56 64 62 65   *piCol){.  Vdbe
16e60 43 75 72 73 6f 72 20 2a 70 20 3d 20 2a 70 70 3b  Cursor *p = *pp;
16e70 0a 20 20 69 66 28 20 70 2d 3e 65 43 75 72 54 79  .  if( p->eCurTy
16e80 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
16e90 45 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  E ){.    if( p->
16ea0 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29  deferredMoveto )
16eb0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4d 61 70  {.      int iMap
16ec0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61  ;.      if( p->a
16ed0 41 6c 74 4d 61 70 20 26 26 20 28 69 4d 61 70 20  AltMap && (iMap 
16ee0 3d 20 70 2d 3e 61 41 6c 74 4d 61 70 5b 31 2b 2a  = p->aAltMap[1+*
16ef0 70 69 43 6f 6c 5d 29 3e 30 20 29 7b 0a 20 20 20  piCol])>0 ){.   
16f00 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70 41       *pp = p->pA
16f10 6c 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  ltCursor;.      
16f20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 4d 61 70 20    *piCol = iMap 
16f30 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74  - 1;.        ret
16f40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
16f50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
16f60 75 72 6e 20 68 61 6e 64 6c 65 44 65 66 65 72 72  urn handleDeferr
16f70 65 64 4d 6f 76 65 74 6f 28 70 29 3b 0a 20 20 20  edMoveto(p);.   
16f80 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
16f90 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
16fa0 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72  Moved(p->uc.pCur
16fb0 73 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 72 65  sor) ){.      re
16fc0 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64  turn handleMoved
16fd0 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 7d  Cursor(p);.    }
16fe0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
16ff0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
17000 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
17010 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  functions:.**.**
17020 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
17030 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69  alType().** sqli
17040 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
17050 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65  eLen().** sqlite
17060 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29  3VdbeSerialLen()
17070 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
17080 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71  erialPut().** sq
17090 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
170a0 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70  et().**.** encap
170b0 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20  sulate the code 
170c0 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20  that serializes 
170d0 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61  values for stora
170e0 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20  ge in SQLite.** 
170f0 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72  data and index r
17100 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72  ecords. Each ser
17110 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f  ialized value co
17120 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27  nsists of a.** '
17130 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64  serial-type' and
17140 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e   a blob of data.
17150 20 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   The serial type
17160 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e   is an 8-byte un
17170 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65  signed.** intege
17180 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 76  r, stored as a v
17190 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  arint..**.** In 
171a0 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20  an SQLite index 
171b0 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69  record, the seri
171c0 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72 65  al type is store
171d0 64 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72  d directly befor
171e0 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66  e.** the blob of
171f0 20 64 61 74 61 20 74 68 61 74 20 69 74 20 63 6f   data that it co
17200 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e  rresponds to. In
17210 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c   a table record,
17220 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74   all serial.** t
17230 79 70 65 73 20 61 72 65 20 73 74 6f 72 65 64 20  ypes are stored 
17240 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
17250 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20  the record, and 
17260 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74  the blobs of dat
17270 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e  a at.** the end.
17280 20 48 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e   Hence these fun
17290 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65  ctions allow the
172a0 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c   caller to handl
172b0 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d  e the.** serial-
172c0 74 79 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c  type and data bl
172d0 6f 62 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a  ob separately..*
172e0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
172f0 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62  ng table describ
17300 65 73 20 74 68 65 20 76 61 72 69 6f 75 73 20 73  es the various s
17310 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20 66  torage classes f
17320 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20  or data:.**.**  
17330 20 73 65 72 69 61 6c 20 74 79 70 65 20 20 20 20   serial type    
17340 20 20 20 20 62 79 74 65 73 20 6f 66 20 64 61 74      bytes of dat
17350 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20  a      type.**  
17360 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
17370 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
17380 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---    ---------
17390 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30  ------.**      0
173a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173b0 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
173c0 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31    NULL.**      1
173d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173e0 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
173f0 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
17400 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 20  .**      2      
17410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
17420 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
17430 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
17440 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
17450 20 20 20 20 20 20 20 20 20 33 20 20 20 20 20 20           3      
17460 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
17470 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20  eger.**      4  
17480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17490 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20     4            
174a0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
174b0 2a 20 20 20 20 20 20 35 20 20 20 20 20 20 20 20  *      5        
174c0 20 20 20 20 20 20 20 20 20 20 20 20 20 36 20 20               6  
174d0 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
174e0 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
174f0 20 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20   6              
17500 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20         8        
17510 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
17520 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20  er.**      7    
17530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17540 20 38 20 20 20 20 20 20 20 20 20 20 20 20 49 45   8            IE
17550 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20  EE float.**     
17560 20 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20   8              
17570 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
17580 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73      Integer cons
17590 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39  tant 0.**      9
175a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175b0 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
175c0 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61    Integer consta
175d0 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31  nt 1.**     10,1
175e0 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
175f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17600 72 65 73 65 72 76 65 64 20 66 6f 72 20 65 78 70  reserved for exp
17610 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d  ansion.**    N>=
17620 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20  12 and even     
17630 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20    (N-12)/2      
17640 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d    BLOB.**    N>=
17650 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20  13 and odd      
17660 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20    (N-13)/2      
17670 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65    text.**.** The
17680 20 38 20 61 6e 64 20 39 20 74 79 70 65 73 20 77   8 and 9 types w
17690 65 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33  ere added in 3.3
176a0 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  .0, file format 
176b0 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f  4.  Prior versio
176c0 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20  ns.** of SQLite 
176d0 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74  will not underst
176e0 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c  and those serial
176f0 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a   types..*/../*.*
17700 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 72  * Return the ser
17710 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65  ial-type for the
17720 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
17730 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71   pMem..*/.u32 sq
17740 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
17750 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69  ype(Mem *pMem, i
17760 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20  nt file_format, 
17770 75 33 32 20 2a 70 4c 65 6e 29 7b 0a 20 20 69 6e  u32 *pLen){.  in
17780 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e  t flags = pMem->
17790 66 6c 61 67 73 3b 0a 20 20 75 33 32 20 6e 3b 0a  flags;.  u32 n;.
177a0 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 6e 21  .  assert( pLen!
177b0 3d 30 20 29 3b 0a 20 20 69 66 28 20 66 6c 61 67  =0 );.  if( flag
177c0 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  s&MEM_Null ){.  
177d0 20 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20    *pLen = 0;.   
177e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
177f0 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49   if( flags&MEM_I
17800 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67  nt ){.    /* Fig
17810 75 72 65 20 6f 75 74 20 77 68 65 74 68 65 72 20  ure out whether 
17820 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20  to use 1, 2, 4, 
17830 36 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f  6 or 8 bytes. */
17840 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f  .#   define MAX_
17850 36 42 59 54 45 20 28 28 28 28 69 36 34 29 30 78  6BYTE ((((i64)0x
17860 30 30 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31  00008000)<<32)-1
17870 29 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d  ).    i64 i = pM
17880 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34  em->u.i;.    u64
17890 20 75 3b 0a 20 20 20 20 69 66 28 20 69 3c 30 20   u;.    if( i<0 
178a0 29 7b 0a 20 20 20 20 20 20 75 20 3d 20 7e 69 3b  ){.      u = ~i;
178b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
178c0 20 20 75 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20    u = i;.    }. 
178d0 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29 7b     if( u<=127 ){
178e0 0a 20 20 20 20 20 20 69 66 28 20 28 69 26 31 29  .      if( (i&1)
178f0 3d 3d 69 20 26 26 20 66 69 6c 65 5f 66 6f 72 6d  ==i && file_form
17900 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 20 20 20  at>=4 ){.       
17910 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20   *pLen = 0;.    
17920 20 20 20 20 72 65 74 75 72 6e 20 38 2b 28 75 33      return 8+(u3
17930 32 29 75 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  2)u;.      }else
17940 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c 65 6e 20  {.        *pLen 
17950 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 1;.        ret
17960 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
17970 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d     }.    if( u<=
17980 33 32 37 36 37 20 29 7b 20 2a 70 4c 65 6e 20 3d  32767 ){ *pLen =
17990 20 32 3b 20 72 65 74 75 72 6e 20 32 3b 20 7d 0a   2; return 2; }.
179a0 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36      if( u<=83886
179b0 30 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 33 3b  07 ){ *pLen = 3;
179c0 20 72 65 74 75 72 6e 20 33 3b 20 7d 0a 20 20 20   return 3; }.   
179d0 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36   if( u<=21474836
179e0 34 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 34 3b  47 ){ *pLen = 4;
179f0 20 72 65 74 75 72 6e 20 34 3b 20 7d 0a 20 20 20   return 4; }.   
17a00 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54   if( u<=MAX_6BYT
17a10 45 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 36 3b 20  E ){ *pLen = 6; 
17a20 72 65 74 75 72 6e 20 35 3b 20 7d 0a 20 20 20 20  return 5; }.    
17a30 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20 20 20 72  *pLen = 8;.    r
17a40 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69  eturn 6;.  }.  i
17a50 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61  f( flags&MEM_Rea
17a60 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d  l ){.    *pLen =
17a70 20 38 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 37   8;.    return 7
17a80 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
17a90 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  pMem->db->malloc
17aa0 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26  Failed || flags&
17ab0 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f  (MEM_Str|MEM_Blo
17ac0 62 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  b) );.  assert( 
17ad0 70 4d 65 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20  pMem->n>=0 );.  
17ae0 6e 20 3d 20 28 75 33 32 29 70 4d 65 6d 2d 3e 6e  n = (u32)pMem->n
17af0 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
17b00 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20  MEM_Zero ){.    
17b10 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65  n += pMem->u.nZe
17b20 72 6f 3b 0a 20 20 7d 0a 20 20 2a 70 4c 65 6e 20  ro;.  }.  *pLen 
17b30 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 28 28  = n;.  return ((
17b40 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c  n*2) + 12 + ((fl
17b50 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29  ags&MEM_Str)!=0)
17b60 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
17b70 73 69 7a 65 73 20 66 6f 72 20 73 65 72 69 61 6c  sizes for serial
17b80 20 74 79 70 65 73 20 6c 65 73 73 20 74 68 61 6e   types less than
17b90 20 31 32 38 0a 2a 2f 0a 73 74 61 74 69 63 20 63   128.*/.static c
17ba0 6f 6e 73 74 20 75 38 20 73 71 6c 69 74 65 33 53  onst u8 sqlite3S
17bb0 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 5d 20  mallTypeSizes[] 
17bc0 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 20  = {.        /*  
17bd0 30 20 20 20 31 20 20 20 32 20 20 20 33 20 20 20  0   1   2   3   
17be0 34 20 20 20 35 20 20 20 36 20 20 20 37 20 20 20  4   5   6   7   
17bf0 38 20 20 20 39 20 2a 2f 20 20 20 0a 2f 2a 20 20  8   9 */   ./*  
17c00 20 30 20 2a 2f 20 20 20 30 2c 20 20 31 2c 20 20   0 */   0,  1,  
17c10 32 2c 20 20 33 2c 20 20 34 2c 20 20 36 2c 20 20  2,  3,  4,  6,  
17c20 38 2c 20 20 38 2c 20 20 30 2c 20 20 30 2c 0a 2f  8,  8,  0,  0,./
17c30 2a 20 20 31 30 20 2a 2f 20 20 20 30 2c 20 20 30  *  10 */   0,  0
17c40 2c 20 20 30 2c 20 20 30 2c 20 20 31 2c 20 20 31  ,  0,  0,  1,  1
17c50 2c 20 20 32 2c 20 20 32 2c 20 20 33 2c 20 20 33  ,  2,  2,  3,  3
17c60 2c 0a 2f 2a 20 20 32 30 20 2a 2f 20 20 20 34 2c  ,./*  20 */   4,
17c70 20 20 34 2c 20 20 35 2c 20 20 35 2c 20 20 36 2c    4,  5,  5,  6,
17c80 20 20 36 2c 20 20 37 2c 20 20 37 2c 20 20 38 2c    6,  7,  7,  8,
17c90 20 20 38 2c 0a 2f 2a 20 20 33 30 20 2a 2f 20 20    8,./*  30 */  
17ca0 20 39 2c 20 20 39 2c 20 31 30 2c 20 31 30 2c 20   9,  9, 10, 10, 
17cb0 31 31 2c 20 31 31 2c 20 31 32 2c 20 31 32 2c 20  11, 11, 12, 12, 
17cc0 31 33 2c 20 31 33 2c 0a 2f 2a 20 20 34 30 20 2a  13, 13,./*  40 *
17cd0 2f 20 20 31 34 2c 20 31 34 2c 20 31 35 2c 20 31  /  14, 14, 15, 1
17ce0 35 2c 20 31 36 2c 20 31 36 2c 20 31 37 2c 20 31  5, 16, 16, 17, 1
17cf0 37 2c 20 31 38 2c 20 31 38 2c 0a 2f 2a 20 20 35  7, 18, 18,./*  5
17d00 30 20 2a 2f 20 20 31 39 2c 20 31 39 2c 20 32 30  0 */  19, 19, 20
17d10 2c 20 32 30 2c 20 32 31 2c 20 32 31 2c 20 32 32  , 20, 21, 21, 22
17d20 2c 20 32 32 2c 20 32 33 2c 20 32 33 2c 0a 2f 2a  , 22, 23, 23,./*
17d30 20 20 36 30 20 2a 2f 20 20 32 34 2c 20 32 34 2c    60 */  24, 24,
17d40 20 32 35 2c 20 32 35 2c 20 32 36 2c 20 32 36 2c   25, 25, 26, 26,
17d50 20 32 37 2c 20 32 37 2c 20 32 38 2c 20 32 38 2c   27, 27, 28, 28,
17d60 0a 2f 2a 20 20 37 30 20 2a 2f 20 20 32 39 2c 20  ./*  70 */  29, 
17d70 32 39 2c 20 33 30 2c 20 33 30 2c 20 33 31 2c 20  29, 30, 30, 31, 
17d80 33 31 2c 20 33 32 2c 20 33 32 2c 20 33 33 2c 20  31, 32, 32, 33, 
17d90 33 33 2c 0a 2f 2a 20 20 38 30 20 2a 2f 20 20 33  33,./*  80 */  3
17da0 34 2c 20 33 34 2c 20 33 35 2c 20 33 35 2c 20 33  4, 34, 35, 35, 3
17db0 36 2c 20 33 36 2c 20 33 37 2c 20 33 37 2c 20 33  6, 36, 37, 37, 3
17dc0 38 2c 20 33 38 2c 0a 2f 2a 20 20 39 30 20 2a 2f  8, 38,./*  90 */
17dd0 20 20 33 39 2c 20 33 39 2c 20 34 30 2c 20 34 30    39, 39, 40, 40
17de0 2c 20 34 31 2c 20 34 31 2c 20 34 32 2c 20 34 32  , 41, 41, 42, 42
17df0 2c 20 34 33 2c 20 34 33 2c 0a 2f 2a 20 31 30 30  , 43, 43,./* 100
17e00 20 2a 2f 20 20 34 34 2c 20 34 34 2c 20 34 35 2c   */  44, 44, 45,
17e10 20 34 35 2c 20 34 36 2c 20 34 36 2c 20 34 37 2c   45, 46, 46, 47,
17e20 20 34 37 2c 20 34 38 2c 20 34 38 2c 0a 2f 2a 20   47, 48, 48,./* 
17e30 31 31 30 20 2a 2f 20 20 34 39 2c 20 34 39 2c 20  110 */  49, 49, 
17e40 35 30 2c 20 35 30 2c 20 35 31 2c 20 35 31 2c 20  50, 50, 51, 51, 
17e50 35 32 2c 20 35 32 2c 20 35 33 2c 20 35 33 2c 0a  52, 52, 53, 53,.
17e60 2f 2a 20 31 32 30 20 2a 2f 20 20 35 34 2c 20 35  /* 120 */  54, 5
17e70 34 2c 20 35 35 2c 20 35 35 2c 20 35 36 2c 20 35  4, 55, 55, 56, 5
17e80 36 2c 20 35 37 2c 20 35 37 0a 7d 3b 0a 0a 2f 2a  6, 57, 57.};../*
17e90 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c  .** Return the l
17ea0 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61 74  ength of the dat
17eb0 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  a corresponding 
17ec0 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
17ed0 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a  serial-type..*/.
17ee0 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
17ef0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32  erialTypeLen(u32
17f00 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20   serial_type){. 
17f10 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
17f20 3e 3d 31 32 38 20 29 7b 0a 20 20 20 20 72 65 74  >=128 ){.    ret
17f30 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65  urn (serial_type
17f40 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b  -12)/2;.  }else{
17f50 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 65 72  .    assert( ser
17f60 69 61 6c 5f 74 79 70 65 3c 31 32 20 0a 20 20 20  ial_type<12 .   
17f70 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
17f80 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65  te3SmallTypeSize
17f90 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3d 3d  s[serial_type]==
17fa0 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31  (serial_type - 1
17fb0 32 29 2f 32 20 29 3b 0a 20 20 20 20 72 65 74 75  2)/2 );.    retu
17fc0 72 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54  rn sqlite3SmallT
17fd0 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f  ypeSizes[serial_
17fe0 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 75 38 20  type];.  }.}.u8 
17ff0 73 71 6c 69 74 65 33 56 64 62 65 4f 6e 65 42 79  sqlite3VdbeOneBy
18000 74 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  teSerialTypeLen(
18010 75 38 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b  u8 serial_type){
18020 0a 20 20 61 73 73 65 72 74 28 20 73 65 72 69 61  .  assert( seria
18030 6c 5f 74 79 70 65 3c 31 32 38 20 29 3b 0a 20 20  l_type<128 );.  
18040 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 6d  return sqlite3Sm
18050 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72  allTypeSizes[ser
18060 69 61 6c 5f 74 79 70 65 5d 3b 20 20 0a 7d 0a 0a  ial_type];  .}..
18070 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20  /*.** If we are 
18080 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74 75  on an architectu
18090 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e  re with mixed-en
180a0 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a  dian floating .*
180b0 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52  * points (ex: AR
180c0 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20 74 68  M7) then swap th
180d0 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20  e lower 4 bytes 
180e0 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70  with the .** upp
180f0 65 72 20 34 20 62 79 74 65 73 2e 20 20 52 65 74  er 4 bytes.  Ret
18100 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a  urn the result..
18110 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61  **.** For most a
18120 72 63 68 69 74 65 63 74 75 72 65 73 2c 20 74 68  rchitectures, th
18130 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  is is a no-op..*
18140 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49  *.** (later):  I
18150 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f  t is reported to
18160 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69 78   me that the mix
18170 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65  ed-endian proble
18180 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20  m.** on ARM7 is 
18190 61 6e 20 69 73 73 75 65 20 77 69 74 68 20 47 43  an issue with GC
181a0 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20  C, not with the 
181b0 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73  ARM7 chip.  It s
181c0 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72  eems.** that ear
181d0 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47  ly versions of G
181e0 43 43 20 73 74 6f 72 65 64 20 74 68 65 20 74 77  CC stored the tw
181f0 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d  o words of a 64-
18200 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20  bit.** float in 
18210 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e  the wrong order.
18220 20 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72    And that error
18230 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67   has been propag
18240 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e  ated.** ever sin
18250 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69  ce.  The blame i
18260 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
18270 79 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75  y with GCC, thou
18280 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74  gh..** GCC might
18290 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69   have just copyi
182a0 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66  ng the problem f
182b0 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70  rom a prior comp
182c0 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c  iler..** I am al
182d0 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77  so told that new
182e0 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47  er versions of G
182f0 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61  CC that follow a
18300 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42   different.** AB
18310 49 20 67 65 74 20 74 68 65 20 62 79 74 65 20 6f  I get the byte o
18320 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a  rder right..**.*
18330 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69  * Developers usi
18340 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20  ng SQLite on an 
18350 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70  ARM7 should comp
18360 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69  ile and run thei
18370 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e  r.** application
18380 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f   using -DSQLITE_
18390 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74  DEBUG=1 at least
183a0 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42   once.  With DEB
183b0 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73  UG.** enabled, s
183c0 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f  ome asserts belo
183d0 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68  w will ensure th
183e0 61 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65  at the byte orde
183f0 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67  r of.** floating
18400 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73   point values is
18410 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20   correct..**.** 
18420 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72  (2007-08-30)  Fr
18430 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73  ank van Vugt has
18440 20 73 74 75 64 69 65 64 20 74 68 69 73 20 70 72   studied this pr
18450 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a  oblem closely.**
18460 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69   and has send hi
18470 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68  s findings to th
18480 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70  e SQLite develop
18490 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77  ers.  Frank.** w
184a0 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20  rites that some 
184b0 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66  Linux kernels of
184c0 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  fer floating poi
184d0 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65  nt hardware.** e
184e0 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73  mulation that us
184f0 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d  es only 32-bit m
18500 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61 64  antissas instead
18510 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34   of a full .** 4
18520 38 2d 62 69 74 73 20 61 73 20 72 65 71 75 69 72  8-bits as requir
18530 65 64 20 62 79 20 74 68 65 20 49 45 45 45 20 73  ed by the IEEE s
18540 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20  tandard.  (This 
18550 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47  is the.** CONFIG
18560 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74  _FPE_FASTFPE opt
18570 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73  ion.)  On such s
18580 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67  ystems, floating
18590 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73   point.** byte s
185a0 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20  wapping becomes 
185b0 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64  very complicated
185c0 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62  .  To avoid prob
185d0 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63  lems,.** the nec
185e0 65 73 73 61 72 79 20 62 79 74 65 20 73 77 61 70  essary byte swap
185f0 70 69 6e 67 20 69 73 20 63 61 72 72 69 65 64 20  ping is carried 
18600 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62  out using a 64-b
18610 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61  it integer.** ra
18620 74 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62  ther than a 64-b
18630 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b  it float.  Frank
18640 20 61 73 73 75 72 65 73 20 75 73 20 74 68 61 74   assures us that
18650 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a   the code here.*
18660 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e  * works for him.
18670 20 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f    We, the develo
18680 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61  pers, have no wa
18690 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74  y to independent
186a0 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69  ly.** verify thi
186b0 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65  s, but Frank see
186c0 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20  ms to know what 
186d0 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62  he is talking ab
186e0 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75  out.** so we tru
186f0 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65  st him..*/.#ifde
18700 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45  f SQLITE_MIXED_E
18710 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41  NDIAN_64BIT_FLOA
18720 54 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f  T.static u64 flo
18730 61 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a  atSwap(u64 in){.
18740 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36    union {.    u6
18750 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32  4 r;.    u32 i[2
18760 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20  ];.  } u;.  u32 
18770 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a  t;..  u.r = in;.
18780 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20    t = u.i[0];.  
18790 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b  u.i[0] = u.i[1];
187a0 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20  .  u.i[1] = t;. 
187b0 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23   return u.r;.}.#
187c0 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65   define swapMixe
187d0 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20  dEndianFloat(X) 
187e0 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58   X = floatSwap(X
187f0 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
18800 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
18810 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a  Float(X).#endif.
18820 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  ./*.** Write the
18830 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61   serialized data
18840 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61   blob for the va
18850 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d  lue stored in pM
18860 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e  em into .** buf.
18870 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
18880 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
18890 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66  as allocated suf
188a0 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a  ficient space..*
188b0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
188c0 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69  ber of bytes wri
188d0 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66  tten..**.** nBuf
188e0 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   is the amount o
188f0 66 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20  f space left in 
18900 62 75 66 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c  buf[].  The call
18910 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
18920 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74  e.** for allocat
18930 69 6e 67 20 65 6e 6f 75 67 68 20 73 70 61 63 65  ing enough space
18940 20 74 6f 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c   to buf[] to hol
18950 64 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 65  d the entire fie
18960 6c 64 2c 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a  ld, exclusive.**
18970 20 6f 66 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e   of the pMem->u.
18980 6e 5a 65 72 6f 20 62 79 74 65 73 20 66 6f 72 20  nZero bytes for 
18990 61 20 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65  a MEM_Zero value
189a0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
189b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
189c0 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74  es actually writ
189d0 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20  ten into buf[]. 
189e0 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   The number.** o
189f0 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a  f bytes in the z
18a00 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20  ero-filled tail 
18a10 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74  is included in t
18a20 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
18a30 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65  only.** if those
18a40 20 62 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f   bytes were zero
18a50 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20  ed in buf[]..*/ 
18a60 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
18a70 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75  SerialPut(u8 *bu
18a80 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33  f, Mem *pMem, u3
18a90 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a  2 serial_type){.
18aa0 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a    u32 len;..  /*
18ab0 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61   Integer and Rea
18ac0 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  l */.  if( seria
18ad0 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72  l_type<=7 && ser
18ae0 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20  ial_type>0 ){.  
18af0 20 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32    u64 v;.    u32
18b00 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69   i;.    if( seri
18b10 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20  al_type==7 ){.  
18b20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
18b30 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d  of(v)==sizeof(pM
18b40 65 6d 2d 3e 75 2e 72 29 20 29 3b 0a 20 20 20 20  em->u.r) );.    
18b50 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d    memcpy(&v, &pM
18b60 65 6d 2d 3e 75 2e 72 2c 20 73 69 7a 65 6f 66 28  em->u.r, sizeof(
18b70 76 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d  v));.      swapM
18b80 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
18b90 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  v);.    }else{. 
18ba0 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75       v = pMem->u
18bb0 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65  .i;.    }.    le
18bc0 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 53  n = i = sqlite3S
18bd0 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65  mallTypeSizes[se
18be0 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 20 20  rial_type];.    
18bf0 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20  assert( i>0 );. 
18c00 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 62 75 66     do{.      buf
18c10 5b 2d 2d 69 5d 20 3d 20 28 75 38 29 28 76 26 30  [--i] = (u8)(v&0
18c20 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e  xFF);.      v >>
18c30 3d 20 38 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  = 8;.    }while(
18c40 20 69 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   i );.    return
18c50 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   len;.  }..  /* 
18c60 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a  String or blob *
18c70 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  /.  if( serial_t
18c80 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61  ype>=12 ){.    a
18c90 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b  ssert( pMem->n +
18ca0 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26   ((pMem->flags &
18cb0 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d   MEM_Zero)?pMem-
18cc0 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20  >u.nZero:0).    
18cd0 20 20 20 20 20 20 20 20 20 3d 3d 20 28 69 6e 74           == (int
18ce0 29 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69  )sqlite3VdbeSeri
18cf0 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
18d00 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20 6c 65  _type) );.    le
18d10 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20  n = pMem->n;.   
18d20 20 69 66 28 20 6c 65 6e 3e 30 20 29 20 6d 65 6d   if( len>0 ) mem
18d30 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a  cpy(buf, pMem->z
18d40 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74 75  , len);.    retu
18d50 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  rn len;.  }..  /
18d60 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61  * NULL or consta
18d70 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20  nts 0 or 1 */.  
18d80 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20  return 0;.}../* 
18d90 49 6e 70 75 74 20 22 78 22 20 69 73 20 61 20 73  Input "x" is a s
18da0 65 71 75 65 6e 63 65 20 6f 66 20 75 6e 73 69 67  equence of unsig
18db0 6e 65 64 20 63 68 61 72 61 63 74 65 72 73 20 74  ned characters t
18dc0 68 61 74 20 72 65 70 72 65 73 65 6e 74 20 61 0a  hat represent a.
18dd0 2a 2a 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  ** big-endian in
18de0 74 65 67 65 72 2e 20 20 52 65 74 75 72 6e 20 74  teger.  Return t
18df0 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6e 61  he equivalent na
18e00 74 69 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a  tive integer.*/.
18e10 23 64 65 66 69 6e 65 20 4f 4e 45 5f 42 59 54 45  #define ONE_BYTE
18e20 5f 49 4e 54 28 78 29 20 20 20 20 28 28 69 38 29  _INT(x)    ((i8)
18e30 28 78 29 5b 30 5d 29 0a 23 64 65 66 69 6e 65 20  (x)[0]).#define 
18e40 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 78 29 20  TWO_BYTE_INT(x) 
18e50 20 20 20 28 32 35 36 2a 28 69 38 29 28 28 78 29     (256*(i8)((x)
18e60 5b 30 5d 29 7c 28 78 29 5b 31 5d 29 0a 23 64 65  [0])|(x)[1]).#de
18e70 66 69 6e 65 20 54 48 52 45 45 5f 42 59 54 45 5f  fine THREE_BYTE_
18e80 49 4e 54 28 78 29 20 20 28 36 35 35 33 36 2a 28  INT(x)  (65536*(
18e90 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29  i8)((x)[0])|((x)
18ea0 5b 31 5d 3c 3c 38 29 7c 28 78 29 5b 32 5d 29 0a  [1]<<8)|(x)[2]).
18eb0 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54  #define FOUR_BYT
18ec0 45 5f 55 49 4e 54 28 78 29 20 20 28 28 28 75 33  E_UINT(x)  (((u3
18ed0 32 29 28 78 29 5b 30 5d 3c 3c 32 34 29 7c 28 28  2)(x)[0]<<24)|((
18ee0 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b  x)[1]<<16)|((x)[
18ef0 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 23  2]<<8)|(x)[3]).#
18f00 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45  define FOUR_BYTE
18f10 5f 49 4e 54 28 78 29 20 28 31 36 37 37 37 32 31  _INT(x) (1677721
18f20 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28  6*(i8)((x)[0])|(
18f30 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29  (x)[1]<<16)|((x)
18f40 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a  [2]<<8)|(x)[3]).
18f50 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69  ./*.** Deseriali
18f60 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62  ze the data blob
18f70 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62   pointed to by b
18f80 75 66 20 61 73 20 73 65 72 69 61 6c 20 74 79 70  uf as serial typ
18f90 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a  e serial_type.**
18fa0 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
18fb0 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20  esult in pMem.  
18fc0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
18fd0 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e  r of bytes read.
18fe0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
18ff0 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  tion is implemen
19000 74 65 64 20 61 73 20 74 77 6f 20 73 65 70 61 72  ted as two separ
19010 61 74 65 20 72 6f 75 74 69 6e 65 73 20 66 6f 72  ate routines for
19020 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a   performance..**
19030 20 54 68 65 20 66 65 77 20 63 61 73 65 73 20 74   The few cases t
19040 68 61 74 20 72 65 71 75 69 72 65 20 6c 6f 63 61  hat require loca
19050 6c 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  l variables are 
19060 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20  broken out into 
19070 61 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 72 6f  a separate.** ro
19080 75 74 69 6e 65 20 73 6f 20 74 68 61 74 20 69 6e  utine so that in
19090 20 6d 6f 73 74 20 63 61 73 65 73 20 74 68 65 20   most cases the 
190a0 6f 76 65 72 68 65 61 64 20 6f 66 20 6d 6f 76 69  overhead of movi
190b0 6e 67 20 74 68 65 20 73 74 61 63 6b 20 70 6f 69  ng the stack poi
190c0 6e 74 65 72 0a 2a 2a 20 69 73 20 61 76 6f 69 64  nter.** is avoid
190d0 65 64 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 75  ed..*/ .static u
190e0 33 32 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  32 SQLITE_NOINLI
190f0 4e 45 20 73 65 72 69 61 6c 47 65 74 28 0a 20 20  NE serialGet(.  
19100 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
19110 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a  har *buf,     /*
19120 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72   Buffer to deser
19130 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20  ialize from */. 
19140 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
19150 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
19160 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f  * Serial type to
19170 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a   deserialize */.
19180 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20    Mem *pMem     
19190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191a0 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  /* Memory cell t
191b0 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e  o write value in
191c0 74 6f 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 78  to */.){.  u64 x
191d0 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   = FOUR_BYTE_UIN
191e0 54 28 62 75 66 29 3b 0a 20 20 75 33 32 20 79 20  T(buf);.  u32 y 
191f0 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
19200 28 62 75 66 2b 34 29 3b 0a 20 20 78 20 3d 20 28  (buf+4);.  x = (
19210 78 3c 3c 33 32 29 20 2b 20 79 3b 0a 20 20 69 66  x<<32) + y;.  if
19220 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36  ( serial_type==6
19230 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   ){.    /* EVIDE
19240 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 38 35 31 2d  NCE-OF: R-29851-
19250 35 32 32 37 32 20 56 61 6c 75 65 20 69 73 20 61  52272 Value is a
19260 20 62 69 67 2d 65 6e 64 69 61 6e 20 36 34 2d 62   big-endian 64-b
19270 69 74 0a 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63  it.    ** twos-c
19280 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65  omplement intege
19290 72 2e 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  r. */.    pMem->
192a0 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b  u.i = *(i64*)&x;
192b0 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
192c0 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
192d0 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
192e0 75 2e 69 3c 30 20 29 3b 0a 20 20 7d 65 6c 73 65  u.i<0 );.  }else
192f0 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
19300 45 2d 4f 46 3a 20 52 2d 35 37 33 34 33 2d 34 39  E-OF: R-57343-49
19310 31 31 34 20 56 61 6c 75 65 20 69 73 20 61 20 62  114 Value is a b
19320 69 67 2d 65 6e 64 69 61 6e 20 49 45 45 45 20 37  ig-endian IEEE 7
19330 35 34 2d 32 30 30 38 20 36 34 2d 62 69 74 0a 20  54-2008 64-bit. 
19340 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70     ** floating p
19350 6f 69 6e 74 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a  oint number. */.
19360 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
19370 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 64  BUG) && !defined
19380 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f  (SQLITE_OMIT_FLO
19390 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20  ATING_POINT).   
193a0 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
193b0 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f  integers and flo
193c0 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
193d0 65 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a  es use the same.
193e0 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65      ** byte orde
193f0 72 2e 20 20 4f 72 2c 20 74 68 61 74 20 69 66 20  r.  Or, that if 
19400 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44  SQLITE_MIXED_END
19410 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20  IAN_64BIT_FLOAT 
19420 69 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 65  is.    ** define
19430 64 20 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c  d that 64-bit fl
19440 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
19450 75 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d  ues really are m
19460 69 78 65 64 0a 20 20 20 20 2a 2a 20 65 6e 64 69  ixed.    ** endi
19470 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  an..    */.    s
19480 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20  tatic const u64 
19490 74 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66  t1 = ((u64)0x3ff
194a0 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20  00000)<<32;.    
194b0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75  static const dou
194c0 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20  ble r1 = 1.0;.  
194d0 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b 0a 20    u64 t2 = t1;. 
194e0 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
194f0 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20  anFloat(t2);.   
19500 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
19510 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20  r1)==sizeof(t2) 
19520 26 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26  && memcmp(&r1, &
19530 74 32 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d  t2, sizeof(r1))=
19540 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  =0 );.#endif.   
19550 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
19560 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28  x)==8 && sizeof(
19570 70 4d 65 6d 2d 3e 75 2e 72 29 3d 3d 38 20 29 3b  pMem->u.r)==8 );
19580 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e  .    swapMixedEn
19590 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20  dianFloat(x);.  
195a0 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e    memcpy(&pMem->
195b0 75 2e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28  u.r, &x, sizeof(
195c0 78 29 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66  x));.    pMem->f
195d0 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73  lags = sqlite3Is
195e0 4e 61 4e 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 3f  NaN(pMem->u.r) ?
195f0 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f   MEM_Null : MEM_
19600 52 65 61 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Real;.  }.  retu
19610 72 6e 20 38 3b 0a 7d 0a 75 33 32 20 73 71 6c 69  rn 8;.}.u32 sqli
19620 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
19630 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  (.  const unsign
19640 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20  ed char *buf,   
19650 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64    /* Buffer to d
19660 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20  eserialize from 
19670 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f  */.  u32 serial_
19680 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  type,           
19690 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
196a0 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  e to deserialize
196b0 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20   */.  Mem *pMem 
196c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196d0 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
196e0 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75  ll to write valu
196f0 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73  e into */.){.  s
19700 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79  witch( serial_ty
19710 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31  pe ){.    case 1
19720 30 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64  0:   /* Reserved
19730 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20   for future use 
19740 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20  */.    case 11: 
19750 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f    /* Reserved fo
19760 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a  r future use */.
19770 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f      case 0: {  /
19780 2a 20 4e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20  * Null */.      
19790 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
197a0 52 2d 32 34 30 37 38 2d 30 39 33 37 35 20 56 61  R-24078-09375 Va
197b0 6c 75 65 20 69 73 20 61 20 4e 55 4c 4c 2e 20 2a  lue is a NULL. *
197c0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  /.      pMem->fl
197d0 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
197e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
197f0 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b   }.    case 1: {
19800 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
19810 43 45 2d 4f 46 3a 20 52 2d 34 34 38 38 35 2d 32  CE-OF: R-44885-2
19820 35 31 39 36 20 56 61 6c 75 65 20 69 73 20 61 6e  5196 Value is an
19830 20 38 2d 62 69 74 20 74 77 6f 73 2d 63 6f 6d 70   8-bit twos-comp
19840 6c 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  lement.      ** 
19850 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20  integer. */.    
19860 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e    pMem->u.i = ON
19870 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b  E_BYTE_INT(buf);
19880 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
19890 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
198a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
198b0 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20  em->u.i<0 );.   
198c0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
198d0 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b   }.    case 2: {
198e0 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65   /* 2-byte signe
198f0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
19900 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
19910 46 3a 20 52 2d 34 39 37 39 34 2d 33 35 30 32 36  F: R-49794-35026
19920 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d   Value is a big-
19930 65 6e 64 69 61 6e 20 31 36 2d 62 69 74 0a 20 20  endian 16-bit.  
19940 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70      ** twos-comp
19950 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20  lement integer. 
19960 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
19970 2e 69 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e  .i = TWO_BYTE_IN
19980 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
19990 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
199a0 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
199b0 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
199c0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
199d0 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   2;.    }.    ca
199e0 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74  se 3: { /* 3-byt
199f0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
19a00 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
19a10 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 38 33  DENCE-OF: R-3783
19a20 39 2d 35 34 33 30 31 20 56 61 6c 75 65 20 69 73  9-54301 Value is
19a30 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 32 34   a big-endian 24
19a40 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77  -bit.      ** tw
19a50 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
19a60 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
19a70 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 48 52 45  pMem->u.i = THRE
19a80 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b  E_BYTE_INT(buf);
19a90 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
19aa0 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
19ab0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
19ac0 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20  em->u.i<0 );.   
19ad0 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20     return 3;.   
19ae0 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b   }.    case 4: {
19af0 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65   /* 4-byte signe
19b00 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
19b10 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
19b20 46 3a 20 52 2d 30 31 38 34 39 2d 32 36 30 37 39  F: R-01849-26079
19b30 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d   Value is a big-
19b40 65 6e 64 69 61 6e 20 33 32 2d 62 69 74 0a 20 20  endian 32-bit.  
19b50 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70      ** twos-comp
19b60 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20  lement integer. 
19b70 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
19b80 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 49  .i = FOUR_BYTE_I
19b90 4e 54 28 62 75 66 29 3b 0a 23 69 66 64 65 66 20  NT(buf);.#ifdef 
19ba0 5f 5f 48 50 5f 63 63 20 0a 20 20 20 20 20 20 2f  __HP_cc .      /
19bb0 2a 20 57 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20  * Work around a 
19bc0 73 69 67 6e 2d 65 78 74 65 6e 73 69 6f 6e 20 62  sign-extension b
19bd0 75 67 20 69 6e 20 74 68 65 20 48 50 20 63 6f 6d  ug in the HP com
19be0 70 69 6c 65 72 20 66 6f 72 20 48 50 2f 55 58 20  piler for HP/UX 
19bf0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 75 66  */.      if( buf
19c00 5b 30 5d 26 30 78 38 30 20 29 20 70 4d 65 6d 2d  [0]&0x80 ) pMem-
19c10 3e 75 2e 69 20 7c 3d 20 30 78 66 66 66 66 66 66  >u.i |= 0xffffff
19c20 66 66 38 30 30 30 30 30 30 30 4c 4c 3b 0a 23 65  ff80000000LL;.#e
19c30 6e 64 69 66 0a 20 20 20 20 20 20 70 4d 65 6d 2d  ndif.      pMem-
19c40 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
19c50 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
19c60 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
19c70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b  .      return 4;
19c80 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
19c90 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73  5: { /* 6-byte s
19ca0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
19cb0 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
19cc0 43 45 2d 4f 46 3a 20 52 2d 35 30 33 38 35 2d 30  CE-OF: R-50385-0
19cd0 39 36 37 34 20 56 61 6c 75 65 20 69 73 20 61 20  9674 Value is a 
19ce0 62 69 67 2d 65 6e 64 69 61 6e 20 34 38 2d 62 69  big-endian 48-bi
19cf0 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d  t.      ** twos-
19d00 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67  complement integ
19d10 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  er. */.      pMe
19d20 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59  m->u.i = FOUR_BY
19d30 54 45 5f 55 49 4e 54 28 62 75 66 2b 32 29 20 2b  TE_UINT(buf+2) +
19d40 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a   (((i64)1)<<32)*
19d50 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66  TWO_BYTE_INT(buf
19d60 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  );.      pMem->f
19d70 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
19d80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19d90 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
19da0 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20       return 6;. 
19db0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a     }.    case 6:
19dc0 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67     /* 8-byte sig
19dd0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
19de0 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20     case 7: { /* 
19df0 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f  IEEE floating po
19e00 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  int */.      /* 
19e10 54 68 65 73 65 20 75 73 65 20 6c 6f 63 61 6c 20  These use local 
19e20 76 61 72 69 61 62 6c 65 73 2c 20 73 6f 20 64 6f  variables, so do
19e30 20 74 68 65 6d 20 69 6e 20 61 20 73 65 70 61 72   them in a separ
19e40 61 74 65 20 72 6f 75 74 69 6e 65 0a 20 20 20 20  ate routine.    
19e50 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 68 61    ** to avoid ha
19e60 76 69 6e 67 20 74 6f 20 6d 6f 76 65 20 74 68 65  ving to move the
19e70 20 66 72 61 6d 65 20 70 6f 69 6e 74 65 72 20 69   frame pointer i
19e80 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
19e90 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  e */.      retur
19ea0 6e 20 73 65 72 69 61 6c 47 65 74 28 62 75 66 2c  n serialGet(buf,
19eb0 73 65 72 69 61 6c 5f 74 79 70 65 2c 70 4d 65 6d  serial_type,pMem
19ec0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  );.    }.    cas
19ed0 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67  e 8:    /* Integ
19ee0 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65  er 0 */.    case
19ef0 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65   9: {  /* Intege
19f00 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  r 1 */.      /* 
19f10 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
19f20 32 39 37 36 2d 32 32 38 39 33 20 56 61 6c 75 65  2976-22893 Value
19f30 20 69 73 20 74 68 65 20 69 6e 74 65 67 65 72 20   is the integer 
19f40 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45  0. */.      /* E
19f50 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38  VIDENCE-OF: R-18
19f60 31 34 33 2d 31 32 31 32 31 20 56 61 6c 75 65 20  143-12121 Value 
19f70 69 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 31  is the integer 1
19f80 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
19f90 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79  >u.i = serial_ty
19fa0 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d  pe-8;.      pMem
19fb0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
19fc0 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
19fd0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  0;.    }.    def
19fe0 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ault: {.      /*
19ff0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1a000 31 34 36 30 36 2d 33 31 35 36 34 20 56 61 6c 75  14606-31564 Valu
1a010 65 20 69 73 20 61 20 42 4c 4f 42 20 74 68 61 74  e is a BLOB that
1a020 20 69 73 20 28 4e 2d 31 32 29 2f 32 20 62 79 74   is (N-12)/2 byt
1a030 65 73 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6c  es in.      ** l
1a040 65 6e 67 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20  ength..      ** 
1a050 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
1a060 38 34 30 31 2d 30 30 31 34 30 20 56 61 6c 75 65  8401-00140 Value
1a070 20 69 73 20 61 20 73 74 72 69 6e 67 20 69 6e 20   is a string in 
1a080 74 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  the text encodin
1a090 67 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28  g and.      ** (
1a0a0 4e 2d 31 33 29 2f 32 20 62 79 74 65 73 20 69 6e  N-13)/2 bytes in
1a0b0 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 20 20   length. */.    
1a0c0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
1a0d0 31 36 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d  16 aFlag[] = { M
1a0e0 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65  EM_Blob|MEM_Ephe
1a0f0 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45  m, MEM_Str|MEM_E
1a100 70 68 65 6d 20 7d 3b 0a 20 20 20 20 20 20 70 4d  phem };.      pM
1a110 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29  em->z = (char *)
1a120 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  buf;.      pMem-
1a130 3e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  >n = (serial_typ
1a140 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70  e-12)/2;.      p
1a150 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c  Mem->flags = aFl
1a160 61 67 5b 73 65 72 69 61 6c 5f 74 79 70 65 26 31  ag[serial_type&1
1a170 5d 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ];.      return 
1a180 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20  pMem->n;.    }. 
1a190 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1a1a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1a1b0 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 61  ine is used to a
1a1c0 6c 6c 6f 63 61 74 65 20 73 75 66 66 69 63 69 65  llocate sufficie
1a1d0 6e 74 20 73 70 61 63 65 20 66 6f 72 20 61 6e 20  nt space for an 
1a1e0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a  UnpackedRecord.*
1a1f0 2a 20 73 74 72 75 63 74 75 72 65 20 6c 61 72 67  * structure larg
1a200 65 20 65 6e 6f 75 67 68 20 74 6f 20 62 65 20 75  e enough to be u
1a210 73 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33  sed with sqlite3
1a220 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b  VdbeRecordUnpack
1a230 28 29 20 69 66 0a 2a 2a 20 74 68 65 20 66 69 72  () if.** the fir
1a240 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
1a250 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79 49   pointer to KeyI
1a260 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 4b  nfo structure pK
1a270 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  eyInfo..**.** Th
1a280 65 20 73 70 61 63 65 20 69 73 20 65 69 74 68 65  e space is eithe
1a290 72 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e  r allocated usin
1a2a0 67 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  g sqlite3DbMallo
1a2b0 63 52 61 77 28 29 20 6f 72 20 66 72 6f 6d 20 77  cRaw() or from w
1a2c0 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61  ithin.** the una
1a2d0 6c 69 67 6e 65 64 20 62 75 66 66 65 72 20 70 61  ligned buffer pa
1a2e0 73 73 65 64 20 76 69 61 20 74 68 65 20 73 65 63  ssed via the sec
1a2f0 6f 6e 64 20 61 6e 64 20 74 68 69 72 64 20 61 72  ond and third ar
1a300 67 75 6d 65 6e 74 73 20 28 70 72 65 73 75 6d 61  guments (presuma
1a310 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61  bly.** stack spa
1a320 63 65 29 2e 20 49 66 20 74 68 65 20 66 6f 72 6d  ce). If the form
1a330 65 72 2c 20 74 68 65 6e 20 2a 70 70 46 72 65 65  er, then *ppFree
1a340 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 69   is set to a poi
1a350 6e 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64  nter that should
1a360 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75 61 6c 6c  .** be eventuall
1a370 79 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  y freed by the c
1a380 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69  aller using sqli
1a390 74 65 33 44 62 46 72 65 65 28 29 2e 20 4f 72 2c  te3DbFree(). Or,
1a3a0 20 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f   if the .** allo
1a3b0 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f  cation comes fro
1a3c0 6d 20 74 68 65 20 70 53 70 61 63 65 2f 73 7a 53  m the pSpace/szS
1a3d0 70 61 63 65 20 62 75 66 66 65 72 2c 20 2a 70 70  pace buffer, *pp
1a3e0 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Free is set to N
1a3f0 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65  ULL.** before re
1a400 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
1a410 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  f an OOM error o
1a420 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
1a430 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61  eturned..*/.Unpa
1a440 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69  ckedRecord *sqli
1a450 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61  te3VdbeAllocUnpa
1a460 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 4b 65  ckedRecord(.  Ke
1a470 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
1a480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a490 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
1a4a0 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  the record */.  
1a4b0 63 68 61 72 20 2a 70 53 70 61 63 65 2c 20 20 20  char *pSpace,   
1a4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4d0 2f 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73 70 61  /* Unaligned spa
1a4e0 63 65 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ce available */.
1a4f0 20 20 69 6e 74 20 73 7a 53 70 61 63 65 2c 20 20    int szSpace,  
1a500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a510 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53 70    /* Size of pSp
1a520 61 63 65 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a  ace[] in bytes *
1a530 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 46 72 65  /.  char **ppFre
1a540 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
1a550 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 61 6c 6c      /* OUT: Call
1a560 65 72 20 73 68 6f 75 6c 64 20 66 72 65 65 20 74  er should free t
1a570 68 69 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 29  his pointer */.)
1a580 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  {.  UnpackedReco
1a590 72 64 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  rd *p;          
1a5a0 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20      /* Unpacked 
1a5b0 72 65 63 6f 72 64 20 74 6f 20 72 65 74 75 72 6e  record to return
1a5c0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 66 66 3b 20   */.  int nOff; 
1a5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5e0 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65        /* Increme
1a5f0 6e 74 20 70 53 70 61 63 65 20 62 79 20 6e 4f 66  nt pSpace by nOf
1a600 66 20 74 6f 20 61 6c 69 67 6e 20 69 74 20 2a 2f  f to align it */
1a610 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
1a620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a630 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1a640 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 66  bytes required f
1a650 6f 72 20 2a 70 20 2a 2f 0a 0a 20 20 2f 2a 20 57  or *p */..  /* W
1a660 65 20 77 61 6e 74 20 74 6f 20 73 68 69 66 74 20  e want to shift 
1a670 74 68 65 20 70 6f 69 6e 74 65 72 20 70 53 70 61  the pointer pSpa
1a680 63 65 20 75 70 20 73 75 63 68 20 74 68 61 74 20  ce up such that 
1a690 69 74 20 69 73 20 38 2d 62 79 74 65 20 61 6c 69  it is 8-byte ali
1a6a0 67 6e 65 64 2e 0a 20 20 2a 2a 20 54 68 75 73 2c  gned..  ** Thus,
1a6b0 20 77 65 20 6e 65 65 64 20 74 6f 20 63 61 6c 63   we need to calc
1a6c0 75 6c 61 74 65 20 61 20 76 61 6c 75 65 2c 20 6e  ulate a value, n
1a6d0 4f 66 66 2c 20 62 65 74 77 65 65 6e 20 30 20 61  Off, between 0 a
1a6e0 6e 64 20 37 2c 20 74 6f 20 73 68 69 66 74 20 0a  nd 7, to shift .
1a6f0 20 20 2a 2a 20 69 74 20 62 79 2e 20 20 49 66 20    ** it by.  If 
1a700 70 53 70 61 63 65 20 69 73 20 61 6c 72 65 61 64  pSpace is alread
1a710 79 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64  y 8-byte aligned
1a720 2c 20 6e 4f 66 66 20 73 68 6f 75 6c 64 20 62 65  , nOff should be
1a730 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f   zero..  */.  nO
1a740 66 66 20 3d 20 28 38 20 2d 20 28 53 51 4c 49 54  ff = (8 - (SQLIT
1a750 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 53 70  E_PTR_TO_INT(pSp
1a760 61 63 65 29 20 26 20 37 29 29 20 26 20 37 3b 0a  ace) & 7)) & 7;.
1a770 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38    nByte = ROUND8
1a780 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64  (sizeof(Unpacked
1a790 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f  Record)) + sizeo
1a7a0 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f  f(Mem)*(pKeyInfo
1a7b0 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20 69  ->nField+1);.  i
1a7c0 66 28 20 6e 42 79 74 65 3e 73 7a 53 70 61 63 65  f( nByte>szSpace
1a7d0 2b 6e 4f 66 66 20 29 7b 0a 20 20 20 20 70 20 3d  +nOff ){.    p =
1a7e0 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64   (UnpackedRecord
1a7f0 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   *)sqlite3DbMall
1a800 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e  ocRaw(pKeyInfo->
1a810 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  db, nByte);.    
1a820 2a 70 70 46 72 65 65 20 3d 20 28 63 68 61 72 20  *ppFree = (char 
1a830 2a 29 70 3b 0a 20 20 20 20 69 66 28 20 21 70 20  *)p;.    if( !p 
1a840 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65  ) return 0;.  }e
1a850 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e  lse{.    p = (Un
1a860 70 61 63 6b 65 64 52 65 63 6f 72 64 2a 29 26 70  packedRecord*)&p
1a870 53 70 61 63 65 5b 6e 4f 66 66 5d 3b 0a 20 20 20  Space[nOff];.   
1a880 20 2a 70 70 46 72 65 65 20 3d 20 30 3b 0a 20 20   *ppFree = 0;.  
1a890 7d 0a 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28  }..  p->aMem = (
1a8a0 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70 29  Mem*)&((char*)p)
1a8b0 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55  [ROUND8(sizeof(U
1a8c0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 5d  npackedRecord))]
1a8d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
1a8e0 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
1a8f0 21 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b 65 79  !=0 );.  p->pKey
1a900 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b  Info = pKeyInfo;
1a910 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70  .  p->nField = p
1a920 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
1a930 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  + 1;.  return p;
1a940 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
1a950 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e  the nKey-byte en
1a960 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f  coding of a reco
1a970 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f  rd in pKey[], po
1a980 70 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55  pulate the .** U
1a990 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74  npackedRecord st
1a9a0 72 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65  ructure indicate
1a9b0 64 20 62 79 20 74 68 65 20 66 6f 75 72 74 68 20  d by the fourth 
1a9c0 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68  argument with th
1a9d0 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66  e.** contents of
1a9e0 20 74 68 65 20 64 65 63 6f 64 65 64 20 72 65 63   the decoded rec
1a9f0 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71  ord..*/ .void sq
1aa00 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
1aa10 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f  npack(.  KeyInfo
1aa20 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
1aa30 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
1aa40 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64 20  bout the record 
1aa50 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20  format */.  int 
1aa60 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
1aa70 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1aa80 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20  e binary record 
1aa90 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
1aaa0 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54  *pKey,      /* T
1aab0 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64  he binary record
1aac0 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
1aad0 63 6f 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20  cord *p      /* 
1aae0 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20 73 74  Populate this st
1aaf0 72 75 63 74 75 72 65 20 62 65 66 6f 72 65 20 72  ructure before r
1ab00 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a  eturning. */.){.
1ab10 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1ab20 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63   char *aKey = (c
1ab30 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1ab40 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74  ar *)pKey;.  int
1ab50 20 64 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20   d; .  u32 idx; 
1ab60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab70 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1ab80 20 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65   in aKey[] to re
1ab90 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36  ad from */.  u16
1aba0 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
1abb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1abc0 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
1abd0 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73  unter */.  u32 s
1abe0 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65  zHdr;.  Mem *pMe
1abf0 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20  m = p->aMem;..  
1ac00 70 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20  p->default_rc = 
1ac10 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  0;.  assert( EIG
1ac20 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
1ac30 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78  T(pMem) );.  idx
1ac40 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
1ac50 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64  Key, szHdr);.  d
1ac60 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20   = szHdr;.  u = 
1ac70 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c  0;.  while( idx<
1ac80 73 7a 48 64 72 20 26 26 20 64 3c 3d 6e 4b 65 79  szHdr && d<=nKey
1ac90 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69   ){.    u32 seri
1aca0 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64  al_type;..    id
1acb0 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x += getVarint32
1acc0 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72  (&aKey[idx], ser
1acd0 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70  ial_type);.    p
1ace0 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49  Mem->enc = pKeyI
1acf0 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d  nfo->enc;.    pM
1ad00 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66  em->db = pKeyInf
1ad10 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d  o->db;.    /* pM
1ad20 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f  em->flags = 0; /
1ad30 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  / sqlite3VdbeSer
1ad40 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20 73 65  ialGet() will se
1ad50 74 20 74 68 69 73 20 66 6f 72 20 75 73 20 2a 2f  t this for us */
1ad60 0a 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c  .    pMem->szMal
1ad70 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65  loc = 0;.    pMe
1ad80 6d 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20 20 64 20  m->z = 0;.    d 
1ad90 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  += sqlite3VdbeSe
1ada0 72 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d  rialGet(&aKey[d]
1adb0 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70  , serial_type, p
1adc0 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  Mem);.    pMem++
1add0 3b 0a 20 20 20 20 69 66 28 20 28 2b 2b 75 29 3e  ;.    if( (++u)>
1ade0 3d 70 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72 65  =p->nField ) bre
1adf0 61 6b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ak;.  }.  assert
1ae00 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ( u<=pKeyInfo->n
1ae10 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70  Field + 1 );.  p
1ae20 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a  ->nField = u;.}.
1ae30 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55  .#if SQLITE_DEBU
1ae40 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  G./*.** This fun
1ae50 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74  ction compares t
1ae60 77 6f 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  wo index or tabl
1ae70 65 20 72 65 63 6f 72 64 20 6b 65 79 73 20 69 6e  e record keys in
1ae80 20 74 68 65 20 73 61 6d 65 20 77 61 79 0a 2a 2a   the same way.**
1ae90 20 61 73 20 74 68 65 20 73 71 6c 69 74 65 33 56   as the sqlite3V
1aea0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1aeb0 28 29 20 72 6f 75 74 69 6e 65 2e 20 55 6e 6c 69  () routine. Unli
1aec0 6b 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  ke VdbeRecordCom
1aed0 70 61 72 65 28 29 2c 0a 2a 2a 20 74 68 69 73 20  pare(),.** this 
1aee0 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61  function deseria
1aef0 6c 69 7a 65 73 20 61 6e 64 20 63 6f 6d 70 61 72  lizes and compar
1af00 65 73 20 76 61 6c 75 65 73 20 75 73 69 6e 67 20  es values using 
1af10 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  the.** sqlite3Vd
1af20 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 61 6e  beSerialGet() an
1af30 64 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  d sqlite3MemComp
1af40 61 72 65 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e  are() functions.
1af50 20 49 74 20 69 73 20 75 73 65 64 0a 2a 2a 20 69   It is used.** i
1af60 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
1af70 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20  ments to ensure 
1af80 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a  that the optimiz
1af90 65 64 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 73 71  ed code in.** sq
1afa0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1afb0 6f 6d 70 61 72 65 28 29 20 72 65 74 75 72 6e 73  ompare() returns
1afc0 20 72 65 73 75 6c 74 73 20 77 69 74 68 20 74 68   results with th
1afd0 65 73 65 20 74 77 6f 20 70 72 69 6d 69 74 69 76  ese two primitiv
1afe0 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  es..**.** Return
1aff0 20 74 72 75 65 20 69 66 20 74 68 65 20 72 65 73   true if the res
1b000 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  ult of compariso
1b010 6e 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  n is equivalent 
1b020 74 6f 20 64 65 73 69 72 65 64 52 65 73 75 6c 74  to desiredResult
1b030 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73  ..** Return fals
1b040 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  e if there is a 
1b050 64 69 73 61 67 72 65 65 6d 65 6e 74 2e 0a 2a 2f  disagreement..*/
1b060 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
1b070 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62  RecordCompareDeb
1b080 75 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  ug(.  int nKey1,
1b090 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
1b0a0 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  y1, /* Left key 
1b0b0 2a 2f 0a 20 20 63 6f 6e 73 74 20 55 6e 70 61 63  */.  const Unpac
1b0c0 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
1b0d0 32 2c 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20  2, /* Right key 
1b0e0 2a 2f 0a 20 20 69 6e 74 20 64 65 73 69 72 65 64  */.  int desired
1b0f0 52 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20  Result          
1b100 20 20 20 2f 2a 20 43 6f 72 72 65 63 74 20 61 6e     /* Correct an
1b110 73 77 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 33 32  swer */.){.  u32
1b120 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   d1;            
1b130 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
1b140 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61  Key[] of next da
1b150 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  ta element */.  
1b160 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20  u32 idx1;       
1b170 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
1b180 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
1b190 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20   header element 
1b1a0 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b  */.  u32 szHdr1;
1b1b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1b1c0 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65  r of bytes in he
1b1d0 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20  ader */.  int i 
1b1e0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
1b1f0 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  0;.  const unsig
1b200 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20  ned char *aKey1 
1b210 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
1b220 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a  d char *)pKey1;.
1b230 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
1b240 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b  nfo;.  Mem mem1;
1b250 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ..  pKeyInfo = p
1b260 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b  PKey2->pKeyInfo;
1b270 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d  .  if( pKeyInfo-
1b280 3e 64 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  >db==0 ) return 
1b290 31 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20  1;.  mem1.enc = 
1b2a0 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
1b2b0 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49   mem1.db = pKeyI
1b2c0 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65  nfo->db;.  /* me
1b2d0 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f  m1.flags = 0;  /
1b2e0 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69 74 69 61  / Will be initia
1b2f0 6c 69 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33  lized by sqlite3
1b300 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20  VdbeSerialGet() 
1b310 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d  */.  VVA_ONLY( m
1b320 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30  em1.szMalloc = 0
1b330 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64  ; ) /* Only need
1b340 65 64 20 62 79 20 61 73 73 65 72 74 28 29 20 73  ed by assert() s
1b350 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20  tatements */..  
1b360 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d 61 79  /* Compilers may
1b370 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74 20 6d   complain that m
1b380 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74 65 6e  em1.u.i is poten
1b390 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69 61 6c  tially uninitial
1b3a0 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20 63 6f  ized..  ** We co
1b3b0 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  uld initialize i
1b3c0 74 2c 20 61 73 20 73 68 6f 77 6e 20 68 65 72 65  t, as shown here
1b3d0 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20 74 68 6f  , to silence tho
1b3e0 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20  se complaints.. 
1b3f0 20 2a 2a 20 42 75 74 20 69 6e 20 66 61 63 74 2c   ** But in fact,
1b400 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 6e   mem1.u.i will n
1b410 65 76 65 72 20 61 63 74 75 61 6c 6c 79 20 62 65  ever actually be
1b420 20 75 73 65 64 20 75 6e 69 6e 69 74 69 61 6c 69   used uninitiali
1b430 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a  zed, and doing .
1b440 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65 73    ** the unneces
1b450 73 61 72 79 20 69 6e 69 74 69 61 6c 69 7a 61 74  sary initializat
1b460 69 6f 6e 20 68 61 73 20 61 20 6d 65 61 73 75 72  ion has a measur
1b470 61 62 6c 65 20 6e 65 67 61 74 69 76 65 20 70 65  able negative pe
1b480 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69  rformance.  ** i
1b490 6d 70 61 63 74 2c 20 73 69 6e 63 65 20 74 68 69  mpact, since thi
1b4a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76  s routine is a v
1b4b0 65 72 79 20 68 69 67 68 20 72 75 6e 6e 65 72 2e  ery high runner.
1b4c0 20 20 41 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f    And so, we cho
1b4d0 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f  ose.  ** to igno
1b4e0 72 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  re the compiler 
1b4f0 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61  warnings and lea
1b500 76 65 20 74 68 69 73 20 76 61 72 69 61 62 6c 65  ve this variable
1b510 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
1b520 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e    */.  /*  mem1.
1b530 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74  u.i = 0;  // not
1b540 20 6e 65 65 64 65 64 2c 20 68 65 72 65 20 74 6f   needed, here to
1b550 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65   silence compile
1b560 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a  r warning */.  .
1b570 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69    idx1 = getVari
1b580 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64  nt32(aKey1, szHd
1b590 72 31 29 3b 0a 20 20 69 66 28 20 73 7a 48 64 72  r1);.  if( szHdr
1b5a0 31 3e 39 38 33 30 37 20 29 20 72 65 74 75 72 6e  1>98307 ) return
1b5b0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
1b5c0 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a  .  d1 = szHdr1;.
1b5d0 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
1b5e0 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49  fo->nField+pKeyI
1b5f0 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50  nfo->nXField>=pP
1b600 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20  Key2->nField || 
1b610 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
1b620 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
1b630 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20  ->aSortOrder!=0 
1b640 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  );.  assert( pKe
1b650 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20  yInfo->nField>0 
1b660 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  );.  assert( idx
1b670 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52  1<=szHdr1 || COR
1b680 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b  RUPT_DB );.  do{
1b690 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f  .    u32 serial_
1b6a0 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52  type1;..    /* R
1b6b0 65 61 64 20 74 68 65 20 73 65 72 69 61 6c 20 74  ead the serial t
1b6c0 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78  ypes for the nex
1b6d0 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63  t element in eac
1b6e0 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64  h key. */.    id
1b6f0 78 31 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  x1 += getVarint3
1b700 32 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73  2( aKey1+idx1, s
1b710 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 0a  erial_type1 );..
1b720 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68      /* Verify th
1b730 61 74 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75  at there is enou
1b740 67 68 20 6b 65 79 20 73 70 61 63 65 20 72 65 6d  gh key space rem
1b750 61 69 6e 69 6e 67 20 74 6f 20 61 76 6f 69 64 0a  aining to avoid.
1b760 20 20 20 20 2a 2a 20 61 20 62 75 66 66 65 72 20      ** a buffer 
1b770 6f 76 65 72 72 65 61 64 2e 20 20 54 68 65 20 22  overread.  The "
1b780 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b  d1+serial_type1+
1b790 32 22 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  2" subexpression
1b7a0 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c 77   will.    ** alw
1b7b0 61 79 73 20 62 65 20 67 72 65 61 74 65 72 20 74  ays be greater t
1b7c0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
1b7d0 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 72 65  the amount of re
1b7e0 71 75 69 72 65 64 20 6b 65 79 20 73 70 61 63 65  quired key space
1b7f0 2e 0a 20 20 20 20 2a 2a 20 55 73 65 20 74 68 61  ..    ** Use tha
1b800 74 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20  t approximation 
1b810 74 6f 20 61 76 6f 69 64 20 74 68 65 20 6d 6f 72  to avoid the mor
1b820 65 20 65 78 70 65 6e 73 69 76 65 20 63 61 6c 6c  e expensive call
1b830 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
1b840 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
1b850 4c 65 6e 28 29 20 69 6e 20 74 68 65 20 63 6f 6d  Len() in the com
1b860 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f  mon case..    */
1b870 0a 20 20 20 20 69 66 28 20 64 31 2b 73 65 72 69  .    if( d1+seri
1b880 61 6c 5f 74 79 70 65 31 2b 32 3e 28 75 33 32 29  al_type1+2>(u32)
1b890 6e 4b 65 79 31 0a 20 20 20 20 20 26 26 20 64 31  nKey1.     && d1
1b8a0 2b 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69  +sqlite3VdbeSeri
1b8b0 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
1b8c0 5f 74 79 70 65 31 29 3e 28 75 33 32 29 6e 4b 65  _type1)>(u32)nKe
1b8d0 79 31 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  y1 .    ){.     
1b8e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1b8f0 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68     /* Extract th
1b900 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63  e values to be c
1b910 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  ompared..    */.
1b920 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65      d1 += sqlite
1b930 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
1b940 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61  aKey1[d1], seria
1b950 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b  l_type1, &mem1);
1b960 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20  ..    /* Do the 
1b970 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a  comparison.    *
1b980 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
1b990 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65  e3MemCompare(&me
1b9a0 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65  m1, &pPKey2->aMe
1b9b0 6d 5b 69 5d 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e  m[i], pKeyInfo->
1b9c0 61 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 69  aColl[i]);.    i
1b9d0 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
1b9e0 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73    assert( mem1.s
1b9f0 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f  zMalloc==0 );  /
1ba00 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65  * See comment be
1ba10 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  low */.      if(
1ba20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
1ba30 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20  Order[i] ){.    
1ba40 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 20 20 2f      rc = -rc;  /
1ba50 2a 20 49 6e 76 65 72 74 20 74 68 65 20 72 65 73  * Invert the res
1ba60 75 6c 74 20 66 6f 72 20 44 45 53 43 20 73 6f 72  ult for DESC sor
1ba70 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20  t order. */.    
1ba80 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 64    }.      goto d
1ba90 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3b 0a  ebugCompareEnd;.
1baa0 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20      }.    i++;. 
1bab0 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a   }while( idx1<sz
1bac0 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32  Hdr1 && i<pPKey2
1bad0 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a 20 20 2f  ->nField );..  /
1bae0 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  * No memory allo
1baf0 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75  cation is ever u
1bb00 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72  sed on mem1.  Pr
1bb10 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20  ove this using. 
1bb20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** the followin
1bb30 67 20 61 73 73 65 72 74 28 29 2e 20 20 49 66 20  g assert().  If 
1bb40 74 68 65 20 61 73 73 65 72 74 28 29 20 66 61 69  the assert() fai
1bb50 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73  ls, it indicates
1bb60 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c   a.  ** memory l
1bb70 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74  eak and a need t
1bb80 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64  o call sqlite3Vd
1bb90 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65  beMemRelease(&me
1bba0 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  m1)..  */.  asse
1bbb0 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  rt( mem1.szMallo
1bbc0 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63  c==0 );..  /* rc
1bbd0 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74  ==0 here means t
1bbe0 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b  hat one of the k
1bbf0 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66  eys ran out of f
1bc00 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61  ields and.  ** a
1bc10 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70  ll the fields up
1bc20 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77   to that point w
1bc30 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72  ere equal. Retur
1bc40 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63  n the default_rc
1bc50 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f  .  ** value.  */
1bc60 0a 20 20 72 63 20 3d 20 70 50 4b 65 79 32 2d 3e  .  rc = pPKey2->
1bc70 64 65 66 61 75 6c 74 5f 72 63 3b 0a 0a 64 65 62  default_rc;..deb
1bc80 75 67 43 6f 6d 70 61 72 65 45 6e 64 3a 0a 20 20  ugCompareEnd:.  
1bc90 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c  if( desiredResul
1bca0 74 3d 3d 30 20 26 26 20 72 63 3d 3d 30 20 29 20  t==0 && rc==0 ) 
1bcb0 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
1bcc0 64 65 73 69 72 65 64 52 65 73 75 6c 74 3c 30 20  desiredResult<0 
1bcd0 26 26 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e  && rc<0 ) return
1bce0 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65   1;.  if( desire
1bcf0 64 52 65 73 75 6c 74 3e 30 20 26 26 20 72 63 3e  dResult>0 && rc>
1bd00 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
1bd10 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29  if( CORRUPT_DB )
1bd20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
1bd30 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d   pKeyInfo->db->m
1bd40 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
1bd50 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
1bd60 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69   0;.}.#endif..#i
1bd70 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
1bd80 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e  *.** Count the n
1bd90 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20  umber of fields 
1bda0 28 61 2e 6b 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29  (a.k.a. columns)
1bdb0 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 67   in the record g
1bdc0 69 76 65 6e 20 62 79 0a 2a 2a 20 70 4b 65 79 2c  iven by.** pKey,
1bdd0 6e 4b 65 79 2e 20 20 54 68 65 20 76 65 72 69 66  nKey.  The verif
1bde0 79 20 74 68 61 74 20 74 68 69 73 20 63 6f 75 6e  y that this coun
1bdf0 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  t is less than o
1be00 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 0a 2a  r equal to the.*
1be10 2a 20 6c 69 6d 69 74 20 67 69 76 65 6e 20 62 79  * limit given by
1be20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
1be30 64 20 2b 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58  d + pKeyInfo->nX
1be40 46 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Field..**.** If 
1be50 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
1be60 69 73 20 6e 6f 74 20 73 61 74 69 73 66 69 65 64  is not satisfied
1be70 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
1be80 74 68 65 20 68 69 67 68 2d 73 70 65 65 64 0a 2a  the high-speed.*
1be90 2a 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  * vdbeRecordComp
1bea0 61 72 65 49 6e 74 28 29 20 61 6e 64 20 76 64 62  areInt() and vdb
1beb0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74  eRecordCompareSt
1bec0 72 69 6e 67 28 29 20 72 6f 75 74 69 6e 65 73 20  ring() routines 
1bed0 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b  will.** not work
1bee0 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 49 66 20   correctly.  If 
1bef0 74 68 69 73 20 61 73 73 65 72 74 28 29 20 65 76  this assert() ev
1bf00 65 72 20 66 69 72 65 73 2c 20 69 74 20 70 72 6f  er fires, it pro
1bf10 62 61 62 6c 79 20 6d 65 61 6e 73 0a 2a 2a 20 74  bably means.** t
1bf20 68 61 74 20 74 68 65 20 4b 65 79 49 6e 66 6f 2e  hat the KeyInfo.
1bf30 6e 46 69 65 6c 64 20 6f 72 20 4b 65 79 49 6e 66  nField or KeyInf
1bf40 6f 2e 6e 58 46 69 65 6c 64 20 76 61 6c 75 65 73  o.nXField values
1bf50 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64 0a 2a   were computed.*
1bf60 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  * incorrectly..*
1bf70 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
1bf80 62 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75  beAssertFieldCou
1bf90 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 0a  ntWithinLimits(.
1bfa0 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73    int nKey, cons
1bfb0 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
1bfc0 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 74 6f  /* The record to
1bfd0 20 76 65 72 69 66 79 20 2a 2f 20 0a 20 20 63 6f   verify */ .  co
1bfe0 6e 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  nst KeyInfo *pKe
1bff0 79 49 6e 66 6f 20 20 20 20 20 20 20 2f 2a 20 43  yInfo       /* C
1c000 6f 6d 70 61 72 65 20 73 69 7a 65 20 77 69 74 68  ompare size with
1c010 20 74 68 69 73 20 4b 65 79 49 6e 66 6f 20 2a 2f   this KeyInfo */
1c020 0a 29 7b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64  .){.  int nField
1c030 20 3d 20 30 3b 0a 20 20 75 33 32 20 73 7a 48 64   = 0;.  u32 szHd
1c040 72 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a 20 20  r;.  u32 idx;.  
1c050 75 33 32 20 6e 6f 74 55 73 65 64 3b 0a 20 20 63  u32 notUsed;.  c
1c060 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1c070 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73  ar *aKey = (cons
1c080 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  t unsigned char*
1c090 29 70 4b 65 79 3b 0a 0a 20 20 69 66 28 20 43 4f  )pKey;..  if( CO
1c0a0 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72  RRUPT_DB ) retur
1c0b0 6e 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61  n;.  idx = getVa
1c0c0 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48  rint32(aKey, szH
1c0d0 64 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  dr);.  assert( n
1c0e0 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  Key>=0 );.  asse
1c0f0 72 74 28 20 73 7a 48 64 72 3c 3d 28 75 33 32 29  rt( szHdr<=(u32)
1c100 6e 4b 65 79 20 29 3b 0a 20 20 77 68 69 6c 65 28  nKey );.  while(
1c110 20 69 64 78 3c 73 7a 48 64 72 20 29 7b 0a 20 20   idx<szHdr ){.  
1c120 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69    idx += getVari
1c130 6e 74 33 32 28 61 4b 65 79 2b 69 64 78 2c 20 6e  nt32(aKey+idx, n
1c140 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 6e 46 69  otUsed);.    nFi
1c150 65 6c 64 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73  eld++;.  }.  ass
1c160 65 72 74 28 20 6e 46 69 65 6c 64 20 3c 3d 20 70  ert( nField <= p
1c170 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b  KeyInfo->nField+
1c180 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c  pKeyInfo->nXFiel
1c190 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  d );.}.#else.# d
1c1a0 65 66 69 6e 65 20 76 64 62 65 41 73 73 65 72 74  efine vdbeAssert
1c1b0 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e  FieldCountWithin
1c1c0 4c 69 6d 69 74 73 28 41 2c 42 2c 43 29 0a 23 65  Limits(A,B,C).#e
1c1d0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68  ndif../*.** Both
1c1e0 20 2a 70 4d 65 6d 31 20 61 6e 64 20 2a 70 4d 65   *pMem1 and *pMe
1c1f0 6d 32 20 63 6f 6e 74 61 69 6e 20 73 74 72 69 6e  m2 contain strin
1c200 67 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 61 72  g values. Compar
1c210 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73  e the two values
1c220 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 63 6f  .** using the co
1c230 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1c240 20 70 43 6f 6c 6c 2e 20 41 73 20 75 73 75 61 6c   pColl. As usual
1c250 2c 20 72 65 74 75 72 6e 20 61 20 6e 65 67 61 74  , return a negat
1c260 69 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  ive , zero.** or
1c270 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20   positive value 
1c280 69 66 20 2a 70 4d 65 6d 31 20 69 73 20 6c 65 73  if *pMem1 is les
1c290 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
1c2a0 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
1c2b0 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72 65 73   .** *pMem2, res
1c2c0 70 65 63 74 69 76 65 6c 79 2e 20 53 69 6d 69 6c  pectively. Simil
1c2d0 61 72 20 69 6e 20 73 70 69 72 69 74 20 74 6f 20  ar in spirit to 
1c2e0 22 72 63 20 3d 20 28 2a 70 4d 65 6d 31 29 20 2d  "rc = (*pMem1) -
1c2f0 20 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a   (*pMem2);"..*/.
1c300 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43  static int vdbeC
1c310 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28  ompareMemString(
1c320 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d  .  const Mem *pM
1c330 65 6d 31 2c 0a 20 20 63 6f 6e 73 74 20 4d 65 6d  em1,.  const Mem
1c340 20 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73 74   *pMem2,.  const
1c350 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c   CollSeq *pColl,
1c360 0a 20 20 75 38 20 2a 70 72 63 45 72 72 20 20 20  .  u8 *prcErr   
1c370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c380 20 20 20 2f 2a 20 49 66 20 61 6e 20 4f 4f 4d 20     /* If an OOM 
1c390 6f 63 63 75 72 73 2c 20 73 65 74 20 74 6f 20 53  occurs, set to S
1c3a0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29  QLITE_NOMEM */.)
1c3b0 7b 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 65  {.  if( pMem1->e
1c3c0 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29  nc==pColl->enc )
1c3d0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 74 72  {.    /* The str
1c3e0 69 6e 67 73 20 61 72 65 20 61 6c 72 65 61 64 79  ings are already
1c3f0 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20   in the correct 
1c400 65 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c 6c 20  encoding.  Call 
1c410 74 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f 6d 70  the.     ** comp
1c420 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
1c430 64 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20  directly */.    
1c440 72 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43  return pColl->xC
1c450 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c  mp(pColl->pUser,
1c460 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e  pMem1->n,pMem1->
1c470 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32  z,pMem2->n,pMem2
1c480 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ->z);.  }else{. 
1c490 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 63     int rc;.    c
1c4a0 6f 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c 20 2a  onst void *v1, *
1c4b0 76 32 3b 0a 20 20 20 20 69 6e 74 20 6e 31 2c 20  v2;.    int n1, 
1c4c0 6e 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31 3b 0a  n2;.    Mem c1;.
1c4d0 20 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20 20 20      Mem c2;.    
1c4e0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e  sqlite3VdbeMemIn
1c4f0 69 74 28 26 63 31 2c 20 70 4d 65 6d 31 2d 3e 64  it(&c1, pMem1->d
1c500 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20  b, MEM_Null);.  
1c510 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1c520 49 6e 69 74 28 26 63 32 2c 20 70 4d 65 6d 31 2d  Init(&c2, pMem1-
1c530 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a  >db, MEM_Null);.
1c540 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1c550 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63  emShallowCopy(&c
1c560 31 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70  1, pMem1, MEM_Ep
1c570 68 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  hem);.    sqlite
1c580 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43  3VdbeMemShallowC
1c590 6f 70 79 28 26 63 32 2c 20 70 4d 65 6d 32 2c 20  opy(&c2, pMem2, 
1c5a0 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20  MEM_Ephem);.    
1c5b0 76 31 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  v1 = sqlite3Valu
1c5c0 65 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76  eText((sqlite3_v
1c5d0 61 6c 75 65 2a 29 26 63 31 2c 20 70 43 6f 6c 6c  alue*)&c1, pColl
1c5e0 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 31 20 3d  ->enc);.    n1 =
1c5f0 20 76 31 3d 3d 30 20 3f 20 30 20 3a 20 63 31 2e   v1==0 ? 0 : c1.
1c600 6e 3b 0a 20 20 20 20 76 32 20 3d 20 73 71 6c 69  n;.    v2 = sqli
1c610 74 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71  te3ValueText((sq
1c620 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 32  lite3_value*)&c2
1c630 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20  , pColl->enc);. 
1c640 20 20 20 6e 32 20 3d 20 76 32 3d 3d 30 20 3f 20     n2 = v2==0 ? 
1c650 30 20 3a 20 63 32 2e 6e 3b 0a 20 20 20 20 72 63  0 : c2.n;.    rc
1c660 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70   = pColl->xCmp(p
1c670 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e 31 2c  Coll->pUser, n1,
1c680 20 76 31 2c 20 6e 32 2c 20 76 32 29 3b 0a 20 20   v1, n2, v2);.  
1c690 20 20 69 66 28 20 28 76 31 3d 3d 30 20 7c 7c 20    if( (v1==0 || 
1c6a0 76 32 3d 3d 30 29 20 26 26 20 70 72 63 45 72 72  v2==0) && prcErr
1c6b0 20 29 20 2a 70 72 63 45 72 72 20 3d 20 53 51 4c   ) *prcErr = SQL
1c6c0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 73  ITE_NOMEM;.    s
1c6d0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
1c6e0 65 61 73 65 28 26 63 31 29 3b 0a 20 20 20 20 73  ease(&c1);.    s
1c6f0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
1c700 65 61 73 65 28 26 63 32 29 3b 0a 20 20 20 20 72  ease(&c2);.    r
1c710 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a  eturn rc;.  }.}.
1c720 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
1c730 77 6f 20 62 6c 6f 62 73 2e 20 20 52 65 74 75 72  wo blobs.  Retur
1c740 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  n negative, zero
1c750 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  , or positive if
1c760 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 73   the first.** is
1c770 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
1c780 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72  l to, or greater
1c790 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64   than the second
1c7a0 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a  , respectively..
1c7b0 2a 2a 20 49 66 20 6f 6e 65 20 62 6c 6f 62 20 69  ** If one blob i
1c7c0 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68  s a prefix of th
1c7d0 65 20 6f 74 68 65 72 2c 20 74 68 65 6e 20 74 68  e other, then th
1c7e0 65 20 73 68 6f 72 74 65 72 20 69 73 20 74 68 65  e shorter is the
1c7f0 20 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74   lessor..*/.stat
1c800 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
1c810 4e 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42 6c  NE int sqlite3Bl
1c820 6f 62 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20  obCompare(const 
1c830 4d 65 6d 20 2a 70 42 31 2c 20 63 6f 6e 73 74 20  Mem *pB1, const 
1c840 4d 65 6d 20 2a 70 42 32 29 7b 0a 20 20 69 6e 74  Mem *pB2){.  int
1c850 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70 42 31 2d   c = memcmp(pB1-
1c860 3e 7a 2c 20 70 42 32 2d 3e 7a 2c 20 70 42 31 2d  >z, pB2->z, pB1-
1c870 3e 6e 3e 70 42 32 2d 3e 6e 20 3f 20 70 42 32 2d  >n>pB2->n ? pB2-
1c880 3e 6e 20 3a 20 70 42 31 2d 3e 6e 29 3b 0a 20 20  >n : pB1->n);.  
1c890 69 66 28 20 63 20 29 20 72 65 74 75 72 6e 20 63  if( c ) return c
1c8a0 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 31 2d 3e  ;.  return pB1->
1c8b0 6e 20 2d 20 70 42 32 2d 3e 6e 3b 0a 7d 0a 0a 2f  n - pB2->n;.}../
1c8c0 2a 0a 2a 2a 20 44 6f 20 61 20 63 6f 6d 70 61 72  *.** Do a compar
1c8d0 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 61 20 36  ison between a 6
1c8e0 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74  4-bit signed int
1c8f0 65 67 65 72 20 61 6e 64 20 61 20 36 34 2d 62 69  eger and a 64-bi
1c900 74 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74  t floating-point
1c910 0a 2a 2a 20 6e 75 6d 62 65 72 2e 20 20 52 65 74  .** number.  Ret
1c920 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  urn negative, ze
1c930 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ro, or positive 
1c940 69 66 20 74 68 65 20 66 69 72 73 74 20 28 69 36  if the first (i6
1c950 34 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  4) is less than,
1c960 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72  .** equal to, or
1c970 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
1c980 65 20 73 65 63 6f 6e 64 20 28 64 6f 75 62 6c 65  e second (double
1c990 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1c9a0 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74   sqlite3IntFloat
1c9b0 43 6f 6d 70 61 72 65 28 69 36 34 20 69 2c 20 64  Compare(i64 i, d
1c9c0 6f 75 62 6c 65 20 72 29 7b 0a 20 20 69 66 28 20  ouble r){.  if( 
1c9d0 73 69 7a 65 6f 66 28 4c 4f 4e 47 44 4f 55 42 4c  sizeof(LONGDOUBL
1c9e0 45 5f 54 59 50 45 29 3e 38 20 29 7b 0a 20 20 20  E_TYPE)>8 ){.   
1c9f0 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45   LONGDOUBLE_TYPE
1ca00 20 78 20 3d 20 28 4c 4f 4e 47 44 4f 55 42 4c 45   x = (LONGDOUBLE
1ca10 5f 54 59 50 45 29 69 3b 0a 20 20 20 20 69 66 28  _TYPE)i;.    if(
1ca20 20 78 3c 72 20 29 20 72 65 74 75 72 6e 20 2d 31   x<r ) return -1
1ca30 3b 0a 20 20 20 20 69 66 28 20 78 3e 72 20 29 20  ;.    if( x>r ) 
1ca40 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 72  return +1;.    r
1ca50 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65  eturn 0;.  }else
1ca60 7b 0a 20 20 20 20 69 36 34 20 79 3b 0a 20 20 20  {.    i64 y;.   
1ca70 20 64 6f 75 62 6c 65 20 73 3b 0a 20 20 20 20 69   double s;.    i
1ca80 66 28 20 72 3c 2d 39 32 32 33 33 37 32 30 33 36  f( r<-9223372036
1ca90 38 35 34 37 37 35 38 30 38 2e 30 20 29 20 72 65  854775808.0 ) re
1caa0 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 69 66 28  turn +1;.    if(
1cab0 20 72 3e 39 32 32 33 33 37 32 30 33 36 38 35 34   r>9223372036854
1cac0 37 37 35 38 30 37 2e 30 20 29 20 72 65 74 75 72  775807.0 ) retur
1cad0 6e 20 2d 31 3b 0a 20 20 20 20 79 20 3d 20 28 69  n -1;.    y = (i
1cae0 36 34 29 72 3b 0a 20 20 20 20 69 66 28 20 69 3c  64)r;.    if( i<
1caf0 79 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  y ) return -1;. 
1cb00 20 20 20 69 66 28 20 69 3e 79 20 29 7b 0a 20 20     if( i>y ){.  
1cb10 20 20 20 20 69 66 28 20 79 3d 3d 53 4d 41 4c 4c      if( y==SMALL
1cb20 45 53 54 5f 49 4e 54 36 34 20 26 26 20 72 3e 30  EST_INT64 && r>0
1cb30 2e 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .0 ) return -1;.
1cb40 20 20 20 20 20 20 72 65 74 75 72 6e 20 2b 31 3b        return +1;
1cb50 0a 20 20 20 20 7d 0a 20 20 20 20 73 20 3d 20 28  .    }.    s = (
1cb60 64 6f 75 62 6c 65 29 69 3b 0a 20 20 20 20 69 66  double)i;.    if
1cb70 28 20 73 3c 72 20 29 20 72 65 74 75 72 6e 20 2d  ( s<r ) return -
1cb80 31 3b 0a 20 20 20 20 69 66 28 20 73 3e 72 20 29  1;.    if( s>r )
1cb90 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20   return +1;.    
1cba0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a  return 0;.  }.}.
1cbb0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
1cbc0 68 65 20 76 61 6c 75 65 73 20 63 6f 6e 74 61 69  he values contai
1cbd0 6e 65 64 20 62 79 20 74 68 65 20 74 77 6f 20 6d  ned by the two m
1cbe0 65 6d 6f 72 79 20 63 65 6c 6c 73 2c 20 72 65 74  emory cells, ret
1cbf0 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61 74 69  urning.** negati
1cc00 76 65 2c 20 7a 65 72 6f 20 6f 72 20 70 6f 73 69  ve, zero or posi
1cc10 74 69 76 65 20 69 66 20 70 4d 65 6d 31 20 69 73  tive if pMem1 is
1cc20 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
1cc30 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72  l to, or greater
1cc40 0a 2a 2a 20 74 68 61 6e 20 70 4d 65 6d 32 2e 20  .** than pMem2. 
1cc50 53 6f 72 74 69 6e 67 20 6f 72 64 65 72 20 69 73  Sorting order is
1cc60 20 4e 55 4c 4c 27 73 20 66 69 72 73 74 2c 20 66   NULL's first, f
1cc70 6f 6c 6c 6f 77 65 64 20 62 79 20 6e 75 6d 62 65  ollowed by numbe
1cc80 72 73 20 28 69 6e 74 65 67 65 72 73 0a 2a 2a 20  rs (integers.** 
1cc90 61 6e 64 20 72 65 61 6c 73 29 20 73 6f 72 74 65  and reals) sorte
1cca0 64 20 6e 75 6d 65 72 69 63 61 6c 6c 79 2c 20 66  d numerically, f
1ccb0 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65 78 74 20  ollowed by text 
1ccc0 6f 72 64 65 72 65 64 20 62 79 20 74 68 65 20 63  ordered by the c
1ccd0 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75  ollating.** sequ
1cce0 65 6e 63 65 20 70 43 6f 6c 6c 20 61 6e 64 20 66  ence pColl and f
1ccf0 69 6e 61 6c 6c 79 20 62 6c 6f 62 27 73 20 6f 72  inally blob's or
1cd00 64 65 72 65 64 20 62 79 20 6d 65 6d 63 6d 70 28  dered by memcmp(
1cd10 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c  )..**.** Two NUL
1cd20 4c 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e  L values are con
1cd30 73 69 64 65 72 65 64 20 65 71 75 61 6c 20 62 79  sidered equal by
1cd40 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
1cd50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 65  */.int sqlite3Me
1cd60 6d 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d  mCompare(const M
1cd70 65 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73 74  em *pMem1, const
1cd80 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e   Mem *pMem2, con
1cd90 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  st CollSeq *pCol
1cda0 6c 29 7b 0a 20 20 69 6e 74 20 66 31 2c 20 66 32  l){.  int f1, f2
1cdb0 3b 0a 20 20 69 6e 74 20 63 6f 6d 62 69 6e 65 64  ;.  int combined
1cdc0 5f 66 6c 61 67 73 3b 0a 0a 20 20 66 31 20 3d 20  _flags;..  f1 = 
1cdd0 70 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a 20 20  pMem1->flags;.  
1cde0 66 32 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c 61 67  f2 = pMem2->flag
1cdf0 73 3b 0a 20 20 63 6f 6d 62 69 6e 65 64 5f 66 6c  s;.  combined_fl
1ce00 61 67 73 20 3d 20 66 31 7c 66 32 3b 0a 20 20 61  ags = f1|f2;.  a
1ce10 73 73 65 72 74 28 20 28 63 6f 6d 62 69 6e 65 64  ssert( (combined
1ce20 5f 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77  _flags & MEM_Row
1ce30 53 65 74 29 3d 3d 30 20 29 3b 0a 20 0a 20 20 2f  Set)==0 );. .  /
1ce40 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69  * If one value i
1ce50 73 20 4e 55 4c 4c 2c 20 69 74 20 69 73 20 6c 65  s NULL, it is le
1ce60 73 73 20 74 68 61 6e 20 74 68 65 20 6f 74 68 65  ss than the othe
1ce70 72 2e 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65  r. If both value
1ce80 73 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c  s.  ** are NULL,
1ce90 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a   return 0..  */.
1cea0 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66    if( combined_f
1ceb0 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  lags&MEM_Null ){
1cec0 0a 20 20 20 20 72 65 74 75 72 6e 20 28 66 32 26  .    return (f2&
1ced0 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66 31 26  MEM_Null) - (f1&
1cee0 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a  MEM_Null);.  }..
1cef0 20 20 2f 2a 20 41 74 20 6c 65 61 73 74 20 6f 6e    /* At least on
1cf00 65 20 6f 66 20 74 68 65 20 74 77 6f 20 76 61 6c  e of the two val
1cf10 75 65 73 20 69 73 20 61 20 6e 75 6d 62 65 72 0a  ues is a number.
1cf20 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69    */.  if( combi
1cf30 6e 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d 5f 49  ned_flags&(MEM_I
1cf40 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29 7b 0a  nt|MEM_Real) ){.
1cf50 20 20 20 20 69 66 28 20 28 66 31 20 26 20 66 32      if( (f1 & f2
1cf60 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29   & MEM_Int)!=0 )
1cf70 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  {.      if( pMem
1cf80 31 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e  1->u.i < pMem2->
1cf90 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  u.i ) return -1;
1cfa0 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31  .      if( pMem1
1cfb0 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e 75  ->u.i > pMem2->u
1cfc0 2e 69 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a  .i ) return +1;.
1cfd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1cfe0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66      }.    if( (f
1cff0 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 52 65 61  1 & f2 & MEM_Rea
1d000 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  l)!=0 ){.      i
1d010 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3c 20  f( pMem1->u.r < 
1d020 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74  pMem2->u.r ) ret
1d030 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66  urn -1;.      if
1d040 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3e 20 70  ( pMem1->u.r > p
1d050 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74 75  Mem2->u.r ) retu
1d060 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74  rn +1;.      ret
1d070 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
1d080 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 49 6e 74   if( (f1&MEM_Int
1d090 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
1d0a0 28 20 28 66 32 26 4d 45 4d 5f 52 65 61 6c 29 21  ( (f2&MEM_Real)!
1d0b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
1d0c0 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 74 46  turn sqlite3IntF
1d0d0 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d 65 6d  loatCompare(pMem
1d0e0 31 2d 3e 75 2e 69 2c 20 70 4d 65 6d 32 2d 3e 75  1->u.i, pMem2->u
1d0f0 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .r);.      }else
1d100 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1d110 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
1d120 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31 26 4d   }.    if( (f1&M
1d130 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20  EM_Real)!=0 ){. 
1d140 20 20 20 20 20 69 66 28 20 28 66 32 26 4d 45 4d       if( (f2&MEM
1d150 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  _Int)!=0 ){.    
1d160 20 20 20 20 72 65 74 75 72 6e 20 2d 73 71 6c 69      return -sqli
1d170 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61  te3IntFloatCompa
1d180 72 65 28 70 4d 65 6d 32 2d 3e 75 2e 69 2c 20 70  re(pMem2->u.i, p
1d190 4d 65 6d 31 2d 3e 75 2e 72 29 3b 0a 20 20 20 20  Mem1->u.r);.    
1d1a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1d1b0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1d1c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65    }.    }.    re
1d1d0 74 75 72 6e 20 2b 31 3b 0a 20 20 7d 0a 0a 20 20  turn +1;.  }..  
1d1e0 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20  /* If one value 
1d1f0 69 73 20 61 20 73 74 72 69 6e 67 20 61 6e 64 20  is a string and 
1d200 74 68 65 20 6f 74 68 65 72 20 69 73 20 61 20 62  the other is a b
1d210 6c 6f 62 2c 20 74 68 65 20 73 74 72 69 6e 67 20  lob, the string 
1d220 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66  is less..  ** If
1d230 20 62 6f 74 68 20 61 72 65 20 73 74 72 69 6e 67   both are string
1d240 73 2c 20 63 6f 6d 70 61 72 65 20 75 73 69 6e 67  s, compare using
1d250 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66   the collating f
1d260 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  unctions..  */. 
1d270 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c   if( combined_fl
1d280 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  ags&MEM_Str ){. 
1d290 20 20 20 69 66 28 20 28 66 31 20 26 20 4d 45 4d     if( (f1 & MEM
1d2a0 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _Str)==0 ){.    
1d2b0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1d2c0 7d 0a 20 20 20 20 69 66 28 20 28 66 32 20 26 20  }.    if( (f2 & 
1d2d0 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20  MEM_Str)==0 ){. 
1d2e0 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
1d2f0 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
1d300 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70  t( pMem1->enc==p
1d310 4d 65 6d 32 2d 3e 65 6e 63 20 7c 7c 20 70 4d 65  Mem2->enc || pMe
1d320 6d 31 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  m1->db->mallocFa
1d330 69 6c 65 64 20 29 3b 0a 20 20 20 20 61 73 73 65  iled );.    asse
1d340 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d  rt( pMem1->enc==
1d350 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 0a  SQLITE_UTF8 || .
1d360 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 65 6d              pMem
1d370 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  1->enc==SQLITE_U
1d380 54 46 31 36 4c 45 20 7c 7c 20 70 4d 65 6d 31 2d  TF16LE || pMem1-
1d390 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  >enc==SQLITE_UTF
1d3a0 31 36 42 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  16BE );..    /* 
1d3b0 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  The collation se
1d3c0 71 75 65 6e 63 65 20 6d 75 73 74 20 62 65 20 64  quence must be d
1d3d0 65 66 69 6e 65 64 20 61 74 20 74 68 69 73 20 70  efined at this p
1d3e0 6f 69 6e 74 2c 20 65 76 65 6e 20 69 66 0a 20 20  oint, even if.  
1d3f0 20 20 2a 2a 20 74 68 65 20 75 73 65 72 20 64 65    ** the user de
1d400 6c 65 74 65 73 20 74 68 65 20 63 6f 6c 6c 61 74  letes the collat
1d410 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 61 66 74  ion sequence aft
1d420 65 72 20 74 68 65 20 76 64 62 65 20 70 72 6f 67  er the vdbe prog
1d430 72 61 6d 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f  ram is.    ** co
1d440 6d 70 69 6c 65 64 20 28 74 68 69 73 20 77 61 73  mpiled (this was
1d450 20 6e 6f 74 20 61 6c 77 61 79 73 20 74 68 65 20   not always the 
1d460 63 61 73 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  case)..    */.  
1d470 20 20 61 73 73 65 72 74 28 20 21 70 43 6f 6c 6c    assert( !pColl
1d480 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20   || pColl->xCmp 
1d490 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  );..    if( pCol
1d4a0 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  l ){.      retur
1d4b0 6e 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d  n vdbeCompareMem
1d4c0 53 74 72 69 6e 67 28 70 4d 65 6d 31 2c 20 70 4d  String(pMem1, pM
1d4d0 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20 30 29 3b 0a  em2, pColl, 0);.
1d4e0 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 66 20      }.    /* If 
1d4f0 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 77  a NULL pointer w
1d500 61 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  as passed as the
1d510 20 63 6f 6c 6c 61 74 65 20 66 75 6e 63 74 69 6f   collate functio
1d520 6e 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a  n, fall through.
1d530 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 62 6c      ** to the bl
1d540 6f 62 20 63 61 73 65 20 61 6e 64 20 75 73 65 20  ob case and use 
1d550 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20  memcmp().  */.  
1d560 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74 68 20 76 61  }. .  /* Both va
1d570 6c 75 65 73 20 6d 75 73 74 20 62 65 20 62 6c 6f  lues must be blo
1d580 62 73 2e 20 20 43 6f 6d 70 61 72 65 20 75 73 69  bs.  Compare usi
1d590 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f  ng memcmp().  */
1d5a0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1d5b0 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70 4d 65  3BlobCompare(pMe
1d5c0 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a 7d 0a 0a 0a  m1, pMem2);.}...
1d5d0 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  /*.** The first 
1d5e0 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
1d5f0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
1d600 20 69 73 20 61 20 73 65 72 69 61 6c 2d 74 79 70   is a serial-typ
1d610 65 20 74 68 61 74 0a 2a 2a 20 63 6f 72 72 65 73  e that.** corres
1d620 70 6f 6e 64 73 20 74 6f 20 61 6e 20 69 6e 74 65  ponds to an inte
1d630 67 65 72 20 2d 20 61 6c 6c 20 76 61 6c 75 65 73  ger - all values
1d640 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 39   between 1 and 9
1d650 20 69 6e 63 6c 75 73 69 76 65 20 0a 2a 2a 20 65   inclusive .** e
1d660 78 63 65 70 74 20 37 2e 20 54 68 65 20 73 65 63  xcept 7. The sec
1d670 6f 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  ond points to a 
1d680 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
1d690 67 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c  g an integer val
1d6a0 75 65 0a 2a 2a 20 73 65 72 69 61 6c 69 7a 65 64  ue.** serialized
1d6b0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 73 65   according to se
1d6c0 72 69 61 6c 5f 74 79 70 65 2e 20 54 68 69 73 20  rial_type. This 
1d6d0 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61  function deseria
1d6e0 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64 20 72 65 74  lizes.** and ret
1d6f0 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 2e 0a  urns the value..
1d700 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 76 64  */.static i64 vd
1d710 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e  beRecordDecodeIn
1d720 74 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70  t(u32 serial_typ
1d730 65 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65  e, const u8 *aKe
1d740 79 29 7b 0a 20 20 75 33 32 20 79 3b 0a 20 20 61  y){.  u32 y;.  a
1d750 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
1d760 42 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70  B || (serial_typ
1d770 65 3e 3d 31 20 26 26 20 73 65 72 69 61 6c 5f 74  e>=1 && serial_t
1d780 79 70 65 3c 3d 39 20 26 26 20 73 65 72 69 61 6c  ype<=9 && serial
1d790 5f 74 79 70 65 21 3d 37 29 20 29 3b 0a 20 20 73  _type!=7) );.  s
1d7a0 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79  witch( serial_ty
1d7b0 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 30  pe ){.    case 0
1d7c0 3a 0a 20 20 20 20 63 61 73 65 20 31 3a 0a 20 20  :.    case 1:.  
1d7d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
1d7e0 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
1d7f0 20 20 20 20 72 65 74 75 72 6e 20 4f 4e 45 5f 42      return ONE_B
1d800 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1d810 20 20 20 63 61 73 65 20 32 3a 0a 20 20 20 20 20     case 2:.     
1d820 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
1d830 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
1d840 20 72 65 74 75 72 6e 20 54 57 4f 5f 42 59 54 45   return TWO_BYTE
1d850 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1d860 63 61 73 65 20 33 3a 0a 20 20 20 20 20 20 74 65  case 3:.      te
1d870 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26  stcase( aKey[0]&
1d880 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65  0x80 );.      re
1d890 74 75 72 6e 20 54 48 52 45 45 5f 42 59 54 45 5f  turn THREE_BYTE_
1d8a0 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63  INT(aKey);.    c
1d8b0 61 73 65 20 34 3a 20 7b 0a 20 20 20 20 20 20 74  ase 4: {.      t
1d8c0 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d  estcase( aKey[0]
1d8d0 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 79  &0x80 );.      y
1d8e0 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   = FOUR_BYTE_UIN
1d8f0 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 72  T(aKey);.      r
1d900 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69 6e 74  eturn (i64)*(int
1d910 2a 29 26 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  *)&y;.    }.    
1d920 63 61 73 65 20 35 3a 20 7b 0a 20 20 20 20 20 20  case 5: {.      
1d930 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
1d940 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
1d950 72 65 74 75 72 6e 20 46 4f 55 52 5f 42 59 54 45  return FOUR_BYTE
1d960 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20  _UINT(aKey+2) + 
1d970 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54  (((i64)1)<<32)*T
1d980 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  WO_BYTE_INT(aKey
1d990 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  );.    }.    cas
1d9a0 65 20 36 3a 20 7b 0a 20 20 20 20 20 20 75 36 34  e 6: {.      u64
1d9b0 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   x = FOUR_BYTE_U
1d9c0 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
1d9d0 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
1d9e0 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
1d9f0 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46   x = (x<<32) | F
1da00 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
1da10 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 72 65 74  ey+4);.      ret
1da20 75 72 6e 20 28 69 36 34 29 2a 28 69 36 34 2a 29  urn (i64)*(i64*)
1da30 26 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  &x;.    }.  }.. 
1da40 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f   return (serial_
1da50 74 79 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a  type - 8);.}../*
1da60 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1da70 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74  n compares the t
1da80 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72  wo table rows or
1da90 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a   index records.*
1daa0 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7b  * specified by {
1dab0 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e  nKey1, pKey1} an
1dac0 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65  d pPKey2.  It re
1dad0 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65  turns a negative
1dae0 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73  , zero.** or pos
1daf0 69 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66  itive integer if
1db00 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68   key1 is less th
1db10 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20  an, equal to or 
1db20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e  .** greater than
1db30 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65   key2.  The {nKe
1db40 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d  y1, pKey1} key m
1db50 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a  ust be a blob.**
1db60 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20   created by the 
1db70 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
1db80 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45  code of the VDBE
1db90 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a  .  The pPKey2.**
1dba0 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 70   key must be a p
1dbb0 61 72 73 65 64 20 6b 65 79 20 73 75 63 68 20 61  arsed key such a
1dbc0 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  s obtained from.
1dbd0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50 61  ** sqlite3VdbePa
1dbe0 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a  rseRecord..**.**
1dbf0 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 53 6b   If argument bSk
1dc00 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ip is non-zero, 
1dc10 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  it is assumed th
1dc20 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
1dc30 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 64 65 74  s already.** det
1dc40 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65  ermined that the
1dc50 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66   first fields of
1dc60 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 65 71   the keys are eq
1dc70 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20  ual..**.** Key1 
1dc80 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20  and Key2 do not 
1dc90 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20  have to contain 
1dca0 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
1dcb0 6f 66 20 66 69 65 6c 64 73 2e 20 49 66 20 61 6c  of fields. If al
1dcc0 6c 20 0a 2a 2a 20 66 69 65 6c 64 73 20 74 68 61  l .** fields tha
1dcd0 74 20 61 70 70 65 61 72 20 69 6e 20 62 6f 74 68  t appear in both
1dce0 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2c   keys are equal,
1dcf0 20 74 68 65 6e 20 70 50 4b 65 79 32 2d 3e 64 65   then pPKey2->de
1dd00 66 61 75 6c 74 5f 72 63 20 69 73 20 0a 2a 2a 20  fault_rc is .** 
1dd10 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
1dd20 49 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  If database corr
1dd30 75 70 74 69 6f 6e 20 69 73 20 64 69 73 63 6f 76  uption is discov
1dd40 65 72 65 64 2c 20 73 65 74 20 70 50 4b 65 79 32  ered, set pPKey2
1dd50 2d 3e 65 72 72 43 6f 64 65 20 74 6f 20 0a 2a 2a  ->errCode to .**
1dd60 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
1dd70 61 6e 64 20 72 65 74 75 72 6e 20 30 2e 20 49 66  and return 0. If
1dd80 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73   an OOM error is
1dd90 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 0a 2a   encountered, .*
1dda0 2a 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64  * pPKey2->errCod
1ddb0 65 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  e is set to SQLI
1ddc0 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 2c 20 69 66  TE_NOMEM and, if
1ddd0 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c   it is not NULL,
1dde0 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d 66   the.** malloc-f
1ddf0 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74 20 6f  ailed flag set o
1de00 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  n database handl
1de10 65 20 28 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  e (pPKey2->pKeyI
1de20 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a 69 6e 74  nfo->db)..*/.int
1de30 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1de40 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69  rdCompareWithSki
1de50 70 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  p(.  int nKey1, 
1de60 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1de70 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79  1,   /* Left key
1de80 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
1de90 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 20 20  cord *pPKey2,   
1dea0 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b        /* Right k
1deb0 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 53 6b 69  ey */.  int bSki
1dec0 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
1ded0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
1dee0 75 65 2c 20 73 6b 69 70 20 74 68 65 20 66 69 72  ue, skip the fir
1def0 73 74 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20  st field */.){. 
1df00 20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20 20   u32 d1;        
1df10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
1df30 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64  aKey[] of next d
1df40 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  ata element */. 
1df50 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1df60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df70 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78   /* Index of nex
1df80 74 20 66 69 65 6c 64 20 74 6f 20 63 6f 6d 70 61  t field to compa
1df90 72 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64  re */.  u32 szHd
1dfa0 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r1;             
1dfb0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1dfc0 6f 66 20 72 65 63 6f 72 64 20 68 65 61 64 65 72  of record header
1dfd0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
1dfe0 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20  32 idx1;        
1dff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e000 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73  * Offset of firs
1e010 74 20 74 79 70 65 20 69 6e 20 68 65 61 64 65 72  t type in header
1e020 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 30   */.  int rc = 0
1e030 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e040 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1e050 76 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a  value */.  Mem *
1e060 70 52 68 73 20 3d 20 70 50 4b 65 79 32 2d 3e 61  pRhs = pPKey2->a
1e070 4d 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65  Mem;       /* Ne
1e080 78 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65  xt field of pPKe
1e090 79 32 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f  y2 to compare */
1e0a0 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
1e0b0 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70  Info = pPKey2->p
1e0c0 4b 65 79 49 6e 66 6f 3b 0a 20 20 63 6f 6e 73 74  KeyInfo;.  const
1e0d0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1e0e0 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75  aKey1 = (const u
1e0f0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
1e100 4b 65 79 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31  Key1;.  Mem mem1
1e110 3b 0a 0a 20 20 2f 2a 20 49 66 20 62 53 6b 69 70  ;..  /* If bSkip
1e120 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
1e130 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
1e140 72 65 61 64 79 20 64 65 74 65 72 6d 69 6e 65 64  ready determined
1e150 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 0a   that the first.
1e160 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74    ** two element
1e170 73 20 69 6e 20 74 68 65 20 6b 65 79 73 20 61 72  s in the keys ar
1e180 65 20 65 71 75 61 6c 2e 20 46 69 78 20 74 68 65  e equal. Fix the
1e190 20 76 61 72 69 6f 75 73 20 73 74 61 63 6b 20 76   various stack v
1e1a0 61 72 69 61 62 6c 65 73 20 73 6f 0a 20 20 2a 2a  ariables so.  **
1e1b0 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69   that this routi
1e1c0 6e 65 20 62 65 67 69 6e 73 20 63 6f 6d 70 61 72  ne begins compar
1e1d0 69 6e 67 20 61 74 20 74 68 65 20 73 65 63 6f 6e  ing at the secon
1e1e0 64 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 69 66  d field. */.  if
1e1f0 28 20 62 53 6b 69 70 20 29 7b 0a 20 20 20 20 75  ( bSkip ){.    u
1e200 33 32 20 73 31 3b 0a 20 20 20 20 69 64 78 31 20  32 s1;.    idx1 
1e210 3d 20 31 20 2b 20 67 65 74 56 61 72 69 6e 74 33  = 1 + getVarint3
1e220 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 31 29  2(&aKey1[1], s1)
1e230 3b 0a 20 20 20 20 73 7a 48 64 72 31 20 3d 20 61  ;.    szHdr1 = a
1e240 4b 65 79 31 5b 30 5d 3b 0a 20 20 20 20 64 31 20  Key1[0];.    d1 
1e250 3d 20 73 7a 48 64 72 31 20 2b 20 73 71 6c 69 74  = szHdr1 + sqlit
1e260 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
1e270 4c 65 6e 28 73 31 29 3b 0a 20 20 20 20 69 20 3d  Len(s1);.    i =
1e280 20 31 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a   1;.    pRhs++;.
1e290 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64 78    }else{.    idx
1e2a0 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  1 = getVarint32(
1e2b0 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a  aKey1, szHdr1);.
1e2c0 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b      d1 = szHdr1;
1e2d0 0a 20 20 20 20 69 66 28 20 64 31 3e 28 75 6e 73  .    if( d1>(uns
1e2e0 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 20 0a  igned)nKey1 ){ .
1e2f0 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72        pPKey2->er
1e300 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49  rCode = (u8)SQLI
1e310 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1e320 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1e330 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20    /* Corruption 
1e340 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d  */.    }.    i =
1e350 20 30 3b 0a 20 20 7d 0a 0a 20 20 56 56 41 5f 4f   0;.  }..  VVA_O
1e360 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  NLY( mem1.szMall
1e370 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c  oc = 0; ) /* Onl
1e380 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65  y needed by asse
1e390 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
1e3a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b  */.  assert( pPK
1e3b0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ey2->pKeyInfo->n
1e3c0 46 69 65 6c 64 2b 70 50 4b 65 79 32 2d 3e 70 4b  Field+pPKey2->pK
1e3d0 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e  eyInfo->nXField>
1e3e0 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20  =pPKey2->nField 
1e3f0 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55  .       || CORRU
1e400 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  PT_DB );.  asser
1e410 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  t( pPKey2->pKeyI
1e420 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21  nfo->aSortOrder!
1e430 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1e440 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
1e450 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20  ->nField>0 );.  
1e460 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a  assert( idx1<=sz
1e470 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Hdr1 || CORRUPT_
1e480 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  DB );.  do{.    
1e490 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b  u32 serial_type;
1e4a0 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20  ..    /* RHS is 
1e4b0 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  an integer */.  
1e4c0 20 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67    if( pRhs->flag
1e4d0 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  s & MEM_Int ){. 
1e4e0 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65       serial_type
1e4f0 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a   = aKey1[idx1];.
1e500 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e510 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20  serial_type==12 
1e520 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  );.      if( ser
1e530 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a  ial_type>=10 ){.
1e540 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b          rc = +1;
1e550 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1e560 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20   serial_type==0 
1e570 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1e580 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  -1;.      }else 
1e590 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
1e5a0 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =7 ){.        sq
1e5b0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1e5c0 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73  et(&aKey1[d1], s
1e5d0 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d  erial_type, &mem
1e5e0 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  1);.        rc =
1e5f0 20 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61   -sqlite3IntFloa
1e600 74 43 6f 6d 70 61 72 65 28 70 52 68 73 2d 3e 75  tCompare(pRhs->u
1e610 2e 69 2c 20 6d 65 6d 31 2e 75 2e 72 29 3b 0a 20  .i, mem1.u.r);. 
1e620 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e630 20 20 20 20 69 36 34 20 6c 68 73 20 3d 20 76 64      i64 lhs = vd
1e640 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e  beRecordDecodeIn
1e650 74 28 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26  t(serial_type, &
1e660 61 4b 65 79 31 5b 64 31 5d 29 3b 0a 20 20 20 20  aKey1[d1]);.    
1e670 20 20 20 20 69 36 34 20 72 68 73 20 3d 20 70 52      i64 rhs = pR
1e680 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20  hs->u.i;.       
1e690 20 69 66 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a   if( lhs<rhs ){.
1e6a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d            rc = -
1e6b0 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
1e6c0 20 69 66 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a   if( lhs>rhs ){.
1e6d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b            rc = +
1e6e0 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
1e6f0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1e700 2f 2a 20 52 48 53 20 69 73 20 72 65 61 6c 20 2a  /* RHS is real *
1e710 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70  /.    else if( p
1e720 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Rhs->flags & MEM
1e730 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 73  _Real ){.      s
1e740 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65  erial_type = aKe
1e750 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20  y1[idx1];.      
1e760 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
1e770 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  =10 ){.        /
1e780 2a 20 53 65 72 69 61 6c 20 74 79 70 65 73 20 31  * Serial types 1
1e790 32 20 6f 72 20 67 72 65 61 74 65 72 20 61 72 65  2 or greater are
1e7a0 20 73 74 72 69 6e 67 73 20 61 6e 64 20 62 6c 6f   strings and blo
1e7b0 62 73 20 28 67 72 65 61 74 65 72 20 74 68 61 6e  bs (greater than
1e7c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
1e7d0 65 72 73 29 2e 20 54 79 70 65 73 20 31 30 20 61  ers). Types 10 a
1e7e0 6e 64 20 31 31 20 61 72 65 20 63 75 72 72 65 6e  nd 11 are curren
1e7f0 74 6c 79 20 22 72 65 73 65 72 76 65 64 20 66 6f  tly "reserved fo
1e800 72 20 66 75 74 75 72 65 20 0a 20 20 20 20 20 20  r future .      
1e810 20 20 2a 2a 20 75 73 65 22 2c 20 73 6f 20 69 74    ** use", so it
1e820 20 64 6f 65 73 6e 27 74 20 72 65 61 6c 6c 79 20   doesn't really 
1e830 6d 61 74 74 65 72 20 77 68 61 74 20 74 68 65 20  matter what the 
1e840 72 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70 61  results of compa
1e850 72 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  ring.        ** 
1e860 74 68 65 6d 20 74 6f 20 6e 75 6d 62 65 72 69 63  them to numberic
1e870 20 76 61 6c 75 65 73 20 61 72 65 2e 20 20 2a 2f   values are.  */
1e880 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31  .        rc = +1
1e890 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1e8a0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30  ( serial_type==0
1e8b0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1e8c0 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
1e8d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1e8e0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
1e8f0 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61  aKey1[d1], seria
1e900 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a  l_type, &mem1);.
1e910 20 20 20 20 20 20 20 20 69 66 28 20 73 65 72 69          if( seri
1e920 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20  al_type==7 ){.  
1e930 20 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d 31          if( mem1
1e940 2e 75 2e 72 3c 70 52 68 73 2d 3e 75 2e 72 20 29  .u.r<pRhs->u.r )
1e950 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
1e960 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
1e970 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 31 2e   }else if( mem1.
1e980 75 2e 72 3e 70 52 68 73 2d 3e 75 2e 72 20 29 7b  u.r>pRhs->u.r ){
1e990 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1e9a0 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = +1;.          
1e9b0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
1e9c0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1e9d0 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43  sqlite3IntFloatC
1e9e0 6f 6d 70 61 72 65 28 6d 65 6d 31 2e 75 2e 69 2c  ompare(mem1.u.i,
1e9f0 20 70 52 68 73 2d 3e 75 2e 72 29 3b 0a 20 20 20   pRhs->u.r);.   
1ea00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1ea10 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53     }..    /* RHS
1ea20 20 69 73 20 61 20 73 74 72 69 6e 67 20 2a 2f 0a   is a string */.
1ea30 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68      else if( pRh
1ea40 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  s->flags & MEM_S
1ea50 74 72 20 29 7b 0a 20 20 20 20 20 20 67 65 74 56  tr ){.      getV
1ea60 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69  arint32(&aKey1[i
1ea70 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  dx1], serial_typ
1ea80 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
1ea90 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  se( serial_type=
1eaa0 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28  =12 );.      if(
1eab0 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20   serial_type<12 
1eac0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1ead0 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  -1;.      }else 
1eae0 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79 70  if( !(serial_typ
1eaf0 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20  e & 0x01) ){.   
1eb00 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20       rc = +1;.  
1eb10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1eb20 20 20 20 6d 65 6d 31 2e 6e 20 3d 20 28 73 65 72     mem1.n = (ser
1eb30 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f  ial_type - 12) /
1eb40 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   2;.        test
1eb50 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e  case( (d1+mem1.n
1eb60 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  )==(unsigned)nKe
1eb70 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  y1 );.        te
1eb80 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31  stcase( (d1+mem1
1eb90 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64  .n+1)==(unsigned
1eba0 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20  )nKey1 );.      
1ebb0 20 20 69 66 28 20 28 64 31 2b 6d 65 6d 31 2e 6e    if( (d1+mem1.n
1ebc0 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b  ) > (unsigned)nK
1ebd0 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ey1 ){.         
1ebe0 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65   pPKey2->errCode
1ebf0 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f   = (u8)SQLITE_CO
1ec00 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1ec10 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
1ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ec30 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  * Corruption */.
1ec40 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1ec50 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  ( pKeyInfo->aCol
1ec60 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  l[i] ){.        
1ec70 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65    mem1.enc = pKe
1ec80 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20  yInfo->enc;.    
1ec90 20 20 20 20 20 20 6d 65 6d 31 2e 64 62 20 3d 20        mem1.db = 
1eca0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20  pKeyInfo->db;.  
1ecb0 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 66 6c 61          mem1.fla
1ecc0 67 73 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20 20  gs = MEM_Str;.  
1ecd0 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 7a 20 3d          mem1.z =
1ece0 20 28 63 68 61 72 2a 29 26 61 4b 65 79 31 5b 64   (char*)&aKey1[d
1ecf0 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  1];.          rc
1ed00 20 3d 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65   = vdbeCompareMe
1ed10 6d 53 74 72 69 6e 67 28 0a 20 20 20 20 20 20 20  mString(.       
1ed20 20 20 20 20 20 20 20 26 6d 65 6d 31 2c 20 70 52         &mem1, pR
1ed30 68 73 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  hs, pKeyInfo->aC
1ed40 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b 65 79 32 2d  oll[i], &pPKey2-
1ed50 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 20  >errCode.       
1ed60 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65     );.        }e
1ed70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
1ed80 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d 65  nt nCmp = MIN(me
1ed90 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a  m1.n, pRhs->n);.
1eda0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d            rc = m
1edb0 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d  emcmp(&aKey1[d1]
1edc0 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29  , pRhs->z, nCmp)
1edd0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1ede0 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6d 65 6d  rc==0 ) rc = mem
1edf0 31 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a  1.n - pRhs->n; .
1ee00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ee10 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1ee20 52 48 53 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f  RHS is a blob */
1ee30 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52  .    else if( pR
1ee40 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
1ee50 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 67 65  Blob ){.      ge
1ee60 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31  tVarint32(&aKey1
1ee70 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74  [idx1], serial_t
1ee80 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ype);.      test
1ee90 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70  case( serial_typ
1eea0 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69  e==12 );.      i
1eeb0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31  f( serial_type<1
1eec0 32 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70  2 || (serial_typ
1eed0 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20  e & 0x01) ){.   
1eee0 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1eef0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ef00 20 20 20 69 6e 74 20 6e 53 74 72 20 3d 20 28 73     int nStr = (s
1ef10 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29  erial_type - 12)
1ef20 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65   / 2;.        te
1ef30 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72  stcase( (d1+nStr
1ef40 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  )==(unsigned)nKe
1ef50 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  y1 );.        te
1ef60 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72  stcase( (d1+nStr
1ef70 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e  +1)==(unsigned)n
1ef80 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20  Key1 );.        
1ef90 69 66 28 20 28 64 31 2b 6e 53 74 72 29 20 3e 20  if( (d1+nStr) > 
1efa0 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1efb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b  ){.          pPK
1efc0 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28  ey2->errCode = (
1efd0 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  u8)SQLITE_CORRUP
1efe0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
1eff0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
1f000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1f010 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
1f020 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f030 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20       int nCmp = 
1f040 4d 49 4e 28 6e 53 74 72 2c 20 70 52 68 73 2d 3e  MIN(nStr, pRhs->
1f050 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  n);.          rc
1f060 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31   = memcmp(&aKey1
1f070 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e  [d1], pRhs->z, n
1f080 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Cmp);.          
1f090 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d  if( rc==0 ) rc =
1f0a0 20 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e 6e 3b   nStr - pRhs->n;
1f0b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1f0c0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1f0d0 20 52 48 53 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a   RHS is null */.
1f0e0 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
1f0f0 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b  serial_type = aK
1f100 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20  ey1[idx1];.     
1f110 20 72 63 20 3d 20 28 73 65 72 69 61 6c 5f 74 79   rc = (serial_ty
1f120 70 65 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 0a 20  pe!=0);.    }.. 
1f130 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
1f140 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
1f150 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  fo->aSortOrder[i
1f160 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ] ){.        rc 
1f170 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  = -rc;.      }. 
1f180 20 20 20 20 20 61 73 73 65 72 74 28 20 76 64 62       assert( vdb
1f190 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65  eRecordCompareDe
1f1a0 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  bug(nKey1, pKey1
1f1b0 2c 20 70 50 4b 65 79 32 2c 20 72 63 29 20 29 3b  , pPKey2, rc) );
1f1c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d  .      assert( m
1f1d0 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20  em1.szMalloc==0 
1f1e0 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65  );  /* See comme
1f1f0 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20  nt below */.    
1f200 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1f210 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20   }..    i++;.   
1f220 20 70 52 68 73 2b 2b 3b 0a 20 20 20 20 64 31 20   pRhs++;.    d1 
1f230 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  += sqlite3VdbeSe
1f240 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
1f250 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 64  al_type);.    id
1f260 78 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 61 72  x1 += sqlite3Var
1f270 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  intLen(serial_ty
1f280 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69  pe);.  }while( i
1f290 64 78 31 3c 28 75 6e 73 69 67 6e 65 64 29 73 7a  dx1<(unsigned)sz
1f2a0 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32  Hdr1 && i<pPKey2
1f2b0 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64 31 3c 3d  ->nField && d1<=
1f2c0 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1f2d0 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f  );..  /* No memo
1f2e0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ry allocation is
1f2f0 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65   ever used on me
1f300 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20  m1.  Prove this 
1f310 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66  using.  ** the f
1f320 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
1f330 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72  ).  If the asser
1f340 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e  t() fails, it in
1f350 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d  dicates a.  ** m
1f360 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61  emory leak and a
1f370 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71   need to call sq
1f380 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
1f390 61 73 65 28 26 6d 65 6d 31 29 2e 20 20 2a 2f 0a  ase(&mem1).  */.
1f3a0 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73    assert( mem1.s
1f3b0 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20  zMalloc==0 );.. 
1f3c0 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d   /* rc==0 here m
1f3d0 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 72  eans that one or
1f3e0 20 62 6f 74 68 20 6f 66 20 74 68 65 20 6b 65 79   both of the key
1f3f0 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65  s ran out of fie
1f400 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c  lds and.  ** all
1f410 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74   the fields up t
1f420 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72  o that point wer
1f430 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20  e equal. Return 
1f440 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20  the default_rc. 
1f450 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20   ** value.  */. 
1f460 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
1f470 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 76  _DB .       || v
1f480 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1f490 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65  Debug(nKey1, pKe
1f4a0 79 31 2c 20 70 50 4b 65 79 32 2c 20 70 50 4b 65  y1, pPKey2, pPKe
1f4b0 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 29 20  y2->default_rc) 
1f4c0 0a 20 20 20 20 20 20 20 7c 7c 20 70 4b 65 79 49  .       || pKeyI
1f4d0 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  nfo->db->mallocF
1f4e0 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 70 50 4b  ailed.  );.  pPK
1f4f0 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b  ey2->eqSeen = 1;
1f500 0a 20 20 72 65 74 75 72 6e 20 70 50 4b 65 79 32  .  return pPKey2
1f510 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a  ->default_rc;.}.
1f520 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52  int sqlite3VdbeR
1f530 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20  ecordCompare(.  
1f540 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
1f550 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20   void *pKey1,   
1f560 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
1f570 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1f580 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 20  *pPKey2         
1f590 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
1f5a0 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  .){.  return sql
1f5b0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1f5c0 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b  mpareWithSkip(nK
1f5d0 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1f5e0 79 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  y2, 0);.}.../*.*
1f5f0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f600 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20  is an optimized 
1f610 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74  version of sqlit
1f620 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1f630 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28  are() .** that (
1f640 61 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65  a) the first fie
1f650 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20  ld of pPKey2 is 
1f660 61 6e 20 69 6e 74 65 67 65 72 2c 20 61 6e 64 20  an integer, and 
1f670 28 62 29 20 74 68 65 20 0a 2a 2a 20 73 69 7a 65  (b) the .** size
1f680 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e  -of-header varin
1f690 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
1f6a0 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20  f (pKey1/nKey1) 
1f6b0 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65  fits in a single
1f6c0 0a 2a 2a 20 62 79 74 65 20 28 69 2e 65 2e 20 69  .** byte (i.e. i
1f6d0 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32 38 29  s less than 128)
1f6e0 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64  ..**.** To avoid
1f6f0 20 63 6f 6e 63 65 72 6e 73 20 61 62 6f 75 74 20   concerns about 
1f700 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 73  buffer overreads
1f710 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1f720 73 20 6f 6e 6c 79 20 75 73 65 64 0a 2a 2a 20 6f  s only used.** o
1f730 6e 20 73 63 68 65 6d 61 73 20 77 68 65 72 65 20  n schemas where 
1f740 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 69  the maximum vali
1f750 64 20 68 65 61 64 65 72 20 73 69 7a 65 20 69 73  d header size is
1f760 20 36 33 20 62 79 74 65 73 20 6f 72 20 6c 65 73   63 bytes or les
1f770 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1f780 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1f790 72 65 49 6e 74 28 0a 20 20 69 6e 74 20 6e 4b 65  reInt(.  int nKe
1f7a0 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
1f7b0 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b  pKey1, /* Left k
1f7c0 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ey */.  Unpacked
1f7d0 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20  Record *pPKey2  
1f7e0 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b        /* Right k
1f7f0 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ey */.){.  const
1f800 20 75 38 20 2a 61 4b 65 79 20 3d 20 26 28 28 63   u8 *aKey = &((c
1f810 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b  onst u8*)pKey1)[
1f820 2a 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79  *(const u8*)pKey
1f830 31 20 26 20 30 78 33 46 5d 3b 0a 20 20 69 6e 74  1 & 0x3F];.  int
1f840 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 28   serial_type = (
1f850 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31  (const u8*)pKey1
1f860 29 5b 31 5d 3b 0a 20 20 69 6e 74 20 72 65 73 3b  )[1];.  int res;
1f870 0a 20 20 75 33 32 20 79 3b 0a 20 20 75 36 34 20  .  u32 y;.  u64 
1f880 78 3b 0a 20 20 69 36 34 20 76 20 3d 20 70 50 4b  x;.  i64 v = pPK
1f890 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69  ey2->aMem[0].u.i
1f8a0 3b 0a 20 20 69 36 34 20 6c 68 73 3b 0a 0a 20 20  ;.  i64 lhs;..  
1f8b0 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43  vdbeAssertFieldC
1f8c0 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73  ountWithinLimits
1f8d0 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
1f8e0 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29  PKey2->pKeyInfo)
1f8f0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 28 75  ;.  assert( (*(u
1f900 38 2a 29 70 4b 65 79 31 29 3c 3d 30 78 33 46 20  8*)pKey1)<=0x3F 
1f910 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
1f920 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61  .  switch( seria
1f930 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  l_type ){.    ca
1f940 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74  se 1: { /* 1-byt
1f950 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1f960 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   */.      lhs = 
1f970 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  ONE_BYTE_INT(aKe
1f980 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
1f990 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
1f9a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f9b0 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a      case 2: { /*
1f9c0 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   2-byte signed i
1f9d0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1f9e0 6c 68 73 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49  lhs = TWO_BYTE_I
1f9f0 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1fa00 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
1fa10 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1fa20 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33      }.    case 3
1fa30 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69  : { /* 3-byte si
1fa40 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1fa50 20 20 20 20 20 20 6c 68 73 20 3d 20 54 48 52 45        lhs = THRE
1fa60 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  E_BYTE_INT(aKey)
1fa70 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1fa80 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
1fa90 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1faa0 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34    case 4: { /* 4
1fab0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1fac0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 79 20  eger */.      y 
1fad0 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
1fae0 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 6c 68  (aKey);.      lh
1faf0 73 20 3d 20 28 69 36 34 29 2a 28 69 6e 74 2a 29  s = (i64)*(int*)
1fb00 26 79 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  &y;.      testca
1fb10 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
1fb20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1fb30 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a      case 5: { /*
1fb40 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   6-byte signed i
1fb50 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1fb60 6c 68 73 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  lhs = FOUR_BYTE_
1fb70 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20 28  UINT(aKey+2) + (
1fb80 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57  ((i64)1)<<32)*TW
1fb90 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  O_BYTE_INT(aKey)
1fba0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1fbb0 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
1fbc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1fbd0 20 20 63 61 73 65 20 36 3a 20 7b 20 2f 2a 20 38    case 6: { /* 8
1fbe0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1fbf0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 78 20  eger */.      x 
1fc00 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
1fc10 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 78 20  (aKey);.      x 
1fc20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52  = (x<<32) | FOUR
1fc30 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b  _BYTE_UINT(aKey+
1fc40 34 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20  4);.      lhs = 
1fc50 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20  *(i64*)&x;.     
1fc60 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30   testcase( lhs<0
1fc70 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1fc80 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1fc90 38 3a 20 0a 20 20 20 20 20 20 6c 68 73 20 3d 20  8: .      lhs = 
1fca0 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
1fcb0 20 20 20 20 63 61 73 65 20 39 3a 0a 20 20 20 20      case 9:.    
1fcc0 20 20 6c 68 73 20 3d 20 31 3b 0a 20 20 20 20 20    lhs = 1;.     
1fcd0 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20   break;..    /* 
1fce0 54 68 69 73 20 63 61 73 65 20 63 6f 75 6c 64 20  This case could 
1fcf0 62 65 20 72 65 6d 6f 76 65 64 20 77 69 74 68 6f  be removed witho
1fd00 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  ut changing the 
1fd10 72 65 73 75 6c 74 73 20 6f 66 20 72 75 6e 6e 69  results of runni
1fd20 6e 67 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 63  ng.    ** this c
1fd30 6f 64 65 2e 20 49 6e 63 6c 75 64 69 6e 67 20 69  ode. Including i
1fd40 74 20 63 61 75 73 65 73 20 67 63 63 20 74 6f 20  t causes gcc to 
1fd50 67 65 6e 65 72 61 74 65 20 61 20 66 61 73 74 65  generate a faste
1fd60 72 20 73 77 69 74 63 68 20 0a 20 20 20 20 2a 2a  r switch .    **
1fd70 20 73 74 61 74 65 6d 65 6e 74 20 28 73 69 6e 63   statement (sinc
1fd80 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 73  e the range of s
1fd90 77 69 74 63 68 20 74 61 72 67 65 74 73 20 6e 6f  witch targets no
1fda0 77 20 73 74 61 72 74 73 20 61 74 20 7a 65 72 6f  w starts at zero
1fdb0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 73 20 63   and.    ** is c
1fdc0 6f 6e 74 69 67 75 6f 75 73 29 20 62 75 74 20 64  ontiguous) but d
1fdd0 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e  oes not cause an
1fde0 79 20 64 75 70 6c 69 63 61 74 65 20 63 6f 64 65  y duplicate code
1fdf0 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64   to be generated
1fe00 0a 20 20 20 20 2a 2a 20 28 61 73 20 67 63 63 20  .    ** (as gcc 
1fe10 69 73 20 63 6c 65 76 65 72 20 65 6e 6f 75 67 68  is clever enough
1fe20 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20   to combine the 
1fe30 74 77 6f 20 6c 69 6b 65 20 63 61 73 65 73 29 2e  two like cases).
1fe40 20 4f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63   Other .    ** c
1fe50 6f 6d 70 69 6c 65 72 73 20 6d 69 67 68 74 20 62  ompilers might b
1fe60 65 20 73 69 6d 69 6c 61 72 2e 20 20 2a 2f 20 0a  e similar.  */ .
1fe70 20 20 20 20 63 61 73 65 20 30 3a 20 63 61 73 65      case 0: case
1fe80 20 37 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e   7:.      return
1fe90 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1fea0 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c  rdCompare(nKey1,
1feb0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b   pKey1, pPKey2);
1fec0 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ..    default:. 
1fed0 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
1fee0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1fef0 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79  pare(nKey1, pKey
1ff00 31 2c 20 70 50 4b 65 79 32 29 3b 0a 20 20 7d 0a  1, pPKey2);.  }.
1ff10 0a 20 20 69 66 28 20 76 3e 6c 68 73 20 29 7b 0a  .  if( v>lhs ){.
1ff20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
1ff30 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ->r1;.  }else if
1ff40 28 20 76 3c 6c 68 73 20 29 7b 0a 20 20 20 20 72  ( v<lhs ){.    r
1ff50 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b  es = pPKey2->r2;
1ff60 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 4b  .  }else if( pPK
1ff70 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b  ey2->nField>1 ){
1ff80 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  .    /* The firs
1ff90 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
1ffa0 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75  two keys are equ
1ffb0 61 6c 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20  al. Compare the 
1ffc0 74 72 61 69 6c 69 6e 67 20 0a 20 20 20 20 2a 2a  trailing .    **
1ffd0 20 66 69 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 20   fields.  */.   
1ffe0 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64   res = sqlite3Vd
1fff0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57  beRecordCompareW
20000 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70  ithSkip(nKey1, p
20010 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29  Key1, pPKey2, 1)
20020 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
20030 2a 20 54 68 65 20 66 69 72 73 74 20 66 69 65 6c  * The first fiel
20040 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65  ds of the two ke
20050 79 73 20 61 72 65 20 65 71 75 61 6c 20 61 6e 64  ys are equal and
20060 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74 72   there are no tr
20070 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 66 69  ailing.    ** fi
20080 65 6c 64 73 2e 20 52 65 74 75 72 6e 20 70 50 4b  elds. Return pPK
20090 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20  ey2->default_rc 
200a0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 2a 2f  in this case. */
200b0 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79  .    res = pPKey
200c0 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20  2->default_rc;. 
200d0 20 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65     pPKey2->eqSee
200e0 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 61 73  n = 1;.  }..  as
200f0 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72 64  sert( vdbeRecord
20100 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65  CompareDebug(nKe
20110 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
20120 32 2c 20 72 65 73 29 20 29 3b 0a 20 20 72 65 74  2, res) );.  ret
20130 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
20140 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
20150 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20  is an optimized 
20160 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74  version of sqlit
20170 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
20180 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28  are() .** that (
20190 61 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65  a) the first fie
201a0 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20  ld of pPKey2 is 
201b0 61 20 73 74 72 69 6e 67 2c 20 74 68 61 74 20 28  a string, that (
201c0 62 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65  b) the first fie
201d0 6c 64 0a 2a 2a 20 75 73 65 73 20 74 68 65 20 63  ld.** uses the c
201e0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
201f0 65 20 42 49 4e 41 52 59 20 61 6e 64 20 28 63 29  e BINARY and (c)
20200 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f   that the size-o
20210 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20  f-header varint 
20220 0a 2a 2a 20 61 74 20 74 68 65 20 73 74 61 72 74  .** at the start
20230 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31   of (pKey1/nKey1
20240 29 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67  ) fits in a sing
20250 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74  le byte..*/.stat
20260 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72  ic int vdbeRecor
20270 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 0a  dCompareString(.
20280 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
20290 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
202a0 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
202b0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
202c0 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f  *pPKey2        /
202d0 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29  * Right key */.)
202e0 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b  {.  const u8 *aK
202f0 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a  ey1 = (const u8*
20300 29 70 4b 65 79 31 3b 0a 20 20 69 6e 74 20 73 65  )pKey1;.  int se
20310 72 69 61 6c 5f 74 79 70 65 3b 0a 20 20 69 6e 74  rial_type;.  int
20320 20 72 65 73 3b 0a 0a 20 20 61 73 73 65 72 74 28   res;..  assert(
20330 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
20340 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72  .flags & MEM_Str
20350 20 29 3b 0a 20 20 76 64 62 65 41 73 73 65 72 74   );.  vdbeAssert
20360 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e  FieldCountWithin
20370 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b  Limits(nKey1, pK
20380 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ey1, pPKey2->pKe
20390 79 49 6e 66 6f 29 3b 0a 20 20 67 65 74 56 61 72  yInfo);.  getVar
203a0 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c  int32(&aKey1[1],
203b0 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20   serial_type);. 
203c0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
203d0 3c 31 32 20 29 7b 0a 20 20 20 20 72 65 73 20 3d  <12 ){.    res =
203e0 20 70 50 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20   pPKey2->r1;    
203f0 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79    /* (pKey1/nKey
20400 31 29 20 69 73 20 61 20 6e 75 6d 62 65 72 20 6f  1) is a number o
20410 72 20 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65  r a null */.  }e
20420 6c 73 65 20 69 66 28 20 21 28 73 65 72 69 61 6c  lse if( !(serial
20430 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b  _type & 0x01) ){
20440 20 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65   .    res = pPKe
20450 79 32 2d 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20  y2->r2;      /* 
20460 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73  (pKey1/nKey1) is
20470 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c   a blob */.  }el
20480 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70  se{.    int nCmp
20490 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a  ;.    int nStr;.
204a0 20 20 20 20 69 6e 74 20 73 7a 48 64 72 20 3d 20      int szHdr = 
204b0 61 4b 65 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e  aKey1[0];..    n
204c0 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79  Str = (serial_ty
204d0 70 65 2d 31 32 29 20 2f 20 32 3b 0a 20 20 20 20  pe-12) / 2;.    
204e0 69 66 28 20 28 73 7a 48 64 72 20 2b 20 6e 53 74  if( (szHdr + nSt
204f0 72 29 20 3e 20 6e 4b 65 79 31 20 29 7b 0a 20 20  r) > nKey1 ){.  
20500 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43      pPKey2->errC
20510 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45  ode = (u8)SQLITE
20520 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
20530 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
20540 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20    /* Corruption 
20550 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6d  */.    }.    nCm
20560 70 20 3d 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d  p = MIN( pPKey2-
20570 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72  >aMem[0].n, nStr
20580 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 6d 65   );.    res = me
20590 6d 63 6d 70 28 26 61 4b 65 79 31 5b 73 7a 48 64  mcmp(&aKey1[szHd
205a0 72 5d 2c 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  r], pPKey2->aMem
205b0 5b 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20  [0].z, nCmp);.. 
205c0 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b     if( res==0 ){
205d0 0a 20 20 20 20 20 20 72 65 73 20 3d 20 6e 53 74  .      res = nSt
205e0 72 20 2d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  r - pPKey2->aMem
205f0 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28  [0].n;.      if(
20600 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20   res==0 ){.     
20610 20 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e     if( pPKey2->n
20620 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20  Field>1 ){.     
20630 20 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74       res = sqlit
20640 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
20650 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79  areWithSkip(nKey
20660 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
20670 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 1);.        }e
20680 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
20690 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66  es = pPKey2->def
206a0 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20 20 20 20  ault_rc;.       
206b0 20 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65     pPKey2->eqSee
206c0 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  n = 1;.        }
206d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
206e0 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20   res>0 ){.      
206f0 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
20700 72 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r2;.      }else{
20710 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70  .        res = p
20720 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 20  PKey2->r1;.     
20730 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
20740 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20   res>0 ){.      
20750 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32  res = pPKey2->r2
20760 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20770 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
20780 3e 72 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  >r1;.    }.  }..
20790 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65    assert( vdbeRe
207a0 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
207b0 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
207c0 50 4b 65 79 32 2c 20 72 65 73 29 0a 20 20 20 20  PKey2, res).    
207d0 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42     || CORRUPT_DB
207e0 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 4b 65 79  .       || pPKey
207f0 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d  2->pKeyInfo->db-
20800 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20  >mallocFailed.  
20810 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
20820 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
20830 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
20840 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
20850 72 64 43 6f 6d 70 61 72 65 28 29 20 63 6f 6d 70  rdCompare() comp
20860 61 74 69 62 6c 65 20 66 75 6e 63 74 69 6f 6e 0a  atible function.
20870 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  ** suitable for 
20880 63 6f 6d 70 61 72 69 6e 67 20 73 65 72 69 61 6c  comparing serial
20890 69 7a 65 64 20 72 65 63 6f 72 64 73 20 74 6f 20  ized records to 
208a0 74 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63  the unpacked rec
208b0 6f 72 64 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  ord passed.** as
208c0 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
208d0 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f 6d  nt..*/.RecordCom
208e0 70 61 72 65 20 73 71 6c 69 74 65 33 56 64 62 65  pare sqlite3Vdbe
208f0 46 69 6e 64 43 6f 6d 70 61 72 65 28 55 6e 70 61  FindCompare(Unpa
20900 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a  ckedRecord *p){.
20910 20 20 2f 2a 20 76 61 72 69 6e 74 52 65 63 6f 72    /* varintRecor
20920 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e  dCompareInt() an
20930 64 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f  d varintRecordCo
20940 6d 70 61 72 65 53 74 72 69 6e 67 28 29 20 62 6f  mpareString() bo
20950 74 68 20 61 73 73 75 6d 65 0a 20 20 2a 2a 20 74  th assume.  ** t
20960 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d  hat the size-of-
20970 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 74 68  header varint th
20980 61 74 20 6f 63 63 75 72 73 20 61 74 20 74 68 65  at occurs at the
20990 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 72   start of each r
209a0 65 63 6f 72 64 0a 20 20 2a 2a 20 66 69 74 73 20  ecord.  ** fits 
209b0 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  in a single byte
209c0 20 28 69 2e 65 2e 20 69 73 20 31 32 37 20 6f 72   (i.e. is 127 or
209d0 20 6c 65 73 73 29 2e 20 76 61 72 69 6e 74 52 65   less). varintRe
209e0 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29  cordCompareInt()
209f0 0a 20 20 2a 2a 20 61 6c 73 6f 20 61 73 73 75 6d  .  ** also assum
20a00 65 73 20 74 68 61 74 20 69 74 20 69 73 20 73 61  es that it is sa
20a10 66 65 20 74 6f 20 6f 76 65 72 72 65 61 64 20 61  fe to overread a
20a20 20 62 75 66 66 65 72 20 62 79 20 61 74 20 6c 65   buffer by at le
20a30 61 73 74 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61  ast the .  ** ma
20a40 78 69 6d 75 6d 20 70 6f 73 73 69 62 6c 65 20 6c  ximum possible l
20a50 65 67 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65  egal header size
20a60 20 70 6c 75 73 20 38 20 62 79 74 65 73 2e 20 42   plus 8 bytes. B
20a70 65 63 61 75 73 65 20 74 68 65 72 65 20 69 73 0a  ecause there is.
20a80 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20    ** guaranteed 
20a90 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20 37  to be at least 7
20aa0 34 20 28 62 75 74 20 6e 6f 74 20 31 33 36 29 20  4 (but not 136) 
20ab0 62 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67  bytes of padding
20ac0 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 0a   following each.
20ad0 20 20 2a 2a 20 62 75 66 66 65 72 20 70 61 73 73    ** buffer pass
20ae0 65 64 20 74 6f 20 76 61 72 69 6e 74 52 65 63 6f  ed to varintReco
20af0 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 74  rdCompareInt() t
20b00 68 69 73 20 6d 61 6b 65 73 20 69 74 20 63 6f 6e  his makes it con
20b10 76 65 6e 69 65 6e 74 20 74 6f 0a 20 20 2a 2a 20  venient to.  ** 
20b20 6c 69 6d 69 74 20 74 68 65 20 73 69 7a 65 20 6f  limit the size o
20b30 66 20 74 68 65 20 68 65 61 64 65 72 20 74 6f 20  f the header to 
20b40 36 34 20 62 79 74 65 73 20 69 6e 20 63 61 73 65  64 bytes in case
20b50 73 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73  s where the firs
20b60 74 20 66 69 65 6c 64 0a 20 20 2a 2a 20 69 73 20  t field.  ** is 
20b70 61 6e 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a  an integer..  **
20b80 0a 20 20 2a 2a 20 54 68 65 20 65 61 73 69 65 73  .  ** The easies
20b90 74 20 77 61 79 20 74 6f 20 65 6e 66 6f 72 63 65  t way to enforce
20ba0 20 74 68 69 73 20 6c 69 6d 69 74 20 69 73 20 74   this limit is t
20bb0 6f 20 63 6f 6e 73 69 64 65 72 20 6f 6e 6c 79 20  o consider only 
20bc0 72 65 63 6f 72 64 73 20 77 69 74 68 0a 20 20 2a  records with.  *
20bd0 2a 20 31 33 20 66 69 65 6c 64 73 20 6f 72 20 6c  * 13 fields or l
20be0 65 73 73 2e 20 49 66 20 74 68 65 20 66 69 72 73  ess. If the firs
20bf0 74 20 66 69 65 6c 64 20 69 73 20 61 6e 20 69 6e  t field is an in
20c00 74 65 67 65 72 2c 20 74 68 65 20 6d 61 78 69 6d  teger, the maxim
20c10 75 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a 20 68 65  um legal.  ** he
20c20 61 64 65 72 20 73 69 7a 65 20 69 73 20 28 31 32  ader size is (12
20c30 2a 35 20 2b 20 31 20 2b 20 31 29 20 62 79 74 65  *5 + 1 + 1) byte
20c40 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d  s.  */.  if( (p-
20c50 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  >pKeyInfo->nFiel
20c60 64 20 2b 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d  d + p->pKeyInfo-
20c70 3e 6e 58 46 69 65 6c 64 29 3c 3d 31 33 20 29 7b  >nXField)<=13 ){
20c80 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  .    int flags =
20c90 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67   p->aMem[0].flag
20ca0 73 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4b  s;.    if( p->pK
20cb0 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
20cc0 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 70  er[0] ){.      p
20cd0 2d 3e 72 31 20 3d 20 31 3b 0a 20 20 20 20 20 20  ->r1 = 1;.      
20ce0 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a 20 20 20 20  p->r2 = -1;.    
20cf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
20d00 72 31 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70  r1 = -1;.      p
20d10 2d 3e 72 32 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ->r2 = 1;.    }.
20d20 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26      if( (flags &
20d30 20 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a 20 20 20   MEM_Int) ){.   
20d40 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 52 65     return vdbeRe
20d50 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 3b 0a  cordCompareInt;.
20d60 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61      }.    testca
20d70 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  se( flags & MEM_
20d80 52 65 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74  Real );.    test
20d90 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45  case( flags & ME
20da0 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 74 65  M_Null );.    te
20db0 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20  stcase( flags & 
20dc0 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20  MEM_Blob );.    
20dd0 69 66 28 20 28 66 6c 61 67 73 20 26 20 28 4d 45  if( (flags & (ME
20de0 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 7c  M_Real|MEM_Null|
20df0 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 26 26  MEM_Blob))==0 &&
20e00 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 43   p->pKeyInfo->aC
20e10 6f 6c 6c 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20  oll[0]==0 ){.   
20e20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73     assert( flags
20e30 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20   & MEM_Str );.  
20e40 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 52      return vdbeR
20e50 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69  ecordCompareStri
20e60 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ng;.    }.  }.. 
20e70 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
20e80 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
20e90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20  ;.}../*.** pCur 
20ea0 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64  points at an ind
20eb0 65 78 20 65 6e 74 72 79 20 63 72 65 61 74 65 64  ex entry created
20ec0 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61   using the OP_Ma
20ed0 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
20ee0 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77  .** Read the row
20ef0 69 64 20 28 74 68 65 20 6c 61 73 74 20 66 69 65  id (the last fie
20f00 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  ld in the record
20f10 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69  ) and store it i
20f20 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74  n *rowid..** Ret
20f30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
20f40 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
20f50 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  s, or an error c
20f60 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
20f70 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20  *.** pCur might 
20f80 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  be pointing to t
20f90 65 78 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ext obtained fro
20fa0 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  m a corrupt data
20fb0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f  base file..** So
20fc0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e   the content can
20fd0 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20  not be trusted. 
20fe0 20 44 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20   Do appropriate 
20ff0 63 68 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f  checks on the co
21000 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ntent..*/.int sq
21010 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69  lite3VdbeIdxRowi
21020 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42  d(sqlite3 *db, B
21030 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
21040 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36  64 *rowid){.  i6
21050 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a  4 nCellKey = 0;.
21060 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
21070 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a  szHdr;        /*
21080 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   Size of the hea
21090 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70  der */.  u32 typ
210a0 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65  eRowid;    /* Se
210b0 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65  rial type of the
210c0 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20   rowid */.  u32 
210d0 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a  lenRowid;     /*
210e0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77   Size of the row
210f0 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76  id */.  Mem m, v
21100 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20  ;..  /* Get the 
21110 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65  size of the inde
21120 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69  x entry.  Only i
21130 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73 20 6f  ndices entries o
21140 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e  f less.  ** than
21150 20 32 47 69 42 20 61 72 65 20 73 75 70 70 6f 72   2GiB are suppor
21160 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61 72  t - anything lar
21170 67 65 20 6d 75 73 74 20 62 65 20 64 61 74 61 62  ge must be datab
21180 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
21190 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70 74    ** Any corrupt
211a0 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20  ion is detected 
211b0 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  in sqlite3BtreeP
211c0 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 74  arseCellPtr(), t
211d0 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74  hough, so.  ** t
211e0 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73 61 66  his code can saf
211f0 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61 74 20  ely assume that 
21200 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62  nCellKey is 32-b
21210 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73  its  .  */.  ass
21220 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
21230 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70  eCursorIsValid(p
21240 43 75 72 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e  Cur) );.  VVA_ON
21250 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74 65 33  LY(rc =) sqlite3
21260 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75  BtreeKeySize(pCu
21270 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  r, &nCellKey);. 
21280 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
21290 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 20 2f 2a  ITE_OK );     /*
212a0 20 70 43 75 72 20 69 73 20 61 6c 77 61 79 73 20   pCur is always 
212b0 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65  valid so KeySize
212c0 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a   cannot fail */.
212d0 20 20 61 73 73 65 72 74 28 20 28 6e 43 65 6c 6c    assert( (nCell
212e0 4b 65 79 20 26 20 53 51 4c 49 54 45 5f 4d 41 58  Key & SQLITE_MAX
212f0 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e 43 65 6c  _U32)==(u64)nCel
21300 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  lKey );..  /* Re
21310 61 64 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65  ad in the comple
21320 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  te content of th
21330 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f  e index entry */
21340 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
21350 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29  mInit(&m, db, 0)
21360 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
21370 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
21380 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e  (pCur, 0, (u32)n
21390 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b  CellKey, 1, &m);
213a0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
213b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
213c0 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20  .  /* The index 
213d0 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e  entry must begin
213e0 20 77 69 74 68 20 61 20 68 65 61 64 65 72 20 73   with a header s
213f0 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67  ize */.  (void)g
21400 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29  etVarint32((u8*)
21410 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74  m.z, szHdr);.  t
21420 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d  estcase( szHdr==
21430 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  3 );.  testcase(
21440 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20   szHdr==m.n );. 
21450 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a   if( unlikely(sz
21460 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a  Hdr<3 || (int)sz
21470 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20  Hdr>m.n) ){.    
21480 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
21490 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a  orruption;.  }..
214a0 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69    /* The last fi
214b0 65 6c 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  eld of the index
214c0 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e   should be an in
214d0 74 65 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49  teger - the ROWI
214e0 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74  D..  ** Verify t
214f0 68 61 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74  hat the last ent
21500 72 79 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20  ry really is an 
21510 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76  integer. */.  (v
21520 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28  oid)getVarint32(
21530 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d  (u8*)&m.z[szHdr-
21540 31 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a  1], typeRowid);.
21550 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
21560 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65  Rowid==1 );.  te
21570 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
21580 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61  d==2 );.  testca
21590 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33  se( typeRowid==3
215a0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
215b0 74 79 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a  typeRowid==4 );.
215c0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
215d0 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65  Rowid==5 );.  te
215e0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
215f0 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61  d==6 );.  testca
21600 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38  se( typeRowid==8
21610 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
21620 74 79 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a  typeRowid==9 );.
21630 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74    if( unlikely(t
21640 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79  ypeRowid<1 || ty
21650 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70  peRowid>9 || typ
21660 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20  eRowid==7) ){.  
21670 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
21680 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
21690 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71  .  lenRowid = sq
216a0 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69  lite3SmallTypeSi
216b0 7a 65 73 5b 74 79 70 65 52 6f 77 69 64 5d 3b 0a  zes[typeRowid];.
216c0 20 20 74 65 73 74 63 61 73 65 28 20 28 75 33 32    testcase( (u32
216d0 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52  )m.n==szHdr+lenR
216e0 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20 75 6e  owid );.  if( un
216f0 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e 6e 3c  likely((u32)m.n<
21700 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29 20  szHdr+lenRowid) 
21710 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f  ){.    goto idx_
21720 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e  rowid_corruption
21730 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 63  ;.  }..  /* Fetc
21740 68 20 74 68 65 20 69 6e 74 65 67 65 72 20 6f 66  h the integer of
21750 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
21760 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f   index record */
21770 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  .  sqlite3VdbeSe
21780 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e  rialGet((u8*)&m.
21790 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c  z[m.n-lenRowid],
217a0 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76 29 3b   typeRowid, &v);
217b0 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e  .  *rowid = v.u.
217c0 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  i;.  sqlite3Vdbe
217d0 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a  MemRelease(&m);.
217e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
217f0 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  OK;..  /* Jump h
21800 65 72 65 20 69 66 20 64 61 74 61 62 61 73 65 20  ere if database 
21810 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65  corruption is de
21820 74 65 63 74 65 64 20 61 66 74 65 72 20 6d 20 68  tected after m h
21830 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c  as been.  ** all
21840 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20 74 68  ocated.  Free th
21850 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20 72  e m object and r
21860 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
21870 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77  RUPT. */.idx_row
21880 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a 20  id_corruption:. 
21890 20 74 65 73 74 63 61 73 65 28 20 6d 2e 73 7a 4d   testcase( m.szM
218a0 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71  alloc!=0 );.  sq
218b0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
218c0 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
218d0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
218e0 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _BKPT;.}../*.** 
218f0 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20  Compare the key 
21900 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
21910 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
21920 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  C is pointing to
21930 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20   against.** the 
21940 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70 55  key string in pU
21950 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74 65 20  npacked.  Write 
21960 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d  into *pRes a num
21970 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e  ber.** that is n
21980 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f  egative, zero, o
21990 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 43  r positive if pC
219a0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
219b0 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67  qual to,.** or g
219c0 72 65 61 74 65 72 20 74 68 61 6e 20 70 55 6e 70  reater than pUnp
219d0 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e 20 53  acked.  Return S
219e0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
219f0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61  ess..**.** pUnpa
21a00 63 6b 65 64 20 69 73 20 65 69 74 68 65 72 20 63  cked is either c
21a10 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 61  reated without a
21a20 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75   rowid or is tru
21a30 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 69  ncated so that i
21a40 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72  t.** omits the r
21a50 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e  owid at the end.
21a60 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 74    The rowid at t
21a70 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
21a80 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20  dex entry.** is 
21a90 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e  ignored as well.
21aa0 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72 6f    Hence, this ro
21ab0 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61  utine only compa
21ac0 72 65 73 20 74 68 65 20 70 72 65 66 69 78 65 73  res the prefixes
21ad0 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79 73   .** of the keys
21ae0 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69   prior to the fi
21af0 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74  nal rowid, not t
21b00 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a  he entire key..*
21b10 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
21b20 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a  eIdxKeyCompare(.
21b30 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
21b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b50 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
21b60 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56  onnection */.  V
21b70 64 62 65 43 75 72 73 6f 72 20 2a 70 43 2c 20 20  dbeCursor *pC,  
21b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b90 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  /* The cursor to
21ba0 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74   compare against
21bb0 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
21bc0 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c  cord *pUnpacked,
21bd0 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b         /* Unpack
21be0 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65  ed version of ke
21bf0 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20  y */.  int *res 
21c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c10 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
21c20 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
21c30 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29  result here */.)
21c40 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79  {.  i64 nCellKey
21c50 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
21c60 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
21c70 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73  ;.  Mem m;..  as
21c80 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79  sert( pC->eCurTy
21c90 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
21ca0 45 20 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 43  E );.  pCur = pC
21cb0 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20  ->uc.pCursor;.  
21cc0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
21cd0 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
21ce0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56 41  d(pCur) );.  VVA
21cf0 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69  _ONLY(rc =) sqli
21d00 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
21d10 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29  pCur, &nCellKey)
21d20 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
21d30 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20  SQLITE_OK );    
21d40 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61 79  /* pCur is alway
21d50 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69  s valid so KeySi
21d60 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a  ze cannot fail *
21d70 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20  /.  /* nCellKey 
21d80 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62  will always be b
21d90 65 74 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66  etween 0 and 0xf
21da0 66 66 66 66 66 66 66 20 62 65 63 61 75 73 65 20  fffffff because 
21db0 6f 66 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20  of the way.  ** 
21dc0 74 68 61 74 20 62 74 72 65 65 50 61 72 73 65 43  that btreeParseC
21dd0 65 6c 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c  ellPtr() and sql
21de0 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
21df0 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65  ) are implemente
21e00 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c  d */.  if( nCell
21e10 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b  Key<=0 || nCellK
21e20 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b  ey>0x7fffffff ){
21e30 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20  .    *res = 0;. 
21e40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
21e50 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
21e60 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
21e70 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20  MemInit(&m, db, 
21e80 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  0);.  rc = sqlit
21e90 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
21ea0 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32  ee(pCur, 0, (u32
21eb0 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d  )nCellKey, 1, &m
21ec0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
21ed0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
21ee0 7d 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74  }.  *res = sqlit
21ef0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
21f00 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55  are(m.n, m.z, pU
21f10 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69  npacked);.  sqli
21f20 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
21f30 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(&m);.  return 
21f40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
21f50 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
21f60 20 73 65 74 73 20 74 68 65 20 76 61 6c 75 65 20   sets the value 
21f70 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
21f80 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  y subsequent cal
21f90 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ls to.** sqlite3
21fa0 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68  _changes() on th
21fb0 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
21fc0 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64  e 'db'. .*/.void
21fd0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
21fe0 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
21ff0 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29  db, int nChange)
22000 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
22010 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
22020 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64  b->mutex) );.  d
22030 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68  b->nChange = nCh
22040 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74  ange;.  db->nTot
22050 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61  alChange += nCha
22060 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  nge;.}../*.** Se
22070 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20  t a flag in the 
22080 76 64 62 65 20 74 6f 20 75 70 64 61 74 65 20 74  vdbe to update t
22090 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
220a0 72 20 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e  r when it is fin
220b0 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73  alised.** or res
220c0 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
220d0 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e  te3VdbeCountChan
220e0 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  ges(Vdbe *v){.  
220f0 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d  v->changeCntOn =
22100 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72   1;.}../*.** Mar
22110 6b 20 65 76 65 72 79 20 70 72 65 70 61 72 65 64  k every prepared
22120 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f 63   statement assoc
22130 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74  iated with a dat
22140 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
22150 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e 0a  .** as expired..
22160 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65 64  **.** An expired
22170 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73   statement means
22180 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61 74   that recompilat
22190 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65  ion of the state
221a0 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d  ment is.** recom
221b0 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e 74  mend.  Statement
221c0 73 20 65 78 70 69 72 65 20 77 68 65 6e 20 74 68  s expire when th
221d0 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61 74  ings happen that
221e0 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70   make their.** p
221f0 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65  rograms obsolete
22200 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65 72  .  Removing user
22210 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f  -defined functio
22220 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a  ns or collating.
22230 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f 72  ** sequences, or
22240 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75 74   changing an aut
22250 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74  horization funct
22260 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70 65  ion are the type
22270 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74  s of.** things t
22280 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72 65  hat make prepare
22290 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62 73  d statements obs
222a0 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  olete..*/.void s
222b0 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
222c0 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 73  aredStatements(s
222d0 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56  qlite3 *db){.  V
222e0 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20  dbe *p;.  for(p 
222f0 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20  = db->pVdbe; p; 
22300 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
22310 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b   p->expired = 1;
22320 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
22330 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 61 73  turn the databas
22340 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
22350 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73  h the Vdbe..*/.s
22360 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33 56  qlite3 *sqlite3V
22370 64 62 65 44 62 28 56 64 62 65 20 2a 76 29 7b 0a  dbeDb(Vdbe *v){.
22380 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a    return v->db;.
22390 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
223a0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
223b0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74  sqlite3_value st
223c0 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69  ructure containi
223d0 6e 67 20 74 68 65 20 76 61 6c 75 65 20 62 6f 75  ng the value bou
223e0 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  nd.** parameter 
223f0 69 56 61 72 20 6f 66 20 56 4d 20 76 2e 20 45 78  iVar of VM v. Ex
22400 63 65 70 74 2c 20 69 66 20 74 68 65 20 76 61 6c  cept, if the val
22410 75 65 20 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c  ue is an SQL NUL
22420 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20  L, return .** 0 
22430 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73 73 20  instead. Unless 
22440 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c  it is NULL, appl
22450 79 20 61 66 66 69 6e 69 74 79 20 61 66 66 20 28  y affinity aff (
22460 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
22470 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74  E_AFF_*.** const
22480 61 6e 74 73 29 20 74 6f 20 74 68 65 20 76 61 6c  ants) to the val
22490 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ue before return
224a0 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ing it..**.** Th
224b0 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
224c0 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
224d0 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69  y the caller usi
224e0 6e 67 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  ng sqlite3ValueF
224f0 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65  ree()..*/.sqlite
22500 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33  3_value *sqlite3
22510 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75  VdbeGetBoundValu
22520 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  e(Vdbe *v, int i
22530 56 61 72 2c 20 75 38 20 61 66 66 29 7b 0a 20 20  Var, u8 aff){.  
22540 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29  assert( iVar>0 )
22550 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
22560 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d   Mem *pMem = &v-
22570 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20  >aVar[iVar-1];. 
22580 20 20 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d     if( 0==(pMem-
22590 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
225a0 6c 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  l) ){.      sqli
225b0 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 74 20  te3_value *pRet 
225c0 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
225d0 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  w(v->db);.      
225e0 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
225f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
22600 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52  emCopy((Mem *)pR
22610 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20  et, pMem);.     
22620 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 41     sqlite3ValueA
22630 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 52 65  pplyAffinity(pRe
22640 74 2c 20 61 66 66 2c 20 53 51 4c 49 54 45 5f 55  t, aff, SQLITE_U
22650 54 46 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TF8);.      }.  
22660 20 20 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b      return pRet;
22670 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
22680 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
22690 43 6f 6e 66 69 67 75 72 65 20 53 51 4c 20 76 61  Configure SQL va
226a0 72 69 61 62 6c 65 20 69 56 61 72 20 73 6f 20 74  riable iVar so t
226b0 68 61 74 20 62 69 6e 64 69 6e 67 20 61 20 6e 65  hat binding a ne
226c0 77 20 76 61 6c 75 65 20 74 6f 20 69 74 20 73 69  w value to it si
226d0 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69  gnals.** to sqli
226e0 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29  te3_reoptimize()
226f0 20 74 68 61 74 20 72 65 2d 70 72 65 70 61 72 69   that re-prepari
22700 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ng the statement
22710 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69   may result.** i
22720 6e 20 61 20 62 65 74 74 65 72 20 71 75 65 72 79  n a better query
22730 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73   plan..*/.void s
22740 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72  qlite3VdbeSetVar
22750 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e  mask(Vdbe *v, in
22760 74 20 69 56 61 72 29 7b 0a 20 20 61 73 73 65 72  t iVar){.  asser
22770 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69  t( iVar>0 );.  i
22780 66 28 20 69 56 61 72 3e 33 32 20 29 7b 0a 20 20  f( iVar>32 ){.  
22790 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30    v->expmask = 0
227a0 78 66 66 66 66 66 66 66 66 3b 0a 20 20 7d 65 6c  xffffffff;.  }el
227b0 73 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61  se{.    v->expma
227c0 73 6b 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c  sk |= ((u32)1 <<
227d0 20 28 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a   (iVar-1));.  }.
227e0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
227f0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
22800 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66  BLE./*.** Transf
22810 65 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  er error message
22820 20 74 65 78 74 20 66 72 6f 6d 20 61 6e 20 73 71   text from an sq
22830 6c 69 74 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d  lite3_vtab.zErrM
22840 73 67 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a  sg (text stored.
22850 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  ** in memory obt
22860 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
22870 65 33 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f 20  e3_malloc) into 
22880 61 20 56 64 62 65 2e 7a 45 72 72 4d 73 67 20 28  a Vdbe.zErrMsg (
22890 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69  text stored.** i
228a0 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
228b0 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62  d from sqlite3Db
228c0 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64  Malloc)..*/.void
228d0 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f   sqlite3VtabImpo
228e0 72 74 45 72 72 6d 73 67 28 56 64 62 65 20 2a 70  rtErrmsg(Vdbe *p
228f0 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  , sqlite3_vtab *
22900 70 56 74 61 62 29 7b 0a 20 20 69 66 28 20 70 56  pVtab){.  if( pV
22910 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a  tab->zErrMsg ){.
22920 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
22930 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 73 71 6c  = p->db;.    sql
22940 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
22950 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
22960 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c  p->zErrMsg = sql
22970 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
22980 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29   pVtab->zErrMsg)
22990 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
229a0 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  ee(pVtab->zErrMs
229b0 67 29 3b 0a 20 20 20 20 70 56 74 61 62 2d 3e 7a  g);.    pVtab->z
229c0 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a  ErrMsg = 0;.  }.
229d0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
229e0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
229f0 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20  ABLE */..#ifdef 
22a00 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
22a10 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 0a 2f 2a  EUPDATE_HOOK../*
22a20 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e  .** If the secon
22a30 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  d argument is no
22a40 74 20 4e 55 4c 4c 2c 20 72 65 6c 65 61 73 65 20  t NULL, release 
22a50 61 6e 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  any allocations 
22a60 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77  associated .** w
22a70 69 74 68 20 74 68 65 20 6d 65 6d 6f 72 79 20 63  ith the memory c
22a80 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 2d 3e 61  ells in the p->a
22a90 4d 65 6d 5b 5d 20 61 72 72 61 79 2e 20 41 6c 73  Mem[] array. Als
22aa0 6f 20 66 72 65 65 20 74 68 65 20 55 6e 70 61 63  o free the Unpac
22ab0 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72  kedRecord.** str
22ac0 75 63 74 75 72 65 20 69 74 73 65 6c 66 2c 20 75  ucture itself, u
22ad0 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72  sing sqlite3DbFr
22ae0 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ee()..**.** This
22af0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
22b00 64 20 74 6f 20 66 72 65 65 20 55 6e 70 61 63 6b  d to free Unpack
22b10 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75  edRecord structu
22b20 72 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  res allocated by
22b30 0a 2a 2a 20 74 68 65 20 76 64 62 65 55 6e 70 61  .** the vdbeUnpa
22b40 63 6b 52 65 63 6f 72 64 28 29 20 66 75 6e 63 74  ckRecord() funct
22b50 69 6f 6e 20 66 6f 75 6e 64 20 69 6e 20 76 64 62  ion found in vdb
22b60 65 61 70 69 2e 63 2e 0a 2a 2f 0a 73 74 61 74 69  eapi.c..*/.stati
22b70 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 55  c void vdbeFreeU
22b80 6e 70 61 63 6b 65 64 28 73 71 6c 69 74 65 33 20  npacked(sqlite3 
22b90 2a 64 62 2c 20 55 6e 70 61 63 6b 65 64 52 65 63  *db, UnpackedRec
22ba0 6f 72 64 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ord *p){.  if( p
22bb0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
22bc0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
22bd0 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20  >nField; i++){. 
22be0 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d       Mem *pMem =
22bf0 20 26 70 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20   &p->aMem[i];.  
22c00 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 4d      if( pMem->zM
22c10 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 56  alloc ) sqlite3V
22c20 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d  dbeMemRelease(pM
22c30 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  em);.    }.    s
22c40 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
22c50 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   p);.  }.}../*.*
22c60 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 70 72 65  * Invoke the pre
22c70 2d 75 70 64 61 74 65 20 68 6f 6f 6b 2e 20 49 66  -update hook. If
22c80 20 74 68 69 73 20 69 73 20 61 6e 20 55 50 44 41   this is an UPDA
22c90 54 45 20 6f 72 20 44 45 4c 45 54 45 20 70 72 65  TE or DELETE pre
22ca0 2d 75 70 64 61 74 65 20 63 61 6c 6c 2c 0a 2a 2a  -update call,.**
22cb0 20 74 68 65 6e 20 63 75 72 73 6f 72 20 70 61 73   then cursor pas
22cc0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
22cd0 64 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c  d argument shoul
22ce0 64 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72  d point to the r
22cf0 6f 77 20 61 62 6f 75 74 0a 2a 2a 20 74 6f 20 62  ow about.** to b
22d00 65 20 75 70 64 61 74 65 20 6f 72 20 64 65 6c 65  e update or dele
22d10 74 65 64 2e 20 49 66 20 74 68 65 20 61 70 70 6c  ted. If the appl
22d20 69 63 61 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71  ication calls sq
22d30 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f  lite3_preupdate_
22d40 6f 6c 64 28 29 2c 0a 2a 2a 20 74 68 65 20 72 65  old(),.** the re
22d50 71 75 69 72 65 64 20 76 61 6c 75 65 20 77 69 6c  quired value wil
22d60 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  l be read from t
22d70 68 65 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f  he row the curso
22d80 72 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a  r points to..*/.
22d90 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
22da0 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 28 0a 20  PreUpdateHook(. 
22db0 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
22dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22dd0 20 2f 2a 20 56 64 62 65 20 70 72 65 2d 75 70 64   /* Vdbe pre-upd
22de0 61 74 65 20 68 6f 6f 6b 20 69 73 20 69 6e 76 6f  ate hook is invo
22df0 6b 65 64 20 62 79 20 2a 2f 0a 20 20 56 64 62 65  ked by */.  Vdbe
22e00 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 20 20  Cursor *pCsr,   
22e10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
22e20 75 72 73 6f 72 20 74 6f 20 67 72 61 62 20 6f 6c  ursor to grab ol
22e30 64 2e 2a 20 76 61 6c 75 65 73 20 66 72 6f 6d 20  d.* values from 
22e40 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
22e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e60 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49       /* SQLITE_I
22e70 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72  NSERT, UPDATE or
22e80 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20 63 6f 6e   DELETE */.  con
22e90 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20  st char *zDb,   
22ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22eb0 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f  Database name */
22ec0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
22ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ee0 20 20 20 2f 2a 20 4d 6f 64 69 66 69 65 64 20 74     /* Modified t
22ef0 61 62 6c 65 20 2a 2f 0a 20 20 69 36 34 20 69 4b  able */.  i64 iK
22f00 65 79 31 2c 20 20 20 20 20 20 20 20 20 20 20 20  ey1,            
22f10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
22f20 74 69 61 6c 20 6b 65 79 20 76 61 6c 75 65 20 2a  tial key value *
22f30 2f 0a 20 20 69 6e 74 20 69 52 65 67 20 20 20 20  /.  int iReg    
22f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f50 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
22f60 66 6f 72 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64  for new.* record
22f70 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
22f80 20 2a 64 62 20 3d 20 76 2d 3e 64 62 3b 0a 20 20   *db = v->db;.  
22f90 69 36 34 20 69 4b 65 79 32 3b 0a 20 20 50 72 65  i64 iKey2;.  Pre
22fa0 55 70 64 61 74 65 20 70 72 65 75 70 64 61 74 65  Update preupdate
22fb0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
22fc0 7a 54 62 6c 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  zTbl = pTab->zNa
22fd0 6d 65 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  me;.  static con
22fe0 73 74 20 75 38 20 66 61 6b 65 53 6f 72 74 4f 72  st u8 fakeSortOr
22ff0 64 65 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  der = 0;..  asse
23000 72 74 28 20 64 62 2d 3e 70 50 72 65 55 70 64 61  rt( db->pPreUpda
23010 74 65 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65  te==0 );.  memse
23020 74 28 26 70 72 65 75 70 64 61 74 65 2c 20 30 2c  t(&preupdate, 0,
23030 20 73 69 7a 65 6f 66 28 50 72 65 55 70 64 61 74   sizeof(PreUpdat
23040 65 29 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 53  e));.  if( op==S
23050 51 4c 49 54 45 5f 55 50 44 41 54 45 20 29 7b 0a  QLITE_UPDATE ){.
23060 20 20 20 20 69 4b 65 79 32 20 3d 20 76 2d 3e 61      iKey2 = v->a
23070 4d 65 6d 5b 69 52 65 67 5d 2e 75 2e 69 3b 0a 20  Mem[iReg].u.i;. 
23080 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 4b 65 79   }else{.    iKey
23090 32 20 3d 20 69 4b 65 79 31 3b 0a 20 20 7d 0a 0a  2 = iKey1;.  }..
230a0 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e    assert( pCsr->
230b0 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43  nField==pTab->nC
230c0 6f 6c 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  ol .       || (p
230d0 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61  Csr->nField==pTa
230e0 62 2d 3e 6e 43 6f 6c 2b 31 20 26 26 20 6f 70 3d  b->nCol+1 && op=
230f0 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 26  =SQLITE_DELETE &
23100 26 20 69 52 65 67 3d 3d 2d 31 29 0a 20 20 29 3b  & iReg==-1).  );
23110 0a 0a 20 20 70 72 65 75 70 64 61 74 65 2e 76 20  ..  preupdate.v 
23120 3d 20 76 3b 0a 20 20 70 72 65 75 70 64 61 74 65  = v;.  preupdate
23130 2e 70 43 73 72 20 3d 20 70 43 73 72 3b 0a 20 20  .pCsr = pCsr;.  
23140 70 72 65 75 70 64 61 74 65 2e 6f 70 20 3d 20 6f  preupdate.op = o
23150 70 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69  p;.  preupdate.i
23160 4e 65 77 52 65 67 20 3d 20 69 52 65 67 3b 0a 20  NewReg = iReg;. 
23170 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e   preupdate.keyin
23180 66 6f 2e 64 62 20 3d 20 64 62 3b 0a 20 20 70 72  fo.db = db;.  pr
23190 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e  eupdate.keyinfo.
231a0 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
231b0 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e   preupdate.keyin
231c0 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 70 54 61 62  fo.nField = pTab
231d0 2d 3e 6e 43 6f 6c 3b 0a 20 20 70 72 65 75 70 64  ->nCol;.  preupd
231e0 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 61 53 6f 72  ate.keyinfo.aSor
231f0 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 66  tOrder = (u8*)&f
23200 61 6b 65 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20  akeSortOrder;.  
23210 70 72 65 75 70 64 61 74 65 2e 69 4b 65 79 31 20  preupdate.iKey1 
23220 3d 20 69 4b 65 79 31 3b 0a 20 20 70 72 65 75 70  = iKey1;.  preup
23230 64 61 74 65 2e 69 4b 65 79 32 20 3d 20 69 4b 65  date.iKey2 = iKe
23240 79 32 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e  y2;.  preupdate.
23250 69 50 4b 65 79 20 3d 20 70 54 61 62 2d 3e 69 50  iPKey = pTab->iP
23260 4b 65 79 3b 0a 0a 20 20 64 62 2d 3e 70 50 72 65  Key;..  db->pPre
23270 55 70 64 61 74 65 20 3d 20 26 70 72 65 75 70 64  Update = &preupd
23280 61 74 65 3b 0a 20 20 64 62 2d 3e 78 50 72 65 55  ate;.  db->xPreU
23290 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 28 64 62  pdateCallback(db
232a0 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72 67 2c  ->pPreUpdateArg,
232b0 20 64 62 2c 20 6f 70 2c 20 7a 44 62 2c 20 7a 54   db, op, zDb, zT
232c0 62 6c 2c 20 69 4b 65 79 31 2c 20 69 4b 65 79 32  bl, iKey1, iKey2
232d0 29 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64  );.  db->pPreUpd
232e0 61 74 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ate = 0;.  sqlit
232f0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 72 65  e3DbFree(db, pre
23300 75 70 64 61 74 65 2e 61 52 65 63 6f 72 64 29 3b  update.aRecord);
23310 0a 20 20 76 64 62 65 46 72 65 65 55 6e 70 61 63  .  vdbeFreeUnpac
23320 6b 65 64 28 64 62 2c 20 70 72 65 75 70 64 61 74  ked(db, preupdat
23330 65 2e 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20  e.pUnpacked);.  
23340 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65 64  vdbeFreeUnpacked
23350 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e 70  (db, preupdate.p
23360 4e 65 77 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20  NewUnpacked);.  
23370 69 66 28 20 70 72 65 75 70 64 61 74 65 2e 61 4e  if( preupdate.aN
23380 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ew ){.    int i;
23390 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
233a0 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b  pCsr->nField; i+
233b0 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
233c0 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
233d0 26 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77 5b  &preupdate.aNew[
233e0 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  i]);.    }.    s
233f0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
23400 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77 29   preupdate.aNew)
23410 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
23420 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
23430 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a  PREUPDATE_HOOK *
23440 2f 0a                                            /.