/ Hex Artifact Content
Login

Artifact 4c0678a2a2c315534a2609de515d04cccf3990fb:


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 52 61 77 28 64 62 2c  3DbMallocRaw(db,
02d0: 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20 29 3b   sizeof(Vdbe) );
02e0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
02f0: 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 73 65 74  turn 0;.  memset
0300: 28 26 70 2d 3e 61 4f 70 2c 20 30 2c 20 73 69 7a  (&p->aOp, 0, siz
0310: 65 6f 66 28 56 64 62 65 29 2d 6f 66 66 73 65 74  eof(Vdbe)-offset
0320: 6f 66 28 56 64 62 65 2c 61 4f 70 29 29 3b 0a 20  of(Vdbe,aOp));. 
0330: 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 69   p->db = db;.  i
0340: 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29 7b 0a  f( db->pVdbe ){.
0350: 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d 3e 70      db->pVdbe->p
0360: 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a 20 20  Prev = p;.  }.  
0370: 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 70  p->pNext = db->p
0380: 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72 65 76  Vdbe;.  p->pPrev
0390: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56 64 62   = 0;.  db->pVdb
03a0: 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61 67 69  e = p;.  p->magi
03b0: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  c = VDBE_MAGIC_I
03c0: 4e 49 54 3b 0a 20 20 70 2d 3e 70 50 61 72 73 65  NIT;.  p->pParse
03d0: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 61 73 73   = pParse;.  ass
03e0: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 61 4c 61  ert( pParse->aLa
03f0: 62 65 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  bel==0 );.  asse
0400: 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 4c 61 62  rt( pParse->nLab
0410: 65 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  el==0 );.  asser
0420: 74 28 20 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c  t( pParse->nOpAl
0430: 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  loc==0 );.  asse
0440: 72 74 28 20 70 50 61 72 73 65 2d 3e 73 7a 4f 70  rt( pParse->szOp
0450: 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 72 65  Alloc==0 );.  re
0460: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
0470: 20 43 68 61 6e 67 65 20 74 68 65 20 65 72 72 6f   Change the erro
0480: 72 20 73 74 72 69 6e 67 20 73 74 6f 72 65 64 20  r string stored 
0490: 69 6e 20 56 64 62 65 2e 7a 45 72 72 4d 73 67 0a  in Vdbe.zErrMsg.
04a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
04b0: 64 62 65 45 72 72 6f 72 28 56 64 62 65 20 2a 70  dbeError(Vdbe *p
04c0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
04d0: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
04e0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 73 71 6c  a_list ap;.  sql
04f0: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62  ite3DbFree(p->db
0500: 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
0510: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
0520: 6f 72 6d 61 74 29 3b 0a 20 20 70 2d 3e 7a 45 72  ormat);.  p->zEr
0530: 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 56 4d  rMsg = sqlite3VM
0540: 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46  Printf(p->db, zF
0550: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61  ormat, ap);.  va
0560: 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a  _end(ap);.}../*.
0570: 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20  ** Remember the 
0580: 53 51 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61  SQL string for a
0590: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
05a0: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
05b0: 69 74 65 33 56 64 62 65 53 65 74 53 71 6c 28 56  ite3VdbeSetSql(V
05c0: 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  dbe *p, const ch
05d0: 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e  ar *z, int n, in
05e0: 74 20 69 73 50 72 65 70 61 72 65 56 32 29 7b 0a  t isPrepareV2){.
05f0: 20 20 61 73 73 65 72 74 28 20 69 73 50 72 65 70    assert( isPrep
0600: 61 72 65 56 32 3d 3d 31 20 7c 7c 20 69 73 50 72  areV2==1 || isPr
0610: 65 70 61 72 65 56 32 3d 3d 30 20 29 3b 0a 20 20  epareV2==0 );.  
0620: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
0630: 6e 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  n;.#if defined(S
0640: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
0650: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
0660: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c  LITE_ENABLE_SQLL
0670: 4f 47 29 0a 20 20 69 66 28 20 21 69 73 50 72 65  OG).  if( !isPre
0680: 70 61 72 65 56 32 20 29 20 72 65 74 75 72 6e 3b  pareV2 ) return;
0690: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
06a0: 28 20 70 2d 3e 7a 53 71 6c 3d 3d 30 20 29 3b 0a  ( p->zSql==0 );.
06b0: 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 73 71 6c 69    p->zSql = sqli
06c0: 74 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e  te3DbStrNDup(p->
06d0: 64 62 2c 20 7a 2c 20 6e 29 3b 0a 20 20 70 2d 3e  db, z, n);.  p->
06e0: 69 73 50 72 65 70 61 72 65 56 32 20 3d 20 28 75  isPrepareV2 = (u
06f0: 38 29 69 73 50 72 65 70 61 72 65 56 32 3b 0a 7d  8)isPrepareV2;.}
0700: 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c  ../*.** Swap all
0710: 20 63 6f 6e 74 65 6e 74 20 62 65 74 77 65 65 6e   content between
0720: 20 74 77 6f 20 56 44 42 45 20 73 74 72 75 63 74   two VDBE struct
0730: 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ures..*/.void sq
0740: 6c 69 74 65 33 56 64 62 65 53 77 61 70 28 56 64  lite3VdbeSwap(Vd
0750: 62 65 20 2a 70 41 2c 20 56 64 62 65 20 2a 70 42  be *pA, Vdbe *pB
0760: 29 7b 0a 20 20 56 64 62 65 20 74 6d 70 2c 20 2a  ){.  Vdbe tmp, *
0770: 70 54 6d 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54  pTmp;.  char *zT
0780: 6d 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 41  mp;.  assert( pA
0790: 2d 3e 64 62 3d 3d 70 42 2d 3e 64 62 20 29 3b 0a  ->db==pB->db );.
07a0: 20 20 74 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 2a    tmp = *pA;.  *
07b0: 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 20  pA = *pB;.  *pB 
07c0: 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20  = tmp;.  pTmp = 
07d0: 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 41 2d  pA->pNext;.  pA-
07e0: 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70 4e 65  >pNext = pB->pNe
07f0: 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78 74 20  xt;.  pB->pNext 
0800: 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70 20 3d  = pTmp;.  pTmp =
0810: 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20 70 41   pA->pPrev;.  pA
0820: 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e 70 50  ->pPrev = pB->pP
0830: 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72 65 76  rev;.  pB->pPrev
0840: 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 20   = pTmp;.  zTmp 
0850: 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41  = pA->zSql;.  pA
0860: 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 71  ->zSql = pB->zSq
0870: 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20 3d 20  l;.  pB->zSql = 
0880: 7a 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73 50 72  zTmp;.  pB->isPr
0890: 65 70 61 72 65 56 32 20 3d 20 70 41 2d 3e 69 73  epareV2 = pA->is
08a0: 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f 2a  PrepareV2;.}../*
08b0: 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 56  .** Resize the V
08c0: 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73 6f  dbe.aOp array so
08d0: 20 74 68 61 74 20 69 74 20 69 73 20 61 74 20 6c   that it is at l
08e0: 65 61 73 74 20 6e 4f 70 20 65 6c 65 6d 65 6e 74  east nOp element
08f0: 73 20 6c 61 72 67 65 72 20 0a 2a 2a 20 74 68 61  s larger .** tha
0900: 6e 20 69 74 73 20 63 75 72 72 65 6e 74 20 73 69  n its current si
0910: 7a 65 2e 20 6e 4f 70 20 69 73 20 67 75 61 72 61  ze. nOp is guara
0920: 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 65 73 73  nteed to be less
0930: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
0940: 2a 20 74 6f 20 31 30 32 34 2f 73 69 7a 65 6f 66  * to 1024/sizeof
0950: 28 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  (Op)..**.** If a
0960: 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20  n out-of-memory 
0970: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
0980: 6c 65 20 72 65 73 69 7a 69 6e 67 20 74 68 65 20  le resizing the 
0990: 61 72 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a  array, return.**
09a0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49   SQLITE_NOMEM. I
09b0: 6e 20 74 68 69 73 20 63 61 73 65 20 56 64 62 65  n this case Vdbe
09c0: 2e 61 4f 70 20 61 6e 64 20 50 61 72 73 65 2e 6e  .aOp and Parse.n
09d0: 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a  OpAlloc remain .
09e0: 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 28 74 68  ** unchanged (th
09f0: 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 61 6e  is is so that an
0a00: 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61 64  y opcodes alread
0a10: 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20  y allocated can 
0a20: 62 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79  be .** correctly
0a30: 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f   deallocated alo
0a40: 6e 67 20 77 69 74 68 20 74 68 65 20 72 65 73 74  ng with the rest
0a50: 20 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a 2a   of the Vdbe)..*
0a60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 72 6f  /.static int gro
0a70: 77 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 76  wOpArray(Vdbe *v
0a80: 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 56 64  , int nOp){.  Vd
0a90: 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 50 61  beOp *pNew;.  Pa
0aa0: 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72  rse *p = v->pPar
0ab0: 73 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51  se;..  /* The SQ
0ac0: 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f  LITE_TEST_REALLO
0ad0: 43 5f 53 54 52 45 53 53 20 63 6f 6d 70 69 6c 65  C_STRESS compile
0ae0: 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20  -time option is 
0af0: 64 65 73 69 67 6e 65 64 20 74 6f 20 66 6f 72 63  designed to forc
0b00: 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 66 72 65 71  e.  ** more freq
0b10: 75 65 6e 74 20 72 65 61 6c 6c 6f 63 73 20 61 6e  uent reallocs an
0b20: 64 20 68 65 6e 63 65 20 70 72 6f 76 69 64 65 20  d hence provide 
0b30: 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 69  more opportuniti
0b40: 65 73 20 66 6f 72 20 0a 20 20 2a 2a 20 73 69 6d  es for .  ** sim
0b50: 75 6c 61 74 65 64 20 4f 4f 4d 20 66 61 75 6c 74  ulated OOM fault
0b60: 73 2e 20 20 53 51 4c 49 54 45 5f 54 45 53 54 5f  s.  SQLITE_TEST_
0b70: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 69  REALLOC_STRESS i
0b80: 73 20 67 65 6e 65 72 61 6c 6c 79 20 75 73 65 64  s generally used
0b90: 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 65 73  .  ** during tes
0ba0: 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 57 69 74 68  ting only.  With
0bb0: 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41   SQLITE_TEST_REA
0bc0: 4c 4c 4f 43 5f 53 54 52 45 53 53 20 67 72 6f 77  LLOC_STRESS grow
0bd0: 20 74 68 65 20 6f 70 20 61 72 72 61 79 0a 20 20   the op array.  
0be0: 2a 2a 20 62 79 20 74 68 65 20 6d 69 6e 69 6d 75  ** by the minimu
0bf0: 6d 2a 20 61 6d 6f 75 6e 74 20 72 65 71 75 69 72  m* amount requir
0c00: 65 64 20 75 6e 74 69 6c 20 74 68 65 20 73 69 7a  ed until the siz
0c10: 65 20 72 65 61 63 68 65 73 20 35 31 32 2e 20 20  e reaches 512.  
0c20: 4e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65 72  Normal.  ** oper
0c30: 61 74 69 6f 6e 20 28 77 69 74 68 6f 75 74 20 53  ation (without S
0c40: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
0c50: 4f 43 5f 53 54 52 45 53 53 29 20 69 73 20 74 6f  OC_STRESS) is to
0c60: 20 64 6f 75 62 6c 65 20 74 68 65 20 63 75 72 72   double the curr
0c70: 65 6e 74 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66  ent.  ** size of
0c80: 20 74 68 65 20 6f 70 20 61 72 72 61 79 20 6f 72   the op array or
0c90: 20 61 64 64 20 31 4b 42 20 6f 66 20 73 70 61 63   add 1KB of spac
0ca0: 65 2c 20 77 68 69 63 68 65 76 65 72 20 69 73 20  e, whichever is 
0cb0: 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66 64  smaller. */.#ifd
0cc0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52  ef SQLITE_TEST_R
0cd0: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 0a 20 20  EALLOC_STRESS.  
0ce0: 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e  int nNew = (p->n
0cf0: 4f 70 41 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20 70  OpAlloc>=512 ? p
0d00: 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 70  ->nOpAlloc*2 : p
0d10: 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 3b  ->nOpAlloc+nOp);
0d20: 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 6e 4e 65  .#else.  int nNe
0d30: 77 20 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63  w = (p->nOpAlloc
0d40: 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32   ? p->nOpAlloc*2
0d50: 20 3a 20 28 69 6e 74 29 28 31 30 32 34 2f 73 69   : (int)(1024/si
0d60: 7a 65 6f 66 28 4f 70 29 29 29 3b 0a 20 20 55 4e  zeof(Op)));.  UN
0d70: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
0d80: 4f 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  Op);.#endif..  a
0d90: 73 73 65 72 74 28 20 6e 4f 70 3c 3d 28 31 30 32  ssert( nOp<=(102
0da0: 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29 20 29 3b  4/sizeof(Op)) );
0db0: 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e  .  assert( nNew>
0dc0: 3d 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f  =(p->nOpAlloc+nO
0dd0: 70 29 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  p) );.  pNew = s
0de0: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
0df0: 70 2d 3e 64 62 2c 20 76 2d 3e 61 4f 70 2c 20 6e  p->db, v->aOp, n
0e00: 4e 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b  New*sizeof(Op));
0e10: 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
0e20: 20 20 20 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 20     p->szOpAlloc 
0e30: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
0e40: 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65  cSize(p->db, pNe
0e50: 77 29 3b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c  w);.    p->nOpAl
0e60: 6c 6f 63 20 3d 20 70 2d 3e 73 7a 4f 70 41 6c 6c  loc = p->szOpAll
0e70: 6f 63 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20  oc/sizeof(Op);. 
0e80: 20 20 20 76 2d 3e 61 4f 70 20 3d 20 70 4e 65 77     v->aOp = pNew
0e90: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
0ea0: 70 4e 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  pNew ? SQLITE_OK
0eb0: 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   : SQLITE_NOMEM_
0ec0: 42 4b 50 54 29 3b 0a 7d 0a 0a 23 69 66 64 65 66  BKPT);.}..#ifdef
0ed0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
0ee0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
0ef0: 20 6a 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65   just a convenie
0f00: 6e 74 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20  nt place to set 
0f10: 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 74 68 61  a breakpoint tha
0f20: 74 20 77 69 6c 6c 0a 2a 2a 20 66 69 72 65 20 61  t will.** fire a
0f30: 66 74 65 72 20 65 61 63 68 20 6f 70 63 6f 64 65  fter each opcode
0f40: 20 69 73 20 69 6e 73 65 72 74 65 64 20 61 6e 64   is inserted and
0f50: 20 64 69 73 70 6c 61 79 65 64 20 75 73 69 6e 67   displayed using
0f60: 0a 2a 2a 20 22 50 52 41 47 4d 41 20 76 64 62 65  .** "PRAGMA vdbe
0f70: 5f 61 64 64 6f 70 74 72 61 63 65 3d 6f 6e 22 2e  _addoptrace=on".
0f80: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
0f90: 74 65 73 74 5f 61 64 64 6f 70 5f 62 72 65 61 6b  test_addop_break
0fa0: 70 6f 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20 73  point(void){.  s
0fb0: 74 61 74 69 63 20 69 6e 74 20 6e 20 3d 20 30 3b  tatic int n = 0;
0fc0: 0a 20 20 6e 2b 2b 3b 0a 7d 0a 23 65 6e 64 69 66  .  n++;.}.#endif
0fd0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
0fe0: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  w instruction to
0ff0: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 73   the list of ins
1000: 74 72 75 63 74 69 6f 6e 73 20 63 75 72 72 65 6e  tructions curren
1010: 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45  t in the.** VDBE
1020: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 64  .  Return the ad
1030: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 77  dress of the new
1040: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
1050: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73 3a 0a  .** Parameters:.
1060: 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20 20 20  **.**    p      
1070: 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72           Pointer
1080: 20 74 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a   to the VDBE.**.
1090: 2a 2a 20 20 20 20 6f 70 20 20 20 20 20 20 20 20  **    op        
10a0: 20 20 20 20 20 20 54 68 65 20 6f 70 63 6f 64 65        The opcode
10b0: 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74 72 75   for this instru
10c0: 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70  ction.**.**    p
10d0: 31 2c 20 70 32 2c 20 70 33 20 20 20 20 20 20 4f  1, p2, p3      O
10e0: 70 65 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73  perands.**.** Us
10f0: 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  e the sqlite3Vdb
1100: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29 20  eResolveLabel() 
1110: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78 20  function to fix 
1120: 61 6e 20 61 64 64 72 65 73 73 20 61 6e 64 0a 2a  an address and.*
1130: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  * the sqlite3Vdb
1140: 65 43 68 61 6e 67 65 50 34 28 29 20 66 75 6e 63  eChangeP4() func
1150: 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20 74  tion to change t
1160: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
1170: 50 34 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a  P4.** operand..*
1180: 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
1190: 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 67 72 6f  NOINLINE int gro
11a0: 77 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e  wOp3(Vdbe *p, in
11b0: 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e  t op, int p1, in
11c0: 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20  t p2, int p3){. 
11d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61 72   assert( p->pPar
11e0: 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 70 2d  se->nOpAlloc<=p-
11f0: 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 67 72  >nOp );.  if( gr
1200: 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 31 29 20  owOpArray(p, 1) 
1210: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 61 73  ) return 1;.  as
1220: 73 65 72 74 28 20 70 2d 3e 70 50 61 72 73 65 2d  sert( p->pParse-
1230: 3e 6e 4f 70 41 6c 6c 6f 63 3e 70 2d 3e 6e 4f 70  >nOpAlloc>p->nOp
1240: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
1250: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
1260: 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33  , op, p1, p2, p3
1270: 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
1280: 56 64 62 65 41 64 64 4f 70 33 28 56 64 62 65 20  VdbeAddOp3(Vdbe 
1290: 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
12a0: 70 31 2c 20 69 6e 74 20 70 32 2c 20 69 6e 74 20  p1, int p2, int 
12b0: 70 33 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  p3){.  int i;.  
12c0: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20  VdbeOp *pOp;..  
12d0: 69 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73  i = p->nOp;.  as
12e0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
12f0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
1300: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3e  );.  assert( op>
1310: 3d 30 20 26 26 20 6f 70 3c 30 78 66 66 20 29 3b  =0 && op<0xff );
1320: 0a 20 20 69 66 28 20 70 2d 3e 70 50 61 72 73 65  .  if( p->pParse
1330: 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29 7b  ->nOpAlloc<=i ){
1340: 0a 20 20 20 20 72 65 74 75 72 6e 20 67 72 6f 77  .    return grow
1350: 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70  Op3(p, op, p1, p
1360: 32 2c 20 70 33 29 3b 0a 20 20 7d 0a 20 20 70 2d  2, p3);.  }.  p-
1370: 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20  >nOp++;.  pOp = 
1380: 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f  &p->aOp[i];.  pO
1390: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38 29  p->opcode = (u8)
13a0: 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d 20  op;.  pOp->p5 = 
13b0: 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70  0;.  pOp->p1 = p
13c0: 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70  1;.  pOp->p2 = p
13d0: 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 70  2;.  pOp->p3 = p
13e0: 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  3;.  pOp->p4.p =
13f0: 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70   0;.  pOp->p4typ
1400: 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a  e = P4_NOTUSED;.
1410: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1420: 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d  ABLE_EXPLAIN_COM
1430: 4d 45 4e 54 53 0a 20 20 70 4f 70 2d 3e 7a 43 6f  MENTS.  pOp->zCo
1440: 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  mment = 0;.#endi
1450: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
1460: 44 45 42 55 47 0a 20 20 69 66 28 20 70 2d 3e 64  DEBUG.  if( p->d
1470: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
1480: 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65  E_VdbeAddopTrace
1490: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 6a 2c 20   ){.    int jj, 
14a0: 6b 6b 3b 0a 20 20 20 20 50 61 72 73 65 20 2a 70  kk;.    Parse *p
14b0: 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73  Parse = p->pPars
14c0: 65 3b 0a 20 20 20 20 66 6f 72 28 6a 6a 3d 6b 6b  e;.    for(jj=kk
14d0: 3d 30 3b 20 6a 6a 3c 70 50 61 72 73 65 2d 3e 6e  =0; jj<pParse->n
14e0: 43 6f 6c 43 61 63 68 65 3b 20 6a 6a 2b 2b 29 7b  ColCache; jj++){
14f0: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 79 43  .      struct yC
1500: 6f 6c 43 61 63 68 65 20 2a 78 20 3d 20 70 50 61  olCache *x = pPa
1510: 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 20 2b  rse->aColCache +
1520: 20 6a 6a 3b 0a 20 20 20 20 20 20 70 72 69 6e 74   jj;.      print
1530: 66 28 22 20 72 5b 25 64 5d 3d 7b 25 64 3a 25 64  f(" r[%d]={%d:%d
1540: 7d 22 2c 20 78 2d 3e 69 52 65 67 2c 20 78 2d 3e  }", x->iReg, x->
1550: 69 54 61 62 6c 65 2c 20 78 2d 3e 69 43 6f 6c 75  iTable, x->iColu
1560: 6d 6e 29 3b 0a 20 20 20 20 20 20 6b 6b 2b 2b 3b  mn);.      kk++;
1570: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6b  .    }.    if( k
1580: 6b 20 29 20 70 72 69 6e 74 66 28 22 5c 6e 22 29  k ) printf("\n")
1590: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15a0: 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20 26  ePrintOp(0, i, &
15b0: 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20  p->aOp[i]);.    
15c0: 74 65 73 74 5f 61 64 64 6f 70 5f 62 72 65 61 6b  test_addop_break
15d0: 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 0a 23 65 6e  point();.  }.#en
15e0: 64 69 66 0a 23 69 66 64 65 66 20 56 44 42 45 5f  dif.#ifdef VDBE_
15f0: 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70 2d 3e 63  PROFILE.  pOp->c
1600: 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 70 4f 70  ycles = 0;.  pOp
1610: 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  ->cnt = 0;.#endi
1620: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
1630: 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 20 20  VDBE_COVERAGE.  
1640: 70 4f 70 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20  pOp->iSrcLine = 
1650: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  0;.#endif.  retu
1660: 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  rn i;.}.int sqli
1670: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 56 64  te3VdbeAddOp0(Vd
1680: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 29 7b 0a  be *p, int op){.
1690: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
16a0: 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70  VdbeAddOp3(p, op
16b0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e  , 0, 0, 0);.}.in
16c0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
16d0: 4f 70 31 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op1(Vdbe *p, int
16e0: 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b 0a 20 20   op, int p1){.  
16f0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
1700: 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20  beAddOp3(p, op, 
1710: 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74  p1, 0, 0);.}.int
1720: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1730: 70 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  p2(Vdbe *p, int 
1740: 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20  op, int p1, int 
1750: 70 32 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  p2){.  return sq
1760: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1770: 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 30  p, op, p1, p2, 0
1780: 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74  );.}../* Generat
1790: 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20 75 6e  e code for an un
17a0: 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 6a 75 6d 70  conditional jump
17b0: 20 74 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   to instruction 
17c0: 69 44 65 73 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c  iDest.*/.int sql
17d0: 69 74 65 33 56 64 62 65 47 6f 74 6f 28 56 64 62  ite3VdbeGoto(Vdb
17e0: 65 20 2a 70 2c 20 69 6e 74 20 69 44 65 73 74 29  e *p, int iDest)
17f0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
1800: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
1810: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 44 65 73  OP_Goto, 0, iDes
1820: 74 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e  t, 0);.}../* Gen
1830: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63 61  erate code to ca
1840: 75 73 65 20 74 68 65 20 73 74 72 69 6e 67 20 7a  use the string z
1850: 53 74 72 20 74 6f 20 62 65 20 6c 6f 61 64 65 64  Str to be loaded
1860: 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69 73 74 65   into.** registe
1870: 72 20 69 44 65 73 74 0a 2a 2f 0a 69 6e 74 20 73  r iDest.*/.int s
1880: 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74  qlite3VdbeLoadSt
1890: 72 69 6e 67 28 56 64 62 65 20 2a 70 2c 20 69 6e  ring(Vdbe *p, in
18a0: 74 20 69 44 65 73 74 2c 20 63 6f 6e 73 74 20 63  t iDest, const c
18b0: 68 61 72 20 2a 7a 53 74 72 29 7b 0a 20 20 72 65  har *zStr){.  re
18c0: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
18d0: 41 64 64 4f 70 34 28 70 2c 20 4f 50 5f 53 74 72  AddOp4(p, OP_Str
18e0: 69 6e 67 38 2c 20 30 2c 20 69 44 65 73 74 2c 20  ing8, 0, iDest, 
18f0: 30 2c 20 7a 53 74 72 2c 20 30 29 3b 0a 7d 0a 0a  0, zStr, 0);.}..
1900: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1910: 6f 64 65 20 74 68 61 74 20 69 6e 69 74 69 61 6c  ode that initial
1920: 69 7a 65 73 20 6d 75 6c 74 69 70 6c 65 20 72 65  izes multiple re
1930: 67 69 73 74 65 72 73 20 74 6f 20 73 74 72 69 6e  gisters to strin
1940: 67 20 6f 72 20 69 6e 74 65 67 65 72 0a 2a 2a 20  g or integer.** 
1950: 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68 65 20  constants.  The 
1960: 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 20  registers begin 
1970: 77 69 74 68 20 69 44 65 73 74 20 61 6e 64 20 69  with iDest and i
1980: 6e 63 72 65 61 73 65 20 63 6f 6e 73 65 63 75 74  ncrease consecut
1990: 69 76 65 6c 79 2e 0a 2a 2a 20 4f 6e 65 20 72 65  ively..** One re
19a0: 67 69 73 74 65 72 20 69 73 20 69 6e 69 74 69 61  gister is initia
19b0: 6c 69 7a 65 64 20 66 6f 72 20 65 61 63 68 20 63  lized for each c
19c0: 68 61 72 61 63 67 74 65 72 20 69 6e 20 7a 54 79  haracgter in zTy
19d0: 70 65 73 5b 5d 2e 20 20 46 6f 72 20 65 61 63 68  pes[].  For each
19e0: 0a 2a 2a 20 22 73 22 20 63 68 61 72 61 63 74 65  .** "s" characte
19f0: 72 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2c 20 74  r in zTypes[], t
1a00: 68 65 20 72 65 67 69 73 74 65 72 20 69 73 20 61  he register is a
1a10: 20 73 74 72 69 6e 67 20 69 66 20 74 68 65 20 61   string if the a
1a20: 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20 6e 6f  rgument is.** no
1a30: 74 20 4e 55 4c 4c 2c 20 6f 72 20 4f 50 5f 4e 75  t NULL, or OP_Nu
1a40: 6c 6c 20 69 66 20 74 68 65 20 76 61 6c 75 65 20  ll if the value 
1a50: 69 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65  is a null pointe
1a60: 72 2e 20 20 46 6f 72 20 65 61 63 68 20 22 69 22  r.  For each "i"
1a70: 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e   character.** in
1a80: 20 7a 54 79 70 65 73 5b 5d 2c 20 74 68 65 20 72   zTypes[], the r
1a90: 65 67 69 73 74 65 72 20 69 73 20 69 6e 69 74 69  egister is initi
1aa0: 61 6c 69 7a 65 64 20 74 6f 20 61 6e 20 69 6e 74  alized to an int
1ab0: 65 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eger..*/.void sq
1ac0: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
1ad0: 61 64 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ad(Vdbe *p, int 
1ae0: 69 44 65 73 74 2c 20 63 6f 6e 73 74 20 63 68 61  iDest, const cha
1af0: 72 20 2a 7a 54 79 70 65 73 2c 20 2e 2e 2e 29 7b  r *zTypes, ...){
1b00: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
1b10: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 63   int i;.  char c
1b20: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
1b30: 20 7a 54 79 70 65 73 29 3b 0a 20 20 66 6f 72 28   zTypes);.  for(
1b40: 69 3d 30 3b 20 28 63 20 3d 20 7a 54 79 70 65 73  i=0; (c = zTypes
1b50: 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20  [i])!=0; i++){. 
1b60: 20 20 20 69 66 28 20 63 3d 3d 27 73 27 20 29 7b     if( c=='s' ){
1b70: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
1b80: 72 20 2a 7a 20 3d 20 76 61 5f 61 72 67 28 61 70  r *z = va_arg(ap
1b90: 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  , const char*);.
1ba0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1bb0: 65 41 64 64 4f 70 34 28 70 2c 20 7a 3d 3d 30 20  eAddOp4(p, z==0 
1bc0: 3f 20 4f 50 5f 4e 75 6c 6c 20 3a 20 4f 50 5f 53  ? OP_Null : OP_S
1bd0: 74 72 69 6e 67 38 2c 20 30 2c 20 69 44 65 73 74  tring8, 0, iDest
1be0: 2b 2b 2c 20 30 2c 20 7a 2c 20 30 29 3b 0a 20 20  ++, 0, z, 0);.  
1bf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
1c00: 73 73 65 72 74 28 20 63 3d 3d 27 69 27 20 29 3b  ssert( c=='i' );
1c10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1c20: 62 65 41 64 64 4f 70 32 28 70 2c 20 4f 50 5f 49  beAddOp2(p, OP_I
1c30: 6e 74 65 67 65 72 2c 20 76 61 5f 61 72 67 28 61  nteger, va_arg(a
1c40: 70 2c 20 69 6e 74 29 2c 20 69 44 65 73 74 2b 2b  p, int), iDest++
1c50: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76  );.    }.  }.  v
1c60: 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a  a_end(ap);.}../*
1c70: 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64  .** Add an opcod
1c80: 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20  e that includes 
1c90: 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73 20  the p4 value as 
1ca0: 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e  a pointer..*/.in
1cb0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
1cc0: 4f 70 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  Op4(.  Vdbe *p, 
1cd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
1ce0: 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20  d the opcode to 
1cf0: 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74  this VM */.  int
1d00: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
1d10: 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f   /* The new opco
1d20: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20  de */.  int p1, 
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1d40: 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f  he P1 operand */
1d50: 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20  .  int p2,      
1d60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32         /* The P2
1d70: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
1d80: 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20  t p3,           
1d90: 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72    /* The P3 oper
1da0: 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  and */.  const c
1db0: 68 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20  har *zP4,    /* 
1dc0: 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a  The P4 operand *
1dd0: 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20 20  /.  int p4type  
1de0: 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70          /* P4 op
1df0: 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b  erand type */.){
1e00: 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71  .  int addr = sq
1e10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1e20: 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70  p, op, p1, p2, p
1e30: 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  3);.  sqlite3Vdb
1e40: 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64  eChangeP4(p, add
1e50: 72 2c 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b  r, zP4, p4type);
1e60: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
1e70: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  }../*.** Add an 
1e80: 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c  opcode that incl
1e90: 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c 75  udes the p4 valu
1ea0: 65 20 77 69 74 68 20 61 20 50 34 5f 49 4e 54 36  e with a P4_INT6
1eb0: 34 20 6f 72 0a 2a 2a 20 50 34 5f 52 45 41 4c 20  4 or.** P4_REAL 
1ec0: 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  type..*/.int sql
1ed0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75  ite3VdbeAddOp4Du
1ee0: 70 38 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  p8(.  Vdbe *p,  
1ef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1f00: 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74   the opcode to t
1f10: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
1f20: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
1f30: 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64  /* The new opcod
1f40: 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20  e */.  int p1,  
1f50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1f60: 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P1 operand */.
1f70: 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20    int p2,       
1f80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20        /* The P2 
1f90: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1fa0: 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20   p3,            
1fb0: 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61   /* The P3 opera
1fc0: 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  nd */.  const u8
1fd0: 20 2a 7a 50 34 2c 20 20 20 20 20 20 2f 2a 20 54   *zP4,      /* T
1fe0: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f  he P4 operand */
1ff0: 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20  .  int p4type   
2000: 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65         /* P4 ope
2010: 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a  rand type */.){.
2020: 20 20 63 68 61 72 20 2a 70 34 63 6f 70 79 20 3d    char *p4copy =
2030: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
2040: 52 61 77 4e 4e 28 73 71 6c 69 74 65 33 56 64 62  RawNN(sqlite3Vdb
2050: 65 44 62 28 70 29 2c 20 38 29 3b 0a 20 20 69 66  eDb(p), 8);.  if
2060: 28 20 70 34 63 6f 70 79 20 29 20 6d 65 6d 63 70  ( p4copy ) memcp
2070: 79 28 70 34 63 6f 70 79 2c 20 7a 50 34 2c 20 38  y(p4copy, zP4, 8
2080: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
2090: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c  te3VdbeAddOp4(p,
20a0: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 2c   op, p1, p2, p3,
20b0: 20 70 34 63 6f 70 79 2c 20 70 34 74 79 70 65 29   p4copy, p4type)
20c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
20d0: 6e 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61  n OP_ParseSchema
20e0: 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72   opcode.  This r
20f0: 6f 75 74 69 6e 65 20 69 73 20 62 72 6f 6b 65 6e  outine is broken
2100: 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c   out from.** sql
2110: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 29  ite3VdbeAddOp4()
2120: 20 73 69 6e 63 65 20 69 74 20 6e 65 65 64 73 20   since it needs 
2130: 74 6f 20 61 6c 73 6f 20 6e 65 65 64 73 20 74 6f  to also needs to
2140: 20 6d 61 72 6b 20 61 6c 6c 20 62 74 72 65 65 73   mark all btrees
2150: 0a 2a 2a 20 61 73 20 68 61 76 69 6e 67 20 62 65  .** as having be
2160: 65 6e 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  en used..**.** T
2170: 68 65 20 7a 57 68 65 72 65 20 73 74 72 69 6e 67  he zWhere string
2180: 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
2190: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
21a0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
21b0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
21c0: 77 69 6c 6c 20 74 61 6b 65 20 6f 77 6e 65 72 73  will take owners
21d0: 68 69 70 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63  hip of the alloc
21e0: 61 74 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  ated memory..*/.
21f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
2200: 41 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70  AddParseSchemaOp
2210: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44  (Vdbe *p, int iD
2220: 62 2c 20 63 68 61 72 20 2a 7a 57 68 65 72 65 29  b, char *zWhere)
2230: 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 73 71 6c  {.  int j;.  sql
2240: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70  ite3VdbeAddOp4(p
2250: 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61  , OP_ParseSchema
2260: 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 7a 57 68  , iDb, 0, 0, zWh
2270: 65 72 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  ere, P4_DYNAMIC)
2280: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70  ;.  for(j=0; j<p
2290: 2d 3e 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 20  ->db->nDb; j++) 
22a0: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
22b0: 74 72 65 65 28 70 2c 20 6a 29 3b 0a 7d 0a 0a 2f  tree(p, j);.}../
22c0: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f  *.** Add an opco
22d0: 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73  de that includes
22e0: 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73   the p4 value as
22f0: 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a   an integer..*/.
2300: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
2310: 64 64 4f 70 34 49 6e 74 28 0a 20 20 56 64 62 65  ddOp4Int(.  Vdbe
2320: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
2330: 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64  /* Add the opcod
2340: 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a  e to this VM */.
2350: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
2360: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77        /* The new
2370: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74   opcode */.  int
2380: 20 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20   p1,            
2390: 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61   /* The P1 opera
23a0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20  nd */.  int p2, 
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
23c0: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f  he P2 operand */
23d0: 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20  .  int p3,      
23e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33         /* The P3
23f0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
2400: 74 20 70 34 20 20 20 20 20 20 20 20 20 20 20 20  t p4            
2410: 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72    /* The P4 oper
2420: 61 6e 64 20 61 73 20 61 6e 20 69 6e 74 65 67 65  and as an intege
2430: 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64  r */.){.  int ad
2440: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
2450: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31  AddOp3(p, op, p1
2460: 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 73 71 6c  , p2, p3);.  sql
2470: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
2480: 28 70 2c 20 61 64 64 72 2c 20 53 51 4c 49 54 45  (p, addr, SQLITE
2490: 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 70 34 29 2c  _INT_TO_PTR(p4),
24a0: 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 72 65   P4_INT32);.  re
24b0: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
24c0: 20 49 6e 73 65 72 74 20 74 68 65 20 65 6e 64 20   Insert the end 
24d0: 6f 66 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 0a  of a co-routine.
24e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
24f0: 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28  dbeEndCoroutine(
2500: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 72 65 67  Vdbe *v, int reg
2510: 59 69 65 6c 64 29 7b 0a 20 20 73 71 6c 69 74 65  Yield){.  sqlite
2520: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2530: 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20  P_EndCoroutine, 
2540: 72 65 67 59 69 65 6c 64 29 3b 0a 0a 20 20 2f 2a  regYield);..  /*
2550: 20 43 6c 65 61 72 20 74 68 65 20 74 65 6d 70 6f   Clear the tempo
2560: 72 61 72 79 20 72 65 67 69 73 74 65 72 20 63 61  rary register ca
2570: 63 68 65 2c 20 74 68 65 72 65 62 79 20 65 6e 73  che, thereby ens
2580: 75 72 69 6e 67 20 74 68 61 74 20 65 61 63 68 0a  uring that each.
2590: 20 20 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 20    ** co-routine 
25a0: 68 61 73 20 69 74 73 20 6f 77 6e 20 69 6e 64 65  has its own inde
25b0: 70 65 6e 64 65 6e 74 20 73 65 74 20 6f 66 20 72  pendent set of r
25c0: 65 67 69 73 74 65 72 73 2c 20 62 65 63 61 75 73  egisters, becaus
25d0: 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 0a 20 20  e co-routines.  
25e0: 2a 2a 20 6d 69 67 68 74 20 65 78 70 65 63 74 20  ** might expect 
25f0: 74 68 65 69 72 20 72 65 67 69 73 74 65 72 73 20  their registers 
2600: 74 6f 20 62 65 20 70 72 65 73 65 72 76 65 64 20  to be preserved 
2610: 61 63 72 6f 73 73 20 61 6e 20 4f 50 5f 59 69 65  across an OP_Yie
2620: 6c 64 2c 20 61 6e 64 0a 20 20 2a 2a 20 74 68 61  ld, and.  ** tha
2630: 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 70 72  t could cause pr
2640: 6f 62 6c 65 6d 73 20 69 66 20 74 77 6f 20 6f 72  oblems if two or
2650: 20 6d 6f 72 65 20 63 6f 2d 72 6f 75 74 69 6e 65   more co-routine
2660: 73 20 61 72 65 20 75 73 69 6e 67 20 74 68 65 20  s are using the 
2670: 73 61 6d 65 0a 20 20 2a 2a 20 74 65 6d 70 6f 72  same.  ** tempor
2680: 61 72 79 20 72 65 67 69 73 74 65 72 2e 0a 20 20  ary register..  
2690: 2a 2f 0a 20 20 76 2d 3e 70 50 61 72 73 65 2d 3e  */.  v->pParse->
26a0: 6e 54 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  nTempReg = 0;.  
26b0: 76 2d 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67  v->pParse->nRang
26c0: 65 52 65 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  eReg = 0;.}../*.
26d0: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
26e0: 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 66  symbolic label f
26f0: 6f 72 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  or an instructio
2700: 6e 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74  n that has yet t
2710: 6f 20 62 65 0a 2a 2a 20 63 6f 64 65 64 2e 20 20  o be.** coded.  
2720: 54 68 65 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62  The symbolic lab
2730: 65 6c 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73  el is really jus
2740: 74 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  t a negative num
2750: 62 65 72 2e 20 20 54 68 65 0a 2a 2a 20 6c 61 62  ber.  The.** lab
2760: 65 6c 20 63 61 6e 20 62 65 20 75 73 65 64 20 61  el can be used a
2770: 73 20 74 68 65 20 50 32 20 76 61 6c 75 65 20 6f  s the P2 value o
2780: 66 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20  f an operation. 
2790: 20 4c 61 74 65 72 2c 20 77 68 65 6e 0a 2a 2a 20   Later, when.** 
27a0: 74 68 65 20 6c 61 62 65 6c 20 69 73 20 72 65 73  the label is res
27b0: 6f 6c 76 65 64 20 74 6f 20 61 20 73 70 65 63 69  olved to a speci
27c0: 66 69 63 20 61 64 64 72 65 73 73 2c 20 74 68 65  fic address, the
27d0: 20 56 44 42 45 20 77 69 6c 6c 20 73 63 61 6e 0a   VDBE will scan.
27e0: 2a 2a 20 74 68 72 6f 75 67 68 20 69 74 73 20 6f  ** through its o
27f0: 70 65 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e  peration list an
2800: 64 20 63 68 61 6e 67 65 20 61 6c 6c 20 76 61 6c  d change all val
2810: 75 65 73 20 6f 66 20 50 32 20 77 68 69 63 68 20  ues of P2 which 
2820: 6d 61 74 63 68 0a 2a 2a 20 74 68 65 20 6c 61 62  match.** the lab
2830: 65 6c 20 69 6e 74 6f 20 74 68 65 20 72 65 73 6f  el into the reso
2840: 6c 76 65 64 20 61 64 64 72 65 73 73 2e 0a 2a 2a  lved address..**
2850: 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 6b 6e 6f  .** The VDBE kno
2860: 77 73 20 74 68 61 74 20 61 20 50 32 20 76 61 6c  ws that a P2 val
2870: 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 62 65  ue is a label be
2880: 63 61 75 73 65 20 6c 61 62 65 6c 73 20 61 72 65  cause labels are
2890: 0a 2a 2a 20 61 6c 77 61 79 73 20 6e 65 67 61 74  .** always negat
28a0: 69 76 65 20 61 6e 64 20 50 32 20 76 61 6c 75 65  ive and P2 value
28b0: 73 20 61 72 65 20 73 75 70 70 6f 73 65 20 74 6f  s are suppose to
28c0: 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   be non-negative
28d0: 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6e 65  ..** Hence, a ne
28e0: 67 61 74 69 76 65 20 50 32 20 76 61 6c 75 65 20  gative P2 value 
28f0: 69 73 20 61 20 6c 61 62 65 6c 20 74 68 61 74 20  is a label that 
2900: 68 61 73 20 79 65 74 20 74 6f 20 62 65 20 72 65  has yet to be re
2910: 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65  solved..**.** Ze
2920: 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ro is returned i
2930: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  f a malloc() fai
2940: 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ls..*/.int sqlit
2950: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
2960: 56 64 62 65 20 2a 76 29 7b 0a 20 20 50 61 72 73  Vdbe *v){.  Pars
2970: 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65  e *p = v->pParse
2980: 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 2d 3e 6e  ;.  int i = p->n
2990: 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72  Label++;.  asser
29a0: 74 28 20 76 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( v->magic==VDB
29b0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
29c0: 20 20 69 66 28 20 28 69 20 26 20 28 69 2d 31 29    if( (i & (i-1)
29d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 61  )==0 ){.    p->a
29e0: 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 44  Label = sqlite3D
29f0: 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70  bReallocOrFree(p
2a00: 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c  ->db, p->aLabel,
2a10: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a30: 20 20 20 20 20 20 20 20 20 28 69 2a 32 2b 31 29           (i*2+1)
2a40: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65  *sizeof(p->aLabe
2a50: 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66  l[0]));.  }.  if
2a60: 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20  ( p->aLabel ){. 
2a70: 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20     p->aLabel[i] 
2a80: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = -1;.  }.  retu
2a90: 72 6e 20 41 44 44 52 28 69 29 3b 0a 7d 0a 0a 2f  rn ADDR(i);.}../
2aa0: 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62  *.** Resolve lab
2ab0: 65 6c 20 22 78 22 20 74 6f 20 62 65 20 74 68 65  el "x" to be the
2ac0: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
2ad0: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
2ae0: 20 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74   to.** be insert
2af0: 65 64 2e 20 20 54 68 65 20 70 61 72 61 6d 65 74  ed.  The paramet
2b00: 65 72 20 22 78 22 20 6d 75 73 74 20 68 61 76 65  er "x" must have
2b10: 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66   been obtained f
2b20: 72 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63  rom.** a prior c
2b30: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64  all to sqlite3Vd
2b40: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a  beMakeLabel()..*
2b50: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
2b60: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56  beResolveLabel(V
2b70: 64 62 65 20 2a 76 2c 20 69 6e 74 20 78 29 7b 0a  dbe *v, int x){.
2b80: 20 20 50 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e    Parse *p = v->
2b90: 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 6a 20  pParse;.  int j 
2ba0: 3d 20 41 44 44 52 28 78 29 3b 0a 20 20 61 73 73  = ADDR(x);.  ass
2bb0: 65 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d 3d 56  ert( v->magic==V
2bc0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
2bd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3c 70 2d  ;.  assert( j<p-
2be0: 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 61 73 73  >nLabel );.  ass
2bf0: 65 72 74 28 20 6a 3e 3d 30 20 29 3b 0a 20 20 69  ert( j>=0 );.  i
2c00: 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a  f( p->aLabel ){.
2c10: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d      p->aLabel[j]
2c20: 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d   = v->nOp;.  }.}
2c30: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65  ../*.** Mark the
2c40: 20 56 44 42 45 20 61 73 20 6f 6e 65 20 74 68 61   VDBE as one tha
2c50: 74 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75  t can only be ru
2c60: 6e 20 6f 6e 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76  n one time..*/.v
2c70: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
2c80: 75 6e 4f 6e 6c 79 4f 6e 63 65 28 56 64 62 65 20  unOnlyOnce(Vdbe 
2c90: 2a 70 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c  *p){.  p->runOnl
2ca0: 79 4f 6e 63 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  yOnce = 1;.}../*
2cb0: 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42  .** Mark the VDB
2cc0: 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61  E as one that ca
2cd0: 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6d 75  n only be run mu
2ce0: 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e 0a 2a 2f  ltiple times..*/
2cf0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
2d00: 65 52 65 75 73 61 62 6c 65 28 56 64 62 65 20 2a  eReusable(Vdbe *
2d10: 70 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79  p){.  p->runOnly
2d20: 4f 6e 63 65 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66  Once = 0;.}..#if
2d30: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2d40: 20 2f 2a 20 73 71 6c 69 74 65 33 41 73 73 65 72   /* sqlite3Asser
2d50: 74 4d 61 79 41 62 6f 72 74 28 29 20 6c 6f 67 69  tMayAbort() logi
2d60: 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c */../*.** The 
2d70: 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 61  following type a
2d80: 6e 64 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20  nd function are 
2d90: 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  used to iterate 
2da0: 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f  through all opco
2db0: 64 65 73 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65  des.** in a Vdbe
2dc0: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e   main program an
2dd0: 64 20 65 61 63 68 20 6f 66 20 74 68 65 20 73 75  d each of the su
2de0: 62 2d 70 72 6f 67 72 61 6d 73 20 28 74 72 69 67  b-programs (trig
2df0: 67 65 72 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a  gers) it may .**
2e00: 20 69 6e 76 6f 6b 65 20 64 69 72 65 63 74 6c 79   invoke directly
2e10: 20 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 2e 20   or indirectly. 
2e20: 49 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  It should be use
2e30: 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
2e40: 0a 2a 2a 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a  .**   Op *pOp;.*
2e50: 2a 20 20 20 56 64 62 65 4f 70 49 74 65 72 20 73  *   VdbeOpIter s
2e60: 49 74 65 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65  Iter;.**.**   me
2e70: 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20  mset(&sIter, 0, 
2e80: 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a  sizeof(sIter));.
2e90: 2a 2a 20 20 20 73 49 74 65 72 2e 76 20 3d 20 76  **   sIter.v = v
2ea0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
2ec0: 76 20 69 73 20 6f 66 20 74 79 70 65 20 56 64 62  v is of type Vdb
2ed0: 65 2a 20 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20  e* .**   while( 
2ee0: 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78  (pOp = opIterNex
2ef0: 74 28 26 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a  t(&sIter)) ){.**
2f00: 20 20 20 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74       // Do somet
2f10: 68 69 6e 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a  hing with pOp.**
2f20: 20 20 20 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65     }.**   sqlite
2f30: 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73  3DbFree(v->db, s
2f40: 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20  Iter.apSub);.** 
2f50: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
2f60: 63 74 20 56 64 62 65 4f 70 49 74 65 72 20 56 64  ct VdbeOpIter Vd
2f70: 62 65 4f 70 49 74 65 72 3b 0a 73 74 72 75 63 74  beOpIter;.struct
2f80: 20 56 64 62 65 4f 70 49 74 65 72 20 7b 0a 20 20   VdbeOpIter {.  
2f90: 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
2fa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64             /* Vd
2fb0: 62 65 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  be to iterate th
2fc0: 72 6f 75 67 68 20 74 68 65 20 6f 70 63 6f 64 65  rough the opcode
2fd0: 73 20 6f 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f  s of */.  SubPro
2fe0: 67 72 61 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20  gram **apSub;   
2ff0: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
3000: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a   subprograms */.
3010: 20 20 69 6e 74 20 6e 53 75 62 3b 20 20 20 20 20    int nSub;     
3020: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3030: 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
3040: 73 20 69 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20  s in apSub */.  
3050: 69 6e 74 20 69 41 64 64 72 3b 20 20 20 20 20 20  int iAddr;      
3060: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
3070: 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 69 6e  dress of next in
3080: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 72 65 74  struction to ret
3090: 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75  urn */.  int iSu
30a0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
30b0: 20 20 20 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20      /* 0 = main 
30c0: 70 72 6f 67 72 61 6d 2c 20 31 20 3d 20 66 69 72  program, 1 = fir
30d0: 73 74 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 65  st sub-program e
30e0: 74 63 2e 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63  tc. */.};.static
30f0: 20 4f 70 20 2a 6f 70 49 74 65 72 4e 65 78 74 28   Op *opIterNext(
3100: 56 64 62 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a  VdbeOpIter *p){.
3110: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76    Vdbe *v = p->v
3120: 3b 0a 20 20 4f 70 20 2a 70 52 65 74 20 3d 20 30  ;.  Op *pRet = 0
3130: 3b 0a 20 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69  ;.  Op *aOp;.  i
3140: 6e 74 20 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70  nt nOp;..  if( p
3150: 2d 3e 69 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20  ->iSub<=p->nSub 
3160: 29 7b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  ){..    if( p->i
3170: 53 75 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sub==0 ){.      
3180: 61 4f 70 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20  aOp = v->aOp;.  
3190: 20 20 20 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70      nOp = v->nOp
31a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
31b0: 20 20 20 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75     aOp = p->apSu
31c0: 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f  b[p->iSub-1]->aO
31d0: 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 70  p;.      nOp = p
31e0: 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d  ->apSub[p->iSub-
31f0: 31 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20  1]->nOp;.    }. 
3200: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 41     assert( p->iA
3210: 64 64 72 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20  ddr<nOp );..    
3220: 70 52 65 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69  pRet = &aOp[p->i
3230: 41 64 64 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41  Addr];.    p->iA
3240: 64 64 72 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  ddr++;.    if( p
3250: 2d 3e 69 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a  ->iAddr==nOp ){.
3260: 20 20 20 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b        p->iSub++;
3270: 0a 20 20 20 20 20 20 70 2d 3e 69 41 64 64 72 20  .      p->iAddr 
3280: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  = 0;.    }.  .  
3290: 20 20 69 66 28 20 70 52 65 74 2d 3e 70 34 74 79    if( pRet->p4ty
32a0: 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41  pe==P4_SUBPROGRA
32b0: 4d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  M ){.      int n
32c0: 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b  Byte = (p->nSub+
32d0: 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f  1)*sizeof(SubPro
32e0: 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e  gram*);.      in
32f0: 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
3300: 3d 30 3b 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a  =0; j<p->nSub; j
3310: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
3320: 20 70 2d 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52   p->apSub[j]==pR
3330: 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20  et->p4.pProgram 
3340: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
3350: 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d  .      if( j==p-
3360: 3e 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20  >nSub ){.       
3370: 20 70 2d 3e 61 70 53 75 62 20 3d 20 73 71 6c 69   p->apSub = sqli
3380: 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
3390: 65 65 28 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53  ee(v->db, p->apS
33a0: 75 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  ub, nByte);.    
33b0: 20 20 20 20 69 66 28 20 21 70 2d 3e 61 70 53 75      if( !p->apSu
33c0: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  b ){.          p
33d0: 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Ret = 0;.       
33e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
33f0: 20 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53    p->apSub[p->nS
3400: 75 62 2b 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34  ub++] = pRet->p4
3410: 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20  .pProgram;.     
3420: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
3430: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
3440: 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
3450: 43 68 65 63 6b 20 69 66 20 74 68 65 20 70 72 6f  Check if the pro
3460: 67 72 61 6d 20 73 74 6f 72 65 64 20 69 6e 20 74  gram stored in t
3470: 68 65 20 56 4d 20 61 73 73 6f 63 69 61 74 65 64  he VM associated
3480: 20 77 69 74 68 20 70 50 61 72 73 65 20 6d 61 79   with pParse may
3490: 0a 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41 42 4f  .** throw an ABO
34a0: 52 54 20 65 78 63 65 70 74 69 6f 6e 20 28 63 61  RT exception (ca
34b0: 75 73 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d  using the statem
34c0: 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74  ent, but not ent
34d0: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ire transaction.
34e0: 2a 2a 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ** to be rolled 
34f0: 62 61 63 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64  back). This cond
3500: 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66  ition is true if
3510: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
3520: 6d 20 6f 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d  m or any.** sub-
3530: 70 72 6f 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e  programs contain
3540: 73 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  s any of the fol
3550: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
3560: 2a 20 20 4f 50 5f 48 61 6c 74 20 77 69 74 68 20  *  OP_Halt with 
3570: 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  P1=SQLITE_CONSTR
3580: 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41  AINT and P2=OE_A
3590: 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50  bort..**   *  OP
35a0: 5f 48 61 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68  _HaltIfNull with
35b0: 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54   P1=SQLITE_CONST
35c0: 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f  RAINT and P2=OE_
35d0: 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f  Abort..**   *  O
35e0: 50 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a  P_Destroy.**   *
35f0: 20 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20    OP_VUpdate.** 
3600: 20 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a    *  OP_VRename.
3610: 2a 2a 20 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75  **   *  OP_FkCou
3620: 6e 74 65 72 20 77 69 74 68 20 50 32 3d 3d 30 20  nter with P2==0 
3630: 28 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69  (immediate forei
3640: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
3650: 74 29 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 43 72  t).**   *  OP_Cr
3660: 65 61 74 65 54 61 62 6c 65 20 61 6e 64 20 4f 50  eateTable and OP
3670: 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 28  _InitCoroutine (
3680: 66 6f 72 20 43 52 45 41 54 45 20 54 41 42 4c 45  for CREATE TABLE
3690: 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 29 0a   AS SELECT ...).
36a0: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b  **.** Then check
36b0: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20   that the value 
36c0: 6f 66 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72  of Parse.mayAbor
36d0: 74 20 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a  t is true if an.
36e0: 2a 2a 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20  ** ABORT may be 
36f0: 74 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65  thrown, or false
3700: 20 6f 74 68 65 72 77 69 73 65 2e 20 52 65 74 75   otherwise. Retu
3710: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 64 6f  rn true if it do
3720: 65 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20  es.** match, or 
3730: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
3740: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
3750: 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65  s intended to be
3760: 20 75 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74   used as.** part
3770: 20 6f 66 20 61 6e 20 61 73 73 65 72 74 20 73 74   of an assert st
3780: 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63  atement in the c
3790: 6f 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72  ompiler. Similar
37a0: 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73   to:.**.**   ass
37b0: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
37c0: 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70  AssertMayAbort(p
37d0: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50  Parse->pVdbe, pP
37e0: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20  arse->mayAbort) 
37f0: 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  );.*/.int sqlite
3800: 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62  3VdbeAssertMayAb
3810: 6f 72 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  ort(Vdbe *v, int
3820: 20 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e   mayAbort){.  in
3830: 74 20 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a  t hasAbort = 0;.
3840: 20 20 69 6e 74 20 68 61 73 46 6b 43 6f 75 6e 74    int hasFkCount
3850: 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61  er = 0;.  int ha
3860: 73 43 72 65 61 74 65 54 61 62 6c 65 20 3d 20 30  sCreateTable = 0
3870: 3b 0a 20 20 69 6e 74 20 68 61 73 49 6e 69 74 43  ;.  int hasInitC
3880: 6f 72 6f 75 74 69 6e 65 20 3d 20 30 3b 0a 20 20  oroutine = 0;.  
3890: 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f  Op *pOp;.  VdbeO
38a0: 70 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d  pIter sIter;.  m
38b0: 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c  emset(&sIter, 0,
38c0: 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b   sizeof(sIter));
38d0: 0a 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a  .  sIter.v = v;.
38e0: 0a 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d  .  while( (pOp =
38f0: 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74   opIterNext(&sIt
3900: 65 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  er))!=0 ){.    i
3910: 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d  nt opcode = pOp-
3920: 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28  >opcode;.    if(
3930: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74   opcode==OP_Dest
3940: 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  roy || opcode==O
3950: 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63  P_VUpdate || opc
3960: 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20  ode==OP_VRename 
3970: 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70 63 6f 64  .     || ((opcod
3980: 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f 70  e==OP_Halt || op
3990: 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49 66 4e  code==OP_HaltIfN
39a0: 75 6c 6c 29 20 0a 20 20 20 20 20 20 26 26 20 28  ull) .      && (
39b0: 28 70 4f 70 2d 3e 70 31 26 30 78 66 66 29 3d 3d  (pOp->p1&0xff)==
39c0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
39d0: 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45  T && pOp->p2==OE
39e0: 5f 41 62 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a  _Abort)).    ){.
39f0: 20 20 20 20 20 20 68 61 73 41 62 6f 72 74 20 3d        hasAbort =
3a00: 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   1;.      break;
3a10: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
3a20: 70 63 6f 64 65 3d 3d 4f 50 5f 43 72 65 61 74 65  pcode==OP_Create
3a30: 54 61 62 6c 65 20 29 20 68 61 73 43 72 65 61 74  Table ) hasCreat
3a40: 65 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  eTable = 1;.    
3a50: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  if( opcode==OP_I
3a60: 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 29 20 68  nitCoroutine ) h
3a70: 61 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20  asInitCoroutine 
3a80: 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
3a90: 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
3aa0: 5f 4b 45 59 0a 20 20 20 20 69 66 28 20 6f 70 63  _KEY.    if( opc
3ab0: 6f 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65  ode==OP_FkCounte
3ac0: 72 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20  r && pOp->p1==0 
3ad0: 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 20 29 7b  && pOp->p2==1 ){
3ae0: 0a 20 20 20 20 20 20 68 61 73 46 6b 43 6f 75 6e  .      hasFkCoun
3af0: 74 65 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23  ter = 1;.    }.#
3b00: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69  endif.  }.  sqli
3b10: 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c  te3DbFree(v->db,
3b20: 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a   sIter.apSub);..
3b30: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65    /* Return true
3b40: 20 69 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61   if hasAbort==ma
3b50: 79 41 62 6f 72 74 2e 20 4f 72 20 69 66 20 61 20  yAbort. Or if a 
3b60: 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f  malloc failure o
3b70: 63 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20 49 66  ccurred..  ** If
3b80: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2c 20   malloc failed, 
3b90: 74 68 65 6e 20 74 68 65 20 77 68 69 6c 65 28 29  then the while()
3ba0: 20 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61 79 20   loop above may 
3bb0: 6e 6f 74 20 68 61 76 65 20 69 74 65 72 61 74 65  not have iterate
3bc0: 64 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61  d.  ** through a
3bd0: 6c 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 68  ll opcodes and h
3be0: 61 73 41 62 6f 72 74 20 6d 61 79 20 62 65 20 73  asAbort may be s
3bf0: 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20  et incorrectly. 
3c00: 52 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75 65  Return.  ** true
3c10: 20 66 6f 72 20 74 68 69 73 20 63 61 73 65 20 74   for this case t
3c20: 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20 61 73  o prevent the as
3c30: 73 65 72 74 28 29 20 69 6e 20 74 68 65 20 63 61  sert() in the ca
3c40: 6c 6c 65 72 73 20 66 72 61 6d 65 0a 20 20 2a 2a  llers frame.  **
3c50: 20 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e 20 20   from failing.  
3c60: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 20 76 2d  */.  return ( v-
3c70: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
3c80: 64 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d 3d 6d  d || hasAbort==m
3c90: 61 79 41 62 6f 72 74 20 7c 7c 20 68 61 73 46 6b  ayAbort || hasFk
3ca0: 43 6f 75 6e 74 65 72 0a 20 20 20 20 20 20 20 20  Counter.        
3cb0: 20 20 20 20 20 20 7c 7c 20 28 68 61 73 43 72 65        || (hasCre
3cc0: 61 74 65 54 61 62 6c 65 20 26 26 20 68 61 73 49  ateTable && hasI
3cd0: 6e 69 74 43 6f 72 6f 75 74 69 6e 65 29 20 29 3b  nitCoroutine) );
3ce0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
3cf0: 49 54 45 5f 44 45 42 55 47 20 2d 20 74 68 65 20  ITE_DEBUG - the 
3d00: 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79  sqlite3AssertMay
3d10: 41 62 6f 72 74 28 29 20 66 75 6e 63 74 69 6f 6e  Abort() function
3d20: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
3d30: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
3d40: 64 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f  d after all opco
3d50: 64 65 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e  des have been in
3d60: 73 65 72 74 65 64 2e 20 20 49 74 20 6c 6f 6f 70  serted.  It loop
3d70: 73 0a 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c  s.** through all
3d80: 20 74 68 65 20 6f 70 63 6f 64 65 73 20 61 6e 64   the opcodes and
3d90: 20 66 69 78 65 73 20 75 70 20 73 6f 6d 65 20 64   fixes up some d
3da0: 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 28 31  etails..**.** (1
3db0: 29 20 46 6f 72 20 65 61 63 68 20 6a 75 6d 70 20  ) For each jump 
3dc0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 74 68  instruction with
3dd0: 20 61 20 6e 65 67 61 74 69 76 65 20 50 32 20 76   a negative P2 v
3de0: 61 6c 75 65 20 28 61 20 6c 61 62 65 6c 29 0a 2a  alue (a label).*
3df0: 2a 20 20 20 20 20 72 65 73 6f 6c 76 65 20 74 68  *     resolve th
3e00: 65 20 50 32 20 76 61 6c 75 65 20 74 6f 20 61 6e  e P2 value to an
3e10: 20 61 63 74 75 61 6c 20 61 64 64 72 65 73 73 2e   actual address.
3e20: 0a 2a 2a 0a 2a 2a 20 28 32 29 20 43 6f 6d 70 75  .**.** (2) Compu
3e30: 74 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  te the maximum n
3e40: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
3e50: 74 73 20 75 73 65 64 20 62 79 20 61 6e 79 20 53  ts used by any S
3e60: 51 4c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 20  QL function.**  
3e70: 20 20 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61     and store tha
3e80: 74 20 76 61 6c 75 65 20 69 6e 20 2a 70 4d 61 78  t value in *pMax
3e90: 46 75 6e 63 41 72 67 73 2e 0a 2a 2a 0a 2a 2a 20  FuncArgs..**.** 
3ea0: 28 33 29 20 55 70 64 61 74 65 20 74 68 65 20 56  (3) Update the V
3eb0: 64 62 65 2e 72 65 61 64 4f 6e 6c 79 20 61 6e 64  dbe.readOnly and
3ec0: 20 56 64 62 65 2e 62 49 73 52 65 61 64 65 72 20   Vdbe.bIsReader 
3ed0: 66 6c 61 67 73 20 74 6f 20 61 63 63 75 72 61 74  flags to accurat
3ee0: 65 6c 79 0a 2a 2a 20 20 20 20 20 69 6e 64 69 63  ely.**     indic
3ef0: 61 74 65 20 77 68 61 74 20 74 68 65 20 70 72 65  ate what the pre
3f00: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
3f10: 61 63 74 75 61 6c 6c 79 20 64 6f 65 73 2e 0a 2a  actually does..*
3f20: 2a 0a 2a 2a 20 28 34 29 20 49 6e 69 74 69 61 6c  *.** (4) Initial
3f30: 69 7a 65 20 74 68 65 20 70 34 2e 78 41 64 76 61  ize the p4.xAdva
3f40: 6e 63 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 6f  nce pointer on o
3f50: 70 63 6f 64 65 73 20 74 68 61 74 20 75 73 65 20  pcodes that use 
3f60: 69 74 2e 0a 2a 2a 0a 2a 2a 20 28 35 29 20 52 65  it..**.** (5) Re
3f70: 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79  claim the memory
3f80: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 73   allocated for s
3f90: 74 6f 72 69 6e 67 20 6c 61 62 65 6c 73 2e 0a 2a  toring labels..*
3fa0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3fb0: 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 66 75 6e 63  e will only func
3fc0: 74 69 6f 6e 20 63 6f 72 72 65 63 74 6c 79 20 69  tion correctly i
3fd0: 66 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  f the mkopcodeh.
3fe0: 74 63 6c 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a  tcl generator.**
3ff0: 20 73 63 72 69 70 74 20 6e 75 6d 62 65 72 73 20   script numbers 
4000: 74 68 65 20 6f 70 63 6f 64 65 73 20 63 6f 72 72  the opcodes corr
4010: 65 63 74 6c 79 2e 20 20 43 68 61 6e 67 65 73 20  ectly.  Changes 
4020: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
4030: 6d 75 73 74 20 62 65 0a 2a 2a 20 63 6f 6f 72 64  must be.** coord
4040: 69 6e 61 74 65 64 20 77 69 74 68 20 63 68 61 6e  inated with chan
4050: 67 65 73 20 74 6f 20 6d 6b 6f 70 63 6f 64 65 68  ges to mkopcodeh
4060: 2e 74 63 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  .tcl..*/.static 
4070: 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32 56 61  void resolveP2Va
4080: 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20 69 6e  lues(Vdbe *p, in
4090: 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 29  t *pMaxFuncArgs)
40a0: 7b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67 73  {.  int nMaxArgs
40b0: 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73   = *pMaxFuncArgs
40c0: 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 50  ;.  Op *pOp;.  P
40d0: 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
40e0: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20  ->pParse;.  int 
40f0: 2a 61 4c 61 62 65 6c 20 3d 20 70 50 61 72 73 65  *aLabel = pParse
4100: 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 72  ->aLabel;.  p->r
4110: 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 70  eadOnly = 1;.  p
4120: 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 30 3b  ->bIsReader = 0;
4130: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
4140: 5b 70 2d 3e 6e 4f 70 2d 31 5d 3b 0a 20 20 77 68  [p->nOp-1];.  wh
4150: 69 6c 65 28 31 29 7b 0a 0a 20 20 20 20 2f 2a 20  ile(1){..    /* 
4160: 4f 6e 6c 79 20 4a 55 4d 50 20 6f 70 63 6f 64 65  Only JUMP opcode
4170: 73 20 61 6e 64 20 74 68 65 20 73 68 6f 72 74 20  s and the short 
4180: 6c 69 73 74 20 6f 66 20 73 70 65 63 69 61 6c 20  list of special 
4190: 6f 70 63 6f 64 65 73 20 69 6e 20 74 68 65 20 73  opcodes in the s
41a0: 77 69 74 63 68 0a 20 20 20 20 2a 2a 20 62 65 6c  witch.    ** bel
41b0: 6f 77 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f  ow need to be co
41c0: 6e 73 69 64 65 72 65 64 2e 20 20 54 68 65 20 6d  nsidered.  The m
41d0: 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20 67 65 6e  kopcodeh.tcl gen
41e0: 65 72 61 74 6f 72 20 73 63 72 69 70 74 20 67 72  erator script gr
41f0: 6f 75 70 73 0a 20 20 20 20 2a 2a 20 61 6c 6c 20  oups.    ** all 
4200: 74 68 65 73 65 20 6f 70 63 6f 64 65 73 20 74 6f  these opcodes to
4210: 67 65 74 68 65 72 20 6e 65 61 72 20 74 68 65 20  gether near the 
4220: 66 72 6f 6e 74 20 6f 66 20 74 68 65 20 6f 70 63  front of the opc
4230: 6f 64 65 20 6c 69 73 74 2e 20 20 53 6b 69 70 0a  ode list.  Skip.
4240: 20 20 20 20 2a 2a 20 61 6e 79 20 6f 70 63 6f 64      ** any opcod
4250: 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
4260: 6e 65 65 64 20 70 72 6f 63 65 73 73 69 6e 67 20  need processing 
4270: 62 79 20 76 69 72 74 75 61 6c 20 6f 66 20 74 68  by virtual of th
4280: 65 20 66 61 63 74 20 74 68 61 74 0a 20 20 20 20  e fact that.    
4290: 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72 20  ** it is larger 
42a0: 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 58 5f 4a  than SQLITE_MX_J
42b0: 55 4d 50 5f 4f 50 43 4f 44 45 2c 20 61 73 20 61  UMP_OPCODE, as a
42c0: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74   performance opt
42d0: 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  imization..    *
42e0: 2f 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f  /.    if( pOp->o
42f0: 70 63 6f 64 65 3c 3d 53 51 4c 49 54 45 5f 4d 58  pcode<=SQLITE_MX
4300: 5f 4a 55 4d 50 5f 4f 50 43 4f 44 45 20 29 7b 0a  _JUMP_OPCODE ){.
4310: 20 20 20 20 20 20 2f 2a 20 4e 4f 54 45 3a 20 42        /* NOTE: B
4320: 65 20 73 75 72 65 20 74 6f 20 75 70 64 61 74 65  e sure to update
4330: 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20 77   mkopcodeh.tcl w
4340: 68 65 6e 20 61 64 64 69 6e 67 20 6f 72 20 72 65  hen adding or re
4350: 6d 6f 76 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  moving.      ** 
4360: 63 61 73 65 73 20 66 72 6f 6d 20 74 68 69 73 20  cases from this 
4370: 73 77 69 74 63 68 21 20 2a 2f 0a 20 20 20 20 20  switch! */.     
4380: 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70   switch( pOp->op
4390: 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  code ){.        
43a0: 63 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63 74  case OP_Transact
43b0: 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ion: {.         
43c0: 20 69 66 28 20 70 4f 70 2d 3e 70 32 21 3d 30 20   if( pOp->p2!=0 
43d0: 29 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  ) p->readOnly = 
43e0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;.          /* 
43f0: 66 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20  fall thru */.   
4400: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
4410: 61 73 65 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69  ase OP_AutoCommi
4420: 74 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  t:.        case 
4430: 4f 50 5f 53 61 76 65 70 6f 69 6e 74 3a 20 7b 0a  OP_Savepoint: {.
4440: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 62 49 73            p->bIs
4450: 52 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20  Reader = 1;.    
4460: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4470: 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
4480: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
4490: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 43         case OP_C
44a0: 68 65 63 6b 70 6f 69 6e 74 3a 0a 23 65 6e 64 69  heckpoint:.#endi
44b0: 66 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f  f.        case O
44c0: 50 5f 56 61 63 75 75 6d 3a 0a 20 20 20 20 20 20  P_Vacuum:.      
44d0: 20 20 63 61 73 65 20 4f 50 5f 4a 6f 75 72 6e 61    case OP_Journa
44e0: 6c 4d 6f 64 65 3a 20 7b 0a 20 20 20 20 20 20 20  lMode: {.       
44f0: 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d     p->readOnly =
4500: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   0;.          p-
4510: 3e 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b 0a  >bIsReader = 1;.
4520: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
4530: 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  .        }.#ifnd
4540: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
4550: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
4560: 20 20 20 20 63 61 73 65 20 4f 50 5f 56 55 70 64      case OP_VUpd
4570: 61 74 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ate: {.         
4580: 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61   if( pOp->p2>nMa
4590: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73  xArgs ) nMaxArgs
45a0: 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20   = pOp->p2;.    
45b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
45c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
45d0: 61 73 65 20 4f 50 5f 56 46 69 6c 74 65 72 3a 20  ase OP_VFilter: 
45e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
45f0: 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  n;.          ass
4600: 65 72 74 28 20 28 70 4f 70 20 2d 20 70 2d 3e 61  ert( (pOp - p->a
4610: 4f 70 29 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20  Op) >= 3 );.    
4620: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
4630: 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50  p[-1].opcode==OP
4640: 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20  _Integer );.    
4650: 20 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31        n = pOp[-1
4660: 5d 2e 70 31 3b 0a 20 20 20 20 20 20 20 20 20 20  ].p1;.          
4670: 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29  if( n>nMaxArgs )
4680: 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b 0a 20   nMaxArgs = n;. 
4690: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
46a0: 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
46b0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50  .        case OP
46c0: 5f 4e 65 78 74 3a 0a 20 20 20 20 20 20 20 20 63  _Next:.        c
46d0: 61 73 65 20 4f 50 5f 4e 65 78 74 49 66 4f 70 65  ase OP_NextIfOpe
46e0: 6e 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  n:.        case 
46f0: 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a 20 7b  OP_SorterNext: {
4700: 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
4710: 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73 71  p4.xAdvance = sq
4720: 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 3b 0a  lite3BtreeNext;.
4730: 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
4740: 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41 4e  4type = P4_ADVAN
4750: 43 45 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  CE;.          br
4760: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
4770: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 50         case OP_P
4780: 72 65 76 3a 0a 20 20 20 20 20 20 20 20 63 61 73  rev:.        cas
4790: 65 20 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e 3a  e OP_PrevIfOpen:
47a0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70   {.          pOp
47b0: 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20  ->p4.xAdvance = 
47c0: 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
47d0: 69 6f 75 73 3b 0a 20 20 20 20 20 20 20 20 20 20  ious;.          
47e0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
47f0: 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20  _ADVANCE;.      
4800: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4810: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
4820: 20 20 20 69 66 28 20 28 73 71 6c 69 74 65 33 4f     if( (sqlite3O
4830: 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70 4f  pcodeProperty[pO
4840: 70 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46  p->opcode] & OPF
4850: 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 70  LG_JUMP)!=0 && p
4860: 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20  Op->p2<0 ){.    
4870: 20 20 20 20 61 73 73 65 72 74 28 20 41 44 44 52      assert( ADDR
4880: 28 70 4f 70 2d 3e 70 32 29 3c 70 50 61 72 73 65  (pOp->p2)<pParse
4890: 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20  ->nLabel );.    
48a0: 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c      pOp->p2 = aL
48b0: 61 62 65 6c 5b 41 44 44 52 28 70 4f 70 2d 3e 70  abel[ADDR(pOp->p
48c0: 32 29 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  2)];.      }.   
48d0: 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 70 3d 3d   }.    if( pOp==
48e0: 70 2d 3e 61 4f 70 20 29 20 62 72 65 61 6b 3b 0a  p->aOp ) break;.
48f0: 20 20 20 20 70 4f 70 2d 2d 3b 0a 20 20 7d 0a 20      pOp--;.  }. 
4900: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
4910: 2d 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 4c  ->db, pParse->aL
4920: 61 62 65 6c 29 3b 0a 20 20 70 50 61 72 73 65 2d  abel);.  pParse-
4930: 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 70  >aLabel = 0;.  p
4940: 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 3d 20  Parse->nLabel = 
4950: 30 3b 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72  0;.  *pMaxFuncAr
4960: 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 20  gs = nMaxArgs;. 
4970: 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52   assert( p->bIsR
4980: 65 61 64 65 72 21 3d 30 20 7c 7c 20 44 62 4d 61  eader!=0 || DbMa
4990: 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72  skAllZero(p->btr
49a0: 65 65 4d 61 73 6b 29 20 29 3b 0a 7d 0a 0a 2f 2a  eeMask) );.}../*
49b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
49c0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
49d0: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
49e0: 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a  o be inserted..*
49f0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
4a00: 65 43 75 72 72 65 6e 74 41 64 64 72 28 56 64 62  eCurrentAddr(Vdb
4a10: 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
4a20: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
4a30: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
4a40: 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d  return p->nOp;.}
4a50: 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74  ../*.** Verify t
4a60: 68 61 74 20 61 74 20 6c 65 61 73 74 20 4e 20 6f  hat at least N o
4a70: 70 63 6f 64 65 20 73 6c 6f 74 73 20 61 72 65 20  pcode slots are 
4a80: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 20 77  available in p w
4a90: 69 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69 6e 67  ithout.** having
4aa0: 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 6f 72 20 6d   to malloc for m
4ab0: 6f 72 65 20 73 70 61 63 65 20 28 65 78 63 65 70  ore space (excep
4ac0: 74 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20  t when compiled 
4ad0: 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 5f  using.** SQLITE_
4ae0: 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52  TEST_REALLOC_STR
4af0: 45 53 53 29 2e 20 20 54 68 69 73 20 69 6e 74 65  ESS).  This inte
4b00: 72 66 61 63 65 20 69 73 20 75 73 65 64 20 64 75  rface is used du
4b10: 72 69 6e 67 20 74 65 73 74 69 6e 67 0a 2a 2a 20  ring testing.** 
4b20: 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 63  to verify that c
4b30: 65 72 74 61 69 6e 20 63 61 6c 6c 73 20 74 6f 20  ertain calls to 
4b40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4b50: 4c 69 73 74 28 29 20 63 61 6e 20 6e 65 76 65 72  List() can never
4b60: 0a 2a 2a 20 66 61 69 6c 20 64 75 65 20 74 6f 20  .** fail due to 
4b70: 61 20 4f 4f 4d 20 66 61 75 6c 74 20 61 6e 64 20  a OOM fault and 
4b80: 68 65 6e 63 65 20 74 68 61 74 20 74 68 65 20 72  hence that the r
4b90: 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d  eturn value from
4ba0: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41  .** sqlite3VdbeA
4bb0: 64 64 4f 70 4c 69 73 74 28 29 20 77 69 6c 6c 20  ddOpList() will 
4bc0: 61 6c 77 61 79 73 20 62 65 20 6e 6f 6e 2d 4e 55  always be non-NU
4bd0: 4c 4c 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  LL..*/.#if defin
4be0: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
4bf0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
4c00: 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43  ITE_TEST_REALLOC
4c10: 5f 53 54 52 45 53 53 29 0a 76 6f 69 64 20 73 71  _STRESS).void sq
4c20: 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79 4e  lite3VdbeVerifyN
4c30: 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65 64 28  oMallocRequired(
4c40: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 4e 29 7b  Vdbe *p, int N){
4c50: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
4c60: 70 20 2b 20 4e 20 3c 3d 20 70 2d 3e 70 50 61 72  p + N <= p->pPar
4c70: 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29 3b 0a  se->nOpAlloc );.
4c80: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
4c90: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
4ca0: 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
4cb0: 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  to the array of 
4cc0: 6f 70 63 6f 64 65 73 20 61 73 73 6f 63 69 61 74  opcodes associat
4cd0: 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 56  ed with.** the V
4ce0: 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dbe passed as th
4cf0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
4d00: 2e 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c  . It is the call
4d10: 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  ers responsibili
4d20: 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65  ty.** to arrange
4d30: 20 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e 65   for the returne
4d40: 64 20 61 72 72 61 79 20 74 6f 20 62 65 20 65 76  d array to be ev
4d50: 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75  entually freed u
4d60: 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76 64 62  sing the .** vdb
4d70: 65 46 72 65 65 4f 70 41 72 72 61 79 28 29 20 66  eFreeOpArray() f
4d80: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42  unction..**.** B
4d90: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
4da0: 20 2a 70 6e 4f 70 20 69 73 20 73 65 74 20 74 6f   *pnOp is set to
4db0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
4dc0: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 72 65  ntries in the re
4dd0: 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e  turned.** array.
4de0: 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67   Also, *pnMaxArg
4df0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6c   is set to the l
4e00: 61 72 67 65 72 20 6f 66 20 69 74 73 20 63 75 72  arger of its cur
4e10: 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20 0a  rent value and .
4e20: 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
4e30: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
4e40: 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72  Vdbe.apArg[] arr
4e50: 61 79 20 72 65 71 75 69 72 65 64 20 74 6f 20 65  ay required to e
4e60: 78 65 63 75 74 65 20 74 68 65 20 0a 2a 2a 20 72  xecute the .** r
4e70: 65 74 75 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e  eturned program.
4e80: 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69  .*/.VdbeOp *sqli
4e90: 74 65 33 56 64 62 65 54 61 6b 65 4f 70 41 72 72  te3VdbeTakeOpArr
4ea0: 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ay(Vdbe *p, int 
4eb0: 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61  *pnOp, int *pnMa
4ec0: 78 41 72 67 29 7b 0a 20 20 56 64 62 65 4f 70 20  xArg){.  VdbeOp 
4ed0: 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20  *aOp = p->aOp;. 
4ee0: 20 61 73 73 65 72 74 28 20 61 4f 70 20 26 26 20   assert( aOp && 
4ef0: 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  !p->db->mallocFa
4f00: 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  iled );..  /* Ch
4f10: 65 63 6b 20 74 68 61 74 20 73 71 6c 69 74 65 33  eck that sqlite3
4f20: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 29 20  VdbeUsesBtree() 
4f30: 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f  was not called o
4f40: 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61  n this VM */.  a
4f50: 73 73 65 72 74 28 20 44 62 4d 61 73 6b 41 6c 6c  ssert( DbMaskAll
4f60: 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73  Zero(p->btreeMas
4f70: 6b 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65  k) );..  resolve
4f80: 50 32 56 61 6c 75 65 73 28 70 2c 20 70 6e 4d 61  P2Values(p, pnMa
4f90: 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d  xArg);.  *pnOp =
4fa0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f   p->nOp;.  p->aO
4fb0: 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  p = 0;.  return 
4fc0: 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  aOp;.}../*.** Ad
4fd0: 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f  d a whole list o
4fe0: 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20  f operations to 
4ff0: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74  the operation st
5000: 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 61 0a 2a  ack.  Return a.*
5010: 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * pointer to the
5020: 20 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e   first operation
5030: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a   inserted..**.**
5040: 20 4e 6f 6e 2d 7a 65 72 6f 20 50 32 20 61 72 67   Non-zero P2 arg
5050: 75 6d 65 6e 74 73 20 74 6f 20 6a 75 6d 70 20 69  uments to jump i
5060: 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20  nstructions are 
5070: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 64  automatically ad
5080: 6a 75 73 74 65 64 0a 2a 2a 20 73 6f 20 74 68 61  justed.** so tha
5090: 74 20 74 68 65 20 6a 75 6d 70 20 74 61 72 67 65  t the jump targe
50a0: 74 20 69 73 20 72 65 6c 61 74 69 76 65 20 74 6f  t is relative to
50b0: 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72 61   the first opera
50c0: 74 69 6f 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a  tion inserted..*
50d0: 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65  /.VdbeOp *sqlite
50e0: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 0a  3VdbeAddOpList(.
50f0: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
5100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5110: 2a 20 41 64 64 20 6f 70 63 6f 64 65 73 20 74 6f  * Add opcodes to
5120: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
5130: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
5140: 20 6e 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20   nOp,           
5150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
5160: 62 65 72 20 6f 66 20 6f 70 63 6f 64 65 73 20 74  ber of opcodes t
5170: 6f 20 61 64 64 20 2a 2f 0a 20 20 56 64 62 65 4f  o add */.  VdbeO
5180: 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70  pList const *aOp
5190: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  ,       /* The o
51a0: 70 63 6f 64 65 73 20 74 6f 20 62 65 20 61 64 64  pcodes to be add
51b0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e  ed */.  int iLin
51c0: 65 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20 20  eno             
51d0: 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 2d 66       /* Source-f
51e0: 69 6c 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  ile line number 
51f0: 6f 66 20 66 69 72 73 74 20 6f 70 63 6f 64 65 20  of first opcode 
5200: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
5210: 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 2c 20 2a   VdbeOp *pOut, *
5220: 70 46 69 72 73 74 3b 0a 20 20 61 73 73 65 72 74  pFirst;.  assert
5230: 28 20 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73  ( nOp>0 );.  ass
5240: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
5250: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
5260: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b  ;.  if( p->nOp +
5270: 20 6e 4f 70 20 3e 20 70 2d 3e 70 50 61 72 73 65   nOp > p->pParse
5280: 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67 72  ->nOpAlloc && gr
5290: 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 6e 4f 70  owOpArray(p, nOp
52a0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
52b0: 30 3b 0a 20 20 7d 0a 20 20 70 46 69 72 73 74 20  0;.  }.  pFirst 
52c0: 3d 20 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70  = pOut = &p->aOp
52d0: 5b 70 2d 3e 6e 4f 70 5d 3b 0a 20 20 66 6f 72 28  [p->nOp];.  for(
52e0: 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c  i=0; i<nOp; i++,
52f0: 20 61 4f 70 2b 2b 2c 20 70 4f 75 74 2b 2b 29 7b   aOp++, pOut++){
5300: 0a 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64  .    pOut->opcod
5310: 65 20 3d 20 61 4f 70 2d 3e 6f 70 63 6f 64 65 3b  e = aOp->opcode;
5320: 0a 20 20 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20  .    pOut->p1 = 
5330: 61 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 70 4f 75  aOp->p1;.    pOu
5340: 74 2d 3e 70 32 20 3d 20 61 4f 70 2d 3e 70 32 3b  t->p2 = aOp->p2;
5350: 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 4f 70  .    assert( aOp
5360: 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20 20 69  ->p2>=0 );.    i
5370: 66 28 20 28 73 71 6c 69 74 65 33 4f 70 63 6f 64  f( (sqlite3Opcod
5380: 65 50 72 6f 70 65 72 74 79 5b 61 4f 70 2d 3e 6f  eProperty[aOp->o
5390: 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f 4a  pcode] & OPFLG_J
53a0: 55 4d 50 29 21 3d 30 20 26 26 20 61 4f 70 2d 3e  UMP)!=0 && aOp->
53b0: 70 32 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 4f  p2>0 ){.      pO
53c0: 75 74 2d 3e 70 32 20 2b 3d 20 70 2d 3e 6e 4f 70  ut->p2 += p->nOp
53d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 75 74  ;.    }.    pOut
53e0: 2d 3e 70 33 20 3d 20 61 4f 70 2d 3e 70 33 3b 0a  ->p3 = aOp->p3;.
53f0: 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 79 70 65      pOut->p4type
5400: 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20   = P4_NOTUSED;. 
5410: 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20     pOut->p4.p = 
5420: 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 35 20  0;.    pOut->p5 
5430: 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
5440: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
5450: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 70  N_COMMENTS.    p
5460: 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20  Out->zComment = 
5470: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  0;.#endif.#ifdef
5480: 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56   SQLITE_VDBE_COV
5490: 45 52 41 47 45 0a 20 20 20 20 70 4f 75 74 2d 3e  ERAGE.    pOut->
54a0: 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65  iSrcLine = iLine
54b0: 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20 20 20 20  no+i;.#else.    
54c0: 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b 0a 23  (void)iLineno;.#
54d0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
54e0: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 69 66  ITE_DEBUG.    if
54f0: 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  ( p->db->flags &
5500: 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f   SQLITE_VdbeAddo
5510: 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  pTrace ){.      
5520: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
5530: 4f 70 28 30 2c 20 69 2b 70 2d 3e 6e 4f 70 2c 20  Op(0, i+p->nOp, 
5540: 26 70 2d 3e 61 4f 70 5b 69 2b 70 2d 3e 6e 4f 70  &p->aOp[i+p->nOp
5550: 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ]);.    }.#endif
5560: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 20 2b 3d  .  }.  p->nOp +=
5570: 20 6e 4f 70 3b 0a 20 20 72 65 74 75 72 6e 20 70   nOp;.  return p
5580: 46 69 72 73 74 3b 0a 7d 0a 0a 23 69 66 20 64 65  First;.}..#if de
5590: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
55a0: 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
55b0: 54 55 53 29 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  TUS)./*.** Add a
55c0: 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 61  n entry to the a
55d0: 72 72 61 79 20 6f 66 20 63 6f 75 6e 74 65 72 73  rray of counters
55e0: 20 6d 61 6e 61 67 65 64 20 62 79 20 73 71 6c 69   managed by sqli
55f0: 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
5600: 74 75 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tus()..*/.void s
5610: 71 6c 69 74 65 33 56 64 62 65 53 63 61 6e 53 74  qlite3VdbeScanSt
5620: 61 74 75 73 28 0a 20 20 56 64 62 65 20 2a 70 2c  atus(.  Vdbe *p,
5630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5640: 20 20 20 20 20 20 20 20 2f 2a 20 56 4d 20 74 6f          /* VM to
5650: 20 61 64 64 20 73 63 61 6e 73 74 61 74 75 73 28   add scanstatus(
5660: 29 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ) to */.  int ad
5670: 64 72 45 78 70 6c 61 69 6e 2c 20 20 20 20 20 20  drExplain,      
5680: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
5690: 72 65 73 73 20 6f 66 20 4f 50 5f 45 78 70 6c 61  ress of OP_Expla
56a0: 69 6e 20 28 6f 72 20 30 29 20 2a 2f 0a 20 20 69  in (or 0) */.  i
56b0: 6e 74 20 61 64 64 72 4c 6f 6f 70 2c 20 20 20 20  nt addrLoop,    
56c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
56d0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6c 6f 6f  * Address of loo
56e0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 20 0a 20 20  p counter */ .  
56f0: 69 6e 74 20 61 64 64 72 56 69 73 69 74 2c 20 20  int addrVisit,  
5700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5710: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 72 6f  /* Address of ro
5720: 77 73 20 76 69 73 69 74 65 64 20 63 6f 75 6e 74  ws visited count
5730: 65 72 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e  er */.  LogEst n
5740: 45 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  Est,            
5750: 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d          /* Estim
5760: 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f  ated number of o
5770: 75 74 70 75 74 20 72 6f 77 73 20 2a 2f 0a 20 20  utput rows */.  
5780: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
5790: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
57a0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65  /* Name of table
57b0: 20 6f 72 20 69 6e 64 65 78 20 62 65 69 6e 67 20   or index being 
57c0: 73 63 61 6e 6e 65 64 20 2a 2f 0a 29 7b 0a 20 20  scanned */.){.  
57d0: 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70 2d 3e  int nByte = (p->
57e0: 6e 53 63 61 6e 2b 31 29 20 2a 20 73 69 7a 65 6f  nScan+1) * sizeo
57f0: 66 28 53 63 61 6e 53 74 61 74 75 73 29 3b 0a 20  f(ScanStatus);. 
5800: 20 53 63 61 6e 53 74 61 74 75 73 20 2a 61 4e 65   ScanStatus *aNe
5810: 77 3b 0a 20 20 61 4e 65 77 20 3d 20 28 53 63 61  w;.  aNew = (Sca
5820: 6e 53 74 61 74 75 73 2a 29 73 71 6c 69 74 65 33  nStatus*)sqlite3
5830: 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c  DbRealloc(p->db,
5840: 20 70 2d 3e 61 53 63 61 6e 2c 20 6e 42 79 74 65   p->aScan, nByte
5850: 29 3b 0a 20 20 69 66 28 20 61 4e 65 77 20 29 7b  );.  if( aNew ){
5860: 0a 20 20 20 20 53 63 61 6e 53 74 61 74 75 73 20  .    ScanStatus 
5870: 2a 70 4e 65 77 20 3d 20 26 61 4e 65 77 5b 70 2d  *pNew = &aNew[p-
5880: 3e 6e 53 63 61 6e 2b 2b 5d 3b 0a 20 20 20 20 70  >nScan++];.    p
5890: 4e 65 77 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e  New->addrExplain
58a0: 20 3d 20 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a   = addrExplain;.
58b0: 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4c 6f      pNew->addrLo
58c0: 6f 70 20 3d 20 61 64 64 72 4c 6f 6f 70 3b 0a 20  op = addrLoop;. 
58d0: 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 56 69 73     pNew->addrVis
58e0: 69 74 20 3d 20 61 64 64 72 56 69 73 69 74 3b 0a  it = addrVisit;.
58f0: 20 20 20 20 70 4e 65 77 2d 3e 6e 45 73 74 20 3d      pNew->nEst =
5900: 20 6e 45 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d   nEst;.    pNew-
5910: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
5920: 44 62 53 74 72 44 75 70 28 70 2d 3e 64 62 2c 20  DbStrDup(p->db, 
5930: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 61  zName);.    p->a
5940: 53 63 61 6e 20 3d 20 61 4e 65 77 3b 0a 20 20 7d  Scan = aNew;.  }
5950: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
5960: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
5970: 75 65 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65  ue of the opcode
5980: 2c 20 6f 72 20 50 31 2c 20 50 32 2c 20 50 33 2c  , or P1, P2, P3,
5990: 20 6f 72 20 50 35 20 6f 70 65 72 61 6e 64 73 0a   or P5 operands.
59a0: 2a 2a 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  ** for a specifi
59b0: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
59c0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
59d0: 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 56  beChangeOpcode(V
59e0: 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72  dbe *p, u32 addr
59f0: 2c 20 75 38 20 69 4e 65 77 4f 70 63 6f 64 65 29  , u8 iNewOpcode)
5a00: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47  {.  sqlite3VdbeG
5a10: 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 6f 70  etOp(p,addr)->op
5a20: 63 6f 64 65 20 3d 20 69 4e 65 77 4f 70 63 6f 64  code = iNewOpcod
5a30: 65 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  e;.}.void sqlite
5a40: 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 56 64  3VdbeChangeP1(Vd
5a50: 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c  be *p, u32 addr,
5a60: 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c   int val){.  sql
5a70: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c  ite3VdbeGetOp(p,
5a80: 61 64 64 72 29 2d 3e 70 31 20 3d 20 76 61 6c 3b  addr)->p1 = val;
5a90: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
5aa0: 64 62 65 43 68 61 6e 67 65 50 32 28 56 64 62 65  dbeChangeP2(Vdbe
5ab0: 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69   *p, u32 addr, i
5ac0: 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74  nt val){.  sqlit
5ad0: 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64  e3VdbeGetOp(p,ad
5ae0: 64 72 29 2d 3e 70 32 20 3d 20 76 61 6c 3b 0a 7d  dr)->p2 = val;.}
5af0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
5b00: 65 43 68 61 6e 67 65 50 33 28 56 64 62 65 20 2a  eChangeP3(Vdbe *
5b10: 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74  p, u32 addr, int
5b20: 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33   val){.  sqlite3
5b30: 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72  VdbeGetOp(p,addr
5b40: 29 2d 3e 70 33 20 3d 20 76 61 6c 3b 0a 7d 0a 76  )->p3 = val;.}.v
5b50: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
5b60: 68 61 6e 67 65 50 35 28 56 64 62 65 20 2a 70 2c  hangeP5(Vdbe *p,
5b70: 20 75 38 20 70 35 29 7b 0a 20 20 61 73 73 65 72   u8 p5){.  asser
5b80: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70  t( p->nOp>0 || p
5b90: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
5ba0: 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  ed );.  if( p->n
5bb0: 4f 70 3e 30 20 29 20 70 2d 3e 61 4f 70 5b 70 2d  Op>0 ) p->aOp[p-
5bc0: 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20 70 35 3b  >nOp-1].p5 = p5;
5bd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
5be0: 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20   the P2 operand 
5bf0: 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61  of instruction a
5c00: 64 64 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  ddr so that it p
5c10: 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20  oints to.** the 
5c20: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
5c30: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
5c40: 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a  to be coded..*/.
5c50: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
5c60: 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a 70  JumpHere(Vdbe *p
5c70: 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 73  , int addr){.  s
5c80: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
5c90: 50 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e  P2(p, addr, p->n
5ca0: 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  Op);.}.../*.** I
5cb0: 66 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e 63  f the input Func
5cc0: 44 65 66 20 73 74 72 75 63 74 75 72 65 20 69 73  Def structure is
5cd0: 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65 6e   ephemeral, then
5ce0: 20 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a 2a   free it.  If.**
5cf0: 20 74 68 65 20 46 75 6e 63 44 65 66 20 69 73 20   the FuncDef is 
5d00: 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74 68  not ephermal, th
5d10: 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a  en do nothing..*
5d20: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
5d30: 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74  eeEphemeralFunct
5d40: 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ion(sqlite3 *db,
5d50: 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29 7b   FuncDef *pDef){
5d60: 0a 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75  .  if( (pDef->fu
5d70: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
5d80: 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30 20  _FUNC_EPHEM)!=0 
5d90: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
5da0: 46 72 65 65 28 64 62 2c 20 70 44 65 66 29 3b 0a  Free(db, pDef);.
5db0: 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
5dc0: 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  id vdbeFreeOpArr
5dd0: 61 79 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f 70  ay(sqlite3 *, Op
5de0: 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a   *, int);../*.**
5df0: 20 44 65 6c 65 74 65 20 61 20 50 34 20 76 61 6c   Delete a P4 val
5e00: 75 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ue if necessary.
5e10: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
5e20: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20  E_NOINLINE void 
5e30: 66 72 65 65 50 34 4d 65 6d 28 73 71 6c 69 74 65  freeP4Mem(sqlite
5e40: 33 20 2a 64 62 2c 20 4d 65 6d 20 2a 70 29 7b 0a  3 *db, Mem *p){.
5e50: 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f    if( p->szMallo
5e60: 63 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  c ) sqlite3DbFre
5e70: 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63  e(db, p->zMalloc
5e80: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
5e90: 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 73 74 61  ee(db, p);.}.sta
5ea0: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
5eb0: 49 4e 45 20 76 6f 69 64 20 66 72 65 65 50 34 46  INE void freeP4F
5ec0: 75 6e 63 43 74 78 28 73 71 6c 69 74 65 33 20 2a  uncCtx(sqlite3 *
5ed0: 64 62 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  db, sqlite3_cont
5ee0: 65 78 74 20 2a 70 29 7b 0a 20 20 66 72 65 65 45  ext *p){.  freeE
5ef0: 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e  phemeralFunction
5f00: 28 64 62 2c 20 70 2d 3e 70 46 75 6e 63 29 3b 0a  (db, p->pFunc);.
5f10: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5f20: 64 62 2c 20 70 29 3b 0a 7d 0a 73 74 61 74 69 63  db, p);.}.static
5f30: 20 76 6f 69 64 20 66 72 65 65 50 34 28 73 71 6c   void freeP4(sql
5f40: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 70 34  ite3 *db, int p4
5f50: 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b  type, void *p4){
5f60: 0a 20 20 61 73 73 65 72 74 28 20 64 62 20 29 3b  .  assert( db );
5f70: 0a 20 20 73 77 69 74 63 68 28 20 70 34 74 79 70  .  switch( p4typ
5f80: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34  e ){.    case P4
5f90: 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20  _FUNCCTX: {.    
5fa0: 20 20 66 72 65 65 50 34 46 75 6e 63 43 74 78 28    freeP4FuncCtx(
5fb0: 64 62 2c 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  db, (sqlite3_con
5fc0: 74 65 78 74 2a 29 70 34 29 3b 0a 20 20 20 20 20  text*)p4);.     
5fd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5fe0: 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a    case P4_REAL:.
5ff0: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36      case P4_INT6
6000: 34 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f 44  4:.    case P4_D
6010: 59 4e 41 4d 49 43 3a 0a 20 20 20 20 63 61 73 65  YNAMIC:.    case
6020: 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a   P4_INTARRAY: {.
6030: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
6040: 72 65 65 28 64 62 2c 20 70 34 29 3b 0a 20 20 20  ree(db, p4);.   
6050: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6060: 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49      case P4_KEYI
6070: 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  NFO: {.      if(
6080: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
6090: 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4b 65  d==0 ) sqlite3Ke
60a0: 79 49 6e 66 6f 55 6e 72 65 66 28 28 4b 65 79 49  yInfoUnref((KeyI
60b0: 6e 66 6f 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  nfo*)p4);.      
60c0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
60d0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
60e0: 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20  E_CURSOR_HINTS. 
60f0: 20 20 20 63 61 73 65 20 50 34 5f 45 58 50 52 3a     case P4_EXPR:
6100: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
6110: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 28  ExprDelete(db, (
6120: 45 78 70 72 2a 29 70 34 29 3b 0a 20 20 20 20 20  Expr*)p4);.     
6130: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
6140: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34  ndif.    case P4
6150: 5f 4d 50 52 49 4e 54 46 3a 20 7b 0a 20 20 20 20  _MPRINTF: {.    
6160: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
6170: 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69  sFreed==0 ) sqli
6180: 74 65 33 5f 66 72 65 65 28 70 34 29 3b 0a 20 20  te3_free(p4);.  
6190: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
61a0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e  .    case P4_FUN
61b0: 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 66 72  CDEF: {.      fr
61c0: 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74  eeEphemeralFunct
61d0: 69 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44 65 66  ion(db, (FuncDef
61e0: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65  *)p4);.      bre
61f0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6200: 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20  se P4_MEM: {.   
6210: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
6220: 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20  esFreed==0 ){.  
6230: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
6240: 75 65 46 72 65 65 28 28 73 71 6c 69 74 65 33 5f  ueFree((sqlite3_
6250: 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20 20  value*)p4);.    
6260: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6270: 20 66 72 65 65 50 34 4d 65 6d 28 64 62 2c 20 28   freeP4Mem(db, (
6280: 4d 65 6d 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  Mem*)p4);.      
6290: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
62a0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
62b0: 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20 20 20 20  _VTAB : {.      
62c0: 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46  if( db->pnBytesF
62d0: 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65  reed==0 ) sqlite
62e0: 33 56 74 61 62 55 6e 6c 6f 63 6b 28 28 56 54 61  3VtabUnlock((VTa
62f0: 62 6c 65 20 2a 29 70 34 29 3b 0a 20 20 20 20 20  ble *)p4);.     
6300: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6310: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
6320: 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61  the space alloca
6330: 74 65 64 20 66 6f 72 20 61 4f 70 20 61 6e 64 20  ted for aOp and 
6340: 61 6e 79 20 70 34 20 76 61 6c 75 65 73 20 61 6c  any p4 values al
6350: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 0a  located for the.
6360: 2a 2a 20 6f 70 63 6f 64 65 73 20 63 6f 6e 74 61  ** opcodes conta
6370: 69 6e 65 64 20 77 69 74 68 69 6e 2e 20 49 66 20  ined within. If 
6380: 61 4f 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  aOp is not NULL 
6390: 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  it is assumed to
63a0: 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70   contain .** nOp
63b0: 20 65 6e 74 72 69 65 73 2e 20 0a 2a 2f 0a 73 74   entries. .*/.st
63c0: 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 72  atic void vdbeFr
63d0: 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65  eeOpArray(sqlite
63e0: 33 20 2a 64 62 2c 20 4f 70 20 2a 61 4f 70 2c 20  3 *db, Op *aOp, 
63f0: 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 69 66 28 20  int nOp){.  if( 
6400: 61 4f 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70  aOp ){.    Op *p
6410: 4f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d  Op;.    for(pOp=
6420: 61 4f 70 3b 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f  aOp; pOp<&aOp[nO
6430: 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  p]; pOp++){.    
6440: 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70    if( pOp->p4typ
6450: 65 20 29 20 66 72 65 65 50 34 28 64 62 2c 20 70  e ) freeP4(db, p
6460: 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d  Op->p4type, pOp-
6470: 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66 20 53  >p4.p);.#ifdef S
6480: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50  QLITE_ENABLE_EXP
6490: 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20  LAIN_COMMENTS.  
64a0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
64b0: 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  e(db, pOp->zComm
64c0: 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20  ent);.#endif    
64d0: 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71   .    }.  }.  sq
64e0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
64f0: 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  aOp);.}../*.** L
6500: 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f 67 72  ink the SubProgr
6510: 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  am object passed
6520: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
6530: 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65  rgument into the
6540: 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74 20   linked.** list 
6550: 61 74 20 56 64 62 65 2e 70 53 75 62 50 72 6f 67  at Vdbe.pSubProg
6560: 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74 20 69  ram. This list i
6570: 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65 74 65  s used to delete
6580: 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72 61 6d   all sub-program
6590: 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68 65 6e  .** objects when
65a0: 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20 6c 6f   the VM is no lo
65b0: 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a 2a  nger required..*
65c0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
65d0: 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72 61 6d  beLinkSubProgram
65e0: 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53 75  (Vdbe *pVdbe, Su
65f0: 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a 20 20  bProgram *p){.  
6600: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64 62 65  p->pNext = pVdbe
6610: 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 70 56  ->pProgram;.  pV
6620: 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20 3d 20  dbe->pProgram = 
6630: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  p;.}../*.** Chan
6640: 67 65 20 74 68 65 20 6f 70 63 6f 64 65 20 61 74  ge the opcode at
6650: 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f 4e 6f   addr into OP_No
6660: 6f 70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  op.*/.int sqlite
6670: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
6680: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
6690: 64 64 72 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a  ddr){.  VdbeOp *
66a0: 70 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  pOp;.  if( p->db
66b0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
66c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73   return 0;.  ass
66d0: 65 72 74 28 20 61 64 64 72 3e 3d 30 20 26 26 20  ert( addr>=0 && 
66e0: 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20  addr<p->nOp );. 
66f0: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61   pOp = &p->aOp[a
6700: 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 34 28 70  ddr];.  freeP4(p
6710: 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70  ->db, pOp->p4typ
6720: 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20  e, pOp->p4.p);. 
6730: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
6740: 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 70 4f 70  4_NOTUSED;.  pOp
6750: 2d 3e 70 34 2e 7a 20 3d 20 30 3b 0a 20 20 70 4f  ->p4.z = 0;.  pO
6760: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e  p->opcode = OP_N
6770: 6f 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  oop;.  return 1;
6780: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
6790: 20 6c 61 73 74 20 6f 70 63 6f 64 65 20 69 73 20   last opcode is 
67a0: 22 6f 70 22 20 61 6e 64 20 69 74 20 69 73 20 6e  "op" and it is n
67b0: 6f 74 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e  ot a jump destin
67c0: 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 6e 20 72  ation,.** then r
67d0: 65 6d 6f 76 65 20 69 74 2e 20 20 52 65 74 75 72  emove it.  Retur
67e0: 6e 20 74 72 75 65 20 69 66 20 61 6e 64 20 6f 6e  n true if and on
67f0: 6c 79 20 69 66 20 61 6e 20 6f 70 63 6f 64 65 20  ly if an opcode 
6800: 77 61 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a  was removed..*/.
6810: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 44  int sqlite3VdbeD
6820: 65 6c 65 74 65 50 72 69 6f 72 4f 70 63 6f 64 65  eletePriorOpcode
6830: 28 56 64 62 65 20 2a 70 2c 20 75 38 20 6f 70 29  (Vdbe *p, u8 op)
6840: 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 30  {.  if( p->nOp>0
6850: 20 26 26 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f   && p->aOp[p->nO
6860: 70 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 6f 70 20  p-1].opcode==op 
6870: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
6880: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
6890: 6f 4e 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70 2d  oNoop(p, p->nOp-
68a0: 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
68b0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d   return 0;.  }.}
68c0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
68d0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
68e0: 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P4 operand for a
68f0: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
6900: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72  ction..** This r
6910: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c  outine is useful
6920: 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72   when a large pr
6930: 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20  ogram is loaded 
6940: 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63  from a.** static
6950: 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c   array using sql
6960: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
6970: 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f  t but we want to
6980: 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d   make a.** few m
6990: 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20  inor changes to 
69a0: 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a  the program..**.
69b0: 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20  ** If n>=0 then 
69c0: 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 69  the P4 operand i
69d0: 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69  s dynamic, meani
69e0: 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79 20 6f  ng that a copy o
69f0: 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20  f.** the string 
6a00: 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d  is made into mem
6a10: 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
6a20: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
6a30: 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f  ()..** A value o
6a40: 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70  f n==0 means cop
6a50: 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34 20 75  y bytes of zP4 u
6a60: 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69  p to and includi
6a70: 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  ng the.** first 
6a80: 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 20 6e  null byte.  If n
6a90: 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31  >0 then copy n+1
6aa0: 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a   bytes of zP4..*
6ab0: 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75  * .** Other valu
6ac0: 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54 41 54  es of n (P4_STAT
6ad0: 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65  IC, P4_COLLSEQ e
6ae0: 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68  tc.) indicate th
6af0: 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a  at zP4 points.**
6b00: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20   to a string or 
6b10: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69  structure that i
6b20: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
6b30: 65 78 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69  exist for the li
6b40: 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65  fetime of.** the
6b50: 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20   Vdbe. In these 
6b60: 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73  cases we can jus
6b70: 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74  t copy the point
6b80: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64  er..**.** If add
6b90: 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20  r<0 then change 
6ba0: 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  P4 on the most r
6bb0: 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64  ecently inserted
6bc0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
6bd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 51 4c  .static void SQL
6be0: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 64 62  ITE_NOINLINE vdb
6bf0: 65 43 68 61 6e 67 65 50 34 46 75 6c 6c 28 0a 20  eChangeP4Full(. 
6c00: 20 56 64 62 65 20 2a 70 2c 0a 20 20 4f 70 20 2a   Vdbe *p,.  Op *
6c10: 70 4f 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  pOp,.  const cha
6c20: 72 20 2a 7a 50 34 2c 0a 20 20 69 6e 74 20 6e 0a  r *zP4,.  int n.
6c30: 29 7b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 34  ){.  if( pOp->p4
6c40: 74 79 70 65 20 29 7b 0a 20 20 20 20 66 72 65 65  type ){.    free
6c50: 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70  P4(p->db, pOp->p
6c60: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
6c70: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  );.    pOp->p4ty
6c80: 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d  pe = 0;.    pOp-
6c90: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 7d 0a 20  >p4.p = 0;.  }. 
6ca0: 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20   if( n<0 ){.    
6cb0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
6cc0: 65 50 34 28 70 2c 20 28 69 6e 74 29 28 70 4f 70  eP4(p, (int)(pOp
6cd0: 20 2d 20 70 2d 3e 61 4f 70 29 2c 20 7a 50 34 2c   - p->aOp), zP4,
6ce0: 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   n);.  }else{.  
6cf0: 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d    if( n==0 ) n =
6d00: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
6d10: 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  (zP4);.    pOp->
6d20: 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62  p4.z = sqlite3Db
6d30: 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a  StrNDup(p->db, z
6d40: 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d  P4, n);.    pOp-
6d50: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e  >p4type = P4_DYN
6d60: 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64  AMIC;.  }.}.void
6d70: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
6d80: 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69 6e  geP4(Vdbe *p, in
6d90: 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68  t addr, const ch
6da0: 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b  ar *zP4, int n){
6db0: 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 71  .  Op *pOp;.  sq
6dc0: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73 73  lite3 *db;.  ass
6dd0: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 64  ert( p!=0 );.  d
6de0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
6df0: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
6e00: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
6e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ;.  assert( p->a
6e20: 4f 70 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c  Op!=0 || db->mal
6e30: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
6e40: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
6e50: 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  led ){.    if( n
6e60: 21 3d 50 34 5f 56 54 41 42 20 29 20 66 72 65 65  !=P4_VTAB ) free
6e70: 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a  P4(db, n, (void*
6e80: 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b  )*(char**)&zP4);
6e90: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
6ea0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
6eb0: 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  p>0 );.  assert(
6ec0: 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a   addr<p->nOp );.
6ed0: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
6ee0: 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f      addr = p->nO
6ef0: 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70  p - 1;.  }.  pOp
6f00: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
6f10: 3b 0a 20 20 69 66 28 20 6e 3e 3d 30 20 7c 7c 20  ;.  if( n>=0 || 
6f20: 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20  pOp->p4type ){. 
6f30: 20 20 20 76 64 62 65 43 68 61 6e 67 65 50 34 46     vdbeChangeP4F
6f40: 75 6c 6c 28 70 2c 20 70 4f 70 2c 20 7a 50 34 2c  ull(p, pOp, zP4,
6f50: 20 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   n);.    return;
6f60: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 50 34  .  }.  if( n==P4
6f70: 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a  _INT32 ){.    /*
6f80: 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 73 74   Note: this cast
6f90: 20 69 73 20 73 61 66 65 2c 20 62 65 63 61 75 73   is safe, becaus
6fa0: 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64 61 74  e the origin dat
6fb0: 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e 20 69  a point was an i
6fc0: 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77  nt.    ** that w
6fd0: 61 73 20 63 61 73 74 20 74 6f 20 61 20 28 63 6f  as cast to a (co
6fe0: 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a  nst char *). */.
6ff0: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20      pOp->p4.i = 
7000: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
7010: 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d  T(zP4);.    pOp-
7020: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49 4e 54  >p4type = P4_INT
7030: 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  32;.  }else if( 
7040: 7a 50 34 21 3d 30 20 29 7b 0a 20 20 20 20 61 73  zP4!=0 ){.    as
7050: 73 65 72 74 28 20 6e 3c 30 20 29 3b 0a 20 20 20  sert( n<0 );.   
7060: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f   pOp->p4.p = (vo
7070: 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70  id*)zP4;.    pOp
7080: 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69 67 6e  ->p4type = (sign
7090: 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 20 20 69  ed char)n;.    i
70a0: 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29 20  f( n==P4_VTAB ) 
70b0: 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b 28  sqlite3VtabLock(
70c0: 28 56 54 61 62 6c 65 2a 29 7a 50 34 29 3b 0a 20  (VTable*)zP4);. 
70d0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
70e0: 74 68 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f  the P4 on the mo
70f0: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
7100: 64 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 65 20  d opcode to the 
7110: 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 0a  KeyInfo for the.
7120: 2a 2a 20 69 6e 64 65 78 20 67 69 76 65 6e 2e 0a  ** index given..
7130: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
7140: 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28  dbeSetP4KeyInfo(
7150: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
7160: 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 56  ndex *pIdx){.  V
7170: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
7180: 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
7190: 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( v!=0 );.  asse
71a0: 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20  rt( pIdx!=0 );. 
71b0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
71c0: 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61  geP4(v, -1, (cha
71d0: 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  r*)sqlite3KeyInf
71e0: 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c  oOfIndex(pParse,
71f0: 20 70 49 64 78 29 2c 0a 20 20 20 20 20 20 20 20   pIdx),.        
7200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34                P4
7210: 5f 4b 45 59 49 4e 46 4f 29 3b 0a 7d 0a 0a 23 69  _KEYINFO);.}..#i
7220: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7230: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
7240: 4e 54 53 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  NTS./*.** Change
7250: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20   the comment on 
7260: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
7270: 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74  y coded instruct
7280: 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65  ion.  Or.** inse
7290: 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61  rt a No-op and a
72a0: 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74  dd the comment t
72b0: 6f 20 74 68 61 74 20 6e 65 77 20 69 6e 73 74 72  o that new instr
72c0: 75 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a  uction.  This.**
72d0: 20 6d 61 6b 65 73 20 74 68 65 20 63 6f 64 65 20   makes the code 
72e0: 65 61 73 69 65 72 20 74 6f 20 72 65 61 64 20 64  easier to read d
72f0: 75 72 69 6e 67 20 64 65 62 75 67 67 69 6e 67 2e  uring debugging.
7300: 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 68    None of this h
7310: 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70  appens.** in a p
7320: 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e  roduction build.
7330: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7340: 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 56 64 62  vdbeVComment(Vdb
7350: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
7360: 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69   *zFormat, va_li
7370: 73 74 20 61 70 29 7b 0a 20 20 61 73 73 65 72 74  st ap){.  assert
7380: 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d  ( p->nOp>0 || p-
7390: 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73  >aOp==0 );.  ass
73a0: 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c  ert( p->aOp==0 |
73b0: 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d  | p->aOp[p->nOp-
73c0: 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c  1].zComment==0 |
73d0: 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  | p->db->mallocF
73e0: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
73f0: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61 73 73  ->nOp ){.    ass
7400: 65 72 74 28 20 70 2d 3e 61 4f 70 20 29 3b 0a 20  ert( p->aOp );. 
7410: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
7420: 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b 70  (p->db, p->aOp[p
7430: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
7440: 74 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70  t);.    p->aOp[p
7450: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
7460: 74 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69  t = sqlite3VMPri
7470: 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d  ntf(p->db, zForm
7480: 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76  at, ap);.  }.}.v
7490: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
74a0: 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  omment(Vdbe *p, 
74b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
74c0: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
74d0: 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70  list ap;.  if( p
74e0: 20 29 7b 0a 20 20 20 20 76 61 5f 73 74 61 72 74   ){.    va_start
74f0: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
7500: 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28     vdbeVComment(
7510: 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  p, zFormat, ap);
7520: 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  .    va_end(ap);
7530: 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
7540: 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  te3VdbeNoopComme
7550: 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  nt(Vdbe *p, cons
7560: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
7570: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
7580: 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a   ap;.  if( p ){.
7590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
75a0: 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70  ddOp0(p, OP_Noop
75b0: 29 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28  );.    va_start(
75c0: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
75d0: 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70    vdbeVComment(p
75e0: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
75f0: 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a      va_end(ap);.
7600: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a    }.}.#endif  /*
7610: 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64   NDEBUG */..#ifd
7620: 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  ef SQLITE_VDBE_C
7630: 4f 56 45 52 41 47 45 0a 2f 2a 0a 2a 2a 20 53 65  OVERAGE./*.** Se
7640: 74 20 74 68 65 20 76 61 6c 75 65 20 69 66 20 74  t the value if t
7650: 68 65 20 69 53 72 63 4c 69 6e 65 20 66 69 65 6c  he iSrcLine fiel
7660: 64 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f  d for the previo
7670: 75 73 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72  usly coded instr
7680: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
7690: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4c 69  sqlite3VdbeSetLi
76a0: 6e 65 4e 75 6d 62 65 72 28 56 64 62 65 20 2a 76  neNumber(Vdbe *v
76b0: 2c 20 69 6e 74 20 69 4c 69 6e 65 29 7b 0a 20 20  , int iLine){.  
76c0: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
76d0: 28 76 2c 2d 31 29 2d 3e 69 53 72 63 4c 69 6e 65  (v,-1)->iSrcLine
76e0: 20 3d 20 69 4c 69 6e 65 3b 0a 7d 0a 23 65 6e 64   = iLine;.}.#end
76f0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 56 44 42  if /* SQLITE_VDB
7700: 45 5f 43 4f 56 45 52 41 47 45 20 2a 2f 0a 0a 2f  E_COVERAGE */../
7710: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
7720: 6f 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76  opcode for a giv
7730: 65 6e 20 61 64 64 72 65 73 73 2e 20 20 49 66 20  en address.  If 
7740: 74 68 65 20 61 64 64 72 65 73 73 20 69 73 20 2d  the address is -
7750: 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72  1, then.** retur
7760: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
7770: 74 6c 79 20 69 6e 73 65 72 74 65 64 20 6f 70 63  tly inserted opc
7780: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ode..**.** If a 
7790: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
77a0: 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
77b0: 72 72 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  rred prior to th
77c0: 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69  e calling of thi
77d0: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68  s.** routine, th
77e0: 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  en a pointer to 
77f0: 61 20 64 75 6d 6d 79 20 56 64 62 65 4f 70 20 77  a dummy VdbeOp w
7800: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e  ill be returned.
7810: 20 20 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a    That opcode.**
7820: 20 69 73 20 72 65 61 64 61 62 6c 65 20 62 75 74   is readable but
7830: 20 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c 20 74   not writable, t
7840: 68 6f 75 67 68 20 69 74 20 69 73 20 63 61 73 74  hough it is cast
7850: 20 74 6f 20 61 20 77 72 69 74 61 62 6c 65 20 76   to a writable v
7860: 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74  alue..** The ret
7870: 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f  urn of a dummy o
7880: 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68 65  pcode allows the
7890: 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75   call to continu
78a0: 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a  e functioning.**
78b0: 20 61 66 74 65 72 20 61 6e 20 4f 4f 4d 20 66 61   after an OOM fa
78c0: 75 6c 74 20 77 69 74 68 6f 75 74 20 68 61 76 69  ult without havi
78d0: 6e 67 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73  ng to check to s
78e0: 65 65 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ee if the return
78f0: 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72   from .** this r
7900: 6f 75 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69  outine is a vali
7910: 64 20 70 6f 69 6e 74 65 72 2e 20 20 42 75 74 20  d pointer.  But 
7920: 62 65 63 61 75 73 65 20 74 68 65 20 64 75 6d 6d  because the dumm
7930: 79 2e 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a  y.opcode is 0,.*
7940: 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76  * dummy will nev
7950: 65 72 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  er be written to
7960: 2e 20 20 54 68 69 73 20 69 73 20 76 65 72 69 66  .  This is verif
7970: 69 65 64 20 62 79 20 63 6f 64 65 20 69 6e 73 70  ied by code insp
7980: 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79  ection and.** by
7990: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 56 61   running with Va
79a0: 6c 67 72 69 6e 64 2e 0a 2a 2f 0a 56 64 62 65 4f  lgrind..*/.VdbeO
79b0: 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65  p *sqlite3VdbeGe
79c0: 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  tOp(Vdbe *p, int
79d0: 20 61 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39   addr){.  /* C89
79e0: 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74 20   specifies that 
79f0: 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 22 64 75  the constant "du
7a00: 6d 6d 79 22 20 77 69 6c 6c 20 62 65 20 69 6e 69  mmy" will be ini
7a10: 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a  tialized to all.
7a20: 20 20 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63    ** zeros, whic
7a30: 68 20 69 73 20 63 6f 72 72 65 63 74 2e 20 20 4d  h is correct.  M
7a40: 53 56 43 20 67 65 6e 65 72 61 74 65 73 20 61 20  SVC generates a 
7a50: 77 61 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68  warning, neverth
7a60: 65 6c 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74  eless. */.  stat
7a70: 69 63 20 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b  ic VdbeOp dummy;
7a80: 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20    /* Ignore the 
7a90: 4d 53 56 43 20 77 61 72 6e 69 6e 67 20 61 62 6f  MSVC warning abo
7aa0: 75 74 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ut no initialize
7ab0: 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  r */.  assert( p
7ac0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
7ad0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
7ae0: 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20  ( addr<0 ){.    
7af0: 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20  addr = p->nOp - 
7b00: 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  1;.  }.  assert(
7b10: 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64   (addr>=0 && add
7b20: 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e  r<p->nOp) || p->
7b30: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7b40: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d   );.  if( p->db-
7b50: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
7b60: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 56 64 62  .    return (Vdb
7b70: 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d  eOp*)&dummy;.  }
7b80: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
7b90: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
7ba0: 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e    }.}..#if defin
7bb0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
7bc0: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
7bd0: 53 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  S)./*.** Return 
7be0: 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  an integer value
7bf0: 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20   for one of the 
7c00: 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68  parameters to th
7c10: 65 20 6f 70 63 6f 64 65 20 70 4f 70 0a 2a 2a 20  e opcode pOp.** 
7c20: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 63 68  determined by ch
7c30: 61 72 61 63 74 65 72 20 63 2e 0a 2a 2f 0a 73 74  aracter c..*/.st
7c40: 61 74 69 63 20 69 6e 74 20 74 72 61 6e 73 6c 61  atic int transla
7c50: 74 65 50 28 63 68 61 72 20 63 2c 20 63 6f 6e 73  teP(char c, cons
7c60: 74 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 69 66  t Op *pOp){.  if
7c70: 28 20 63 3d 3d 27 31 27 20 29 20 72 65 74 75 72  ( c=='1' ) retur
7c80: 6e 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 66 28  n pOp->p1;.  if(
7c90: 20 63 3d 3d 27 32 27 20 29 20 72 65 74 75 72 6e   c=='2' ) return
7ca0: 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69 66 28 20   pOp->p2;.  if( 
7cb0: 63 3d 3d 27 33 27 20 29 20 72 65 74 75 72 6e 20  c=='3' ) return 
7cc0: 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20 63  pOp->p3;.  if( c
7cd0: 3d 3d 27 34 27 20 29 20 72 65 74 75 72 6e 20 70  =='4' ) return p
7ce0: 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 72 65 74 75  Op->p4.i;.  retu
7cf0: 72 6e 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f  rn pOp->p5;.}../
7d00: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73  *.** Compute a s
7d10: 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20 22 63  tring for the "c
7d20: 6f 6d 6d 65 6e 74 22 20 66 69 65 6c 64 20 6f 66  omment" field of
7d30: 20 61 20 56 44 42 45 20 6f 70 63 6f 64 65 20 6c   a VDBE opcode l
7d40: 69 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  isting..**.** Th
7d50: 65 20 53 79 6e 6f 70 73 69 73 3a 20 66 69 65 6c  e Synopsis: fiel
7d60: 64 20 69 6e 20 63 6f 6d 6d 65 6e 74 73 20 69 6e  d in comments in
7d70: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
7d80: 63 65 20 66 69 6c 65 20 67 65 74 73 20 63 6f 6e  ce file gets con
7d90: 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 61 6e 20  verted.** to an 
7da0: 65 78 74 72 61 20 73 74 72 69 6e 67 20 74 68 61  extra string tha
7db0: 74 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f  t is appended to
7dc0: 20 74 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f   the sqlite3Opco
7dd0: 64 65 4e 61 6d 65 28 29 2e 20 20 49 6e 20 74 68  deName().  In th
7de0: 65 0a 2a 2a 20 61 62 73 65 6e 63 65 20 6f 66 20  e.** absence of 
7df0: 6f 74 68 65 72 20 63 6f 6d 6d 65 6e 74 73 2c 20  other comments, 
7e00: 74 68 69 73 20 73 79 6e 6f 70 73 69 73 20 62 65  this synopsis be
7e10: 63 6f 6d 65 73 20 74 68 65 20 63 6f 6d 6d 65 6e  comes the commen
7e20: 74 20 6f 6e 20 74 68 65 20 6f 70 63 6f 64 65 2e  t on the opcode.
7e30: 0a 2a 2a 20 53 6f 6d 65 20 74 72 61 6e 73 6c 61  .** Some transla
7e40: 74 69 6f 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a 0a  tion occurs:.**.
7e50: 2a 2a 20 20 20 20 20 20 20 22 50 58 22 20 20 20  **       "PX"   
7e60: 20 20 20 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a 2a     ->  "r[X]".**
7e70: 20 20 20 20 20 20 20 22 50 58 40 50 59 22 20 20         "PX@PY"  
7e80: 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 2d 31   ->  "r[X..X+Y-1
7e90: 5d 22 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66  ]"  or "r[x]" if
7ea0: 20 79 20 69 73 20 30 20 6f 72 20 31 0a 2a 2a 20   y is 0 or 1.** 
7eb0: 20 20 20 20 20 20 22 50 58 40 50 59 2b 31 22 20        "PX@PY+1" 
7ec0: 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 5d 22 20  ->  "r[X..X+Y]" 
7ed0: 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20     or "r[x]" if 
7ee0: 79 20 69 73 20 30 0a 2a 2a 20 20 20 20 20 20 20  y is 0.**       
7ef0: 22 50 59 2e 2e 50 59 22 20 20 2d 3e 20 20 22 72  "PY..PY"  ->  "r
7f00: 5b 58 2e 2e 59 5d 22 20 20 20 20 20 20 6f 72 20  [X..Y]"      or 
7f10: 22 72 5b 78 5d 22 20 69 66 20 79 3c 3d 78 0a 2a  "r[x]" if y<=x.*
7f20: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69 73  /.static int dis
7f30: 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 0a 20 20 63  playComment(.  c
7f40: 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 2c 20 20 20  onst Op *pOp,   
7f50: 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20    /* The opcode 
7f60: 74 6f 20 62 65 20 63 6f 6d 6d 65 6e 74 65 64 20  to be commented 
7f70: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
7f80: 2a 7a 50 34 2c 20 20 20 2f 2a 20 50 72 65 76 69  *zP4,   /* Previ
7f90: 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65 64 20 76  ously obtained v
7fa0: 61 6c 75 65 20 66 6f 72 20 50 34 20 2a 2f 0a 20  alue for P4 */. 
7fb0: 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 20 20   char *zTemp,   
7fc0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73      /* Write res
7fd0: 75 6c 74 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ult here */.  in
7fe0: 74 20 6e 54 65 6d 70 20 20 20 20 20 20 20 20 20  t nTemp         
7ff0: 20 2f 2a 20 53 70 61 63 65 20 61 76 61 69 6c 61   /* Space availa
8000: 62 6c 65 20 69 6e 20 7a 54 65 6d 70 5b 5d 20 2a  ble in zTemp[] *
8010: 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
8020: 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63 6f  r *zOpName;.  co
8030: 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6e 6f 70  nst char *zSynop
8040: 73 69 73 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e 61  sis;.  int nOpNa
8050: 6d 65 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a  me;.  int ii, jj
8060: 3b 0a 20 20 63 68 61 72 20 7a 41 6c 74 5b 35 30  ;.  char zAlt[50
8070: 5d 3b 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 73  ];.  zOpName = s
8080: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
8090: 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20  (pOp->opcode);. 
80a0: 20 6e 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74   nOpName = sqlit
80b0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 4e 61  e3Strlen30(zOpNa
80c0: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4f 70 4e 61  me);.  if( zOpNa
80d0: 6d 65 5b 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29 7b  me[nOpName+1] ){
80e0: 0a 20 20 20 20 69 6e 74 20 73 65 65 6e 43 6f 6d  .    int seenCom
80f0: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 63   = 0;.    char c
8100: 3b 0a 20 20 20 20 7a 53 79 6e 6f 70 73 69 73 20  ;.    zSynopsis 
8110: 3d 20 7a 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f 70  = zOpName += nOp
8120: 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 20 20 69 66  Name + 1;.    if
8130: 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70  ( strncmp(zSynop
8140: 73 69 73 2c 22 49 46 20 22 2c 33 29 3d 3d 30 20  sis,"IF ",3)==0 
8150: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  ){.      if( pOp
8160: 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 53 54  ->p5 & SQLITE_ST
8170: 4f 52 45 50 32 20 29 7b 0a 20 20 20 20 20 20 20  OREP2 ){.       
8180: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
8190: 66 28 73 69 7a 65 6f 66 28 7a 41 6c 74 29 2c 20  f(sizeof(zAlt), 
81a0: 7a 41 6c 74 2c 20 22 72 5b 50 32 5d 20 3d 20 28  zAlt, "r[P2] = (
81b0: 25 73 29 22 2c 20 7a 53 79 6e 6f 70 73 69 73 2b  %s)", zSynopsis+
81c0: 33 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  3);.      }else{
81d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
81e0: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
81f0: 28 7a 41 6c 74 29 2c 20 7a 41 6c 74 2c 20 22 69  (zAlt), zAlt, "i
8200: 66 20 25 73 20 67 6f 74 6f 20 50 32 22 2c 20 7a  f %s goto P2", z
8210: 53 79 6e 6f 70 73 69 73 2b 33 29 3b 0a 20 20 20  Synopsis+3);.   
8220: 20 20 20 7d 0a 20 20 20 20 20 20 7a 53 79 6e 6f     }.      zSyno
8230: 70 73 69 73 20 3d 20 7a 41 6c 74 3b 0a 20 20 20  psis = zAlt;.   
8240: 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 6a 6a   }.    for(ii=jj
8250: 3d 30 3b 20 6a 6a 3c 6e 54 65 6d 70 2d 31 20 26  =0; jj<nTemp-1 &
8260: 26 20 28 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73  & (c = zSynopsis
8270: 5b 69 69 5d 29 21 3d 30 3b 20 69 69 2b 2b 29 7b  [ii])!=0; ii++){
8280: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 50  .      if( c=='P
8290: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
82a0: 20 7a 53 79 6e 6f 70 73 69 73 5b 2b 2b 69 69 5d   zSynopsis[++ii]
82b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  ;.        if( c=
82c0: 3d 27 34 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='4' ){.        
82d0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
82e0: 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65  tf(nTemp-jj, zTe
82f0: 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 7a 50 34  mp+jj, "%s", zP4
8300: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
8310: 20 69 66 28 20 63 3d 3d 27 58 27 20 29 7b 0a 20   if( c=='X' ){. 
8320: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
8330: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d  _snprintf(nTemp-
8340: 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25  jj, zTemp+jj, "%
8350: 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  s", pOp->zCommen
8360: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 65  t);.          se
8370: 65 6e 43 6f 6d 20 3d 20 31 3b 0a 20 20 20 20 20  enCom = 1;.     
8380: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8390: 20 20 20 20 69 6e 74 20 76 31 20 3d 20 74 72 61      int v1 = tra
83a0: 6e 73 6c 61 74 65 50 28 63 2c 20 70 4f 70 29 3b  nslateP(c, pOp);
83b0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76  .          int v
83c0: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  2;.          sql
83d0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
83e0: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
83f0: 2c 20 22 25 64 22 2c 20 76 31 29 3b 0a 20 20 20  , "%d", v1);.   
8400: 20 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63         if( strnc
8410: 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b  mp(zSynopsis+ii+
8420: 31 2c 20 22 40 50 22 2c 20 32 29 3d 3d 30 20 29  1, "@P", 2)==0 )
8430: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 69  {.            ii
8440: 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20   += 3;.         
8450: 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33     jj += sqlite3
8460: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a  Strlen30(zTemp+j
8470: 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  j);.            
8480: 76 32 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28  v2 = translateP(
8490: 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 2c 20 70  zSynopsis[ii], p
84a0: 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Op);.           
84b0: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79   if( strncmp(zSy
84c0: 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 22 2b 31 22  nopsis+ii+1,"+1"
84d0: 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,2)==0 ){.      
84e0: 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 32 3b          ii += 2;
84f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76  .              v
8500: 32 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  2++;.           
8510: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
8520: 66 28 20 76 32 3e 31 20 29 7b 0a 20 20 20 20 20  f( v2>1 ){.     
8530: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
8540: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d  _snprintf(nTemp-
8550: 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 2e  jj, zTemp+jj, ".
8560: 2e 25 64 22 2c 20 76 31 2b 76 32 2d 31 29 3b 0a  .%d", v1+v2-1);.
8570: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8580: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
8590: 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70  ( strncmp(zSynop
85a0: 73 69 73 2b 69 69 2b 31 2c 20 22 2e 2e 50 33 22  sis+ii+1, "..P3"
85b0: 2c 20 34 29 3d 3d 30 20 26 26 20 70 4f 70 2d 3e  , 4)==0 && pOp->
85c0: 70 33 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  p3==0 ){.       
85d0: 20 20 20 20 20 69 69 20 2b 3d 20 34 3b 0a 20 20       ii += 4;.  
85e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
85f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 6a 6a 20 2b    }.        jj +
8600: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
8610: 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20  0(zTemp+jj);.   
8620: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8630: 20 20 7a 54 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20    zTemp[jj++] = 
8640: 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
8650: 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e 43 6f  .    if( !seenCo
8660: 6d 20 26 26 20 6a 6a 3c 6e 54 65 6d 70 2d 35 20  m && jj<nTemp-5 
8670: 26 26 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  && pOp->zComment
8680: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8690: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
86a0: 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22  -jj, zTemp+jj, "
86b0: 3b 20 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d  ; %s", pOp->zCom
86c0: 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 6a 6a 20  ment);.      jj 
86d0: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
86e0: 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20  30(zTemp+jj);.  
86f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 6a 3c 6e    }.    if( jj<n
8700: 54 65 6d 70 20 29 20 7a 54 65 6d 70 5b 6a 6a 5d  Temp ) zTemp[jj]
8710: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
8720: 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20  ( pOp->zComment 
8730: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
8740: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
8750: 54 65 6d 70 2c 20 22 25 73 22 2c 20 70 4f 70 2d  Temp, "%s", pOp-
8760: 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20  >zComment);.    
8770: 6a 6a 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  jj = sqlite3Strl
8780: 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20 7d  en30(zTemp);.  }
8790: 65 6c 73 65 7b 0a 20 20 20 20 7a 54 65 6d 70 5b  else{.    zTemp[
87a0: 30 5d 20 3d 20 30 3b 0a 20 20 20 20 6a 6a 20 3d  0] = 0;.    jj =
87b0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
87c0: 20 6a 6a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   jj;.}.#endif /*
87d0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
87e0: 0a 0a 23 69 66 20 56 44 42 45 5f 44 49 53 50 4c  ..#if VDBE_DISPL
87f0: 41 59 5f 50 34 20 26 26 20 64 65 66 69 6e 65 64  AY_P4 && defined
8800: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43  (SQLITE_ENABLE_C
8810: 55 52 53 4f 52 5f 48 49 4e 54 53 29 0a 2f 2a 0a  URSOR_HINTS)./*.
8820: 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 74 68 65  ** Translate the
8830: 20 50 34 2e 70 45 78 70 72 20 76 61 6c 75 65 20   P4.pExpr value 
8840: 66 6f 72 20 61 6e 20 4f 50 5f 43 75 72 73 6f 72  for an OP_Cursor
8850: 48 69 6e 74 20 6f 70 63 6f 64 65 20 69 6e 74 6f  Hint opcode into
8860: 20 74 65 78 74 0a 2a 2a 20 74 68 61 74 20 63 61   text.** that ca
8870: 6e 20 62 65 20 64 69 73 70 6c 61 79 65 64 20 69  n be displayed i
8880: 6e 20 74 68 65 20 50 34 20 63 6f 6c 75 6d 6e 20  n the P4 column 
8890: 6f 66 20 45 58 50 4c 41 49 4e 20 6f 75 74 70 75  of EXPLAIN outpu
88a0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
88b0: 64 20 64 69 73 70 6c 61 79 50 34 45 78 70 72 28  d displayP4Expr(
88c0: 53 74 72 41 63 63 75 6d 20 2a 70 2c 20 45 78 70  StrAccum *p, Exp
88d0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 6f 6e  r *pExpr){.  con
88e0: 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20 30  st char *zOp = 0
88f0: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ;.  switch( pExp
8900: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
8910: 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20  e TK_STRING:.   
8920: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
8930: 66 28 70 2c 20 22 25 51 22 2c 20 70 45 78 70 72  f(p, "%Q", pExpr
8940: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
8950: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8960: 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20  se TK_INTEGER:. 
8970: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
8980: 6e 74 66 28 70 2c 20 22 25 64 22 2c 20 70 45 78  ntf(p, "%d", pEx
8990: 70 72 2d 3e 75 2e 69 56 61 6c 75 65 29 3b 0a 20  pr->u.iValue);. 
89a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
89b0: 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20  case TK_NULL:.  
89c0: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
89d0: 74 66 28 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20  tf(p, "NULL");. 
89e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
89f0: 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52  case TK_REGISTER
8a00: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
8a10: 33 58 50 72 69 6e 74 66 28 70 2c 20 22 72 5b 25  3XPrintf(p, "r[%
8a20: 64 5d 22 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  d]", pExpr->iTab
8a30: 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  le);.      break
8a40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
8a50: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
8a60: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
8a70: 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
8a80: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
8a90: 74 66 28 70 2c 20 22 72 6f 77 69 64 22 29 3b 0a  tf(p, "rowid");.
8aa0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8ab0: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
8ac0: 6e 74 66 28 70 2c 20 22 63 25 64 22 2c 20 28 69  ntf(p, "c%d", (i
8ad0: 6e 74 29 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  nt)pExpr->iColum
8ae0: 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
8af0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
8b00: 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20     case TK_LT:  
8b10: 20 20 20 20 7a 4f 70 20 3d 20 22 4c 54 22 3b 20      zOp = "LT"; 
8b20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8b30: 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20  case TK_LE:     
8b40: 20 7a 4f 70 20 3d 20 22 4c 45 22 3b 20 20 20 20   zOp = "LE";    
8b50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8b60: 65 20 54 4b 5f 47 54 3a 20 20 20 20 20 20 7a 4f  e TK_GT:      zO
8b70: 70 20 3d 20 22 47 54 22 3b 20 20 20 20 20 20 62  p = "GT";      b
8b80: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8b90: 4b 5f 47 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_GE:      zOp =
8ba0: 20 22 47 45 22 3b 20 20 20 20 20 20 62 72 65 61   "GE";      brea
8bb0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  k;.    case TK_N
8bc0: 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4e  E:      zOp = "N
8bd0: 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  E";      break;.
8be0: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
8bf0: 20 20 20 20 20 7a 4f 70 20 3d 20 22 45 51 22 3b       zOp = "EQ";
8c00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8c10: 20 63 61 73 65 20 54 4b 5f 49 53 3a 20 20 20 20   case TK_IS:    
8c20: 20 20 7a 4f 70 20 3d 20 22 49 53 22 3b 20 20 20    zOp = "IS";   
8c30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8c40: 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 7a  se TK_ISNOT:   z
8c50: 4f 70 20 3d 20 22 49 53 4e 4f 54 22 3b 20 20 20  Op = "ISNOT";   
8c60: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8c70: 54 4b 5f 41 4e 44 3a 20 20 20 20 20 7a 4f 70 20  TK_AND:     zOp 
8c80: 3d 20 22 41 4e 44 22 3b 20 20 20 20 20 62 72 65  = "AND";     bre
8c90: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8ca0: 4f 52 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22  OR:      zOp = "
8cb0: 4f 52 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  OR";      break;
8cc0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55  .    case TK_PLU
8cd0: 53 3a 20 20 20 20 7a 4f 70 20 3d 20 22 41 44 44  S:    zOp = "ADD
8ce0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
8cf0: 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 20    case TK_STAR: 
8d00: 20 20 20 7a 4f 70 20 3d 20 22 4d 55 4c 22 3b 20     zOp = "MUL"; 
8d10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
8d20: 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 20 20 20  ase TK_MINUS:   
8d30: 7a 4f 70 20 3d 20 22 53 55 42 22 3b 20 20 20 20  zOp = "SUB";    
8d40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8d50: 20 54 4b 5f 52 45 4d 3a 20 20 20 20 20 7a 4f 70   TK_REM:     zOp
8d60: 20 3d 20 22 52 45 4d 22 3b 20 20 20 20 20 62 72   = "REM";     br
8d70: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8d80: 5f 42 49 54 41 4e 44 3a 20 20 7a 4f 70 20 3d 20  _BITAND:  zOp = 
8d90: 22 42 49 54 41 4e 44 22 3b 20 20 62 72 65 61 6b  "BITAND";  break
8da0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  ;.    case TK_BI
8db0: 54 4f 52 3a 20 20 20 7a 4f 70 20 3d 20 22 42 49  TOR:   zOp = "BI
8dc0: 54 4f 52 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  TOR";   break;. 
8dd0: 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48     case TK_SLASH
8de0: 3a 20 20 20 7a 4f 70 20 3d 20 22 44 49 56 22 3b  :   zOp = "DIV";
8df0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8e00: 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 20  case TK_LSHIFT: 
8e10: 20 7a 4f 70 20 3d 20 22 4c 53 48 49 46 54 22 3b   zOp = "LSHIFT";
8e20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8e30: 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 20 7a 4f  e TK_RSHIFT:  zO
8e40: 70 20 3d 20 22 52 53 48 49 46 54 22 3b 20 20 62  p = "RSHIFT";  b
8e50: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8e60: 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a 4f 70 20 3d  K_CONCAT:  zOp =
8e70: 20 22 43 4f 4e 43 41 54 22 3b 20 20 62 72 65 61   "CONCAT";  brea
8e80: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  k;.    case TK_U
8e90: 4d 49 4e 55 53 3a 20 20 7a 4f 70 20 3d 20 22 4d  MINUS:  zOp = "M
8ea0: 49 4e 55 53 22 3b 20 20 20 62 72 65 61 6b 3b 0a  INUS";   break;.
8eb0: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55      case TK_UPLU
8ec0: 53 3a 20 20 20 7a 4f 70 20 3d 20 22 50 4c 55 53  S:   zOp = "PLUS
8ed0: 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
8ee0: 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a   case TK_BITNOT:
8ef0: 20 20 7a 4f 70 20 3d 20 22 42 49 54 4e 4f 54 22    zOp = "BITNOT"
8f00: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
8f10: 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20 20 20 7a  se TK_NOT:     z
8f20: 4f 70 20 3d 20 22 4e 4f 54 22 3b 20 20 20 20 20  Op = "NOT";     
8f30: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8f40: 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 7a 4f 70 20  TK_ISNULL:  zOp 
8f50: 3d 20 22 49 53 4e 55 4c 4c 22 3b 20 20 62 72 65  = "ISNULL";  bre
8f60: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8f70: 4e 4f 54 4e 55 4c 4c 3a 20 7a 4f 70 20 3d 20 22  NOTNULL: zOp = "
8f80: 4e 4f 54 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b  NOTNULL"; break;
8f90: 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ..    default:. 
8fa0: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
8fb0: 6e 74 66 28 70 2c 20 22 25 73 22 2c 20 22 65 78  ntf(p, "%s", "ex
8fc0: 70 72 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  pr");.      brea
8fd0: 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a 4f  k;.  }..  if( zO
8fe0: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
8ff0: 58 50 72 69 6e 74 66 28 70 2c 20 22 25 73 28 22  XPrintf(p, "%s("
9000: 2c 20 7a 4f 70 29 3b 0a 20 20 20 20 64 69 73 70  , zOp);.    disp
9010: 6c 61 79 50 34 45 78 70 72 28 70 2c 20 70 45 78  layP4Expr(p, pEx
9020: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
9030: 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  if( pExpr->pRigh
9040: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
9050: 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
9060: 28 70 2c 20 22 2c 22 2c 20 31 29 3b 0a 20 20 20  (p, ",", 1);.   
9070: 20 20 20 64 69 73 70 6c 61 79 50 34 45 78 70 72     displayP4Expr
9080: 28 70 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  (p, pExpr->pRigh
9090: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  t);.    }.    sq
90a0: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
90b0: 65 6e 64 28 70 2c 20 22 29 22 2c 20 31 29 3b 0a  end(p, ")", 1);.
90c0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
90d0: 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20  VDBE_DISPLAY_P4 
90e0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
90f0: 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f  E_ENABLE_CURSOR_
9100: 48 49 4e 54 53 29 20 2a 2f 0a 0a 0a 23 69 66 20  HINTS) */...#if 
9110: 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 0a  VDBE_DISPLAY_P4.
9120: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
9130: 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
9140: 72 69 62 65 73 20 74 68 65 20 50 34 20 70 61 72  ribes the P4 par
9150: 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70  ameter for an op
9160: 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65  code..** Use zTe
9170: 6d 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69  mp for any requi
9180: 72 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75  red temporary bu
9190: 66 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  ffer space..*/.s
91a0: 74 61 74 69 63 20 63 68 61 72 20 2a 64 69 73 70  tatic char *disp
91b0: 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63  layP4(Op *pOp, c
91c0: 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20  har *zTemp, int 
91d0: 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a  nTemp){.  char *
91e0: 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 53  zP4 = zTemp;.  S
91f0: 74 72 41 63 63 75 6d 20 78 3b 0a 20 20 61 73 73  trAccum x;.  ass
9200: 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29  ert( nTemp>=20 )
9210: 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
9220: 63 75 6d 49 6e 69 74 28 26 78 2c 20 30 2c 20 7a  cumInit(&x, 0, z
9230: 54 65 6d 70 2c 20 6e 54 65 6d 70 2c 20 30 29 3b  Temp, nTemp, 0);
9240: 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e  .  switch( pOp->
9250: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  p4type ){.    ca
9260: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b  se P4_KEYINFO: {
9270: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
9280: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
9290: 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e  yInfo = pOp->p4.
92a0: 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pKeyInfo;.      
92b0: 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
92c0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20  ->aSortOrder!=0 
92d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
92e0: 58 50 72 69 6e 74 66 28 26 78 2c 20 22 6b 28 25  XPrintf(&x, "k(%
92f0: 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  d", pKeyInfo->nF
9300: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 66 6f 72  ield);.      for
9310: 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f  (j=0; j<pKeyInfo
9320: 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a  ->nField; j++){.
9330: 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
9340: 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66  *pColl = pKeyInf
9350: 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20  o->aColl[j];.   
9360: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
9370: 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 20 3f  *zColl = pColl ?
9380: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20   pColl->zName : 
9390: 22 22 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  "";.        if( 
93a0: 73 74 72 63 6d 70 28 7a 43 6f 6c 6c 2c 20 22 42  strcmp(zColl, "B
93b0: 49 4e 41 52 59 22 29 3d 3d 30 20 29 20 7a 43 6f  INARY")==0 ) zCo
93c0: 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20 20 20 20  ll = "B";.      
93d0: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
93e0: 28 26 78 2c 20 22 2c 25 73 25 73 22 2c 20 70 4b  (&x, ",%s%s", pK
93f0: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
9400: 65 72 5b 6a 5d 20 3f 20 22 2d 22 20 3a 20 22 22  er[j] ? "-" : ""
9410: 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , zColl);.      
9420: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  }.      sqlite3S
9430: 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 78  trAccumAppend(&x
9440: 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 20 20 20  , ")", 1);.     
9450: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
9460: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
9470: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
9480: 20 20 20 20 63 61 73 65 20 50 34 5f 45 58 50 52      case P4_EXPR
9490: 3a 20 7b 0a 20 20 20 20 20 20 64 69 73 70 6c 61  : {.      displa
94a0: 79 50 34 45 78 70 72 28 26 78 2c 20 70 4f 70 2d  yP4Expr(&x, pOp-
94b0: 3e 70 34 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  >p4.pExpr);.    
94c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
94d0: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50  endif.    case P
94e0: 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20  4_COLLSEQ: {.   
94f0: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
9500: 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c  l = pOp->p4.pCol
9510: 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  l;.      sqlite3
9520: 58 50 72 69 6e 74 66 28 26 78 2c 20 22 28 25 2e  XPrintf(&x, "(%.
9530: 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e  20s)", pColl->zN
9540: 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ame);.      brea
9550: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
9560: 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a  e P4_FUNCDEF: {.
9570: 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
9580: 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46  Def = pOp->p4.pF
9590: 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  unc;.      sqlit
95a0: 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25  e3XPrintf(&x, "%
95b0: 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e  s(%d)", pDef->zN
95c0: 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29  ame, pDef->nArg)
95d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
95e0: 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
95f0: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 63 61 73  TE_DEBUG.    cas
9600: 65 20 50 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a  e P4_FUNCCTX: {.
9610: 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
9620: 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43  Def = pOp->p4.pC
9630: 74 78 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20  tx->pFunc;.     
9640: 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
9650: 26 78 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44  &x, "%s(%d)", pD
9660: 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d  ef->zName, pDef-
9670: 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72  >nArg);.      br
9680: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
9690: 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e  f.    case P4_IN
96a0: 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  T64: {.      sql
96b0: 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20  ite3XPrintf(&x, 
96c0: 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34  "%lld", *pOp->p4
96d0: 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72  .pI64);.      br
96e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
96f0: 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a  ase P4_INT32: {.
9700: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
9710: 69 6e 74 66 28 26 78 2c 20 22 25 64 22 2c 20 70  intf(&x, "%d", p
9720: 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20  Op->p4.i);.     
9730: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9740: 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 20    case P4_REAL: 
9750: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58  {.      sqlite3X
9760: 50 72 69 6e 74 66 28 26 78 2c 20 22 25 2e 31 36  Printf(&x, "%.16
9770: 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65  g", *pOp->p4.pRe
9780: 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  al);.      break
9790: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
97a0: 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20   P4_MEM: {.     
97b0: 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f 70   Mem *pMem = pOp
97c0: 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20 20  ->p4.pMem;.     
97d0: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
97e0: 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20   & MEM_Str ){.  
97f0: 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d 65 6d        zP4 = pMem
9800: 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ->z;.      }else
9810: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
9820: 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20   & MEM_Int ){.  
9830: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
9840: 69 6e 74 66 28 26 78 2c 20 22 25 6c 6c 64 22 2c  intf(&x, "%lld",
9850: 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20   pMem->u.i);.   
9860: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65     }else if( pMe
9870: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  m->flags & MEM_R
9880: 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  eal ){.        s
9890: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78  qlite3XPrintf(&x
98a0: 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d  , "%.16g", pMem-
98b0: 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >u.r);.      }el
98c0: 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61  se if( pMem->fla
98d0: 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  gs & MEM_Null ){
98e0: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 22  .        zP4 = "
98f0: 4e 55 4c 4c 22 3b 0a 20 20 20 20 20 20 7d 65 6c  NULL";.      }el
9900: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
9910: 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  rt( pMem->flags 
9920: 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20  & MEM_Blob );.  
9930: 20 20 20 20 20 20 7a 50 34 20 3d 20 22 28 62 6c        zP4 = "(bl
9940: 6f 62 29 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ob)";.      }.  
9950: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9960: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9970: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
9980: 45 0a 20 20 20 20 63 61 73 65 20 50 34 5f 56 54  E.    case P4_VT
9990: 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AB: {.      sqli
99a0: 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20  te3_vtab *pVtab 
99b0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d  = pOp->p4.pVtab-
99c0: 3e 70 56 74 61 62 3b 0a 20 20 20 20 20 20 73 71  >pVtab;.      sq
99d0: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c  lite3XPrintf(&x,
99e0: 20 22 76 74 61 62 3a 25 70 22 2c 20 70 56 74 61   "vtab:%p", pVta
99f0: 62 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  b);.      break;
9a00: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
9a10: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52    case P4_INTARR
9a20: 41 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  AY: {.      int 
9a30: 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 69  i;.      int *ai
9a40: 20 3d 20 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a 20   = pOp->p4.ai;. 
9a50: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 61 69 5b       int n = ai[
9a60: 30 5d 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72  0];   /* The fir
9a70: 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 6e  st element of an
9a80: 20 49 4e 54 41 52 52 41 59 20 69 73 20 61 6c 77   INTARRAY is alw
9a90: 61 79 73 20 74 68 65 0a 20 20 20 20 20 20 20 20  ays the.        
9aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
9ab0: 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e  * count of the n
9ac0: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
9ad0: 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20  s to follow */. 
9ae0: 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
9af0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
9b00: 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
9b10: 26 78 2c 20 22 2c 25 64 22 2c 20 61 69 5b 69 5d  &x, ",%d", ai[i]
9b20: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9b30: 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 27 5b 27 3b   zTemp[0] = '[';
9b40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74  .      sqlite3St
9b50: 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 78 2c  rAccumAppend(&x,
9b60: 20 22 5d 22 2c 20 31 29 3b 0a 20 20 20 20 20 20   "]", 1);.      
9b70: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
9b80: 20 63 61 73 65 20 50 34 5f 53 55 42 50 52 4f 47   case P4_SUBPROG
9b90: 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  RAM: {.      sql
9ba0: 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20  ite3XPrintf(&x, 
9bb0: 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20  "program");.    
9bc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
9bd0: 20 20 20 63 61 73 65 20 50 34 5f 41 44 56 41 4e     case P4_ADVAN
9be0: 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d  CE: {.      zTem
9bf0: 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  p[0] = 0;.      
9c00: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
9c10: 20 63 61 73 65 20 50 34 5f 54 41 42 4c 45 3a 20   case P4_TABLE: 
9c20: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58  {.      sqlite3X
9c30: 50 72 69 6e 74 66 28 26 78 2c 20 22 25 73 22 2c  Printf(&x, "%s",
9c40: 20 70 4f 70 2d 3e 70 34 2e 70 54 61 62 2d 3e 7a   pOp->p4.pTab->z
9c50: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Name);.      bre
9c60: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
9c70: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a  fault: {.      z
9c80: 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a  P4 = pOp->p4.z;.
9c90: 20 20 20 20 20 20 69 66 28 20 7a 50 34 3d 3d 30        if( zP4==0
9ca0: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20   ){.        zP4 
9cb0: 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 20  = zTemp;.       
9cc0: 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20   zTemp[0] = 0;. 
9cd0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
9ce0: 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
9cf0: 75 6d 46 69 6e 69 73 68 28 26 78 29 3b 0a 20 20  umFinish(&x);.  
9d00: 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30 20 29  assert( zP4!=0 )
9d10: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a  ;.  return zP4;.
9d20: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56 44 42 45  }.#endif /* VDBE
9d30: 5f 44 49 53 50 4c 41 59 5f 50 34 20 2a 2f 0a 0a  _DISPLAY_P4 */..
9d40: 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f  /*.** Declare to
9d50: 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20 74   the Vdbe that t
9d60: 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74 20  he BTree object 
9d70: 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73  at db->aDb[i] is
9d80: 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   used..**.** The
9d90: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
9da0: 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f  ents need to kno
9db0: 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74 68 65  w in advance the
9dc0: 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20 6f 66   complete set of
9dd0: 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74  .** attached dat
9de0: 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c  abases that will
9df0: 20 62 65 20 75 73 65 2e 20 20 41 20 6d 61 73 6b   be use.  A mask
9e00: 20 6f 66 20 74 68 65 73 65 20 64 61 74 61 62 61   of these databa
9e10: 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e 74 61  ses.** is mainta
9e20: 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72 65 65  ined in p->btree
9e30: 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e 6c 6f  Mask.  The p->lo
9e40: 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69 73 20  ckMask value is 
9e50: 74 68 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a  the subset of.**
9e60: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 6f 66   p->btreeMask of
9e70: 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
9e80: 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6c  will require a l
9e90: 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ock..*/.void sql
9ea0: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
9eb0: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  e(Vdbe *p, int i
9ec0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d  ){.  assert( i>=
9ed0: 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44  0 && i<p->db->nD
9ee0: 62 20 26 26 20 69 3c 28 69 6e 74 29 73 69 7a 65  b && i<(int)size
9ef0: 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20 29 3b  of(yDbMask)*8 );
9f00: 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28 69 6e  .  assert( i<(in
9f10: 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65  t)sizeof(p->btre
9f20: 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 44 62  eMask)*8 );.  Db
9f30: 4d 61 73 6b 53 65 74 28 70 2d 3e 62 74 72 65 65  MaskSet(p->btree
9f40: 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 69 66 28 20  Mask, i);.  if( 
9f50: 69 21 3d 31 20 26 26 20 73 71 6c 69 74 65 33 42  i!=1 && sqlite3B
9f60: 74 72 65 65 53 68 61 72 61 62 6c 65 28 70 2d 3e  treeSharable(p->
9f70: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20  db->aDb[i].pBt) 
9f80: 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74  ){.    DbMaskSet
9f90: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 20 69 29  (p->lockMask, i)
9fa0: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65  ;.  }.}..#if !de
9fb0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
9fc0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 0a  T_SHARED_CACHE).
9fd0: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20  /*.** If SQLite 
9fe0: 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20 73  is compiled to s
9ff0: 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61  upport shared-ca
a000: 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74 6f 20  che mode and to 
a010: 62 65 20 74 68 72 65 61 64 73 61 66 65 2c 0a 2a  be threadsafe,.*
a020: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  * this routine o
a030: 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74 65 78  btains the mutex
a040: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
a050: 20 65 61 63 68 20 42 74 53 68 61 72 65 64 20 73   each BtShared s
a060: 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68 61 74  tructure.** that
a070: 20 6d 61 79 20 62 65 20 61 63 63 65 73 73 65 64   may be accessed
a080: 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73 65   by the VM passe
a090: 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
a0a0: 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20 69 74  . In doing so it
a0b0: 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73 20 74 68   also.** sets th
a0c0: 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 6d 65  e BtShared.db me
a0d0: 6d 62 65 72 20 6f 66 20 65 61 63 68 20 6f 66 20  mber of each of 
a0e0: 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72  the BtShared str
a0f0: 75 63 74 75 72 65 73 2c 20 65 6e 73 75 72 69 6e  uctures, ensurin
a100: 67 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 6f  g.** that the co
a110: 72 72 65 63 74 20 62 75 73 79 2d 68 61 6e 64 6c  rrect busy-handl
a120: 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69  er callback is i
a130: 6e 76 6f 6b 65 64 20 69 66 20 72 65 71 75 69 72  nvoked if requir
a140: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  ed..**.** If SQL
a150: 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61  ite is not threa
a160: 64 73 61 66 65 20 62 75 74 20 64 6f 65 73 20 73  dsafe but does s
a170: 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61  upport shared-ca
a180: 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a  che mode, then.*
a190: 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e  * sqlite3BtreeEn
a1a0: 74 65 72 28 29 20 69 73 20 69 6e 76 6f 6b 65 64  ter() is invoked
a1b0: 20 74 6f 20 73 65 74 20 74 68 65 20 42 74 53 68   to set the BtSh
a1c0: 61 72 65 64 2e 64 62 20 76 61 72 69 61 62 6c 65  ared.db variable
a1d0: 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 42  s.** of all of B
a1e0: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
a1f0: 65 73 20 61 63 63 65 73 73 69 62 6c 65 20 76 69  es accessible vi
a200: 61 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  a the database h
a210: 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63 69  andle .** associ
a220: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d  ated with the VM
a230: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74  ..**.** If SQLit
a240: 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73  e is not threads
a250: 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  afe and does not
a260: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d   support shared-
a270: 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 69 73  cache mode, this
a280: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
a290: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
a2a0: 68 65 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20  he p->btreeMask 
a2b0: 66 69 65 6c 64 20 69 73 20 61 20 62 69 74 6d 61  field is a bitma
a2c0: 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72 65 65 73  sk of all btrees
a2d0: 20 74 68 61 74 20 74 68 65 20 70 72 65 70 61 72   that the prepar
a2e0: 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ed .** statement
a2f0: 20 70 20 77 69 6c 6c 20 65 76 65 72 20 75 73 65   p will ever use
a300: 2e 20 20 4c 65 74 20 4e 20 62 65 20 74 68 65 20  .  Let N be the 
a310: 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20 69  number of bits i
a320: 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 0a 2a  n p->btreeMask.*
a330: 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
a340: 74 6f 20 62 74 72 65 65 73 20 74 68 61 74 20 75  to btrees that u
a350: 73 65 20 73 68 61 72 65 64 20 63 61 63 68 65 2e  se shared cache.
a360: 20 20 54 68 65 6e 20 74 68 65 20 72 75 6e 74 69    Then the runti
a370: 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20 72 6f  me of.** this ro
a380: 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e 20 20 42  utine is N*N.  B
a390: 75 74 20 61 73 20 4e 20 69 73 20 72 61 72 65 6c  ut as N is rarel
a3a0: 79 20 6d 6f 72 65 20 74 68 61 6e 20 31 2c 20 74  y more than 1, t
a3b0: 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a  his should not.*
a3c0: 2a 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a  * be a problem..
a3d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
a3e0: 64 62 65 45 6e 74 65 72 28 56 64 62 65 20 2a 70  dbeEnter(Vdbe *p
a3f0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
a400: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20  lite3 *db;.  Db 
a410: 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b  *aDb;.  int nDb;
a420: 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c  .  if( DbMaskAll
a430: 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  Zero(p->lockMask
a440: 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  ) ) return;  /* 
a450: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
a460: 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  */.  db = p->db;
a470: 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62  .  aDb = db->aDb
a480: 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44  ;.  nDb = db->nD
a490: 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  b;.  for(i=0; i<
a4a0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
a4b0: 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d 61 73  f( i!=1 && DbMas
a4c0: 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73  kTest(p->lockMas
a4d0: 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53 28 61  k,i) && ALWAYS(a
a4e0: 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b  Db[i].pBt!=0) ){
a4f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
a500: 72 65 65 45 6e 74 65 72 28 61 44 62 5b 69 5d 2e  reeEnter(aDb[i].
a510: 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pBt);.    }.  }.
a520: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  }.#endif..#if !d
a530: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
a540: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
a550: 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41   && SQLITE_THREA
a560: 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e  DSAFE>0./*.** Un
a570: 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65 20  lock all of the 
a580: 62 74 72 65 65 73 20 70 72 65 76 69 6f 75 73 6c  btrees previousl
a590: 79 20 6c 6f 63 6b 65 64 20 62 79 20 61 20 63 61  y locked by a ca
a5a0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
a5b0: 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a 73 74 61  eEnter()..*/.sta
a5c0: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
a5d0: 49 4e 45 20 76 6f 69 64 20 76 64 62 65 4c 65 61  INE void vdbeLea
a5e0: 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ve(Vdbe *p){.  i
a5f0: 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt i;.  sqlite3 
a600: 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a  *db;.  Db *aDb;.
a610: 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 64 62 20    int nDb;.  db 
a620: 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d  = p->db;.  aDb =
a630: 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20   db->aDb;.  nDb 
a640: 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72  = db->nDb;.  for
a650: 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b  (i=0; i<nDb; i++
a660: 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20  ){.    if( i!=1 
a670: 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d  && DbMaskTest(p-
a680: 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20  >lockMask,i) && 
a690: 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42  ALWAYS(aDb[i].pB
a6a0: 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73  t!=0) ){.      s
a6b0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
a6c0: 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20  (aDb[i].pBt);.  
a6d0: 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73    }.  }.}.void s
a6e0: 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28  qlite3VdbeLeave(
a6f0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20  Vdbe *p){.  if( 
a700: 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d  DbMaskAllZero(p-
a710: 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65 74  >lockMask) ) ret
a720: 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d  urn;  /* The com
a730: 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 76 64  mon case */.  vd
a740: 62 65 4c 65 61 76 65 28 70 29 3b 0a 7d 0a 23 65  beLeave(p);.}.#e
a750: 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
a760: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20  d(VDBE_PROFILE) 
a770: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
a780: 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50  E_DEBUG)./*.** P
a790: 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70  rint a single op
a7a0: 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74  code.  This rout
a7b0: 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
a7c0: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
a7d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
a7e0: 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20  dbePrintOp(FILE 
a7f0: 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f  *pOut, int pc, O
a800: 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20  p *pOp){.  char 
a810: 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74  *zP4;.  char zPt
a820: 72 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20 7a 43  r[50];.  char zC
a830: 6f 6d 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74 69  om[100];.  stati
a840: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  c const char *zF
a850: 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d  ormat1 = "%4d %-
a860: 31 33 73 20 25 34 64 20 25 34 64 20 25 34 64 20  13s %4d %4d %4d 
a870: 25 2d 31 33 73 20 25 2e 32 58 20 25 73 5c 6e 22  %-13s %.2X %s\n"
a880: 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20  ;.  if( pOut==0 
a890: 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b  ) pOut = stdout;
a8a0: 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79  .  zP4 = display
a8b0: 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69  P4(pOp, zPtr, si
a8c0: 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 23 69 66  zeof(zPtr));.#if
a8d0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
a8e0: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
a8f0: 54 53 0a 20 20 64 69 73 70 6c 61 79 43 6f 6d 6d  TS.  displayComm
a900: 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 7a 43  ent(pOp, zP4, zC
a910: 6f 6d 2c 20 73 69 7a 65 6f 66 28 7a 43 6f 6d 29  om, sizeof(zCom)
a920: 29 3b 0a 23 65 6c 73 65 0a 20 20 7a 43 6f 6d 5b  );.#else.  zCom[
a930: 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  0] = 0;.#endif. 
a940: 20 2f 2a 20 4e 42 3a 20 20 54 68 65 20 73 71 6c   /* NB:  The sql
a950: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29  ite3OpcodeName()
a960: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70   function is imp
a970: 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 6f 64 65  lemented by code
a980: 20 63 72 65 61 74 65 64 0a 20 20 2a 2a 20 62 79   created.  ** by
a990: 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61   the mkopcodeh.a
a9a0: 77 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f 64 65 63  wk and mkopcodec
a9b0: 2e 61 77 6b 20 73 63 72 69 70 74 73 20 77 68 69  .awk scripts whi
a9c0: 63 68 20 65 78 74 72 61 63 74 20 74 68 65 0a 20  ch extract the. 
a9d0: 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   ** information 
a9e0: 66 72 6f 6d 20 74 68 65 20 76 64 62 65 2e 63 20  from the vdbe.c 
a9f0: 73 6f 75 72 63 65 20 74 65 78 74 20 2a 2f 0a 20  source text */. 
aa00: 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a   fprintf(pOut, z
aa10: 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20  Format1, pc, .  
aa20: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f 64      sqlite3Opcod
aa30: 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64  eName(pOp->opcod
aa40: 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70  e), pOp->p1, pOp
aa50: 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a  ->p2, pOp->p3, z
aa60: 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20 20 20  P4, pOp->p5,.   
aa70: 20 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20 66     zCom.  );.  f
aa80: 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23  flush(pOut);.}.#
aa90: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  endif../*.** Ini
aaa0: 74 69 61 6c 69 7a 65 20 61 6e 20 61 72 72 61 79  tialize an array
aab0: 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e   of N Mem elemen
aac0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
aad0: 64 20 69 6e 69 74 4d 65 6d 41 72 72 61 79 28 4d  d initMemArray(M
aae0: 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 2c 20 73 71  em *p, int N, sq
aaf0: 6c 69 74 65 33 20 2a 64 62 2c 20 75 31 36 20 66  lite3 *db, u16 f
ab00: 6c 61 67 73 29 7b 0a 20 20 77 68 69 6c 65 28 20  lags){.  while( 
ab10: 28 4e 2d 2d 29 3e 30 20 29 7b 0a 20 20 20 20 70  (N--)>0 ){.    p
ab20: 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 70  ->db = db;.    p
ab30: 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  ->flags = flags;
ab40: 0a 20 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63  .    p->szMalloc
ab50: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
ab60: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70 2d  ITE_DEBUG.    p-
ab70: 3e 70 53 63 6f 70 79 46 72 6f 6d 20 3d 20 30 3b  >pScopyFrom = 0;
ab80: 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2b 2b 3b  .#endif.    p++;
ab90: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
aba0: 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f  lease an array o
abb0: 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73  f N Mem elements
abc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
abd0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
abe0: 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  Mem *p, int N){.
abf0: 20 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a    if( p && N ){.
ac00: 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 20 3d 20      Mem *pEnd = 
ac10: 26 70 5b 4e 5d 3b 0a 20 20 20 20 73 71 6c 69 74  &p[N];.    sqlit
ac20: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
ac30: 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79      if( db->pnBy
ac40: 74 65 73 46 72 65 65 64 20 29 7b 0a 20 20 20 20  tesFreed ){.    
ac50: 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66    do{.        if
ac60: 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20  ( p->szMalloc ) 
ac70: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
ac80: 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20  , p->zMalloc);. 
ac90: 20 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b       }while( (++
aca0: 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20 20  p)<pEnd );.     
acb0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
acc0: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 61 73 73     do{.      ass
acd0: 65 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45  ert( (&p[1])==pE
ace0: 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70  nd || p[0].db==p
acf0: 5b 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20 20  [1].db );.      
ad00: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56  assert( sqlite3V
ad10: 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72  dbeCheckMemInvar
ad20: 69 61 6e 74 73 28 70 29 20 29 3b 0a 0a 20 20 20  iants(p) );..   
ad30: 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b     /* This block
ad40: 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e   is really an in
ad50: 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  lined version of
ad60: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
ad70: 65 6c 65 61 73 65 28 29 0a 20 20 20 20 20 20 2a  elease().      *
ad80: 2a 20 74 68 61 74 20 74 61 6b 65 73 20 61 64 76  * that takes adv
ad90: 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20 66 61  antage of the fa
ada0: 63 74 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f  ct that the memo
adb0: 72 79 20 63 65 6c 6c 20 76 61 6c 75 65 20 69 73  ry cell value is
adc0: 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67   .      ** being
add0: 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74   set to NULL aft
ade0: 65 72 20 72 65 6c 65 61 73 69 6e 67 20 61 6e 79  er releasing any
adf0: 20 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63   dynamic resourc
ae00: 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  es..      **.   
ae10: 20 20 20 2a 2a 20 54 68 65 20 6a 75 73 74 69 66     ** The justif
ae20: 69 63 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c  ication for dupl
ae30: 69 63 61 74 69 6e 67 20 63 6f 64 65 20 69 73 20  icating code is 
ae40: 74 68 61 74 20 61 63 63 6f 72 64 69 6e 67 20 74  that according t
ae50: 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  o .      ** call
ae60: 67 72 69 6e 64 2c 20 74 68 69 73 20 63 61 75 73  grind, this caus
ae70: 65 73 20 61 20 63 65 72 74 61 69 6e 20 74 65 73  es a certain tes
ae80: 74 20 63 61 73 65 20 74 6f 20 68 69 74 20 74 68  t case to hit th
ae90: 65 20 43 50 55 20 34 2e 37 20 0a 20 20 20 20 20  e CPU 4.7 .     
aea0: 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65 73 73   ** percent less
aeb0: 20 28 78 38 36 20 6c 69 6e 75 78 2c 20 67 63 63   (x86 linux, gcc
aec0: 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20   version 4.1.2, 
aed0: 2d 4f 36 29 20 74 68 61 6e 20 69 66 20 0a 20 20  -O6) than if .  
aee0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65      ** sqlite3Me
aef0: 6d 52 65 6c 65 61 73 65 28 29 20 77 65 72 65 20  mRelease() were 
af00: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72 65  called from here
af10: 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74 68 69 73  . With -O2, this
af20: 20 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20   jumps.      ** 
af30: 74 6f 20 36 2e 36 20 70 65 72 63 65 6e 74 2e 20  to 6.6 percent. 
af40: 54 68 65 20 74 65 73 74 20 63 61 73 65 20 69 73  The test case is
af50: 20 69 6e 73 65 72 74 69 6e 67 20 31 30 30 30 20   inserting 1000 
af60: 72 6f 77 73 20 69 6e 74 6f 20 61 20 74 61 62 6c  rows into a tabl
af70: 65 20 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68  e .      ** with
af80: 20 6e 6f 20 69 6e 64 65 78 65 73 20 75 73 69 6e   no indexes usin
af90: 67 20 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61  g a single prepa
afa0: 72 65 64 20 49 4e 53 45 52 54 20 73 74 61 74 65  red INSERT state
afb0: 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20 20  ment, bind() .  
afc0: 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74      ** and reset
afd0: 28 29 2e 20 49 6e 73 65 72 74 73 20 61 72 65 20  (). Inserts are 
afe0: 67 72 6f 75 70 65 64 20 69 6e 74 6f 20 61 20 74  grouped into a t
aff0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
b000: 20 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63    */.      testc
b010: 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20  ase( p->flags & 
b020: 4d 45 4d 5f 41 67 67 20 29 3b 0a 20 20 20 20 20  MEM_Agg );.     
b030: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c   testcase( p->fl
b040: 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b  ags & MEM_Dyn );
b050: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
b060: 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f   p->flags & MEM_
b070: 46 72 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 74  Frame );.      t
b080: 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67  estcase( p->flag
b090: 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29  s & MEM_RowSet )
b0a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66  ;.      if( p->f
b0b0: 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45  lags&(MEM_Agg|ME
b0c0: 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c  M_Dyn|MEM_Frame|
b0d0: 4d 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20  MEM_RowSet) ){. 
b0e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b0f0: 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 29 3b  beMemRelease(p);
b100: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
b110: 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a   p->szMalloc ){.
b120: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
b130: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61  bFree(db, p->zMa
b140: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 70  lloc);.        p
b150: 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a  ->szMalloc = 0;.
b160: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
b170: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e  ->flags = MEM_Un
b180: 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 7d 77 68  defined;.    }wh
b190: 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20  ile( (++p)<pEnd 
b1a0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
b1b0: 44 65 6c 65 74 65 20 61 20 56 64 62 65 46 72 61  Delete a VdbeFra
b1c0: 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74  me object and it
b1d0: 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65  s contents. Vdbe
b1e0: 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72  Frame objects ar
b1f0: 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62  e.** allocated b
b200: 79 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d  y the OP_Program
b210: 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74   opcode in sqlit
b220: 65 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f  e3VdbeExec()..*/
b230: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
b240: 65 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62  eFrameDelete(Vdb
b250: 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e  eFrame *p){.  in
b260: 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d  t i;.  Mem *aMem
b270: 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28   = VdbeFrameMem(
b280: 70 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  p);.  VdbeCursor
b290: 20 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65   **apCsr = (Vdbe
b2a0: 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b  Cursor **)&aMem[
b2b0: 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20  p->nChildMem];. 
b2c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
b2d0: 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a  ChildCsr; i++){.
b2e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
b2f0: 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20  reeCursor(p->v, 
b300: 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20  apCsr[i]);.  }. 
b310: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
b320: 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64  (aMem, p->nChild
b330: 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Mem);.  sqlite3V
b340: 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61  dbeDeleteAuxData
b350: 28 70 2d 3e 76 2d 3e 64 62 2c 20 26 70 2d 3e 70  (p->v->db, &p->p
b360: 41 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b  AuxData, -1, 0);
b370: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
b380: 28 70 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d  (p->v->db, p);.}
b390: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b3a0: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a  _OMIT_EXPLAIN./*
b3b0: 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69  .** Give a listi
b3c0: 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61  ng of the progra
b3d0: 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c  m in the virtual
b3e0: 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   machine..**.** 
b3f0: 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69 73  The interface is
b400: 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c   the same as sql
b410: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20  ite3VdbeExec(). 
b420: 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   But instead of.
b430: 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63  ** running the c
b440: 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20  ode, it invokes 
b450: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63  the callback onc
b460: 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72  e for each instr
b470: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
b480: 66 65 61 74 75 72 65 20 69 73 20 75 73 65 64 20  feature is used 
b490: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58  to implement "EX
b4a0: 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68  PLAIN"..**.** Wh
b4b0: 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  en p->explain==1
b4c0: 2c 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69  , each instructi
b4d0: 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e 20 20 57  on is listed.  W
b4e0: 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69  hen.** p->explai
b4f0: 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78  n==2, only OP_Ex
b500: 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f  plain instructio
b510: 6e 73 20 61 72 65 20 6c 69 73 74 65 64 20 61 6e  ns are listed an
b520: 64 20 74 68 65 73 65 0a 2a 2a 20 61 72 65 20 73  d these.** are s
b530: 68 6f 77 6e 20 69 6e 20 61 20 64 69 66 66 65 72  hown in a differ
b540: 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e  ent format.  p->
b550: 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73  explain==2 is us
b560: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a  ed to implement.
b570: 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  ** EXPLAIN QUERY
b580: 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65   PLAN..**.** Whe
b590: 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c  n p->explain==1,
b5a0: 20 66 69 72 73 74 20 74 68 65 20 6d 61 69 6e 20   first the main 
b5b0: 70 72 6f 67 72 61 6d 20 69 73 20 6c 69 73 74 65  program is liste
b5c0: 64 2c 20 74 68 65 6e 20 65 61 63 68 20 6f 66 0a  d, then each of.
b5d0: 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72 20 73  ** the trigger s
b5e0: 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 20 6c  ubprograms are l
b5f0: 69 73 74 65 64 20 6f 6e 65 20 62 79 20 6f 6e 65  isted one by one
b600: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
b610: 56 64 62 65 4c 69 73 74 28 0a 20 20 56 64 62 65  VdbeList(.  Vdbe
b620: 20 2a 70 20 20 20 20 20 20 20 20 20 20 20 20 20   *p             
b630: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
b640: 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52  E */.){.  int nR
b650: 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ow;             
b660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b670: 2a 20 53 74 6f 70 20 77 68 65 6e 20 72 6f 77 20  * Stop when row 
b680: 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 74 68  count reaches th
b690: 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62  is */.  int nSub
b6a0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
b6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b6c0: 4e 75 6d 62 65 72 20 6f 66 20 73 75 62 2d 76 64  Number of sub-vd
b6d0: 62 65 73 20 73 65 65 6e 20 73 6f 20 66 61 72 20  bes seen so far 
b6e0: 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20  */.  SubProgram 
b6f0: 2a 2a 61 70 53 75 62 20 3d 20 30 3b 20 20 20 20  **apSub = 0;    
b700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
b710: 61 79 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20  ay of sub-vdbes 
b720: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 75 62 20 3d  */.  Mem *pSub =
b730: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
b740: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
b750: 6f 72 79 20 63 65 6c 6c 20 68 6f 6c 64 20 61 72  ory cell hold ar
b760: 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 73 20  ray of subprogs 
b770: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
b780: 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20 20 20   = p->db;       
b790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
b7a0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
b7b0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  tion */.  int i;
b7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b7e0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
b7f0: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
b800: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
b810: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
b820: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d  rn code */.  Mem
b830: 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65   *pMem = &p->aMe
b840: 6d 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20  m[1];           
b850: 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f    /* First Mem o
b860: 66 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  f result set */.
b870: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 78  .  assert( p->ex
b880: 70 6c 61 69 6e 20 29 3b 0a 20 20 61 73 73 65 72  plain );.  asser
b890: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
b8a0: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20  E_MAGIC_RUN );. 
b8b0: 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
b8c0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
b8d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
b8e0: 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  || p->rc==SQLITE
b8f0: 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20  _NOMEM );..  /* 
b900: 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68 69 73  Even though this
b910: 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74   opcode does not
b920: 20 75 73 65 20 64 79 6e 61 6d 69 63 20 73 74 72   use dynamic str
b930: 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68  ings for.  ** th
b940: 65 20 72 65 73 75 6c 74 2c 20 72 65 73 75 6c 74  e result, result
b950: 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63   columns may bec
b960: 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69 66 20 74  ome dynamic if t
b970: 68 65 20 75 73 65 72 20 63 61 6c 6c 73 0a 20 20  he user calls.  
b980: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ** sqlite3_colum
b990: 6e 5f 74 65 78 74 31 36 28 29 2c 20 63 61 75 73  n_text16(), caus
b9a0: 69 6e 67 20 61 20 74 72 61 6e 73 6c 61 74 69 6f  ing a translatio
b9b0: 6e 20 74 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f  n to UTF-16 enco
b9c0: 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c  ding..  */.  rel
b9d0: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 4d 65  easeMemArray(pMe
b9e0: 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e 70 52 65 73  m, 8);.  p->pRes
b9f0: 75 6c 74 53 65 74 20 3d 20 30 3b 0a 0a 20 20 69  ultSet = 0;..  i
ba00: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
ba10: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 20 29 7b 0a 20  _NOMEM_BKPT ){. 
ba20: 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
ba30: 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  ns if a malloc()
ba40: 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74   inside a call t
ba50: 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  o sqlite3_column
ba60: 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a  _text() or.    *
ba70: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  * sqlite3_column
ba80: 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64  _text16() failed
ba90: 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  .  */.    sqlite
baa0: 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
bab0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bac0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
bad0: 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  * When the numbe
bae0: 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
baf0: 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20 74   reaches nRow, t
bb00: 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20 20  hat means the.  
bb10: 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20 66  ** listing has f
bb20: 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c 69  inished and sqli
bb30: 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75 6c  te3_step() shoul
bb40: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
bb50: 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20  DONE..  ** nRow 
bb60: 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  is the sum of th
bb70: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
bb80: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f   in the main pro
bb90: 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20  gram, plus.  ** 
bba0: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e  the sum of the n
bbb0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
bbc0: 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75 62   all trigger sub
bbd0: 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74  programs encount
bbe0: 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72  ered.  ** so far
bbf0: 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75  .  The nRow valu
bc00: 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20  e will increase 
bc10: 61 73 20 6e 65 77 20 74 72 69 67 67 65 72 20 73  as new trigger s
bc20: 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a 20  ubprograms are. 
bc30: 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   ** encountered,
bc40: 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20   but p->pc will 
bc50: 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63 68  eventually catch
bc60: 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a   up to nRow..  *
bc70: 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f  /.  nRow = p->nO
bc80: 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  p;.  if( p->expl
bc90: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a  ain==1 ){.    /*
bca0: 20 54 68 65 20 66 69 72 73 74 20 38 20 6d 65 6d   The first 8 mem
bcb0: 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75 73  ory cells are us
bcc0: 65 64 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ed for the resul
bcd0: 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77 69  t set.  So we wi
bce0: 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e  ll.    ** comman
bcf0: 64 65 65 72 20 74 68 65 20 39 74 68 20 63 65 6c  deer the 9th cel
bd00: 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f 72  l to use as stor
bd10: 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61 79  age for an array
bd20: 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20 20   of pointers.   
bd30: 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20 73   ** to trigger s
bd40: 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68 65  ubprograms.  The
bd50: 20 56 44 42 45 20 69 73 20 67 75 61 72 61 6e 74   VDBE is guarant
bd60: 65 65 64 20 74 6f 20 68 61 76 65 20 61 74 20 6c  eed to have at l
bd70: 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63 65  east 9.    ** ce
bd80: 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  lls.  */.    ass
bd90: 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29  ert( p->nMem>9 )
bda0: 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d  ;.    pSub = &p-
bdb0: 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66  >aMem[9];.    if
bdc0: 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45  ( pSub->flags&ME
bdd0: 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20  M_Blob ){.      
bde0: 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20  /* On the first 
bdf0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
be00: 73 74 65 70 28 29 2c 20 70 53 75 62 20 77 69 6c  step(), pSub wil
be10: 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20  l hold a NULL.  
be20: 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  It is.      ** i
be30: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20  nitialized to a 
be40: 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f 53  BLOB by the P4_S
be50: 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65 73  UBPROGRAM proces
be60: 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77  sing logic below
be70: 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20 3d   */.      nSub =
be80: 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28   pSub->n/sizeof(
be90: 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70  Vdbe*);.      ap
bea0: 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61  Sub = (SubProgra
beb0: 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20  m **)pSub->z;.  
bec0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
bed0: 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20   i<nSub; i++){. 
bee0: 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53       nRow += apS
bef0: 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20  ub[i]->nOp;.    
bf00: 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20  }.  }..  do{.   
bf10: 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20   i = p->pc++;.  
bf20: 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26  }while( i<nRow &
bf30: 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  & p->explain==2 
bf40: 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  && p->aOp[i].opc
bf50: 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20  ode!=OP_Explain 
bf60: 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77  );.  if( i>=nRow
bf70: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
bf80: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
bf90: 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
bfa0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d  .  }else if( db-
bfb0: 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65  >u1.isInterrupte
bfc0: 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
bfd0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
bfe0: 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  T;.    rc = SQLI
bff0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71  TE_ERROR;.    sq
c000: 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70  lite3VdbeError(p
c010: 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
c020: 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65  p->rc));.  }else
c030: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 34 3b  {.    char *zP4;
c040: 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  .    Op *pOp;.  
c050: 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70 20 29    if( i<p->nOp )
c060: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  {.      /* The o
c070: 75 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d 62 65  utput line numbe
c080: 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  r is small enoug
c090: 68 20 74 68 61 74 20 77 65 20 61 72 65 20 73 74  h that we are st
c0a0: 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20 20 20  ill in the.     
c0b0: 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d   ** main program
c0c0: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70 20 3d  . */.      pOp =
c0d0: 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20   &p->aOp[i];.   
c0e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
c0f0: 20 57 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c   We are currentl
c100: 79 20 6c 69 73 74 69 6e 67 20 73 75 62 70 72 6f  y listing subpro
c110: 67 72 61 6d 73 2e 20 20 46 69 67 75 72 65 20 6f  grams.  Figure o
c120: 75 74 20 77 68 69 63 68 20 6f 6e 65 20 61 6e 64  ut which one and
c130: 0a 20 20 20 20 20 20 2a 2a 20 70 69 63 6b 20 75  .      ** pick u
c140: 70 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  p the appropriat
c150: 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20  e opcode. */.   
c160: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
c170: 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20  i -= p->nOp;.   
c180: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61     for(j=0; i>=a
c190: 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b  pSub[j]->nOp; j+
c1a0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2d 3d  +){.        i -=
c1b0: 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a   apSub[j]->nOp;.
c1c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f        }.      pO
c1d0: 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d 3e 61  p = &apSub[j]->a
c1e0: 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  Op[i];.    }.   
c1f0: 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d   if( p->explain=
c200: 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d  =1 ){.      pMem
c210: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
c220: 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  t;.      pMem->u
c230: 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20  .i = i;         
c240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c250: 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61         /* Progra
c260: 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  m counter */.   
c270: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20     pMem++;.  .  
c280: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
c290: 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d  = MEM_Static|MEM
c2a0: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
c2b0: 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28       pMem->z = (
c2c0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f 70 63  char*)sqlite3Opc
c2d0: 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63  odeName(pOp->opc
c2e0: 6f 64 65 29 3b 20 2f 2a 20 4f 70 63 6f 64 65 20  ode); /* Opcode 
c2f0: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
c300: 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20   pMem->z!=0 );. 
c310: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73       pMem->n = s
c320: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
c330: 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70  Mem->z);.      p
c340: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
c350: 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d  E_UTF8;.      pM
c360: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  em++;..      /* 
c370: 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72  When an OP_Progr
c380: 61 6d 20 6f 70 63 6f 64 65 20 69 73 20 65 6e 63  am opcode is enc
c390: 6f 75 6e 74 65 72 20 28 74 68 65 20 6f 6e 6c 79  ounter (the only
c3a0: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 68 61 73   opcode that has
c3b0: 0a 20 20 20 20 20 20 2a 2a 20 61 20 50 34 5f 53  .      ** a P4_S
c3c0: 55 42 50 52 4f 47 52 41 4d 20 61 72 67 75 6d 65  UBPROGRAM argume
c3d0: 6e 74 29 2c 20 65 78 70 61 6e 64 20 74 68 65 20  nt), expand the 
c3e0: 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61  size of the arra
c3f0: 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d 73  y of subprograms
c400: 0a 20 20 20 20 20 20 2a 2a 20 6b 65 70 74 20 69  .      ** kept i
c410: 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74  n p->aMem[9].z t
c420: 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65 77 20 70  o hold the new p
c430: 72 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d 69 6e  rogram - assumin
c440: 67 20 74 68 69 73 20 73 75 62 70 72 6f 67 72 61  g this subprogra
c450: 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e  m.      ** has n
c460: 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ot already been 
c470: 73 65 65 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  seen..      */. 
c480: 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34       if( pOp->p4
c490: 74 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47  type==P4_SUBPROG
c4a0: 52 41 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  RAM ){.        i
c4b0: 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e 53 75 62  nt nByte = (nSub
c4c0: 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72  +1)*sizeof(SubPr
c4d0: 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20  ogram*);.       
c4e0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
c4f0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b  for(j=0; j<nSub;
c500: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
c510: 20 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d 3d 70   if( apSub[j]==p
c520: 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20  Op->p4.pProgram 
c530: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
c540: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
c550: 3d 3d 6e 53 75 62 20 26 26 20 53 51 4c 49 54 45  ==nSub && SQLITE
c560: 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64 62 65  _OK==sqlite3Vdbe
c570: 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c 20 6e 42  MemGrow(pSub, nB
c580: 79 74 65 2c 20 6e 53 75 62 21 3d 30 29 20 29 7b  yte, nSub!=0) ){
c590: 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62  .          apSub
c5a0: 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a   = (SubProgram *
c5b0: 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 20  *)pSub->z;.     
c5c0: 20 20 20 20 20 61 70 53 75 62 5b 6e 53 75 62 2b       apSub[nSub+
c5d0: 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72  +] = pOp->p4.pPr
c5e0: 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 20  ogram;.         
c5f0: 20 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20   pSub->flags |= 
c600: 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20  MEM_Blob;.      
c610: 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53      pSub->n = nS
c620: 75 62 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f  ub*sizeof(SubPro
c630: 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20  gram*);.        
c640: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
c650: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
c660: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
c670: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d  pMem->u.i = pOp-
c680: 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  >p1;            
c690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c6a0: 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b   P1 */.    pMem+
c6b0: 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  +;..    pMem->fl
c6c0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
c6d0: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70     pMem->u.i = p
c6e0: 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20  Op->p2;         
c6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c700: 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d   /* P2 */.    pM
c710: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d  em++;..    pMem-
c720: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
c730: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  ;.    pMem->u.i 
c740: 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20  = pOp->p3;      
c750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c760: 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20      /* P3 */.   
c770: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66   pMem++;..    if
c780: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
c790: 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70  ClearAndResize(p
c7a0: 4d 65 6d 2c 20 31 30 30 29 20 29 7b 20 2f 2a 20  Mem, 100) ){ /* 
c7b0: 50 34 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  P4 */.      asse
c7c0: 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  rt( p->db->mallo
c7d0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
c7e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
c7f0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
c800: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
c810: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
c820: 20 20 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61      zP4 = displa
c830: 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a  yP4(pOp, pMem->z
c840: 2c 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63  , pMem->szMalloc
c850: 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 34 21 3d  );.    if( zP4!=
c860: 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20  pMem->z ){.     
c870: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 30 3b 0a 20 20   pMem->n = 0;.  
c880: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
c890: 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a  emSetStr(pMem, z
c8a0: 50 34 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  P4, -1, SQLITE_U
c8b0: 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  TF8, 0);.    }el
c8c0: 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
c8d0: 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a  ( pMem->z!=0 );.
c8e0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
c8f0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
c900: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  pMem->z);.      
c910: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
c920: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20  TE_UTF8;.    }. 
c930: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
c940: 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  if( p->explain==
c950: 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  1 ){.      if( s
c960: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65  qlite3VdbeMemCle
c970: 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d  arAndResize(pMem
c980: 2c 20 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 4) ){.        
c990: 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d  assert( p->db->m
c9a0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
c9b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
c9c0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
c9d0: 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e    }.      pMem->
c9e0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c  flags = MEM_Str|
c9f0: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20  MEM_Term;.      
ca00: 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20  pMem->n = 2;.   
ca10: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
ca20: 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  ntf(3, pMem->z, 
ca30: 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29  "%.2x", pOp->p5)
ca40: 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20  ;   /* P5 */.   
ca50: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53     pMem->enc = S
ca60: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20  QLITE_UTF8;.    
ca70: 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66    pMem++;.  .#if
ca80: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
ca90: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
caa0: 54 53 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  TS.      if( sql
cab0: 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72  ite3VdbeMemClear
cac0: 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20  AndResize(pMem, 
cad0: 35 30 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  500) ){.        
cae0: 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d  assert( p->db->m
caf0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
cb00: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
cb10: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
cb20: 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e    }.      pMem->
cb30: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c  flags = MEM_Str|
cb40: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20  MEM_Term;.      
cb50: 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69 73 70 6c 61  pMem->n = displa
cb60: 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50  yComment(pOp, zP
cb70: 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29  4, pMem->z, 500)
cb80: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ;.      pMem->en
cb90: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
cba0: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70 4d 65  .#else.      pMe
cbb0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  m->flags = MEM_N
cbc0: 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ull;            
cbd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
cbe0: 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64 69 66 0a  mment */.#endif.
cbf0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52      }..    p->nR
cc00: 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 34  esColumn = 8 - 4
cc10: 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b  *(p->explain-1);
cc20: 0a 20 20 20 20 70 2d 3e 70 52 65 73 75 6c 74 53  .    p->pResultS
cc30: 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d  et = &p->aMem[1]
cc40: 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  ;.    p->rc = SQ
cc50: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20  LITE_OK;.    rc 
cc60: 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20  = SQLITE_ROW;.  
cc70: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
cc80: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
cc90: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a  E_OMIT_EXPLAIN *
cca0: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
ccb0: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69  _DEBUG./*.** Pri
ccc0: 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61 74 20  nt the SQL that 
ccd0: 77 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65  was used to gene
cce0: 72 61 74 65 20 61 20 56 44 42 45 20 70 72 6f 67  rate a VDBE prog
ccf0: 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ram..*/.void sql
cd00: 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c  ite3VdbePrintSql
cd10: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 63 6f 6e  (Vdbe *p){.  con
cd20: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a  st char *z = 0;.
cd30: 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b    if( p->zSql ){
cd40: 0a 20 20 20 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c  .    z = p->zSql
cd50: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
cd60: 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20 20 20 63  >nOp>=1 ){.    c
cd70: 6f 6e 73 74 20 56 64 62 65 4f 70 20 2a 70 4f 70  onst VdbeOp *pOp
cd80: 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20   = &p->aOp[0];. 
cd90: 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
cda0: 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70  de==OP_Init && p
cdb0: 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20  Op->p4.z!=0 ){. 
cdc0: 20 20 20 20 20 7a 20 3d 20 70 4f 70 2d 3e 70 34       z = pOp->p4
cdd0: 2e 7a 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  .z;.      while(
cde0: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
cdf0: 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d  *z) ) z++;.    }
ce00: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 20 70  .  }.  if( z ) p
ce10: 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d  rintf("SQL: [%s]
ce20: 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69  \n", z);.}.#endi
ce30: 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
ce40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
ce50: 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  E) && defined(SQ
ce60: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
ce70: 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  ACE)./*.** Print
ce80: 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73   an IOTRACE mess
ce90: 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20  age showing SQL 
cea0: 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  content..*/.void
ceb0: 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72   sqlite3VdbeIOTr
cec0: 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b  aceSql(Vdbe *p){
ced0: 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e  .  int nOp = p->
cee0: 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  nOp;.  VdbeOp *p
cef0: 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  Op;.  if( sqlite
cf00: 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65  3IoTrace==0 ) re
cf10: 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c  turn;.  if( nOp<
cf20: 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f  1 ) return;.  pO
cf30: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a  p = &p->aOp[0];.
cf40: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
cf50: 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f  e==OP_Init && pO
cf60: 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20  p->p4.z!=0 ){.  
cf70: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
cf80: 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20  char z[1000];.  
cf90: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
cfa0: 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c  tf(sizeof(z), z,
cfb0: 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a   "%s", pOp->p4.z
cfc0: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
cfd0: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
cfe0: 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20  [i]); i++){}.   
cff0: 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20   for(j=0; z[i]; 
d000: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
d010: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
d020: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
d030: 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20  if( z[i-1]!=' ' 
d040: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a  ){.          z[j
d050: 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20  ++] = ' ';.     
d060: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
d070: 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d  {.        z[j++]
d080: 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d   = z[i];.      }
d090: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20  .    }.    z[j] 
d0a0: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
d0b0: 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c  IoTrace("SQL %s\
d0c0: 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65  n", z);.  }.}.#e
d0d0: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
d0e0: 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53 51  OMIT_TRACE && SQ
d0f0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
d100: 41 43 45 20 2a 2f 0a 0a 2f 2a 20 41 6e 20 69 6e  ACE */../* An in
d110: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f  stance of this o
d120: 62 6a 65 63 74 20 64 65 73 63 72 69 62 65 73 20  bject describes 
d130: 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 61 76 61 69  bulk memory avai
d140: 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 0a 2a 2a  lable for use.**
d150: 20 62 79 20 73 75 62 63 6f 6d 70 6f 6e 65 6e 74   by subcomponent
d160: 73 20 6f 66 20 61 20 70 72 65 70 61 72 65 64 20  s of a prepared 
d170: 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 70 61 63  statement.  Spac
d180: 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f  e is allocated o
d190: 75 74 0a 2a 2a 20 6f 66 20 61 20 52 65 75 73 61  ut.** of a Reusa
d1a0: 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74 20  bleSpace object 
d1b0: 62 79 20 74 68 65 20 61 6c 6c 6f 63 53 70 61 63  by the allocSpac
d1c0: 65 28 29 20 72 6f 75 74 69 6e 65 20 62 65 6c 6f  e() routine belo
d1d0: 77 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52 65 75  w..*/.struct Reu
d1e0: 73 61 62 6c 65 53 70 61 63 65 20 7b 0a 20 20 75  sableSpace {.  u
d1f0: 38 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20  8 *pSpace;      
d200: 20 20 20 20 2f 2a 20 41 76 61 69 6c 61 62 6c 65      /* Available
d210: 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74   memory */.  int
d220: 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
d230: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 61 76    /* Bytes of av
d240: 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79 20 2a  ailable memory *
d250: 2f 0a 20 20 69 6e 74 20 6e 4e 65 65 64 65 64 3b  /.  int nNeeded;
d260: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
d270: 6c 20 62 79 74 65 73 20 74 68 61 74 20 63 6f 75  l bytes that cou
d280: 6c 64 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61  ld not be alloca
d290: 74 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 72  ted */.};../* Tr
d2a0: 79 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6e 42  y to allocate nB
d2b0: 79 74 65 20 62 79 74 65 73 20 6f 66 20 38 2d 62  yte bytes of 8-b
d2c0: 79 74 65 20 61 6c 69 67 6e 65 64 20 62 75 6c 6b  yte aligned bulk
d2d0: 20 6d 65 6d 6f 72 79 20 66 6f 72 20 70 42 75 66   memory for pBuf
d2e0: 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 52 65 75  .** from the Reu
d2f0: 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63  sableSpace objec
d300: 74 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  t.  Return a poi
d310: 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f  nter to the allo
d320: 63 61 74 65 64 0a 2a 2a 20 6d 65 6d 6f 72 79 20  cated.** memory 
d330: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
d340: 69 6e 73 75 66 66 69 63 69 65 6e 74 20 6d 65 6d  insufficient mem
d350: 6f 72 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ory is available
d360: 20 69 6e 20 74 68 65 0a 2a 2a 20 52 65 75 73 61   in the.** Reusa
d370: 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74 2c  bleSpace object,
d380: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 52 65   increase the Re
d390: 75 73 61 62 6c 65 53 70 61 63 65 2e 6e 4e 65 65  usableSpace.nNee
d3a0: 64 65 64 0a 2a 2a 20 76 61 6c 75 65 20 62 79 20  ded.** value by 
d3b0: 74 68 65 20 61 6d 6f 75 6e 74 20 6e 65 65 64 65  the amount neede
d3c0: 64 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  d and return NUL
d3d0: 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 66  L..**.** If pBuf
d3e0: 20 69 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c 6c   is not initiall
d3f0: 79 20 4e 55 4c 4c 2c 20 74 68 61 74 20 6d 65 61  y NULL, that mea
d400: 6e 73 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f  ns that the memo
d410: 72 79 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a  ry has already.*
d420: 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  * been allocated
d430: 20 62 79 20 61 20 70 72 69 6f 72 20 63 61 6c 6c   by a prior call
d440: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
d450: 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e  , so just return
d460: 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 70 42   a copy.** of pB
d470: 75 66 20 61 6e 64 20 6c 65 61 76 65 20 52 65 75  uf and leave Reu
d480: 73 61 62 6c 65 53 70 61 63 65 20 75 6e 63 68 61  sableSpace uncha
d490: 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  nged..**.** This
d4a0: 20 61 6c 6c 6f 63 61 74 6f 72 20 69 73 20 65 6d   allocator is em
d4b0: 70 6c 6f 79 65 64 20 74 6f 20 72 65 70 75 72 70  ployed to repurp
d4c0: 6f 73 65 20 75 6e 75 73 65 64 20 73 6c 6f 74 73  ose unused slots
d4d0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
d4e0: 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 20 61 72 72  he.** opcode arr
d4f0: 61 79 20 6f 66 20 70 72 65 70 61 72 65 64 20 73  ay of prepared s
d500: 74 61 74 65 20 66 6f 72 20 6f 74 68 65 72 20 6d  tate for other m
d510: 65 6d 6f 72 79 20 6e 65 65 64 73 20 6f 66 20 74  emory needs of t
d520: 68 65 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73  he prepared.** s
d530: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  tatement..*/.sta
d540: 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53  tic void *allocS
d550: 70 61 63 65 28 0a 20 20 73 74 72 75 63 74 20 52  pace(.  struct R
d560: 65 75 73 61 62 6c 65 53 70 61 63 65 20 2a 70 2c  eusableSpace *p,
d570: 20 20 2f 2a 20 42 75 6c 6b 20 6d 65 6d 6f 72 79    /* Bulk memory
d580: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61   available for a
d590: 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 76  llocation */.  v
d5a0: 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
d5b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
d5c0: 74 65 72 20 74 6f 20 61 20 70 72 69 6f 72 20 61  ter to a prior a
d5d0: 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  llocation */.  i
d5e0: 6e 74 20 6e 42 79 74 65 20 20 20 20 20 20 20 20  nt nByte        
d5f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
d600: 73 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64  s of memory need
d610: 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  ed */.){.  asser
d620: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
d630: 49 47 4e 4d 45 4e 54 28 70 2d 3e 70 53 70 61 63  IGNMENT(p->pSpac
d640: 65 29 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66  e) );.  if( pBuf
d650: 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65  ==0 ){.    nByte
d660: 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29   = ROUND8(nByte)
d670: 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 20  ;.    if( nByte 
d680: 3c 3d 20 70 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  <= p->nFree ){. 
d690: 20 20 20 20 20 70 2d 3e 6e 46 72 65 65 20 2d 3d       p->nFree -=
d6a0: 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 70 42   nByte;.      pB
d6b0: 75 66 20 3d 20 26 70 2d 3e 70 53 70 61 63 65 5b  uf = &p->pSpace[
d6c0: 70 2d 3e 6e 46 72 65 65 5d 3b 0a 20 20 20 20 7d  p->nFree];.    }
d6d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  else{.      p->n
d6e0: 4e 65 65 64 65 64 20 2b 3d 20 6e 42 79 74 65 3b  Needed += nByte;
d6f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
d700: 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
d710: 41 4c 49 47 4e 4d 45 4e 54 28 70 42 75 66 29 20  ALIGNMENT(pBuf) 
d720: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66  );.  return pBuf
d730: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e  ;.}../*.** Rewin
d740: 64 20 74 68 65 20 56 44 42 45 20 62 61 63 6b 20  d the VDBE back 
d750: 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
d760: 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20   in preparation 
d770: 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69  for.** running i
d780: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
d790: 65 33 56 64 62 65 52 65 77 69 6e 64 28 56 64 62  e3VdbeRewind(Vdb
d7a0: 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e  e *p){.#if defin
d7b0: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
d7c0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45   || defined(VDBE
d7d0: 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20  _PROFILE).  int 
d7e0: 69 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  i;.#endif.  asse
d7f0: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
d800: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
d810: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
d820: 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  || p->magic==VDB
d830: 45 5f 4d 41 47 49 43 5f 52 45 53 45 54 20 29 3b  E_MAGIC_RESET );
d840: 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f  ..  /* There sho
d850: 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74 20  uld be at least 
d860: 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f  one opcode..  */
d870: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
d880: 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  p>0 );..  /* Set
d890: 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44   the magic to VD
d8a0: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f  BE_MAGIC_RUN soo
d8b0: 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20  ner rather than 
d8c0: 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d  later. */.  p->m
d8d0: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
d8e0: 43 5f 52 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53  C_RUN;..#ifdef S
d8f0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f  QLITE_DEBUG.  fo
d900: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d  r(i=0; i<p->nMem
d910: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
d920: 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64  rt( p->aMem[i].d
d930: 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a  b==p->db );.  }.
d940: 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d  #endif.  p->pc =
d950: 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53   -1;.  p->rc = S
d960: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65  QLITE_OK;.  p->e
d970: 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f  rrorAction = OE_
d980: 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 6e 43 68 61  Abort;.  p->nCha
d990: 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61  nge = 0;.  p->ca
d9a0: 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d  cheCtr = 1;.  p-
d9b0: 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72  >minWriteFileFor
d9c0: 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e  mat = 255;.  p->
d9d0: 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  iStatement = 0;.
d9e0: 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69    p->nFkConstrai
d9f0: 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56  nt = 0;.#ifdef V
da00: 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f  DBE_PROFILE.  fo
da10: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
da20: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f   i++){.    p->aO
da30: 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20  p[i].cnt = 0;.  
da40: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c    p->aOp[i].cycl
da50: 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  es = 0;.  }.#end
da60: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70  if.}../*.** Prep
da70: 61 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61  are a virtual ma
da80: 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74  chine for execut
da90: 69 6f 6e 20 66 6f 72 20 74 68 65 20 66 69 72 73  ion for the firs
daa0: 74 20 74 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20  t time after.** 
dab0: 63 72 65 61 74 69 6e 67 20 74 68 65 20 76 69 72  creating the vir
dac0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54  tual machine.  T
dad0: 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69  his involves thi
dae0: 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61  ngs such.** as a
daf0: 6c 6c 6f 63 61 74 69 6e 67 20 72 65 67 69 73 74  llocating regist
db00: 65 72 73 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ers and initiali
db10: 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d  zing the program
db20: 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74   counter..** Aft
db30: 65 72 20 74 68 65 20 56 44 42 45 20 68 61 73 20  er the VDBE has 
db40: 62 65 20 70 72 65 70 70 65 64 2c 20 69 74 20 63  be prepped, it c
db50: 61 6e 20 62 65 20 65 78 65 63 75 74 65 64 20 62  an be executed b
db60: 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a  y one or more.**
db70: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
db80: 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a 2a  3VdbeExec().  .*
db90: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
dba0: 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  on may be called
dbb0: 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 6f 6e   exactly once on
dbc0: 20 65 61 63 68 20 76 69 72 74 75 61 6c 20 6d 61   each virtual ma
dbd0: 63 68 69 6e 65 2e 0a 2a 2a 20 41 66 74 65 72 20  chine..** After 
dbe0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
dbf0: 63 61 6c 6c 65 64 20 74 68 65 20 56 4d 20 68 61  called the VM ha
dc00: 73 20 62 65 65 6e 20 22 70 61 63 6b 61 67 65 64  s been "packaged
dc10: 22 20 61 6e 64 20 69 73 20 72 65 61 64 79 0a 2a  " and is ready.*
dc20: 2a 20 74 6f 20 72 75 6e 2e 20 20 41 66 74 65 72  * to run.  After
dc30: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
dc40: 20 63 61 6c 6c 65 64 2c 20 66 75 72 74 68 65 72   called, further
dc50: 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71   calls to .** sq
dc60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 29  lite3VdbeAddOp()
dc70: 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 70   functions are p
dc80: 72 6f 68 69 62 69 74 65 64 2e 20 20 54 68 69 73  rohibited.  This
dc90: 20 72 6f 75 74 69 6e 65 20 64 69 73 63 6f 6e 6e   routine disconn
dca0: 65 63 74 73 0a 2a 2a 20 74 68 65 20 56 64 62 65  ects.** the Vdbe
dcb0: 20 66 72 6f 6d 20 74 68 65 20 50 61 72 73 65 20   from the Parse 
dcc0: 6f 62 6a 65 63 74 20 74 68 61 74 20 68 65 6c 70  object that help
dcd0: 65 64 20 67 65 6e 65 72 61 74 65 20 69 74 20 73  ed generate it s
dce0: 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 74 68  o that the.** th
dcf0: 65 20 56 64 62 65 20 62 65 63 6f 6d 65 73 20 61  e Vdbe becomes a
dd00: 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 65 6e  n independent en
dd10: 74 69 74 79 20 61 6e 64 20 74 68 65 20 50 61 72  tity and the Par
dd20: 73 65 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65  se object can be
dd30: 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a  .** destroyed..*
dd40: 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c  *.** Use the sql
dd50: 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 29  ite3VdbeRewind()
dd60: 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20 72 65   procedure to re
dd70: 73 74 6f 72 65 20 61 20 76 69 72 74 75 61 6c 20  store a virtual 
dd80: 6d 61 63 68 69 6e 65 20 62 61 63 6b 0a 2a 2a 20  machine back.** 
dd90: 74 6f 20 69 74 73 20 69 6e 69 74 69 61 6c 20 73  to its initial s
dda0: 74 61 74 65 20 61 66 74 65 72 20 69 74 20 68 61  tate after it ha
ddb0: 73 20 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76  s been run..*/.v
ddc0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d  oid sqlite3VdbeM
ddd0: 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65  akeReady(.  Vdbe
dde0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
ddf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
de00: 65 20 56 44 42 45 20 2a 2f 0a 20 20 50 61 72 73  e VDBE */.  Pars
de10: 65 20 2a 70 50 61 72 73 65 20 20 20 20 20 20 20  e *pParse       
de20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
de30: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
de40: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
de50: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
de60: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
de70: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
de80: 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b 20 20  */.  int nVar;  
de90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dea0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
deb0: 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
dec0: 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20   int nMem;      
ded0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dee0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 56 4d 20  /* Number of VM 
def0: 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73  memory registers
df00: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f   */.  int nCurso
df10: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
df20: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
df30: 66 20 63 75 72 73 6f 72 73 20 72 65 71 75 69 72  f cursors requir
df40: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67  ed */.  int nArg
df50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
df60: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
df70: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 69 6e   of arguments in
df80: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a   subprograms */.
df90: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
dfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfb0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
dfc0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 52 65 75   */.  struct Reu
dfd0: 73 61 62 6c 65 53 70 61 63 65 20 78 3b 20 20 20  sableSpace x;   
dfe0: 20 20 20 20 20 2f 2a 20 52 65 75 73 61 62 6c 65       /* Reusable
dff0: 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 2a 2f 0a   bulk memory */.
e000: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
e010: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
e020: 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  nOp>0 );.  asser
e030: 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a  t( pParse!=0 );.
e040: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
e050: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
e060: 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NIT );.  assert(
e070: 20 70 50 61 72 73 65 3d 3d 70 2d 3e 70 50 61 72   pParse==p->pPar
e080: 73 65 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  se );.  db = p->
e090: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  db;.  assert( db
e0a0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
e0b0: 30 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50  0 );.  nVar = pP
e0c0: 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d  arse->nVar;.  nM
e0d0: 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
e0e0: 6d 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20 70  m;.  nCursor = p
e0f0: 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e  Parse->nTab;.  n
e100: 41 72 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Arg = pParse->nM
e110: 61 78 41 72 67 3b 0a 20 20 0a 20 20 2f 2a 20 45  axArg;.  .  /* E
e120: 61 63 68 20 63 75 72 73 6f 72 20 75 73 65 73 20  ach cursor uses 
e130: 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 20  a memory cell.  
e140: 54 68 65 20 66 69 72 73 74 20 63 75 72 73 6f 72  The first cursor
e150: 20 28 63 75 72 73 6f 72 20 30 29 20 63 61 6e 0a   (cursor 0) can.
e160: 20 20 2a 2a 20 75 73 65 20 61 4d 65 6d 5b 30 5d    ** use aMem[0]
e170: 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 6f 74   which is not ot
e180: 68 65 72 77 69 73 65 20 75 73 65 64 20 62 79 20  herwise used by 
e190: 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d  the VDBE program
e1a0: 2e 20 20 41 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a  .  Allocate.  **
e1b0: 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
e1c0: 64 20 6f 66 20 61 4d 65 6d 5b 5d 20 66 6f 72 20  d of aMem[] for 
e1d0: 63 75 72 73 6f 72 73 20 31 20 61 6e 64 20 67 72  cursors 1 and gr
e1e0: 65 61 74 65 72 2e 0a 20 20 2a 2a 20 53 65 65 20  eater..  ** See 
e1f0: 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75  also: allocateCu
e200: 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e  rsor()..  */.  n
e210: 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a  Mem += nCursor;.
e220: 20 20 69 66 28 20 6e 43 75 72 73 6f 72 3d 3d 30    if( nCursor==0
e230: 20 26 26 20 6e 4d 65 6d 3e 30 20 29 20 6e 4d 65   && nMem>0 ) nMe
e240: 6d 2b 2b 3b 20 20 2f 2a 20 53 70 61 63 65 20 66  m++;  /* Space f
e250: 6f 72 20 61 4d 65 6d 5b 30 5d 20 65 76 65 6e 20  or aMem[0] even 
e260: 69 66 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 0a  if not used */..
e270: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
e280: 68 6f 77 20 6d 75 63 68 20 72 65 75 73 61 62 6c  how much reusabl
e290: 65 20 6d 65 6d 6f 72 79 20 69 73 20 61 76 61 69  e memory is avai
e2a0: 6c 61 62 6c 65 20 61 74 20 74 68 65 20 65 6e 64  lable at the end
e2b0: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6f 70 63   of the.  ** opc
e2c0: 6f 64 65 20 61 72 72 61 79 2e 20 20 54 68 69 73  ode array.  This
e2d0: 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 77 69   extra memory wi
e2e0: 6c 6c 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65  ll be reallocate
e2f0: 64 20 66 6f 72 20 6f 74 68 65 72 20 65 6c 65 6d  d for other elem
e300: 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65  ents.  ** of the
e310: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
e320: 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20  ent..  */.  n = 
e330: 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4f 70  ROUND8(sizeof(Op
e340: 29 2a 70 2d 3e 6e 4f 70 29 3b 20 20 20 20 20 20  )*p->nOp);      
e350: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
e360: 20 6f 66 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72   of opcode memor
e370: 79 20 75 73 65 64 20 2a 2f 0a 20 20 78 2e 70 53  y used */.  x.pS
e380: 70 61 63 65 20 3d 20 26 28 28 75 38 2a 29 70 2d  pace = &((u8*)p-
e390: 3e 61 4f 70 29 5b 6e 5d 3b 20 20 20 20 20 20 20  >aOp)[n];       
e3a0: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65          /* Unuse
e3b0: 64 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20  d opcode memory 
e3c0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  */.  assert( EIG
e3d0: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
e3e0: 54 28 78 2e 70 53 70 61 63 65 29 20 29 3b 0a 20  T(x.pSpace) );. 
e3f0: 20 78 2e 6e 46 72 65 65 20 3d 20 52 4f 55 4e 44   x.nFree = ROUND
e400: 44 4f 57 4e 38 28 70 50 61 72 73 65 2d 3e 73 7a  DOWN8(pParse->sz
e410: 4f 70 41 6c 6c 6f 63 20 2d 20 6e 29 3b 20 20 2f  OpAlloc - n);  /
e420: 2a 20 42 79 74 65 73 20 6f 66 20 75 6e 75 73 65  * Bytes of unuse
e430: 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 73  d memory */.  as
e440: 73 65 72 74 28 20 78 2e 6e 46 72 65 65 3e 3d 30  sert( x.nFree>=0
e450: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   );.  assert( EI
e460: 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
e470: 4e 54 28 26 78 2e 70 53 70 61 63 65 5b 78 2e 6e  NT(&x.pSpace[x.n
e480: 46 72 65 65 5d 29 20 29 3b 0a 0a 20 20 72 65 73  Free]) );..  res
e490: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20  olveP2Values(p, 
e4a0: 26 6e 41 72 67 29 3b 0a 20 20 70 2d 3e 75 73 65  &nArg);.  p->use
e4b0: 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28  sStmtJournal = (
e4c0: 75 38 29 28 70 50 61 72 73 65 2d 3e 69 73 4d 75  u8)(pParse->isMu
e4d0: 6c 74 69 57 72 69 74 65 20 26 26 20 70 50 61 72  ltiWrite && pPar
e4e0: 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20  se->mayAbort);. 
e4f0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
e500: 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20  lain && nMem<10 
e510: 29 7b 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30  ){.    nMem = 10
e520: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70 69 72  ;.  }.  p->expir
e530: 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65  ed = 0;..  /* Me
e540: 6d 6f 72 79 20 66 6f 72 20 72 65 67 69 73 74 65  mory for registe
e550: 72 73 2c 20 70 61 72 61 6d 65 74 65 72 73 2c 20  rs, parameters, 
e560: 63 75 72 73 6f 72 2c 20 65 74 63 2c 20 69 73 20  cursor, etc, is 
e570: 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 6f 6e 65  allocated in one
e580: 20 6f 72 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73   or two.  ** pas
e590: 73 65 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72  ses.  On the fir
e5a0: 73 74 20 70 61 73 73 2c 20 77 65 20 74 72 79 20  st pass, we try 
e5b0: 74 6f 20 72 65 75 73 65 20 75 6e 75 73 65 64 20  to reuse unused 
e5c0: 6d 65 6d 6f 72 79 20 61 74 20 74 68 65 20 0a 20  memory at the . 
e5d0: 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 6f   ** end of the o
e5e0: 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20 49 66  pcode array.  If
e5f0: 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74   we are unable t
e600: 6f 20 73 61 74 69 73 66 79 20 61 6c 6c 20 6d 65  o satisfy all me
e610: 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75 69 72  mory.  ** requir
e620: 65 6d 65 6e 74 73 20 62 79 20 72 65 75 73 69 6e  ements by reusin
e630: 67 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72  g the opcode arr
e640: 61 79 20 74 61 69 6c 2c 20 74 68 65 6e 20 74 68  ay tail, then th
e650: 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61  e second.  ** pa
e660: 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20  ss will fill in 
e670: 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 75 73  the remainder us
e680: 69 6e 67 20 61 20 66 72 65 73 68 20 6d 65 6d 6f  ing a fresh memo
e690: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20  ry allocation.  
e6a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
e6b0: 74 77 6f 2d 70 61 73 73 20 61 70 70 72 6f 61 63  two-pass approac
e6c0: 68 20 74 68 61 74 20 72 65 75 73 65 73 20 61 73  h that reuses as
e6d0: 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20   much memory as 
e6e0: 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20  possible from.  
e6f0: 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76 65 72 20  ** the leftover 
e700: 6d 65 6d 6f 72 79 20 61 74 20 74 68 65 20 65 6e  memory at the en
e710: 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20  d of the opcode 
e720: 61 72 72 61 79 2e 20 20 54 68 69 73 20 63 61 6e  array.  This can
e730: 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20   significantly. 
e740: 20 2a 2a 20 72 65 64 75 63 65 20 74 68 65 20 61   ** reduce the a
e750: 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20  mount of memory 
e760: 68 65 6c 64 20 62 79 20 61 20 70 72 65 70 61 72  held by a prepar
e770: 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  ed statement..  
e780: 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20 20 20 78 2e  */.  do {.    x.
e790: 6e 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 20  nNeeded = 0;.   
e7a0: 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63   p->aMem = alloc
e7b0: 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 4d 65  Space(&x, p->aMe
e7c0: 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d  m, nMem*sizeof(M
e7d0: 65 6d 29 29 3b 0a 20 20 20 20 70 2d 3e 61 56 61  em));.    p->aVa
e7e0: 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26  r = allocSpace(&
e7f0: 78 2c 20 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72  x, p->aVar, nVar
e800: 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20  *sizeof(Mem));. 
e810: 20 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c     p->apArg = al
e820: 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e  locSpace(&x, p->
e830: 61 70 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65  apArg, nArg*size
e840: 6f 66 28 4d 65 6d 2a 29 29 3b 0a 20 20 20 20 70  of(Mem*));.    p
e850: 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53  ->apCsr = allocS
e860: 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 70 43 73  pace(&x, p->apCs
e870: 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f  r, nCursor*sizeo
e880: 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29 29 3b  f(VdbeCursor*));
e890: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
e8a0: 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
e8b0: 54 41 54 55 53 0a 20 20 20 20 70 2d 3e 61 6e 45  TATUS.    p->anE
e8c0: 78 65 63 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  xec = allocSpace
e8d0: 28 26 78 2c 20 70 2d 3e 61 6e 45 78 65 63 2c 20  (&x, p->anExec, 
e8e0: 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36  p->nOp*sizeof(i6
e8f0: 34 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  4));.#endif.    
e900: 69 66 28 20 78 2e 6e 4e 65 65 64 65 64 3d 3d 30  if( x.nNeeded==0
e910: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 78 2e   ) break;.    x.
e920: 70 53 70 61 63 65 20 3d 20 70 2d 3e 70 46 72 65  pSpace = p->pFre
e930: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
e940: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 78 2e 6e  locRawNN(db, x.n
e950: 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 78 2e 6e  Needed);.    x.n
e960: 46 72 65 65 20 3d 20 78 2e 6e 4e 65 65 64 65 64  Free = x.nNeeded
e970: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 21 64 62 2d  ;.  }while( !db-
e980: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
e990: 0a 0a 20 20 70 2d 3e 6e 7a 56 61 72 20 3d 20 70  ..  p->nzVar = p
e9a0: 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3b 0a 20 20  Parse->nzVar;.  
e9b0: 70 2d 3e 61 7a 56 61 72 20 3d 20 70 50 61 72 73  p->azVar = pPars
e9c0: 65 2d 3e 61 7a 56 61 72 3b 0a 20 20 70 50 61 72  e->azVar;.  pPar
e9d0: 73 65 2d 3e 6e 7a 56 61 72 20 3d 20 20 30 3b 0a  se->nzVar =  0;.
e9e0: 20 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 20    pParse->azVar 
e9f0: 3d 20 30 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69  = 0;.  p->explai
ea00: 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  n = pParse->expl
ea10: 61 69 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ain;.  if( db->m
ea20: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
ea30: 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a     p->nVar = 0;.
ea40: 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d      p->nCursor =
ea50: 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20   0;.    p->nMem 
ea60: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
ea70: 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e    p->nCursor = n
ea80: 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 2d 3e 6e  Cursor;.    p->n
ea90: 56 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61  Var = (ynVar)nVa
eaa0: 72 3b 0a 20 20 20 20 69 6e 69 74 4d 65 6d 41 72  r;.    initMemAr
eab0: 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 6e 56 61  ray(p->aVar, nVa
eac0: 72 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  r, db, MEM_Null)
ead0: 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20  ;.    p->nMem = 
eae0: 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 69 74 4d 65  nMem;.    initMe
eaf0: 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c 20  mArray(p->aMem, 
eb00: 6e 4d 65 6d 2c 20 64 62 2c 20 4d 45 4d 5f 55 6e  nMem, db, MEM_Un
eb10: 64 65 66 69 6e 65 64 29 3b 0a 20 20 20 20 6d 65  defined);.    me
eb20: 6d 73 65 74 28 70 2d 3e 61 70 41 72 67 2c 20 30  mset(p->apArg, 0
eb30: 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65  , nArg*sizeof(Me
eb40: 6d 2a 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  m*));.    memset
eb50: 28 70 2d 3e 61 70 43 73 72 2c 20 30 2c 20 6e 43  (p->apCsr, 0, nC
eb60: 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62  ursor*sizeof(Vdb
eb70: 65 43 75 72 73 6f 72 2a 29 29 3b 0a 23 69 66 64  eCursor*));.#ifd
eb80: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
eb90: 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
eba0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 61  .    memset(p->a
ebb0: 6e 45 78 65 63 2c 20 30 2c 20 70 2d 3e 6e 4f 70  nExec, 0, p->nOp
ebc0: 2a 73 69 7a 65 6f 66 28 69 36 34 29 29 3b 0a 23  *sizeof(i64));.#
ebd0: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69  endif.  }.  sqli
ebe0: 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 70 29  te3VdbeRewind(p)
ebf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
ec00: 20 61 20 56 44 42 45 20 63 75 72 73 6f 72 20 61   a VDBE cursor a
ec10: 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74  nd release all t
ec20: 68 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61  he resources tha
ec30: 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70  t cursor .** hap
ec40: 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f  pens to hold..*/
ec50: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
ec60: 65 46 72 65 65 43 75 72 73 6f 72 28 56 64 62 65  eFreeCursor(Vdbe
ec70: 20 2a 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20   *p, VdbeCursor 
ec80: 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78  *pCx){.  if( pCx
ec90: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
eca0: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
ecb0: 20 70 43 78 2d 3e 70 42 74 3d 3d 30 20 7c 7c 20   pCx->pBt==0 || 
ecc0: 70 43 78 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43  pCx->eCurType==C
ecd0: 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
ece0: 20 20 73 77 69 74 63 68 28 20 70 43 78 2d 3e 65    switch( pCx->e
ecf0: 43 75 72 54 79 70 65 20 29 7b 0a 20 20 20 20 63  CurType ){.    c
ed00: 61 73 65 20 43 55 52 54 59 50 45 5f 53 4f 52 54  ase CURTYPE_SORT
ed10: 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ER: {.      sqli
ed20: 74 65 33 56 64 62 65 53 6f 72 74 65 72 43 6c 6f  te3VdbeSorterClo
ed30: 73 65 28 70 2d 3e 64 62 2c 20 70 43 78 29 3b 0a  se(p->db, pCx);.
ed40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ed50: 20 7d 0a 20 20 20 20 63 61 73 65 20 43 55 52 54   }.    case CURT
ed60: 59 50 45 5f 42 54 52 45 45 3a 20 7b 0a 20 20 20  YPE_BTREE: {.   
ed70: 20 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74 20     if( pCx->pBt 
ed80: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
ed90: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78  e3BtreeClose(pCx
eda0: 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  ->pBt);.        
edb0: 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72  /* The pCx->pCur
edc0: 73 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73  sor will be clos
edd0: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c  e automatically,
ede0: 20 69 66 20 69 74 20 65 78 69 73 74 73 2c 20 62   if it exists, b
edf0: 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  y.        ** the
ee00: 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a   call above. */.
ee10: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ee20: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 78       assert( pCx
ee30: 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20  ->uc.pCursor!=0 
ee40: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
ee50: 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
ee60: 6f 72 28 70 43 78 2d 3e 75 63 2e 70 43 75 72 73  or(pCx->uc.pCurs
ee70: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
ee80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ee90: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
eea0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
eeb0: 0a 20 20 20 20 63 61 73 65 20 43 55 52 54 59 50  .    case CURTYP
eec0: 45 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20  E_VTAB: {.      
eed0: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
eee0: 73 6f 72 20 2a 70 56 43 75 72 20 3d 20 70 43 78  sor *pVCur = pCx
eef0: 2d 3e 75 63 2e 70 56 43 75 72 3b 0a 20 20 20 20  ->uc.pVCur;.    
ef00: 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
ef10: 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20  module *pModule 
ef20: 3d 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e  = pVCur->pVtab->
ef30: 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 20 20 61  pModule;.      a
ef40: 73 73 65 72 74 28 20 70 56 43 75 72 2d 3e 70 56  ssert( pVCur->pV
ef50: 74 61 62 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  tab->nRef>0 );. 
ef60: 20 20 20 20 20 70 56 43 75 72 2d 3e 70 56 74 61       pVCur->pVta
ef70: 62 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 20  b->nRef--;.     
ef80: 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65   pModule->xClose
ef90: 28 70 56 43 75 72 29 3b 0a 20 20 20 20 20 20 62  (pVCur);.      b
efa0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
efb0: 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  if.  }.}../*.** 
efc0: 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
efd0: 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  s in the current
efe0: 20 66 72 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69   frame..*/.stati
eff0: 63 20 76 6f 69 64 20 63 6c 6f 73 65 43 75 72 73  c void closeCurs
f000: 6f 72 73 49 6e 46 72 61 6d 65 28 56 64 62 65 20  orsInFrame(Vdbe 
f010: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 70  *p){.  if( p->ap
f020: 43 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  Csr ){.    int i
f030: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
f040: 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b  <p->nCursor; i++
f050: 29 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75 72  ){.      VdbeCur
f060: 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43  sor *pC = p->apC
f070: 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  sr[i];.      if(
f080: 20 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73   pC ){.        s
f090: 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75  qlite3VdbeFreeCu
f0a0: 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20  rsor(p, pC);.   
f0b0: 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d       p->apCsr[i]
f0c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
f0d0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
f0e0: 20 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73   Copy the values
f0f0: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56   stored in the V
f100: 64 62 65 46 72 61 6d 65 20 73 74 72 75 63 74 75  dbeFrame structu
f110: 72 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20  re to its Vdbe. 
f120: 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c  This.** is used,
f130: 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68   for example, wh
f140: 65 6e 20 61 20 74 72 69 67 67 65 72 20 73 75 62  en a trigger sub
f150: 2d 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74  -program is halt
f160: 65 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a  ed to restore.**
f170: 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20   control to the 
f180: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  main program..*/
f190: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
f1a0: 46 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62  FrameRestore(Vdb
f1b0: 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b  eFrame *pFrame){
f1c0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72  .  Vdbe *v = pFr
f1d0: 61 6d 65 2d 3e 76 3b 0a 20 20 63 6c 6f 73 65 43  ame->v;.  closeC
f1e0: 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 76 29  ursorsInFrame(v)
f1f0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
f200: 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
f210: 53 54 41 54 55 53 0a 20 20 76 2d 3e 61 6e 45 78  STATUS.  v->anEx
f220: 65 63 20 3d 20 70 46 72 61 6d 65 2d 3e 61 6e 45  ec = pFrame->anE
f230: 78 65 63 3b 0a 23 65 6e 64 69 66 0a 20 20 76 2d  xec;.#endif.  v-
f240: 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61  >aOp = pFrame->a
f250: 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70  Op;.  v->nOp = p
f260: 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d  Frame->nOp;.  v-
f270: 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e  >aMem = pFrame->
f280: 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20  aMem;.  v->nMem 
f290: 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a  = pFrame->nMem;.
f2a0: 20 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72    v->apCsr = pFr
f2b0: 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d  ame->apCsr;.  v-
f2c0: 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d  >nCursor = pFram
f2d0: 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d  e->nCursor;.  v-
f2e0: 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d  >db->lastRowid =
f2f0: 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77   pFrame->lastRow
f300: 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65  id;.  v->nChange
f310: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e   = pFrame->nChan
f320: 67 65 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6e 43 68  ge;.  v->db->nCh
f330: 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  ange = pFrame->n
f340: 44 62 43 68 61 6e 67 65 3b 0a 20 20 73 71 6c 69  DbChange;.  sqli
f350: 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78  te3VdbeDeleteAux
f360: 44 61 74 61 28 76 2d 3e 64 62 2c 20 26 76 2d 3e  Data(v->db, &v->
f370: 70 41 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29  pAuxData, -1, 0)
f380: 3b 0a 20 20 76 2d 3e 70 41 75 78 44 61 74 61 20  ;.  v->pAuxData 
f390: 3d 20 70 46 72 61 6d 65 2d 3e 70 41 75 78 44 61  = pFrame->pAuxDa
f3a0: 74 61 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70 41  ta;.  pFrame->pA
f3b0: 75 78 44 61 74 61 20 3d 20 30 3b 0a 20 20 72 65  uxData = 0;.  re
f3c0: 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b  turn pFrame->pc;
f3d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
f3e0: 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a  all cursors..**.
f3f0: 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65 20  ** Also release 
f400: 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f  any dynamic memo
f410: 72 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 56  ry held by the V
f420: 4d 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 4d  M in the Vdbe.aM
f430: 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65  em memory .** ce
f440: 6c 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20 69  ll array. This i
f450: 73 20 6e 65 63 65 73 73 61 72 79 20 61 73 20 74  s necessary as t
f460: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  he memory cell a
f470: 72 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e  rray may contain
f480: 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  .** pointers to 
f490: 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74  VdbeFrame object
f4a0: 73 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e 20  s, which may in 
f4b0: 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69  turn contain poi
f4c0: 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e  nters to.** open
f4d0: 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61   cursors..*/.sta
f4e0: 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c  tic void closeAl
f4f0: 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70  lCursors(Vdbe *p
f500: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61  ){.  if( p->pFra
f510: 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72  me ){.    VdbeFr
f520: 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20  ame *pFrame;.   
f530: 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70   for(pFrame=p->p
f540: 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70  Frame; pFrame->p
f550: 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70  Parent; pFrame=p
f560: 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b  Frame->pParent);
f570: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f580: 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72  FrameRestore(pFr
f590: 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70 46 72  ame);.    p->pFr
f5a0: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  ame = 0;.    p->
f5b0: 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  nFrame = 0;.  }.
f5c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 46 72    assert( p->nFr
f5d0: 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 63 6c 6f 73  ame==0 );.  clos
f5e0: 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28  eCursorsInFrame(
f5f0: 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65  p);.  if( p->aMe
f600: 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  m ){.    release
f610: 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d  MemArray(p->aMem
f620: 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a  , p->nMem);.  }.
f630: 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c    while( p->pDel
f640: 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62  Frame ){.    Vdb
f650: 65 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70  eFrame *pDel = p
f660: 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20  ->pDelFrame;.   
f670: 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20   p->pDelFrame = 
f680: 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20  pDel->pParent;. 
f690: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
f6a0: 61 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29 3b  ameDelete(pDel);
f6b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  .  }..  /* Delet
f6c0: 65 20 61 6e 79 20 61 75 78 64 61 74 61 20 61 6c  e any auxdata al
f6d0: 6c 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 62  locations made b
f6e0: 79 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20 69 66  y the VM */.  if
f6f0: 28 20 70 2d 3e 70 41 75 78 44 61 74 61 20 29 20  ( p->pAuxData ) 
f700: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
f710: 65 41 75 78 44 61 74 61 28 70 2d 3e 64 62 2c 20  eAuxData(p->db, 
f720: 26 70 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d 31  &p->pAuxData, -1
f730: 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
f740: 70 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30 20 29  p->pAuxData==0 )
f750: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  ;.}../*.** Clean
f760: 20 75 70 20 74 68 65 20 56 4d 20 61 66 74 65 72   up the VM after
f770: 20 61 20 73 69 6e 67 6c 65 20 72 75 6e 2e 0a 2a   a single run..*
f780: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c  /.static void Cl
f790: 65 61 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a  eanup(Vdbe *p){.
f7a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
f7b0: 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66 20 53  p->db;..#ifdef S
f7c0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
f7d0: 20 45 78 65 63 75 74 65 20 61 73 73 65 72 74 28   Execute assert(
f7e0: 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  ) statements to 
f7f0: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
f800: 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64  Vdbe.apCsr[] and
f810: 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d   .  ** Vdbe.aMem
f820: 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65 20 61  [] arrays have a
f830: 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c 65 61  lready been clea
f840: 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e  ned up.  */.  in
f850: 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70  t i;.  if( p->ap
f860: 43 73 72 20 29 20 66 6f 72 28 69 3d 30 3b 20 69  Csr ) for(i=0; i
f870: 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b  <p->nCursor; i++
f880: 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43  ) assert( p->apC
f890: 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 69 66  sr[i]==0 );.  if
f8a0: 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20  ( p->aMem ){.   
f8b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
f8c0: 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72 74  Mem; i++) assert
f8d0: 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61  ( p->aMem[i].fla
f8e0: 67 73 3d 3d 4d 45 4d 5f 55 6e 64 65 66 69 6e 65  gs==MEM_Undefine
f8f0: 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  d );.  }.#endif.
f900: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
f910: 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
f920: 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d  ;.  p->zErrMsg =
f930: 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74   0;.  p->pResult
f940: 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Set = 0;.}../*.*
f950: 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72  * Set the number
f960: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
f970: 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ns that will be 
f980: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
f990: 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   SQL.** statemen
f9a0: 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73  t. This is now s
f9b0: 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  et at compile ti
f9c0: 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20  me, rather than 
f9d0: 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74  during.** execut
f9e0: 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20  ion of the vdbe 
f9f0: 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20  program so that 
fa00: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
fa10: 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65  ount() can.** be
fa20: 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51   called on an SQ
fa30: 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f  L statement befo
fa40: 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  re sqlite3_step(
fa50: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
fa60: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
fa70: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52  (Vdbe *p, int nR
fa80: 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d  esColumn){.  Mem
fa90: 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e   *pColName;.  in
faa0: 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  t n;.  sqlite3 *
fab0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72  db = p->db;..  r
fac0: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
fad0: 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e  ->aColName, p->n
fae0: 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
faf0: 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  E_N);.  sqlite3D
fb00: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f  bFree(db, p->aCo
fb10: 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52  lName);.  n = nR
fb20: 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
fb30: 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c  _N;.  p->nResCol
fb40: 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73 43  umn = (u16)nResC
fb50: 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c  olumn;.  p->aCol
fb60: 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20  Name = pColName 
fb70: 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44  = (Mem*)sqlite3D
fb80: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
fb90: 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29   sizeof(Mem)*n )
fba0: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e  ;.  if( p->aColN
fbb0: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
fbc0: 0a 20 20 69 6e 69 74 4d 65 6d 41 72 72 61 79 28  .  initMemArray(
fbd0: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 6e 2c 20  p->aColName, n, 
fbe0: 70 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  p->db, MEM_Null)
fbf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
fc00: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
fc10: 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20  dx'th column to 
fc20: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
fc30: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
fc40: 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20  ..** zName must 
fc50: 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  be a pointer to 
fc60: 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64  a nul terminated
fc70: 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54   string..**.** T
fc80: 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65  his call must be
fc90: 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63 61   made after a ca
fca0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
fcb0: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a  eSetNumCols()..*
fcc0: 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70  *.** The final p
fcd0: 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20  arameter, xDel, 
fce0: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53  must be one of S
fcf0: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53  QLITE_DYNAMIC, S
fd00: 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20  QLITE_STATIC.** 
fd10: 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  or SQLITE_TRANSI
fd20: 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53 51  ENT. If it is SQ
fd30: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68  LITE_DYNAMIC, th
fd40: 65 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  en the buffer po
fd50: 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a  inted.** to by z
fd60: 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65  Name will be fre
fd70: 65 64 20 62 79 20 73 71 6c 69 74 65 33 44 62 46  ed by sqlite3DbF
fd80: 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20 76  ree() when the v
fd90: 64 62 65 20 69 73 20 64 65 73 74 72 6f 79 65 64  dbe is destroyed
fda0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
fdb0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a  VdbeSetColName(.
fdc0: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
fdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fde0: 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67     /* Vdbe being
fdf0: 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20   configured */. 
fe00: 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20   int idx,       
fe10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe20: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
fe30: 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69  lumn zName appli
fe40: 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76  es to */.  int v
fe50: 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ar,             
fe60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
fe70: 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d  ne of the COLNAM
fe80: 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f  E_* constants */
fe90: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
fea0: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Name,           
feb0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
fec0: 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  o buffer contain
fed0: 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f  ing name */.  vo
fee0: 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a  id (*xDel)(void*
fef0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  )              /
ff00: 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d  * Memory managem
ff10: 65 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f 72  ent strategy for
ff20: 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69   zName */.){.  i
ff30: 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43  nt rc;.  Mem *pC
ff40: 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74  olName;.  assert
ff50: 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c  ( idx<p->nResCol
ff60: 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  umn );.  assert(
ff70: 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29   var<COLNAME_N )
ff80: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
ff90: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
ffa0: 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d     assert( !zNam
ffb0: 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54  e || xDel!=SQLIT
ffc0: 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20  E_DYNAMIC );.   
ffd0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
ffe0: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
fff0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c   assert( p->aCol
10000 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f  Name!=0 );.  pCo
10010 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f  lName = &(p->aCo
10020 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d  lName[idx+var*p-
10030 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20  >nResColumn]);. 
10040 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
10050 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e  eMemSetStr(pColN
10060 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20  ame, zName, -1, 
10070 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78 44 65  SQLITE_UTF8, xDe
10080 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  l);.  assert( rc
10090 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c  !=0 || !zName ||
100a0 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67   (pColName->flag
100b0 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29  s&MEM_Term)!=0 )
100c0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
100d0 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f  ../*.** A read o
100e0 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
100f0 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ion may or may n
10100 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20  ot be active on 
10110 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a  database handle.
10120 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61 6e  ** db. If a tran
10130 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
10140 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66  e, commit it. If
10150 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20 77   there is a.** w
10160 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
10170 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74   spanning more t
10180 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65  han one database
10190 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75 74   file, this rout
101a0 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72  ine.** takes car
101b0 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  e of the master 
101c0 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72 79  journal trickery
101d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
101e0 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74  vdbeCommit(sqlit
101f0 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29  e3 *db, Vdbe *p)
10200 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
10210 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a   nTrans = 0;  /*
10220 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62   Number of datab
10230 61 73 65 73 20 77 69 74 68 20 61 6e 20 61 63 74  ases with an act
10240 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ive write-transa
10250 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20  ction.          
10260 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74           ** that
10270 20 61 72 65 20 63 61 6e 64 69 64 61 74 65 73 20   are candidates 
10280 66 6f 72 20 61 20 74 77 6f 2d 70 68 61 73 65 20  for a two-phase 
10290 63 6f 6d 6d 69 74 20 75 73 69 6e 67 20 61 0a 20  commit using a. 
102a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102b0 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72    ** master-jour
102c0 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  nal */.  int rc 
102d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
102e0 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d  nt needXcommit =
102f0 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   0;..#ifdef SQLI
10300 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
10310 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74  ABLE.  /* With t
10320 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69  his option, sqli
10330 74 65 33 56 74 61 62 53 79 6e 63 28 29 20 69 73  te3VtabSync() is
10340 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73   defined to be s
10350 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49  imply .  ** SQLI
10360 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f  TE_OK so p is no
10370 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20  t used. .  */.  
10380 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
10390 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  (p);.#endif..  /
103a0 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61  * Before doing a
103b0 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61  nything else, ca
103c0 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29 20 63  ll the xSync() c
103d0 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a  allback for any.
103e0 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64    ** virtual mod
103f0 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69 74 74  ule tables writt
10400 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73  en in this trans
10410 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73  action. This has
10420 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65   to.  ** be done
10430 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e   before determin
10440 69 6e 67 20 77 68 65 74 68 65 72 20 61 20 6d 61  ing whether a ma
10450 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
10460 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69  e is .  ** requi
10470 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63  red, as an xSync
10480 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20  () callback may 
10490 61 64 64 20 61 6e 20 61 74 74 61 63 68 65 64 20  add an attached 
104a0 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f  database.  ** to
104b0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
104c0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
104d0 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 64 62  lite3VtabSync(db
104e0 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  , p);..  /* This
104f0 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73   loop determines
10500 20 28 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d   (a) if the comm
10510 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62  it hook should b
10520 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20  e invoked and.  
10530 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20  ** (b) how many 
10540 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 68  database files h
10550 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74  ave open write t
10560 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74  ransactions, not
10570 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67   .  ** including
10580 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
10590 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72  se. (b) is impor
105a0 74 61 6e 74 20 62 65 63 61 75 73 65 20 69 66 20  tant because if 
105b0 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20  more than .  ** 
105c0 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  one database fil
105d0 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72  e has an open wr
105e0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite transaction,
105f0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
10600 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72  l.  ** file is r
10610 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61  equired for an a
10620 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20  tomic commit..  
10630 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72  */ .  for(i=0; r
10640 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
10650 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
10660 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74   .    Btree *pBt
10670 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
10680 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  t;.    if( sqlit
10690 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
106a0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
106b0 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * Whether or not
106c0 20 61 20 64 61 74 61 62 61 73 65 20 6d 69 67 68   a database migh
106d0 74 20 6e 65 65 64 20 61 20 6d 61 73 74 65 72 20  t need a master 
106e0 6a 6f 75 72 6e 61 6c 20 64 65 70 65 6e 64 73 20  journal depends 
106f0 75 70 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 74  upon.      ** it
10700 73 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 28  s journal mode (
10710 61 6d 6f 6e 67 20 6f 74 68 65 72 20 74 68 69 6e  among other thin
10720 67 73 29 2e 20 20 54 68 69 73 20 6d 61 74 72 69  gs).  This matri
10730 78 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69  x determines whi
10740 63 68 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  ch.      ** jour
10750 6e 61 6c 20 6d 6f 64 65 73 20 75 73 65 20 61 20  nal modes use a 
10760 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
10770 6e 64 20 77 68 69 63 68 20 64 6f 20 6e 6f 74 20  nd which do not 
10780 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  */.      static 
10790 63 6f 6e 73 74 20 75 38 20 61 4d 4a 4e 65 65 64  const u8 aMJNeed
107a0 65 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  ed[] = {.       
107b0 20 2f 2a 20 44 45 4c 45 54 45 20 20 20 2a 2f 20   /* DELETE   */ 
107c0 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 50   1,.        /* P
107d0 45 52 53 49 53 54 20 20 20 2a 2f 20 31 2c 0a 20  ERSIST   */ 1,. 
107e0 20 20 20 20 20 20 20 2f 2a 20 4f 46 46 20 20 20         /* OFF   
107f0 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 20 20      */ 0,.      
10800 20 20 2f 2a 20 54 52 55 4e 43 41 54 45 20 20 2a    /* TRUNCATE  *
10810 2f 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  / 1,.        /* 
10820 4d 45 4d 4f 52 59 20 20 20 20 2a 2f 20 30 2c 0a  MEMORY    */ 0,.
10830 20 20 20 20 20 20 20 20 2f 2a 20 57 41 4c 20 20          /* WAL  
10840 20 20 20 20 20 2a 2f 20 30 0a 20 20 20 20 20 20       */ 0.      
10850 7d 3b 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a  };.      Pager *
10860 70 50 61 67 65 72 3b 20 20 20 2f 2a 20 50 61 67  pPager;   /* Pag
10870 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  er associated wi
10880 74 68 20 70 42 74 20 2a 2f 0a 20 20 20 20 20 20  th pBt */.      
10890 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b  needXcommit = 1;
108a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
108b0 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b 0a 20  reeEnter(pBt);. 
108c0 20 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71       pPager = sq
108d0 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
108e0 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pBt);.      if( 
108f0 64 62 2d 3e 61 44 62 5b 69 5d 2e 73 61 66 65 74  db->aDb[i].safet
10900 79 5f 6c 65 76 65 6c 21 3d 50 41 47 45 52 5f 53  y_level!=PAGER_S
10910 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46 0a 20  YNCHRONOUS_OFF. 
10920 20 20 20 20 20 20 26 26 20 61 4d 4a 4e 65 65 64        && aMJNeed
10930 65 64 5b 73 71 6c 69 74 65 33 50 61 67 65 72 47  ed[sqlite3PagerG
10940 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50  etJournalMode(pP
10950 61 67 65 72 29 5d 0a 20 20 20 20 20 20 29 7b 20  ager)].      ){ 
10960 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
10970 20 69 21 3d 31 20 29 3b 0a 20 20 20 20 20 20 20   i!=1 );.       
10980 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 20   nTrans++;.     
10990 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   }.      rc = sq
109a0 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73  lite3PagerExclus
109b0 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b  iveLock(pPager);
109c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
109d0 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a 20  reeLeave(pBt);. 
109e0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
109f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
10a00 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
10a10 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
10a20 65 20 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d  e are any write-
10a30 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20  transactions at 
10a40 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20  all, invoke the 
10a50 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20  commit hook */. 
10a60 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74   if( needXcommit
10a70 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43   && db->xCommitC
10a80 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 72  allback ){.    r
10a90 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43  c = db->xCommitC
10aa0 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d  allback(db->pCom
10ab0 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66 28  mitArg);.    if(
10ac0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
10ad0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  urn SQLITE_CONST
10ae0 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b  RAINT_COMMITHOOK
10af0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
10b00 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73  * The simple cas
10b10 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e  e - no more than
10b20 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
10b30 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67  le (not counting
10b40 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64   the.  ** TEMP d
10b50 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20 74  atabase) has a t
10b60 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
10b70 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f  e.   There is no
10b80 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20   need for the.  
10b90 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  ** master-journa
10ba0 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  l..  **.  ** If 
10bb0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
10bc0 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
10bd0 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73  GetFilename() is
10be0 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20   a zero length. 
10bf0 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d   ** string, it m
10c00 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61  eans the main da
10c10 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72  tabase is :memor
10c20 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69 6c  y: or a temp fil
10c30 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61  e.  In .  ** tha
10c40 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f 74  t case we do not
10c50 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20   support atomic 
10c60 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69  multi-file commi
10c70 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20 0a  ts, so use the .
10c80 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73 65    ** simple case
10c90 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a   then too..  */.
10ca0 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
10cb0 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33  Strlen30(sqlite3
10cc0 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
10cd0 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
10ce0 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d  ).   || nTrans<=
10cf0 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  1.  ){.    for(i
10d00 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
10d10 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
10d20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
10d30 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
10d40 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
10d50 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
10d60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
10d70 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
10d80 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20  e(pBt, 0);.     
10d90 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
10da0 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f   Do the commit o
10db0 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62  nly if all datab
10dc0 61 73 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c  ases successfull
10dd0 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65  y complete phase
10de0 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f   1. .    ** If o
10df0 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65 65 43  ne of the BtreeC
10e00 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
10e10 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69  calls fails, thi
10e20 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20  s indicates an. 
10e30 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77     ** IO error w
10e40 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72  hile deleting or
10e50 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f   truncating a jo
10e60 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69  urnal file. It i
10e70 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20  s unlikely,.    
10e80 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70  ** but could hap
10e90 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  pen. In this cas
10ea0 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73  e abandon proces
10eb0 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20  sing and return 
10ec0 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a  the error..    *
10ed0 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  /.    for(i=0; r
10ee0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
10ef0 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
10f00 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
10f10 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
10f20 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
10f30 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
10f40 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
10f50 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
10f60 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
10f70 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
10f80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10f90 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f     sqlite3VtabCo
10fa0 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a  mmit(db);.    }.
10fb0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f    }..  /* The co
10fc0 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65  mplex case - The
10fd0 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69  re is a multi-fi
10fe0 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  le write-transac
10ff0 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a  tion active..  *
11000 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20  * This requires 
11010 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
11020 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20   file to ensure 
11030 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
11040 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65  is.  ** committe
11050 64 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20  d atomically..  
11060 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
11070 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20  E_OMIT_DISKIO.  
11080 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
11090 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64 62  3_vfs *pVfs = db
110a0 2d 3e 70 56 66 73 3b 0a 20 20 20 20 63 68 61 72  ->pVfs;.    char
110b0 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
110c0 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f   /* File-name fo
110d0 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  r the master jou
110e0 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72  rnal */.    char
110f0 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c   const *zMainFil
11100 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
11110 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e  GetFilename(db->
11120 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[0].pBt);.   
11130 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
11140 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
11150 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
11160 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20      int res;.   
11170 20 69 6e 74 20 72 65 74 72 79 43 6f 75 6e 74 20   int retryCount 
11180 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61  = 0;.    int nMa
11190 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20  inFile;..    /* 
111a0 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20  Select a master 
111b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
111c0 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e 46 69  e */.    nMainFi
111d0 6c 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  le = sqlite3Strl
111e0 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65 29 3b  en30(zMainFile);
111f0 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73  .    zMaster = s
11200 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
11210 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58 58 39 58  , "%s-mjXXXXXX9X
11220 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 29 3b  Xz", zMainFile);
11230 0a 20 20 20 20 69 66 28 20 7a 4d 61 73 74 65 72  .    if( zMaster
11240 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
11250 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
11260 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75      do {.      u
11270 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20  32 iRandom;.    
11280 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74    if( retryCount
11290 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
112a0 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 30 20 29  retryCount>100 )
112b0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
112c0 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46  te3_log(SQLITE_F
112d0 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65 3a  ULL, "MJ delete:
112e0 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a   %s", zMaster);.
112f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11300 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
11310 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
11320 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
11330 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
11340 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29 7b  retryCount==1 ){
11350 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
11360 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55  e3_log(SQLITE_FU
11370 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a  LL, "MJ collide:
11380 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a   %s", zMaster);.
11390 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
113a0 7d 0a 20 20 20 20 20 20 72 65 74 72 79 43 6f 75  }.      retryCou
113b0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt++;.      sqli
113c0 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
113d0 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20  izeof(iRandom), 
113e0 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20  &iRandom);.     
113f0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
11400 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b 6e  f(13, &zMaster[n
11410 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25  MainFile], "-mj%
11420 30 36 58 39 25 30 32 58 22 2c 0a 20 20 20 20 20  06X9%02X",.     
11430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11440 20 20 20 20 20 20 20 20 20 20 28 69 52 61 6e 64            (iRand
11450 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 66 66 2c  om>>8)&0xffffff,
11460 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b 0a   iRandom&0xff);.
11470 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 6e 74        /* The ant
11480 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 63 68 61  ipenultimate cha
11490 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 6d 61  racter of the ma
114a0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
114b0 65 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20  e must.      ** 
114c0 62 65 20 22 39 22 20 74 6f 20 61 76 6f 69 64 20  be "9" to avoid 
114d0 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 20  name collisions 
114e0 77 68 65 6e 20 75 73 69 6e 67 20 38 2b 33 20 66  when using 8+3 f
114f0 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20  ilenames. */.   
11500 20 20 20 61 73 73 65 72 74 28 20 7a 4d 61 73 74     assert( zMast
11510 65 72 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  er[sqlite3Strlen
11520 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d 3d  30(zMaster)-3]==
11530 27 39 27 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  '9' );.      sql
11540 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
11550 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73 74  zMainFile, zMast
11560 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  er);.      rc = 
11570 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
11580 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53  pVfs, zMaster, S
11590 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
115a0 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  STS, &res);.    
115b0 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
115c0 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a  TE_OK && res );.
115d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
115e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
115f0 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  * Open the maste
11600 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  r journal. */.  
11610 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11620 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66  OsOpenMalloc(pVf
11630 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61  s, zMaster, &pMa
11640 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20  ster, .         
11650 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
11660 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
11670 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20  EN_CREATE|.     
11680 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
11690 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54  _EXCLUSIVE|SQLIT
116a0 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
116b0 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 29  URNAL, 0.      )
116c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
116d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
116e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
116f0 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
11700 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
11710 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20  rc;.    }. .    
11720 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d  /* Write the nam
11730 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62 61  e of each databa
11740 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74  se file in the t
11750 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20  ransaction into 
11760 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d  the new.    ** m
11770 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
11780 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  le. If an error 
11790 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70  occurs at this p
117a0 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a  oint close.    *
117b0 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  * and delete the
117c0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
117d0 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e  file. All the in
117e0 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
117f0 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74   files.    ** st
11800 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20  ill have 'null' 
11810 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  as the master jo
11820 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73  urnal pointer, s
11830 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c  o they will roll
11840 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64  .    ** back ind
11850 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20  ependently if a 
11860 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a  failure occurs..
11870 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
11880 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
11890 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
118a0 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
118b0 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
118c0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
118d0 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
118e0 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e          char con
118f0 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69  st *zFile = sqli
11900 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e  te3BtreeGetJourn
11910 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20  alname(pBt);.   
11920 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d       if( zFile==
11930 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  0 ){.          c
11940 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e  ontinue;  /* Ign
11950 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65  ore TEMP and :me
11960 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73 20  mory: databases 
11970 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
11980 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 46 69       assert( zFi
11990 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20  le[0]!=0 );.    
119a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
119b0 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c  OsWrite(pMaster,
119c0 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53   zFile, sqlite3S
119d0 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31  trlen30(zFile)+1
119e0 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  , offset);.     
119f0 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c     offset += sql
11a00 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
11a10 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69  le)+1;.        i
11a20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11a30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
11a40 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
11a50 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (pMaster);.     
11a60 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
11a70 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
11a80 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
11a90 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
11aa0 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
11ab0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
11ac0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
11ad0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
11ae0 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74  /* Sync the mast
11af0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
11b00 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45   If the IOCAP_SE
11b10 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a  QUENTIAL device.
11b20 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73      ** flag is s
11b30 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72  et this is not r
11b40 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
11b50 20 20 20 20 69 66 28 20 30 3d 3d 28 73 71 6c 69      if( 0==(sqli
11b60 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
11b70 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73 74  cteristics(pMast
11b80 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  er)&SQLITE_IOCAP
11b90 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 20  _SEQUENTIAL).   
11ba0 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    && SQLITE_OK!=
11bb0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  (rc = sqlite3OsS
11bc0 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c  ync(pMaster, SQL
11bd0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
11be0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73  ).    ){.      s
11bf0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
11c00 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
11c10 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
11c20 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
11c30 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
11c40 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
11c50 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
11c60 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
11c70 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74     /* Sync all t
11c80 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f  he db files invo
11c90 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e  lved in the tran
11ca0 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d  saction. The sam
11cb0 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65  e call.    ** se
11cc0 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ts the master jo
11cd0 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e  urnal pointer in
11ce0 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c   each individual
11cf0 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
11d00 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
11d10 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74  urs here, do not
11d20 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
11d30 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
11d40 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
11d50 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75  f the error occu
11d60 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66 69  rs during the fi
11d70 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  rst call to.    
11d80 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
11d90 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c  ommitPhaseOne(),
11da0 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   then there is a
11db0 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
11dc0 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a  .    ** master j
11dd0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c  ournal file will
11de0 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75   be orphaned. Bu
11df0 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65  t we cannot dele
11e00 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e  te it,.    ** in
11e10 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65 72   case the master
11e20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
11e30 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69  me was written i
11e40 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  nto the journal.
11e50 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f      ** file befo
11e60 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f  re the failure o
11e70 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  ccurred..    */.
11e80 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
11e90 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
11ea0 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
11eb0 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
11ec0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
11ed0 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
11ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
11ef0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
11f00 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c  mitPhaseOne(pBt,
11f10 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
11f20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
11f30 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
11f40 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73  pMaster);.    as
11f50 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
11f60 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66 28  _BUSY );.    if(
11f70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11f80 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
11f90 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
11fa0 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
11fb0 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
11fc0 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61  /* Delete the ma
11fd0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
11fe0 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20  e. This commits 
11ff0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
12000 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f   After.    ** do
12010 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69 72  ing this the dir
12020 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64  ectory is synced
12030 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e   again before an
12040 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20  y individual.   
12050 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
12060 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65  files are delete
12070 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  d..    */.    rc
12080 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
12090 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
120a0 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
120b0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
120c0 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65  ter);.    zMaste
120d0 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72  r = 0;.    if( r
120e0 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
120f0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
12100 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e   /* All files an
12110 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68 61  d directories ha
12120 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
12130 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66  synced, so the f
12140 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20  ollowing.    ** 
12150 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
12160 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
12170 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63  Two() are only c
12180 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64  losing files and
12190 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67  .    ** deleting
121a0 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a   or truncating j
121b0 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65  ournals. If some
121c0 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
121d0 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68   while.    ** th
121e0 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  is is happening 
121f0 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20  we don't really 
12200 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72  care. The integr
12210 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ity of the.    *
12220 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
12230 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74   already guarant
12240 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74  eed, but some st
12250 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e  ray 'cold' journ
12260 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62  als.    ** may b
12270 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20  e lying around. 
12280 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  Returning an err
12290 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65  or code won't he
122a0 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20  lp matters..    
122b0 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73  */.    disable_s
122c0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
122d0 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rs();.    sqlite
122e0 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
122f0 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  oc();.    for(i=
12300 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
12310 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65  +){ .      Btree
12320 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
12330 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
12340 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
12350 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
12360 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c  mitPhaseTwo(pBt,
12370 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   1);.      }.   
12380 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e   }.    sqlite3En
12390 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
123a0 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75  .    enable_simu
123b0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
123c0 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56  );..    sqlite3V
123d0 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20  tabCommit(db);. 
123e0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
123f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  urn rc;.}../* .*
12400 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
12410 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 73  hecks that the s
12420 71 6c 69 74 65 33 2e 6e 56 64 62 65 41 63 74 69  qlite3.nVdbeActi
12430 76 65 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c  ve count variabl
12440 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65  e.** matches the
12450 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27   number of vdbe'
12460 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71  s in the list sq
12470 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61 74  lite3.pVdbe that
12480 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   are.** currentl
12490 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73  y active. An ass
124a0 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20  ertion fails if 
124b0 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64  the two counts d
124c0 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20  o not match..** 
124d0 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72  This is an inter
124e0 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f  nal self-check o
124f0 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20  nly - it is not 
12500 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f  an essential pro
12510 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e  cessing.** step.
12520 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
12530 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47   no-op if NDEBUG
12540 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a   is defined..*/.
12550 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73  #ifndef NDEBUG.s
12560 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
12570 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73 71  ActiveVdbeCnt(sq
12580 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64  lite3 *db){.  Vd
12590 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74  be *p;.  int cnt
125a0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69   = 0;.  int nWri
125b0 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52  te = 0;.  int nR
125c0 65 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64  ead = 0;.  p = d
125d0 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c  b->pVdbe;.  whil
125e0 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  e( p ){.    if( 
125f0 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73  sqlite3_stmt_bus
12600 79 28 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  y((sqlite3_stmt*
12610 29 70 29 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  )p) ){.      cnt
12620 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ++;.      if( p-
12630 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e  >readOnly==0 ) n
12640 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 20 20 69  Write++;.      i
12650 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  f( p->bIsReader 
12660 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 20 7d  ) nRead++;.    }
12670 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
12680 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
12690 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62 65 41   cnt==db->nVdbeA
126a0 63 74 69 76 65 20 29 3b 0a 20 20 61 73 73 65 72  ctive );.  asser
126b0 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 6e  t( nWrite==db->n
126c0 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20 61  VdbeWrite );.  a
126d0 73 73 65 72 74 28 20 6e 52 65 61 64 3d 3d 64 62  ssert( nRead==db
126e0 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 7d  ->nVdbeRead );.}
126f0 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63  .#else.#define c
12700 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
12710 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t(x).#endif../*.
12720 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65 20 70  ** If the Vdbe p
12730 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
12740 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e  st argument open
12750 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74 2d 74  ed a statement-t
12760 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63  ransaction,.** c
12770 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41 72 67  lose it now. Arg
12780 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74 20 62  ument eOp must b
12790 65 20 65 69 74 68 65 72 20 53 41 56 45 50 4f 49  e either SAVEPOI
127a0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a  NT_ROLLBACK or.*
127b0 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  * SAVEPOINT_RELE
127c0 41 53 45 2e 20 49 66 20 69 74 20 69 73 20 53 41  ASE. If it is SA
127d0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
127e0 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74 65  , then the state
127f0 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ment.** transact
12800 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
12810 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20 53 41  ck. If eOp is SA
12820 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
12830 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74   then the .** st
12840 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
12850 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
12860 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
12870 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
12880 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58  n SQLITE_IOERR_X
12890 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  XX error code is
128a0 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f   returned. .** O
128b0 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f  therwise SQLITE_
128c0 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
128d0 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
128e0 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 69 6e  ment(Vdbe *p, in
128f0 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65  t eOp){.  sqlite
12900 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d  3 *const db = p-
12910 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  >db;.  int rc = 
12920 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
12930 20 49 66 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e   If p->iStatemen
12940 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
12950 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69  n zero, then thi
12960 73 20 56 64 62 65 20 6f 70 65 6e 65 64 20 61 20  s Vdbe opened a 
12970 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
12980 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74  transaction that
12990 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65   should be close
129a0 64 20 68 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79  d here. The only
129b0 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20   exception.  ** 
129c0 69 73 20 74 68 61 74 20 61 6e 20 49 4f 20 65 72  is that an IO er
129d0 72 6f 72 20 6d 61 79 20 68 61 76 65 20 6f 63 63  ror may have occ
129e0 75 72 72 65 64 2c 20 63 61 75 73 69 6e 67 20 61  urred, causing a
129f0 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c  n emergency roll
12a00 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74 68  back..  ** In th
12a10 69 73 20 63 61 73 65 20 28 64 62 2d 3e 6e 53 74  is case (db->nSt
12a20 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e 64  atement==0), and
12a30 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e   there is nothin
12a40 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20  g to do..  */.  
12a50 69 66 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65  if( db->nStateme
12a60 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65 6d  nt && p->iStatem
12a70 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ent ){.    int i
12a80 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  ;.    const int 
12a90 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e  iSavepoint = p->
12aa0 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20  iStatement-1;.. 
12ab0 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d     assert( eOp==
12ac0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
12ad0 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50  CK || eOp==SAVEP
12ae0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20  OINT_RELEASE);. 
12af0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
12b00 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20  Statement>0 );. 
12b10 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53     assert( p->iS
12b20 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e  tatement==(db->n
12b30 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53  Statement+db->nS
12b40 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20  avepoint) );..  
12b50 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
12b60 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
12b70 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c     int rc2 = SQL
12b80 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74  ITE_OK;.      Bt
12b90 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
12ba0 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
12bb0 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
12bc0 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56      if( eOp==SAV
12bd0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
12be0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 32  ){.          rc2
12bf0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53   = sqlite3BtreeS
12c00 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41  avepoint(pBt, SA
12c10 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
12c20 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
12c30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12c40 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45   if( rc2==SQLITE
12c50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
12c60 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74   rc2 = sqlite3Bt
12c70 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74  reeSavepoint(pBt
12c80 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  , SAVEPOINT_RELE
12c90 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ASE, iSavepoint)
12ca0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12cb0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
12cc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
12cd0 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
12ce0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
12cf0 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74     }.    db->nSt
12d00 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70  atement--;.    p
12d10 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->iStatement = 0
12d20 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ;..    if( rc==S
12d30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12d40 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50    if( eOp==SAVEP
12d50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
12d60 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
12d70 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69  lite3VtabSavepoi
12d80 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54  nt(db, SAVEPOINT
12d90 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65  _ROLLBACK, iSave
12da0 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a  point);.      }.
12db0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
12dc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12dd0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
12de0 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c  tabSavepoint(db,
12df0 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
12e00 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  SE, iSavepoint);
12e10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
12e20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74      /* If the st
12e30 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
12e40 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  ion is being rol
12e50 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72  led back, also r
12e60 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20 20 20  estore the .    
12e70 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
12e80 6c 65 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e  les deferred con
12e90 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20  straint counter 
12ea0 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20  to the value it 
12eb0 68 61 64 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a  had when .    **
12ec0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
12ed0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f  ransaction was o
12ee0 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69  pened.  */.    i
12ef0 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  f( eOp==SAVEPOIN
12f00 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
12f10 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
12f20 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74  dCons = p->nStmt
12f30 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20 20 20 64  DefCons;.      d
12f40 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
12f50 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65  ons = p->nStmtDe
12f60 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a  fImmCons;.    }.
12f70 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
12f80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
12f90 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
12fa0 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  d when a transac
12fb0 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20 74  tion opened by t
12fc0 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
12fd0 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65  handle associate
12fe0 64 20 77 69 74 68 20 74 68 65 20 56 4d 20 70 61  d with the VM pa
12ff0 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
13000 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20  ent is about to 
13010 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64  be .** committed
13020 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  . If there are o
13030 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66 65 72  utstanding defer
13040 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  red foreign key 
13050 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69  constraint.** vi
13060 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e  olations, return
13070 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f   SQLITE_ERROR. O
13080 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
13090 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  _OK..**.** If th
130a0 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
130b0 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e  ing FK violation
130c0 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  s and this funct
130d0 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  ion returns .** 
130e0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73 65  SQLITE_ERROR, se
130f0 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  t the result of 
13100 74 68 65 20 56 4d 20 74 6f 20 53 51 4c 49 54 45  the VM to SQLITE
13110 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
13120 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72  IGNKEY.** and wr
13130 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ite an error mes
13140 73 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65 6e  sage to it. Then
13150 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
13160 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  RROR..*/.#ifndef
13170 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
13180 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c  EIGN_KEY.int sql
13190 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
131a0 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65 66  Vdbe *p, int def
131b0 65 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74 65  erred){.  sqlite
131c0 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
131d0 20 69 66 28 20 28 64 65 66 65 72 72 65 64 20 26   if( (deferred &
131e0 26 20 28 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  & (db->nDeferred
131f0 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72  Cons+db->nDeferr
13200 65 64 49 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20  edImmCons)>0) . 
13210 20 20 7c 7c 20 28 21 64 65 66 65 72 72 65 64 20    || (!deferred 
13220 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61  && p->nFkConstra
13230 69 6e 74 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20  int>0) .  ){.   
13240 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
13250 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49  CONSTRAINT_FOREI
13260 47 4e 4b 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72  GNKEY;.    p->er
13270 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41  rorAction = OE_A
13280 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  bort;.    sqlite
13290 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22 46  3VdbeError(p, "F
132a0 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74  OREIGN KEY const
132b0 72 61 69 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a  raint failed");.
132c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
132d0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
132e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
132f0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
13300 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
13310 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e   called the when
13320 20 61 20 56 44 42 45 20 74 72 69 65 73 20 74 6f   a VDBE tries to
13330 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56   halt.  If the V
13340 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20  DBE.** has made 
13350 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69  changes and is i
13360 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64  n autocommit mod
13370 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74  e, then commit t
13380 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e  hose.** changes.
13390 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20    If a rollback 
133a0 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20  is needed, then 
133b0 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  do the rollback.
133c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
133d0 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  ine is the only 
133e0 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  way to move the 
133f0 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72  state of a VM fr
13400 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47  om.** SQLITE_MAG
13410 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45  IC_RUN to SQLITE
13420 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74  _MAGIC_HALT.  It
13430 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a   is harmless to.
13440 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20  ** call this on 
13450 61 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20  a VM that is in 
13460 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  the SQLITE_MAGIC
13470 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a  _HALT state..**.
13480 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  ** Return an err
13490 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65  or code.  If the
134a0 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f   commit could no
134b0 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75  t complete becau
134c0 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f  se of.** lock co
134d0 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e  ntention, return
134e0 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49   SQLITE_BUSY.  I
134f0 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  f SQLITE_BUSY is
13500 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a   returned, it.**
13510 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65   means the close
13520 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20   did not happen 
13530 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20  and needs to be 
13540 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74  repeated..*/.int
13550 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
13560 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
13570 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
13580 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13590 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72  Used to store tr
135a0 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63  ansient return c
135b0 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  odes */.  sqlite
135c0 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  3 *db = p->db;..
135d0 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
135e0 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
135f0 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74 65 72  logic that deter
13600 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61 74 65  mines if a state
13610 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61  ment or.  ** tra
13620 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  nsaction will be
13630 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
13640 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
13650 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a  esult of the.  *
13660 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  * execution of t
13670 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68  his virtual mach
13680 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ine. .  **.  ** 
13690 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  If any of the fo
136a0 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f  llowing errors o
136b0 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ccur:.  **.  ** 
136c0 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d      SQLITE_NOMEM
136d0 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
136e0 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20  _IOERR.  **     
136f0 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a  SQLITE_FULL.  **
13700 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45       SQLITE_INTE
13710 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20  RRUPT.  **.  ** 
13720 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61  Then the interna
13730 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20 68 61  l cache might ha
13740 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20  ve been left in 
13750 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a  an inconsistent.
13760 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20    ** state.  We 
13770 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  need to rollback
13780 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
13790 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74  ransaction, if t
137a0 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65  here is.  ** one
137b0 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74  , or the complet
137c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  e transaction if
137d0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61   there is no sta
137e0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
137f0 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20  on..  */..  if( 
13800 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
13810 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
13820 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
13830 54 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c  T;.  }.  closeAl
13840 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20 69  lCursors(p);.  i
13850 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  f( p->magic!=VDB
13860 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20  E_MAGIC_RUN ){. 
13870 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13880 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b  _OK;.  }.  check
13890 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
138a0 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d  );..  /* No comm
138b0 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e  it or rollback n
138c0 65 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f  eeded if the pro
138d0 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74  gram never start
138e0 65 64 20 6f 72 20 69 66 20 74 68 65 0a 20 20 2a  ed or if the.  *
138f0 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  * SQL statement 
13900 64 6f 65 73 20 6e 6f 74 20 72 65 61 64 20 6f 72  does not read or
13910 20 77 72 69 74 65 20 61 20 64 61 74 61 62 61 73   write a databas
13920 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 69 66  e file.  */.  if
13930 28 20 70 2d 3e 70 63 3e 3d 30 20 26 26 20 70 2d  ( p->pc>=0 && p-
13940 3e 62 49 73 52 65 61 64 65 72 20 29 7b 0a 20 20  >bIsReader ){.  
13950 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20    int mrc;   /* 
13960 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f  Primary error co
13970 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f  de from p->rc */
13980 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d  .    int eStatem
13990 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69  entOp = 0;.    i
139a0 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  nt isSpecialErro
139b0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
139c0 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
139d0 61 20 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f  a 'special' erro
139e0 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63  r */..    /* Loc
139f0 6b 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65  k all btrees use
13a00 64 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65  d by the stateme
13a10 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  nt */.    sqlite
13a20 33 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a  3VdbeEnter(p);..
13a30 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
13a40 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63   one of the spec
13a50 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  ial errors */.  
13a60 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20    mrc = p->rc & 
13a70 30 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65 63  0xff;.    isSpec
13a80 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d  ialError = mrc==
13a90 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
13aa0 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  mrc==SQLITE_IOER
13ab0 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R.              
13ac0 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53         || mrc==S
13ad0 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
13ae0 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46  || mrc==SQLITE_F
13af0 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53  ULL;.    if( isS
13b00 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20  pecialError ){. 
13b10 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71       /* If the q
13b20 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e  uery was read-on
13b30 6c 79 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  ly and the error
13b40 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f   code is SQLITE_
13b50 49 4e 54 45 52 52 55 50 54 2c 20 0a 20 20 20 20  INTERRUPT, .    
13b60 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b    ** no rollback
13b70 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20 4f   is necessary. O
13b80 74 68 65 72 77 69 73 65 2c 20 61 74 20 6c 65 61  therwise, at lea
13b90 73 74 20 61 20 73 61 76 65 70 6f 69 6e 74 20 0a  st a savepoint .
13ba0 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
13bb0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c  tion must be rol
13bc0 6c 65 64 20 62 61 63 6b 20 74 6f 20 72 65 73 74  led back to rest
13bd0 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
13be0 20 74 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a 20   to a .      ** 
13bf0 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65  consistent state
13c00 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
13c10 20 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65 20   ** Even if the 
13c20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65 61  statement is rea
13c30 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d  d-only, it is im
13c40 70 6f 72 74 61 6e 74 20 74 6f 20 70 65 72 66 6f  portant to perfo
13c50 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 74  rm.      ** a st
13c60 61 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73  atement or trans
13c70 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20  action rollback 
13c80 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74 68  operation. If th
13c90 65 20 65 72 72 6f 72 20 0a 20 20 20 20 20 20 2a  e error .      *
13ca0 2a 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  * occurred while
13cb0 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
13cc0 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75  journal, sub-jou
13cd0 72 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73 65  rnal or database
13ce0 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61  .      ** file a
13cf0 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66 66  s part of an eff
13d00 6f 72 74 20 74 6f 20 66 72 65 65 20 75 70 20 63  ort to free up c
13d10 61 63 68 65 20 73 70 61 63 65 20 28 73 65 65 20  ache space (see 
13d20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
13d30 2a 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20  * pagerStress() 
13d40 69 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68 65  in pager.c), the
13d50 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65 71   rollback is req
13d60 75 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72 65  uired to restore
13d70 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70   .      ** the p
13d80 61 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69 73  ager to a consis
13d90 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20  tent state..    
13da0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
13db0 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d  p->readOnly || m
13dc0 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52  rc!=SQLITE_INTER
13dd0 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20  RUPT ){.        
13de0 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45  if( (mrc==SQLITE
13df0 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53  _NOMEM || mrc==S
13e00 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20 70  QLITE_FULL) && p
13e10 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  ->usesStmtJourna
13e20 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65  l ){.          e
13e30 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
13e40 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
13e50 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
13e60 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
13e70 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72   are forced to r
13e80 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74  oll back the act
13e90 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
13ea0 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20   Before doing.  
13eb0 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61          ** so, a
13ec0 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73  bort any other s
13ed0 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68  tatements this h
13ee0 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  andle currently 
13ef0 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20  has active..    
13f00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
13f10 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
13f20 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
13f30 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29  _ABORT_ROLLBACK)
13f40 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
13f50 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
13f60 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
13f70 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
13f80 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
13f90 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
13fa0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13fb0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
13fc0 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69  Check for immedi
13fd0 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
13fe0 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20  violations. */. 
13ff0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
14000 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14010 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
14020 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d  kFk(p, 0);.    }
14030 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
14040 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
14050 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
14060 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61  is is the only a
14070 63 74 69 76 65 20 77 72 69 74 65 72 20 0a 20 20  ctive writer .  
14080 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65    ** VM, then we
14090 20 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d   do either a com
140a0 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
140b0 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  of the current t
140c0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20  ransaction. .   
140d0 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a   **.    ** Note:
140e0 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f   This block also
140f0 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20   runs if one of 
14100 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f  the special erro
14110 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20  rs handled .    
14120 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63  ** above has occ
14130 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20  urred. .    */. 
14140 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56     if( !sqlite3V
14150 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20  tabInSync(db) . 
14160 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43      && db->autoC
14170 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64  ommit .     && d
14180 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d 28  b->nVdbeWrite==(
14190 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20  p->readOnly==0) 
141a0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66  .    ){.      if
141b0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
141c0 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41  OK || (p->errorA
141d0 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26  ction==OE_Fail &
141e0 26 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f  & !isSpecialErro
141f0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  r) ){.        rc
14200 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68   = sqlite3VdbeCh
14210 65 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20  eckFk(p, 1);.   
14220 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
14230 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14240 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d      if( NEVER(p-
14250 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20  >readOnly) ){.  
14260 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14270 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
14280 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
14290 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
142a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
142b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
142c0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
142d0 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20  EIGNKEY;.       
142e0 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20   }else{ .       
142f0 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63     /* The auto-c
14300 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72  ommit flag is tr
14310 75 65 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f  ue, the vdbe pro
14320 67 72 61 6d 20 77 61 73 20 73 75 63 63 65 73 73  gram was success
14330 66 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ful .          *
14340 2a 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20  * or hit an 'OR 
14350 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74  FAIL' constraint
14360 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e   and there are n
14370 6f 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  o deferred forei
14380 67 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  gn.          ** 
14390 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  key constraints 
143a0 74 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74  to hold up the t
143b0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73  ransaction. This
143c0 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20   means a commit 
143d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73  .          ** is
143e0 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
143f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62          rc = vdb
14400 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a  eCommit(db, p);.
14410 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14420 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14430 5f 42 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64  _BUSY && p->read
14440 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
14450 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61    sqlite3VdbeLea
14460 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ve(p);.         
14470 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
14480 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  USY;.        }el
14490 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  se if( rc!=SQLIT
144a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
144b0 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
144c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
144d0 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
144e0 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20  QLITE_OK);.     
144f0 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
14500 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
14510 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62  se{.          db
14520 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20  ->nDeferredCons 
14530 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64  = 0;.          d
14540 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
14550 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ons = 0;.       
14560 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20     db->flags &= 
14570 7e 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73  ~SQLITE_DeferFKs
14580 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
14590 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  te3CommitInterna
145a0 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20  lChanges(db);.  
145b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
145c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
145d0 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
145e0 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  db, SQLITE_OK);.
145f0 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e          p->nChan
14600 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ge = 0;.      }.
14610 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65        db->nState
14620 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  ment = 0;.    }e
14630 6c 73 65 20 69 66 28 20 65 53 74 61 74 65 6d 65  lse if( eStateme
14640 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ntOp==0 ){.     
14650 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
14660 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f  TE_OK || p->erro
14670 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c  rAction==OE_Fail
14680 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61   ){.        eSta
14690 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50  tementOp = SAVEP
146a0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20  OINT_RELEASE;.  
146b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
146c0 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
146d0 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  _Abort ){.      
146e0 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d    eStatementOp =
146f0 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
14700 41 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ACK;.      }else
14710 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
14720 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
14730 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
14740 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20  LLBACK);.       
14750 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
14760 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
14770 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
14780 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
14790 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
147a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
147b0 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74 61   .    /* If eSta
147c0 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d  tementOp is non-
147d0 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74 61  zero, then a sta
147e0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
147f0 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20  on needs to.    
14800 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20  ** be committed 
14810 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  or rolled back. 
14820 43 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65  Call sqlite3Vdbe
14830 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 29  CloseStatement()
14840 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f   to.    ** do so
14850 2e 20 49 66 20 74 68 69 73 20 6f 70 65 72 61 74  . If this operat
14860 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65  ion returns an e
14870 72 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63 75  rror, and the cu
14880 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a  rrent statement.
14890 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64      ** error cod
148a0 65 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  e is SQLITE_OK o
148b0 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  r SQLITE_CONSTRA
148c0 49 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74  INT, then promot
148d0 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72  e the.    ** cur
148e0 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 65  rent statement e
148f0 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a  rror code..    *
14900 2f 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65  /.    if( eState
14910 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20 20  mentOp ){.      
14920 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
14930 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70  CloseStatement(p
14940 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b  , eStatementOp);
14950 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
14960 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
14970 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
14980 20 28 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53   (p->rc&0xff)==S
14990 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
149a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
149b0 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
149c0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
149d0 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
149e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  );.          p->
149f0 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
14a00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
14a10 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
14a20 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f  l(db, SQLITE_ABO
14a30 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20  RT_ROLLBACK);.  
14a40 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
14a50 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
14a60 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75  ;.        db->au
14a70 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
14a80 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
14a90 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
14aa0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
14ab0 20 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53   this was an INS
14ac0 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44  ERT, UPDATE or D
14ad0 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73 74 61  ELETE and no sta
14ae0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
14af0 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65  on.    ** has be
14b00 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  en rolled back, 
14b10 75 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62  update the datab
14b20 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  ase connection c
14b30 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a  hange-counter. .
14b40 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
14b50 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b  ->changeCntOn ){
14b60 0a 20 20 20 20 20 20 69 66 28 20 65 53 74 61 74  .      if( eStat
14b70 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49  ementOp!=SAVEPOI
14b80 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
14b90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14ba0 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c  beSetChanges(db,
14bb0 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20   p->nChange);.  
14bc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14bd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
14be0 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b  tChanges(db, 0);
14bf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
14c00 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
14c10 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c     }..    /* Rel
14c20 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a  ease the locks *
14c30 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
14c40 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 0a  eLeave(p);.  }..
14c50 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63    /* We have suc
14c60 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64  cessfully halted
14c70 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20   and closed the 
14c80 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73  VM.  Record this
14c90 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20   fact. */.  if( 
14ca0 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
14cb0 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 2d  db->nVdbeActive-
14cc0 2d 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72  -;.    if( !p->r
14cd0 65 61 64 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e 56  eadOnly ) db->nV
14ce0 64 62 65 57 72 69 74 65 2d 2d 3b 0a 20 20 20 20  dbeWrite--;.    
14cf0 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72  if( p->bIsReader
14d00 20 29 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64   ) db->nVdbeRead
14d10 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
14d20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e  db->nVdbeActive>
14d30 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29  =db->nVdbeRead )
14d40 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
14d50 2d 3e 6e 56 64 62 65 52 65 61 64 3e 3d 64 62 2d  ->nVdbeRead>=db-
14d60 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20  >nVdbeWrite );. 
14d70 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
14d80 56 64 62 65 57 72 69 74 65 3e 3d 30 20 29 3b 0a  VdbeWrite>=0 );.
14d90 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d    }.  p->magic =
14da0 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54   VDBE_MAGIC_HALT
14db0 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56  ;.  checkActiveV
14dc0 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 69 66  dbeCnt(db);.  if
14dd0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
14de0 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
14df0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
14e00 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  KPT;.  }..  /* I
14e10 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  f the auto-commi
14e20 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f  t flag is set to
14e30 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20   true, then any 
14e40 6c 6f 63 6b 73 20 74 68 61 74 20 77 65 72 65 20  locks that were 
14e50 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e  held.  ** by con
14e60 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 76 65 20  nection db have 
14e70 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65 61 73 65  now been release
14e80 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43  d. Call sqlite3C
14e90 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65  onnectionUnlocke
14ea0 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76  d() .  ** to inv
14eb0 6f 6b 65 20 61 6e 79 20 72 65 71 75 69 72 65 64  oke any required
14ec0 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63   unlock-notify c
14ed0 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20  allbacks..  */. 
14ee0 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d   if( db->autoCom
14ef0 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
14f00 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f  e3ConnectionUnlo
14f10 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20  cked(db);.  }.. 
14f20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64   assert( db->nVd
14f30 62 65 41 63 74 69 76 65 3e 30 20 7c 7c 20 64 62  beActive>0 || db
14f40 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20  ->autoCommit==0 
14f50 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  || db->nStatemen
14f60 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  t==0 );.  return
14f70 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f   (p->rc==SQLITE_
14f80 42 55 53 59 20 3f 20 53 51 4c 49 54 45 5f 42 55  BUSY ? SQLITE_BU
14f90 53 59 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  SY : SQLITE_OK);
14fa0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  .}.../*.** Each 
14fb0 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65 20 72  VDBE holds the r
14fc0 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73  esult of the mos
14fd0 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33  t recent sqlite3
14fe0 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20  _step() call.** 
14ff0 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69 73 20  in p->rc.  This 
15000 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 61  routine sets tha
15010 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20 74 6f  t result back to
15020 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76   SQLITE_OK..*/.v
15030 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
15040 65 73 65 74 53 74 65 70 52 65 73 75 6c 74 28 56  esetStepResult(V
15050 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63  dbe *p){.  p->rc
15060 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a   = SQLITE_OK;.}.
15070 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20  ./*.** Copy the 
15080 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65  error code and e
15090 72 72 6f 72 20 6d 65 73 73 61 67 65 20 62 65 6c  rror message bel
150a0 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 56 44  onging to the VD
150b0 42 45 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20  BE passed.** as 
150c0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
150d0 6e 74 20 74 6f 20 69 74 73 20 64 61 74 61 62 61  nt to its databa
150e0 73 65 20 68 61 6e 64 6c 65 20 28 73 6f 20 74 68  se handle (so th
150f0 61 74 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20  at they will be 
15100 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 62 79 20  .** returned by 
15110 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
15120 5f 65 72 72 63 6f 64 65 28 29 20 61 6e 64 20 73  _errcode() and s
15130 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 29  qlite3_errmsg())
15140 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
15150 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63  ction does not c
15160 6c 65 61 72 20 74 68 65 20 56 44 42 45 20 65 72  lear the VDBE er
15170 72 6f 72 20 63 6f 64 65 20 6f 72 20 6d 65 73 73  ror code or mess
15180 61 67 65 2c 20 6a 75 73 74 0a 2a 2a 20 63 6f 70  age, just.** cop
15190 69 65 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20  ies them to the 
151a0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  database handle.
151b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
151c0 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72  dbeTransferError
151d0 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c  (Vdbe *p){.  sql
151e0 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
151f0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e  ;.  int rc = p->
15200 72 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 45 72  rc;.  if( p->zEr
15210 72 4d 73 67 20 29 7b 0a 20 20 20 20 64 62 2d 3e  rMsg ){.    db->
15220 62 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 2b 2b 3b  bBenignMalloc++;
15230 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
15240 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
15250 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 45 72  .    if( db->pEr
15260 72 3d 3d 30 20 29 20 64 62 2d 3e 70 45 72 72 20  r==0 ) db->pErr 
15270 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
15280 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  w(db);.    sqlit
15290 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62  e3ValueSetStr(db
152a0 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a  ->pErr, -1, p->z
152b0 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55  ErrMsg, SQLITE_U
152c0 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  TF8, SQLITE_TRAN
152d0 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
152e0 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
152f0 6f 63 28 29 3b 0a 20 20 20 20 64 62 2d 3e 62 42  oc();.    db->bB
15300 65 6e 69 67 6e 4d 61 6c 6c 6f 63 2d 2d 3b 0a 20  enignMalloc--;. 
15310 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d     db->errCode =
15320 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   rc;.  }else{.  
15330 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
15340 62 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65  b, rc);.  }.  re
15350 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
15360 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
15370 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66  _SQLLOG./*.** If
15380 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49   an SQLITE_CONFI
15390 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73  G_SQLLOG hook is
153a0 20 72 65 67 69 73 74 65 72 65 64 20 61 6e 64 20   registered and 
153b0 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20  the VM has been 
153c0 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20  run, .** invoke 
153d0 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  it..*/.static vo
153e0 69 64 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c  id vdbeInvokeSql
153f0 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  log(Vdbe *v){.  
15400 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
15410 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20  lConfig.xSqllog 
15420 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  && v->rc==SQLITE
15430 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26  _OK && v->zSql &
15440 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  & v->pc>=0 ){.  
15450 20 20 63 68 61 72 20 2a 7a 45 78 70 61 6e 64 65    char *zExpande
15460 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45  d = sqlite3VdbeE
15470 78 70 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a  xpandSql(v, v->z
15480 53 71 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Sql);.    assert
15490 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75  ( v->db->init.bu
154a0 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  sy==0 );.    if(
154b0 20 7a 45 78 70 61 6e 64 65 64 20 29 7b 0a 20 20   zExpanded ){.  
154c0 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
154d0 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28  lConfig.xSqllog(
154e0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
154f0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
15500 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62  SqllogArg, v->db
15510 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a 20  , zExpanded, 1. 
15520 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71       );.      sq
15530 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64  lite3DbFree(v->d
15540 62 2c 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20  b, zExpanded);. 
15550 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65     }.  }.}.#else
15560 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 49 6e  .# define vdbeIn
15570 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65  vokeSqllog(x).#e
15580 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ndif../*.** Clea
15590 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74 65  n up a VDBE afte
155a0 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20  r execution but 
155b0 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  do not delete th
155c0 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e  e VDBE just yet.
155d0 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72  .** Write any er
155e0 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74  ror messages int
155f0 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65  o *pzErrMsg.  Re
15600 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20  turn the result 
15610 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  code..**.** Afte
15620 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  r this routine i
15630 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20  s run, the VDBE 
15640 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20  should be ready 
15650 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a  to be executed.*
15660 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54  * again..**.** T
15670 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f  o look at it ano
15680 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 20 72  ther way, this r
15690 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 74 68  outine resets th
156a0 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a  e state of the.*
156b0 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * virtual machin
156c0 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49  e from VDBE_MAGI
156d0 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41  C_RUN or VDBE_MA
156e0 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f  GIC_HALT back to
156f0 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  .** VDBE_MAGIC_I
15700 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  NIT..*/.int sqli
15710 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64 62  te3VdbeReset(Vdb
15720 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
15730 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e   *db;.  db = p->
15740 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  db;..  /* If the
15750 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20   VM did not run 
15760 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72  to completion or
15770 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72   if it encounter
15780 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72  ed an.  ** error
15790 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20  , then it might 
157a0 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68 61  not have been ha
157b0 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20  lted properly.  
157c0 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20  So halt.  ** it 
157d0 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  now..  */.  sqli
157e0 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a  te3VdbeHalt(p);.
157f0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42  .  /* If the VDB
15800 45 20 68 61 73 20 62 65 20 72 75 6e 20 65 76 65  E has be run eve
15810 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65  n partially, the
15820 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 65  n transfer the e
15830 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
15840 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  nd error message
15850 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69   from the VDBE i
15860 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74  nto the main dat
15870 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e  abase structure.
15880 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68    But.  ** if th
15890 65 20 56 44 42 45 20 68 61 73 20 6a 75 73 74 20  e VDBE has just 
158a0 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20  been set to run 
158b0 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75  but has not actu
158c0 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e  ally executed an
158d0 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69  y.  ** instructi
158e0 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74  ons yet, leave t
158f0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
15900 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69   error informati
15910 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20  on unchanged..  
15920 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
15930 30 20 29 7b 0a 20 20 20 20 76 64 62 65 49 6e 76  0 ){.    vdbeInv
15940 6f 6b 65 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20  okeSqllog(p);.  
15950 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61    sqlite3VdbeTra
15960 6e 73 66 65 72 45 72 72 6f 72 28 70 29 3b 0a 20  nsferError(p);. 
15970 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
15980 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
15990 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67  ;.    p->zErrMsg
159a0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d   = 0;.    if( p-
159b0 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70  >runOnlyOnce ) p
159c0 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20  ->expired = 1;. 
159d0 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63   }else if( p->rc
159e0 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29   && p->expired )
159f0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70  {.    /* The exp
15a00 69 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65  ired flag was se
15a10 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65  t on the VDBE be
15a20 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63  fore the first c
15a30 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71  all.    ** to sq
15a40 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f  lite3_step(). Fo
15a50 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73  r consistency (s
15a60 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65  ince sqlite3_ste
15a70 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  p() was.    ** c
15a80 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20  alled), set the 
15a90 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69  database error i
15aa0 6e 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77  n this case as w
15ab0 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ell..    */.    
15ac0 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
15ad0 4d 73 67 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70  Msg(db, p->rc, p
15ae0 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22  ->zErrMsg ? "%s"
15af0 20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67   : 0, p->zErrMsg
15b00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
15b10 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
15b20 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72  Msg);.    p->zEr
15b30 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  rMsg = 0;.  }.. 
15b40 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20   /* Reclaim all 
15b50 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74  memory used by t
15b60 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43  he VDBE.  */.  C
15b70 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a  leanup(p);..  /*
15b80 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20   Save profiling 
15b90 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
15ba0 20 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a   this VDBE run..
15bb0 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45    */.#ifdef VDBE
15bc0 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20  _PROFILE.  {.   
15bd0 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70   FILE *out = fop
15be0 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65  en("vdbe_profile
15bf0 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20  .out", "a");.   
15c00 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20   if( out ){.    
15c10 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
15c20 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d  printf(out, "---
15c30 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  - ");.      for(
15c40 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
15c50 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  ++){.        fpr
15c60 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22  intf(out, "%02x"
15c70 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f  , p->aOp[i].opco
15c80 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  de);.      }.   
15c90 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
15ca0 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 69 66 28  "\n");.      if(
15cb0 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20   p->zSql ){.    
15cc0 20 20 20 20 63 68 61 72 20 63 2c 20 70 63 20 3d      char c, pc =
15cd0 20 30 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69   0;.        fpri
15ce0 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b  ntf(out, "-- ");
15cf0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
15d00 3b 20 28 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69  ; (c = p->zSql[i
15d10 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  ])!=0; i++){.   
15d20 20 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d 27         if( pc=='
15d30 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75  \n' ) fprintf(ou
15d40 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20  t, "-- ");.     
15d50 20 20 20 20 20 70 75 74 63 28 63 2c 20 6f 75 74       putc(c, out
15d60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 63 20  );.          pc 
15d70 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = c;.        }. 
15d80 20 20 20 20 20 20 20 69 66 28 20 70 63 21 3d 27         if( pc!='
15d90 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75  \n' ) fprintf(ou
15da0 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  t, "\n");.      
15db0 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
15dc0 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
15dd0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 48  .        char zH
15de0 64 72 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20 20  dr[100];.       
15df0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
15e00 66 28 73 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20  f(sizeof(zHdr), 
15e10 7a 48 64 72 2c 20 22 25 36 75 20 25 31 32 6c 6c  zHdr, "%6u %12ll
15e20 75 20 25 38 6c 6c 75 20 22 2c 0a 20 20 20 20 20  u %8llu ",.     
15e30 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
15e40 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  cnt,.           
15e50 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
15e60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
15e70 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70  aOp[i].cnt>0 ? p
15e80 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f  ->aOp[i].cycles/
15e90 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20  p->aOp[i].cnt : 
15ea0 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  0.        );.   
15eb0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
15ec0 2c 20 22 25 73 22 2c 20 7a 48 64 72 29 3b 0a 20  , "%s", zHdr);. 
15ed0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15ee0 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69  bePrintOp(out, i
15ef0 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20  , &p->aOp[i]);. 
15f00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c       }.      fcl
15f10 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a  ose(out);.    }.
15f20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e    }.#endif.  p->
15f30 69 43 75 72 72 65 6e 74 54 69 6d 65 20 3d 20 30  iCurrentTime = 0
15f40 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  ;.  p->magic = V
15f50 44 42 45 5f 4d 41 47 49 43 5f 52 45 53 45 54 3b  DBE_MAGIC_RESET;
15f60 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20  .  return p->rc 
15f70 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d  & db->errMask;.}
15f80 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  . ./*.** Clean u
15f90 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56  p and delete a V
15fa0 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74  DBE after execut
15fb0 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ion.  Return an 
15fc0 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
15fd0 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63  .** the result c
15fe0 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20  ode.  Write any 
15ff0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65  error message te
16000 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73  xt into *pzErrMs
16010 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
16020 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64  3VdbeFinalize(Vd
16030 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  be *p){.  int rc
16040 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
16050 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  if( p->magic==VD
16060 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20  BE_MAGIC_RUN || 
16070 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
16080 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20  AGIC_HALT ){.   
16090 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
160a0 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61  eReset(p);.    a
160b0 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e  ssert( (rc & p->
160c0 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63  db->errMask)==rc
160d0 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   );.  }.  sqlite
160e0 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a  3VdbeDelete(p);.
160f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16100 2f 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  /*.** If paramet
16110 65 72 20 69 4f 70 20 69 73 20 6c 65 73 73 20 74  er iOp is less t
16120 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69  han zero, then i
16130 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75  nvoke the destru
16140 63 74 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20  ctor for.** all 
16150 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 70  auxiliary data p
16160 6f 69 6e 74 65 72 73 20 63 75 72 72 65 6e 74 6c  ointers currentl
16170 79 20 63 61 63 68 65 64 20 62 79 20 74 68 65 20  y cached by the 
16180 56 4d 20 70 61 73 73 65 64 20 61 73 0a 2a 2a 20  VM passed as.** 
16190 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
161a0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66  nt..**.** Or, if
161b0 20 69 4f 70 20 69 73 20 67 72 65 61 74 65 72 20   iOp is greater 
161c0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
161d0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
161e0 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a  destructor is.**
161f0 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f   only invoked fo
16200 72 20 74 68 6f 73 65 20 61 75 78 69 6c 69 61 72  r those auxiliar
16210 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20  y data pointers 
16220 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20 75  created by the u
16230 73 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ser .** function
16240 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20   invoked by the 
16250 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f  OP_Function opco
16260 64 65 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f  de at instructio
16270 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20  n iOp of .** VM 
16280 70 56 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20  pVdbe, and only 
16290 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  then if:.**.**  
162a0 20 20 2a 20 74 68 65 20 61 73 73 6f 63 69 61 74    * the associat
162b0 65 64 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61  ed function para
162c0 6d 65 74 65 72 20 69 73 20 74 68 65 20 33 32 6e  meter is the 32n
162d0 64 20 6f 72 20 6c 61 74 65 72 20 28 63 6f 75 6e  d or later (coun
162e0 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f  ting.**      fro
162f0 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 29  m left to right)
16300 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  , or.**.**    * 
16310 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
16320 67 20 62 69 74 20 69 6e 20 61 72 67 75 6d 65 6e  g bit in argumen
16330 74 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 20  t mask is clear 
16340 28 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74  (where the first
16350 0a 2a 2a 20 20 20 20 20 20 66 75 6e 63 74 69 6f  .**      functio
16360 6e 20 70 61 72 61 6d 65 74 65 72 20 63 6f 72 72  n parameter corr
16370 65 73 70 6f 6e 64 73 20 74 6f 20 62 69 74 20 30  esponds to bit 0
16380 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20   etc.)..*/.void 
16390 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
163a0 65 41 75 78 44 61 74 61 28 73 71 6c 69 74 65 33  eAuxData(sqlite3
163b0 20 2a 64 62 2c 20 41 75 78 44 61 74 61 20 2a 2a   *db, AuxData **
163c0 70 70 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74  pp, int iOp, int
163d0 20 6d 61 73 6b 29 7b 0a 20 20 77 68 69 6c 65 28   mask){.  while(
163e0 20 2a 70 70 20 29 7b 0a 20 20 20 20 41 75 78 44   *pp ){.    AuxD
163f0 61 74 61 20 2a 70 41 75 78 20 3d 20 2a 70 70 3b  ata *pAux = *pp;
16400 0a 20 20 20 20 69 66 28 20 28 69 4f 70 3c 30 29  .    if( (iOp<0)
16410 0a 20 20 20 20 20 7c 7c 20 28 70 41 75 78 2d 3e  .     || (pAux->
16420 69 4f 70 3d 3d 69 4f 70 20 26 26 20 28 70 41 75  iOp==iOp && (pAu
16430 78 2d 3e 69 41 72 67 3e 33 31 20 7c 7c 20 21 28  x->iArg>31 || !(
16440 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49 54 33 32  mask & MASKBIT32
16450 28 70 41 75 78 2d 3e 69 41 72 67 29 29 29 29 0a  (pAux->iArg)))).
16460 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73      ){.      tes
16470 74 63 61 73 65 28 20 70 41 75 78 2d 3e 69 41 72  tcase( pAux->iAr
16480 67 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 69  g==31 );.      i
16490 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65  f( pAux->xDelete
164a0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78   ){.        pAux
164b0 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e  ->xDelete(pAux->
164c0 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pAux);.      }. 
164d0 20 20 20 20 20 2a 70 70 20 3d 20 70 41 75 78 2d       *pp = pAux-
164e0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71  >pNext;.      sq
164f0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
16500 70 41 75 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pAux);.    }else
16510 7b 0a 20 20 20 20 20 20 70 70 3d 20 26 70 41 75  {.      pp= &pAu
16520 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  x->pNext;.    }.
16530 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
16540 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73  e all memory ass
16550 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
16560 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
16570 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
16580 65 6e 74 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66  ent,.** except f
16590 6f 72 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66  or object itself
165a0 2c 20 77 68 69 63 68 20 69 73 20 70 72 65 73 65  , which is prese
165b0 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rved..**.** The 
165c0 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
165d0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
165e0 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65   and sqlite3Vdbe
165f0 44 65 6c 65 74 65 28 29 20 69 73 20 74 68 61 74  Delete() is that
16600 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28 29  .** VdbeDelete()
16610 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68   also unlinks th
16620 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20  e Vdbe from the 
16630 6c 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73 6f  list of VMs asso
16640 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  ciated with.** t
16650 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
16660 65 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 73  ection and frees
16670 20 74 68 65 20 6f 62 6a 65 63 74 20 69 74 73 65   the object itse
16680 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  lf..*/.void sqli
16690 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65  te3VdbeClearObje
166a0 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ct(sqlite3 *db, 
166b0 56 64 62 65 20 2a 70 29 7b 0a 20 20 53 75 62 50  Vdbe *p){.  SubP
166c0 72 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70  rogram *pSub, *p
166d0 4e 65 78 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Next;.  int i;. 
166e0 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d   assert( p->db==
166f0 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29  0 || p->db==db )
16700 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ;.  releaseMemAr
16710 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e  ray(p->aVar, p->
16720 6e 56 61 72 29 3b 0a 20 20 72 65 6c 65 61 73 65  nVar);.  release
16730 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c  MemArray(p->aCol
16740 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c  Name, p->nResCol
16750 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a  umn*COLNAME_N);.
16760 20 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50    for(pSub=p->pP
16770 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20 70 53  rogram; pSub; pS
16780 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  ub=pNext){.    p
16790 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65  Next = pSub->pNe
167a0 78 74 3b 0a 20 20 20 20 76 64 62 65 46 72 65 65  xt;.    vdbeFree
167b0 4f 70 41 72 72 61 79 28 64 62 2c 20 70 53 75 62  OpArray(db, pSub
167c0 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70  ->aOp, pSub->nOp
167d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
167e0 46 72 65 65 28 64 62 2c 20 70 53 75 62 29 3b 0a  Free(db, pSub);.
167f0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67    }.  if( p->mag
16800 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic!=VDBE_MAGIC_I
16810 4e 49 54 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  NIT ){.    for(i
16820 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20 69 3e 3d  =p->nzVar-1; i>=
16830 30 3b 20 69 2d 2d 29 20 73 71 6c 69 74 65 33 44  0; i--) sqlite3D
16840 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a 56  bFree(db, p->azV
16850 61 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71  ar[i]);.  }.  sq
16860 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
16870 70 2d 3e 61 7a 56 61 72 29 3b 0a 20 20 76 64 62  p->azVar);.  vdb
16880 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c  eFreeOpArray(db,
16890 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29   p->aOp, p->nOp)
168a0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
168b0 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d  e(db, p->aColNam
168c0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
168d0 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29  ree(db, p->zSql)
168e0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
168f0 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b  e(db, p->pFree);
16900 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
16910 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
16920 54 41 54 55 53 0a 20 20 66 6f 72 28 69 3d 30 3b  TATUS.  for(i=0;
16930 20 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20 69 2b 2b   i<p->nScan; i++
16940 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
16950 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61  Free(db, p->aSca
16960 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  n[i].zName);.  }
16970 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
16980 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 29 3b 0a  (db, p->aScan);.
16990 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
169a0 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
169b0 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73   VDBE..*/.void s
169c0 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
169d0 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c  (Vdbe *p){.  sql
169e0 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
169f0 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72   NEVER(p==0) ) r
16a00 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d  eturn;.  db = p-
16a10 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73  >db;.  assert( s
16a20 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
16a30 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
16a40 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65    sqlite3VdbeCle
16a50 61 72 4f 62 6a 65 63 74 28 64 62 2c 20 70 29 3b  arObject(db, p);
16a60 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
16a70 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d  ){.    p->pPrev-
16a80 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
16a90 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
16aa0 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62  assert( db->pVdb
16ab0 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e  e==p );.    db->
16ac0 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74  pVdbe = p->pNext
16ad0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
16ae0 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Next ){.    p->p
16af0 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
16b00 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d  >pPrev;.  }.  p-
16b10 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
16b20 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64  GIC_DEAD;.  p->d
16b30 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  b = 0;.  sqlite3
16b40 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d  DbFree(db, p);.}
16b50 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73  ../*.** The curs
16b60 6f 72 20 22 70 22 20 68 61 73 20 61 20 70 65 6e  or "p" has a pen
16b70 64 69 6e 67 20 73 65 65 6b 20 6f 70 65 72 61 74  ding seek operat
16b80 69 6f 6e 20 74 68 61 74 20 68 61 73 20 6e 6f 74  ion that has not
16b90 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20 63 61 72   yet been.** car
16ba0 72 69 65 64 20 6f 75 74 2e 20 20 53 65 65 6b 20  ried out.  Seek 
16bb0 74 68 65 20 63 75 72 73 6f 72 20 6e 6f 77 2e 20  the cursor now. 
16bc0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
16bd0 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 74  urs, return.** t
16be0 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  he appropriate e
16bf0 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
16c00 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
16c10 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 44  NOINLINE handleD
16c20 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 56 64  eferredMoveto(Vd
16c30 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  beCursor *p){.  
16c40 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66  int res, rc;.#if
16c50 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
16c60 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
16c70 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
16c80 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  t;.#endif.  asse
16c90 72 74 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d  rt( p->deferredM
16ca0 6f 76 65 74 6f 20 29 3b 0a 20 20 61 73 73 65 72  oveto );.  asser
16cb0 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b  t( p->isTable );
16cc0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43  .  assert( p->eC
16cd0 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
16ce0 42 54 52 45 45 20 29 3b 0a 20 20 72 63 20 3d 20  BTREE );.  rc = 
16cf0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
16d00 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 75 63  toUnpacked(p->uc
16d10 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e  .pCursor, 0, p->
16d20 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c  movetoTarget, 0,
16d30 20 26 72 65 73 29 3b 0a 20 20 69 66 28 20 72 63   &res);.  if( rc
16d40 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
16d50 69 66 28 20 72 65 73 21 3d 30 20 29 20 72 65 74  if( res!=0 ) ret
16d60 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
16d70 50 54 5f 42 4b 50 54 3b 0a 23 69 66 64 65 66 20  PT_BKPT;.#ifdef 
16d80 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71  SQLITE_TEST.  sq
16d90 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
16da0 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70  nt++;.#endif.  p
16db0 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
16dc0 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65   = 0;.  p->cache
16dd0 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
16de0 54 41 4c 45 3b 0a 20 20 72 65 74 75 72 6e 20 53  TALE;.  return S
16df0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
16e00 2a 2a 20 53 6f 6d 65 74 68 69 6e 67 20 68 61 73  ** Something has
16e10 20 6d 6f 76 65 64 20 63 75 72 73 6f 72 20 22 70   moved cursor "p
16e20 22 20 6f 75 74 20 6f 66 20 70 6c 61 63 65 2e 20  " out of place. 
16e30 20 4d 61 79 62 65 20 74 68 65 20 72 6f 77 20 69   Maybe the row i
16e40 74 20 77 61 73 0a 2a 2a 20 70 6f 69 6e 74 65 64  t was.** pointed
16e50 20 74 6f 20 77 61 73 20 64 65 6c 65 74 65 64 20   to was deleted 
16e60 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 69  out from under i
16e70 74 2e 20 20 4f 72 20 6d 61 79 62 65 20 74 68 65  t.  Or maybe the
16e80 20 62 74 72 65 65 20 77 61 73 0a 2a 2a 20 72 65   btree was.** re
16e90 62 61 6c 61 6e 63 65 64 2e 20 20 57 68 61 74 65  balanced.  Whate
16ea0 76 65 72 20 74 68 65 20 63 61 75 73 65 2c 20 74  ver the cause, t
16eb0 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20 22 70  ry to restore "p
16ec0 22 20 74 6f 20 74 68 65 20 70 6c 61 63 65 20 69  " to the place i
16ed0 74 0a 2a 2a 20 69 73 20 73 75 70 70 6f 73 65 64  t.** is supposed
16ee0 20 74 6f 20 62 65 20 70 6f 69 6e 74 69 6e 67 2e   to be pointing.
16ef0 20 20 49 66 20 74 68 65 20 72 6f 77 20 77 61 73    If the row was
16f00 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
16f10 6d 20 75 6e 64 65 72 20 74 68 65 0a 2a 2a 20 63  m under the.** c
16f20 75 72 73 6f 72 2c 20 73 65 74 20 74 68 65 20 63  ursor, set the c
16f30 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74  ursor to point t
16f40 6f 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f  o a NULL row..*/
16f50 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
16f60 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64  TE_NOINLINE hand
16f70 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 56 64  leMovedCursor(Vd
16f80 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  beCursor *p){.  
16f90 69 6e 74 20 69 73 44 69 66 66 65 72 65 6e 74 52  int isDifferentR
16fa0 6f 77 2c 20 72 63 3b 0a 20 20 61 73 73 65 72 74  ow, rc;.  assert
16fb0 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43  ( p->eCurType==C
16fc0 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
16fd0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 75 63 2e    assert( p->uc.
16fe0 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20  pCursor!=0 );.  
16ff0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
17000 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76  treeCursorHasMov
17010 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72  ed(p->uc.pCursor
17020 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
17030 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
17040 73 74 6f 72 65 28 70 2d 3e 75 63 2e 70 43 75 72  store(p->uc.pCur
17050 73 6f 72 2c 20 26 69 73 44 69 66 66 65 72 65 6e  sor, &isDifferen
17060 74 52 6f 77 29 3b 0a 20 20 70 2d 3e 63 61 63 68  tRow);.  p->cach
17070 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
17080 53 54 41 4c 45 3b 0a 20 20 69 66 28 20 69 73 44  STALE;.  if( isD
17090 69 66 66 65 72 65 6e 74 52 6f 77 20 29 20 70 2d  ifferentRow ) p-
170a0 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20  >nullRow = 1;.  
170b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
170c0 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 65 6e 73  .** Check to ens
170d0 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
170e0 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 52  sor is valid.  R
170f0 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
17100 72 0a 2a 2a 20 69 66 20 6e 65 65 64 20 62 65 2e  r.** if need be.
17110 20 20 52 65 74 75 72 6e 20 61 6e 79 20 49 2f 4f    Return any I/O
17120 20 65 72 72 6f 72 20 66 72 6f 6d 20 74 68 65 20   error from the 
17130 72 65 73 74 6f 72 65 20 6f 70 65 72 61 74 69 6f  restore operatio
17140 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
17150 33 56 64 62 65 43 75 72 73 6f 72 52 65 73 74 6f  3VdbeCursorResto
17160 72 65 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70  re(VdbeCursor *p
17170 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
17180 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
17190 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 69 66 28  E_BTREE );.  if(
171a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
171b0 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75  sorHasMoved(p->u
171c0 63 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20  c.pCursor) ){.  
171d0 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d    return handleM
171e0 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20  ovedCursor(p);. 
171f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
17200 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
17210 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 75  Make sure the cu
17220 72 73 6f 72 20 70 20 69 73 20 72 65 61 64 79 20  rsor p is ready 
17230 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
17240 20 74 68 65 20 72 6f 77 20 74 6f 20 77 68 69 63   the row to whic
17250 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74  h it.** was last
17260 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52 65   positioned.  Re
17270 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
17280 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75  de if an OOM fau
17290 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a  lt or I/O error.
172a0 2a 2a 20 70 72 65 76 65 6e 74 73 20 75 73 20 66  ** prevents us f
172b0 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20  rom positioning 
172c0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74  the cursor to it
172d0 73 20 63 6f 72 72 65 63 74 20 70 6f 73 69 74 69  s correct positi
172e0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d  on..**.** If a M
172f0 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20  oveTo operation 
17300 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68  is pending on th
17310 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20  e given cursor, 
17320 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20  then do that.** 
17330 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20  MoveTo now.  If 
17340 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e 64 69  no move is pendi
17350 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65  ng, check to see
17360 20 69 66 20 74 68 65 20 72 6f 77 20 68 61 73 20   if the row has 
17370 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20  been.** deleted 
17380 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
17390 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 69 66  he cursor and if
173a0 20 69 74 20 68 61 73 2c 20 6d 61 72 6b 20 74 68   it has, mark th
173b0 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55  e row as.** a NU
173c0 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66  LL row..**.** If
173d0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
173e0 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
173f0 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 72  to the correct r
17400 6f 77 20 61 6e 64 20 74 68 61 74 20 72 6f 77 20  ow and that row 
17410 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20  has.** not been 
17420 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
17430 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f   under the curso
17440 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  r, then this rou
17450 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
17460 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
17470 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28  dbeCursorMoveto(
17480 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 70 70 2c  VdbeCursor **pp,
17490 20 69 6e 74 20 2a 70 69 43 6f 6c 29 7b 0a 20 20   int *piCol){.  
174a0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 20 3d 20  VdbeCursor *p = 
174b0 2a 70 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 43  *pp;.  if( p->eC
174c0 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
174d0 42 54 52 45 45 20 29 7b 0a 20 20 20 20 69 66 28  BTREE ){.    if(
174e0 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65   p->deferredMove
174f0 74 6f 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  to ){.      int 
17500 69 4d 61 70 3b 0a 20 20 20 20 20 20 69 66 28 20  iMap;.      if( 
17510 70 2d 3e 61 41 6c 74 4d 61 70 20 26 26 20 28 69  p->aAltMap && (i
17520 4d 61 70 20 3d 20 70 2d 3e 61 41 6c 74 4d 61 70  Map = p->aAltMap
17530 5b 31 2b 2a 70 69 43 6f 6c 5d 29 3e 30 20 29 7b  [1+*piCol])>0 ){
17540 0a 20 20 20 20 20 20 20 20 2a 70 70 20 3d 20 70  .        *pp = p
17550 2d 3e 70 41 6c 74 43 75 72 73 6f 72 3b 0a 20 20  ->pAltCursor;.  
17560 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69        *piCol = i
17570 4d 61 70 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  Map - 1;.       
17580 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17590 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
175a0 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 44 65   return handleDe
175b0 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 70 29 3b  ferredMoveto(p);
175c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
175d0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
175e0 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e  rHasMoved(p->uc.
175f0 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20  pCursor) ){.    
17600 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d    return handleM
17610 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20  ovedCursor(p);. 
17620 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
17630 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
17640 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
17650 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a  ing functions:.*
17660 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  *.** sqlite3Vdbe
17670 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20  SerialType().** 
17680 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
17690 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71  lTypeLen().** sq
176a0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c  lite3VdbeSerialL
176b0 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  en().** sqlite3V
176c0 64 62 65 53 65 72 69 61 6c 50 75 74 28 29 0a 2a  dbeSerialPut().*
176d0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
176e0 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65  ialGet().**.** e
176f0 6e 63 61 70 73 75 6c 61 74 65 20 74 68 65 20 63  ncapsulate the c
17700 6f 64 65 20 74 68 61 74 20 73 65 72 69 61 6c 69  ode that seriali
17710 7a 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73  zes values for s
17720 74 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65  torage in SQLite
17730 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64  .** data and ind
17740 65 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68  ex records. Each
17750 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75   serialized valu
17760 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a  e consists of a.
17770 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27  ** 'serial-type'
17780 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64   and a blob of d
17790 61 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20  ata. The serial 
177a0 74 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74  type is an 8-byt
177b0 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e  e unsigned.** in
177c0 74 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73  teger, stored as
177d0 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a   a varint..**.**
177e0 20 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e   In an SQLite in
177f0 64 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20  dex record, the 
17800 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 73  serial type is s
17810 74 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20 62  tored directly b
17820 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f  efore.** the blo
17830 62 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69  b of data that i
17840 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
17850 2e 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63  . In a table rec
17860 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a  ord, all serial.
17870 2a 2a 20 74 79 70 65 73 20 61 72 65 20 73 74 6f  ** types are sto
17880 72 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74  red at the start
17890 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20   of the record, 
178a0 61 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66  and the blobs of
178b0 20 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20   data at.** the 
178c0 65 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65  end. Hence these
178d0 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77   functions allow
178e0 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68   the caller to h
178f0 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72  andle the.** ser
17900 69 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74  ial-type and dat
17910 61 20 62 6c 6f 62 20 73 65 70 61 72 61 74 65 6c  a blob separatel
17920 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  y..**.** The fol
17930 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73  lowing table des
17940 63 72 69 62 65 73 20 74 68 65 20 76 61 72 69 6f  cribes the vario
17950 75 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73  us storage class
17960 65 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a  es for data:.**.
17970 2a 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70 65  **   serial type
17980 20 20 20 20 20 20 20 20 62 79 74 65 73 20 6f 66          bytes of
17990 20 64 61 74 61 20 20 20 20 20 20 74 79 70 65 0a   data      type.
179a0 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
179b0 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ---     --------
179c0 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d  -------    -----
179d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
179e0 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
179f0 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
17a00 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20        NULL.**   
17a10 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
17a20 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20           1      
17a30 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
17a40 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20  eger.**      2  
17a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a60 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
17a70 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
17a80 2a 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20  *      3        
17a90 20 20 20 20 20 20 20 20 20 20 20 20 20 33 20 20               3  
17aa0 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
17ab0 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
17ac0 20 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20   4              
17ad0 20 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20         4        
17ae0 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
17af0 65 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20  er.**      5    
17b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b10 20 36 20 20 20 20 20 20 20 20 20 20 20 20 73 69   6            si
17b20 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
17b30 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20       6          
17b40 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20             8    
17b50 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
17b60 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37  nteger.**      7
17b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b80 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20       8          
17b90 20 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20    IEEE float.** 
17ba0 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20       8          
17bb0 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
17bc0 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20          Integer 
17bd0 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20  constant 0.**   
17be0 20 20 20 39 20 20 20 20 20 20 20 20 20 20 20 20     9            
17bf0 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
17c00 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f        Integer co
17c10 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20  nstant 1.**     
17c20 31 30 2c 31 31 20 20 20 20 20 20 20 20 20 20 20  10,11           
17c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c40 20 20 20 20 72 65 73 65 72 76 65 64 20 66 6f 72      reserved for
17c50 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20   expansion.**   
17c60 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20   N>=12 and even 
17c70 20 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20        (N-12)/2  
17c80 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20        BLOB.**   
17c90 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20   N>=13 and odd  
17ca0 20 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20        (N-13)/2  
17cb0 20 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a        text.**.**
17cc0 20 54 68 65 20 38 20 61 6e 64 20 39 20 74 79 70   The 8 and 9 typ
17cd0 65 73 20 77 65 72 65 20 61 64 64 65 64 20 69 6e  es were added in
17ce0 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72   3.3.0, file for
17cf0 6d 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65  mat 4.  Prior ve
17d00 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c  rsions.** of SQL
17d10 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64  ite will not und
17d20 65 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65  erstand those se
17d30 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a  rial types..*/..
17d40 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
17d50 20 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72   serial-type for
17d60 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   the value store
17d70 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33  d in pMem..*/.u3
17d80 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
17d90 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65  ialType(Mem *pMe
17da0 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d  m, int file_form
17db0 61 74 2c 20 75 33 32 20 2a 70 4c 65 6e 29 7b 0a  at, u32 *pLen){.
17dc0 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d    int flags = pM
17dd0 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 75 33 32  em->flags;.  u32
17de0 20 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   n;..  assert( p
17df0 4c 65 6e 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Len!=0 );.  if( 
17e00 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29  flags&MEM_Null )
17e10 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b  {.    *pLen = 0;
17e20 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
17e30 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d   }.  if( flags&M
17e40 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a  EM_Int ){.    /*
17e50 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74   Figure out whet
17e60 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c  her to use 1, 2,
17e70 20 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73   4, 6 or 8 bytes
17e80 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20  . */.#   define 
17e90 4d 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 36  MAX_6BYTE ((((i6
17ea0 34 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33  4)0x00008000)<<3
17eb0 32 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20  2)-1).    i64 i 
17ec0 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  = pMem->u.i;.   
17ed0 20 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20   u64 u;.    if( 
17ee0 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 75 20 3d  i<0 ){.      u =
17ef0 20 7e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   ~i;.    }else{.
17f00 20 20 20 20 20 20 75 20 3d 20 69 3b 0a 20 20 20        u = i;.   
17f10 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32   }.    if( u<=12
17f20 37 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  7 ){.      if( (
17f30 69 26 31 29 3d 3d 69 20 26 26 20 66 69 6c 65 5f  i&1)==i && file_
17f40 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20  format>=4 ){.   
17f50 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a       *pLen = 0;.
17f60 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 38          return 8
17f70 2b 28 75 33 32 29 75 3b 0a 20 20 20 20 20 20 7d  +(u32)u;.      }
17f80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70  else{.        *p
17f90 4c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Len = 1;.       
17fa0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
17fb0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
17fc0 20 75 3c 3d 33 32 37 36 37 20 29 7b 20 2a 70 4c   u<=32767 ){ *pL
17fd0 65 6e 20 3d 20 32 3b 20 72 65 74 75 72 6e 20 32  en = 2; return 2
17fe0 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 38  ; }.    if( u<=8
17ff0 33 38 38 36 30 37 20 29 7b 20 2a 70 4c 65 6e 20  388607 ){ *pLen 
18000 3d 20 33 3b 20 72 65 74 75 72 6e 20 33 3b 20 7d  = 3; return 3; }
18010 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37  .    if( u<=2147
18020 34 38 33 36 34 37 20 29 7b 20 2a 70 4c 65 6e 20  483647 ){ *pLen 
18030 3d 20 34 3b 20 72 65 74 75 72 6e 20 34 3b 20 7d  = 4; return 4; }
18040 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f  .    if( u<=MAX_
18050 36 42 59 54 45 20 29 7b 20 2a 70 4c 65 6e 20 3d  6BYTE ){ *pLen =
18060 20 36 3b 20 72 65 74 75 72 6e 20 35 3b 20 7d 0a   6; return 5; }.
18070 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20      *pLen = 8;. 
18080 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d     return 6;.  }
18090 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
180a0 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 2a 70 4c  _Real ){.    *pL
180b0 65 6e 20 3d 20 38 3b 0a 20 20 20 20 72 65 74 75  en = 8;.    retu
180c0 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 7;.  }.  asse
180d0 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61  rt( pMem->db->ma
180e0 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c  llocFailed || fl
180f0 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  ags&(MEM_Str|MEM
18100 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 61 73 73 65  _Blob) );.  asse
18110 72 74 28 20 70 4d 65 6d 2d 3e 6e 3e 3d 30 20 29  rt( pMem->n>=0 )
18120 3b 0a 20 20 6e 20 3d 20 28 75 33 32 29 70 4d 65  ;.  n = (u32)pMe
18130 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67  m->n;.  if( flag
18140 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  s & MEM_Zero ){.
18150 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75      n += pMem->u
18160 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 2a 70  .nZero;.  }.  *p
18170 4c 65 6e 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72  Len = n;.  retur
18180 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20  n ((n*2) + 12 + 
18190 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29  ((flags&MEM_Str)
181a0 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  !=0));.}../*.** 
181b0 54 68 65 20 73 69 7a 65 73 20 66 6f 72 20 73 65  The sizes for se
181c0 72 69 61 6c 20 74 79 70 65 73 20 6c 65 73 73 20  rial types less 
181d0 74 68 61 6e 20 31 32 38 0a 2a 2f 0a 73 74 61 74  than 128.*/.stat
181e0 69 63 20 63 6f 6e 73 74 20 75 38 20 73 71 6c 69  ic const u8 sqli
181f0 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65  te3SmallTypeSize
18200 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  s[] = {.        
18210 2f 2a 20 20 30 20 20 20 31 20 20 20 32 20 20 20  /*  0   1   2   
18220 33 20 20 20 34 20 20 20 35 20 20 20 36 20 20 20  3   4   5   6   
18230 37 20 20 20 38 20 20 20 39 20 2a 2f 20 20 20 0a  7   8   9 */   .
18240 2f 2a 20 20 20 30 20 2a 2f 20 20 20 30 2c 20 20  /*   0 */   0,  
18250 31 2c 20 20 32 2c 20 20 33 2c 20 20 34 2c 20 20  1,  2,  3,  4,  
18260 36 2c 20 20 38 2c 20 20 38 2c 20 20 30 2c 20 20  6,  8,  8,  0,  
18270 30 2c 0a 2f 2a 20 20 31 30 20 2a 2f 20 20 20 30  0,./*  10 */   0
18280 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 31  ,  0,  0,  0,  1
18290 2c 20 20 31 2c 20 20 32 2c 20 20 32 2c 20 20 33  ,  1,  2,  2,  3
182a0 2c 20 20 33 2c 0a 2f 2a 20 20 32 30 20 2a 2f 20  ,  3,./*  20 */ 
182b0 20 20 34 2c 20 20 34 2c 20 20 35 2c 20 20 35 2c    4,  4,  5,  5,
182c0 20 20 36 2c 20 20 36 2c 20 20 37 2c 20 20 37 2c    6,  6,  7,  7,
182d0 20 20 38 2c 20 20 38 2c 0a 2f 2a 20 20 33 30 20    8,  8,./*  30 
182e0 2a 2f 20 20 20 39 2c 20 20 39 2c 20 31 30 2c 20  */   9,  9, 10, 
182f0 31 30 2c 20 31 31 2c 20 31 31 2c 20 31 32 2c 20  10, 11, 11, 12, 
18300 31 32 2c 20 31 33 2c 20 31 33 2c 0a 2f 2a 20 20  12, 13, 13,./*  
18310 34 30 20 2a 2f 20 20 31 34 2c 20 31 34 2c 20 31  40 */  14, 14, 1
18320 35 2c 20 31 35 2c 20 31 36 2c 20 31 36 2c 20 31  5, 15, 16, 16, 1
18330 37 2c 20 31 37 2c 20 31 38 2c 20 31 38 2c 0a 2f  7, 17, 18, 18,./
18340 2a 20 20 35 30 20 2a 2f 20 20 31 39 2c 20 31 39  *  50 */  19, 19
18350 2c 20 32 30 2c 20 32 30 2c 20 32 31 2c 20 32 31  , 20, 20, 21, 21
18360 2c 20 32 32 2c 20 32 32 2c 20 32 33 2c 20 32 33  , 22, 22, 23, 23
18370 2c 0a 2f 2a 20 20 36 30 20 2a 2f 20 20 32 34 2c  ,./*  60 */  24,
18380 20 32 34 2c 20 32 35 2c 20 32 35 2c 20 32 36 2c   24, 25, 25, 26,
18390 20 32 36 2c 20 32 37 2c 20 32 37 2c 20 32 38 2c   26, 27, 27, 28,
183a0 20 32 38 2c 0a 2f 2a 20 20 37 30 20 2a 2f 20 20   28,./*  70 */  
183b0 32 39 2c 20 32 39 2c 20 33 30 2c 20 33 30 2c 20  29, 29, 30, 30, 
183c0 33 31 2c 20 33 31 2c 20 33 32 2c 20 33 32 2c 20  31, 31, 32, 32, 
183d0 33 33 2c 20 33 33 2c 0a 2f 2a 20 20 38 30 20 2a  33, 33,./*  80 *
183e0 2f 20 20 33 34 2c 20 33 34 2c 20 33 35 2c 20 33  /  34, 34, 35, 3
183f0 35 2c 20 33 36 2c 20 33 36 2c 20 33 37 2c 20 33  5, 36, 36, 37, 3
18400 37 2c 20 33 38 2c 20 33 38 2c 0a 2f 2a 20 20 39  7, 38, 38,./*  9
18410 30 20 2a 2f 20 20 33 39 2c 20 33 39 2c 20 34 30  0 */  39, 39, 40
18420 2c 20 34 30 2c 20 34 31 2c 20 34 31 2c 20 34 32  , 40, 41, 41, 42
18430 2c 20 34 32 2c 20 34 33 2c 20 34 33 2c 0a 2f 2a  , 42, 43, 43,./*
18440 20 31 30 30 20 2a 2f 20 20 34 34 2c 20 34 34 2c   100 */  44, 44,
18450 20 34 35 2c 20 34 35 2c 20 34 36 2c 20 34 36 2c   45, 45, 46, 46,
18460 20 34 37 2c 20 34 37 2c 20 34 38 2c 20 34 38 2c   47, 47, 48, 48,
18470 0a 2f 2a 20 31 31 30 20 2a 2f 20 20 34 39 2c 20  ./* 110 */  49, 
18480 34 39 2c 20 35 30 2c 20 35 30 2c 20 35 31 2c 20  49, 50, 50, 51, 
18490 35 31 2c 20 35 32 2c 20 35 32 2c 20 35 33 2c 20  51, 52, 52, 53, 
184a0 35 33 2c 0a 2f 2a 20 31 32 30 20 2a 2f 20 20 35  53,./* 120 */  5
184b0 34 2c 20 35 34 2c 20 35 35 2c 20 35 35 2c 20 35  4, 54, 55, 55, 5
184c0 36 2c 20 35 36 2c 20 35 37 2c 20 35 37 0a 7d 3b  6, 56, 57, 57.};
184d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
184e0 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
184f0 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64   data correspond
18500 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c  ing to the suppl
18510 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e  ied serial-type.
18520 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56  .*/.u32 sqlite3V
18530 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
18540 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65  (u32 serial_type
18550 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  ){.  if( serial_
18560 74 79 70 65 3e 3d 31 32 38 20 29 7b 0a 20 20 20  type>=128 ){.   
18570 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f   return (serial_
18580 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65  type-12)/2;.  }e
18590 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
185a0 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20   serial_type<12 
185b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
185c0 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65  sqlite3SmallType
185d0 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70  Sizes[serial_typ
185e0 65 5d 3d 3d 28 73 65 72 69 61 6c 5f 74 79 70 65  e]==(serial_type
185f0 20 2d 20 31 32 29 2f 32 20 29 3b 0a 20 20 20 20   - 12)/2 );.    
18600 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 6d  return sqlite3Sm
18610 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72  allTypeSizes[ser
18620 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d  ial_type];.  }.}
18630 0a 75 38 20 73 71 6c 69 74 65 33 56 64 62 65 4f  .u8 sqlite3VdbeO
18640 6e 65 42 79 74 65 53 65 72 69 61 6c 54 79 70 65  neByteSerialType
18650 4c 65 6e 28 75 38 20 73 65 72 69 61 6c 5f 74 79  Len(u8 serial_ty
18660 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  pe){.  assert( s
18670 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 38 20 29  erial_type<128 )
18680 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
18690 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73  e3SmallTypeSizes
186a0 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 20 20  [serial_type];  
186b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20  .}../*.** If we 
186c0 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74  are on an archit
186d0 65 63 74 75 72 65 20 77 69 74 68 20 6d 69 78 65  ecture with mixe
186e0 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e  d-endian floatin
186f0 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78  g .** points (ex
18700 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61  : ARM7) then swa
18710 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79  p the lower 4 by
18720 74 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a  tes with the .**
18730 20 75 70 70 65 72 20 34 20 62 79 74 65 73 2e 20   upper 4 bytes. 
18740 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
18750 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f  lt..**.** For mo
18760 73 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73  st architectures
18770 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
18780 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29  p..**.** (later)
18790 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72 74 65  :  It is reporte
187a0 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65  d to me that the
187b0 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72   mixed-endian pr
187c0 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37  oblem.** on ARM7
187d0 20 69 73 20 61 6e 20 69 73 73 75 65 20 77 69 74   is an issue wit
187e0 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20  h GCC, not with 
187f0 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20  the ARM7 chip.  
18800 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74  It seems.** that
18810 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20   early versions 
18820 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20 74 68  of GCC stored th
18830 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61  e two words of a
18840 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74   64-bit.** float
18850 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72   in the wrong or
18860 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65  der.  And that e
18870 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72  rror has been pr
18880 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72  opagated.** ever
18890 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61   since.  The bla
188a0 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  me is not necess
188b0 61 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20  arily with GCC, 
188c0 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d  though..** GCC m
188d0 69 67 68 74 20 68 61 76 65 20 6a 75 73 74 20 63  ight have just c
188e0 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c  opying the probl
188f0 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20  em from a prior 
18900 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61  compiler..** I a
18910 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74  m also told that
18920 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
18930 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c  of GCC that foll
18940 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a  ow a different.*
18950 2a 20 41 42 49 20 67 65 74 20 74 68 65 20 62 79  * ABI get the by
18960 74 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a  te order right..
18970 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73  **.** Developers
18980 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e   using SQLite on
18990 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20   an ARM7 should 
189a0 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20  compile and run 
189b0 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61  their.** applica
189c0 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c  tion using -DSQL
189d0 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c  ITE_DEBUG=1 at l
189e0 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68  east once.  With
189f0 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65   DEBUG.** enable
18a00 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20  d, some asserts 
18a10 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72  below will ensur
18a20 65 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20  e that the byte 
18a30 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61  order of.** floa
18a40 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
18a50 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a  s is correct..**
18a60 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29  .** (2007-08-30)
18a70 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74    Frank van Vugt
18a80 20 68 61 73 20 73 74 75 64 69 65 64 20 74 68 69   has studied thi
18a90 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c  s problem closel
18aa0 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e  y.** and has sen
18ab0 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74  d his findings t
18ac0 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64 65 76  o the SQLite dev
18ad0 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a  elopers.  Frank.
18ae0 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74 20 73  ** writes that s
18af0 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c  ome Linux kernel
18b00 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67  s offer floating
18b10 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a   point hardware.
18b20 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61  ** emulation tha
18b30 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62  t uses only 32-b
18b40 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73  it mantissas ins
18b50 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a  tead of a full .
18b60 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72 65  ** 48-bits as re
18b70 71 75 69 72 65 64 20 62 79 20 74 68 65 20 49 45  quired by the IE
18b80 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54  EE standard.  (T
18b90 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f  his is the.** CO
18ba0 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45  NFIG_FPE_FASTFPE
18bb0 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75   option.)  On su
18bc0 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61  ch systems, floa
18bd0 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79  ting point.** by
18be0 74 65 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f  te swapping beco
18bf0 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63  mes very complic
18c00 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20  ated.  To avoid 
18c10 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65  problems,.** the
18c20 20 6e 65 63 65 73 73 61 72 79 20 62 79 74 65 20   necessary byte 
18c30 73 77 61 70 70 69 6e 67 20 69 73 20 63 61 72 72  swapping is carr
18c40 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20  ied out using a 
18c50 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a  64-bit integer.*
18c60 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20  * rather than a 
18c70 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46  64-bit float.  F
18c80 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20  rank assures us 
18c90 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 68 65  that the code he
18ca0 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20  re.** works for 
18cb0 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65  him.  We, the de
18cc0 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e  velopers, have n
18cd0 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e  o way to indepen
18ce0 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79  dently.** verify
18cf0 20 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b   this, but Frank
18d00 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77   seems to know w
18d10 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e  hat he is talkin
18d20 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65  g about.** so we
18d30 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23   trust him..*/.#
18d40 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58  ifdef SQLITE_MIX
18d50 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f  ED_ENDIAN_64BIT_
18d60 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34  FLOAT.static u64
18d70 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69   floatSwap(u64 i
18d80 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20  n){.  union {.  
18d90 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32    u64 r;.    u32
18da0 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20   i[2];.  } u;.  
18db0 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20  u32 t;..  u.r = 
18dc0 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d  in;.  t = u.i[0]
18dd0 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69  ;.  u.i[0] = u.i
18de0 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20  [1];.  u.i[1] = 
18df0 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b  t;.  return u.r;
18e00 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70  .}.# define swap
18e10 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
18e20 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77  (X)  X = floatSw
18e30 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65  ap(X).#else.# de
18e40 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e  fine swapMixedEn
18e50 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e  dianFloat(X).#en
18e60 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  dif../*.** Write
18e70 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20   the serialized 
18e80 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68  data blob for th
18e90 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
18ea0 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20  n pMem into .** 
18eb0 62 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d  buf. It is assum
18ec0 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ed that the call
18ed0 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64  er has allocated
18ee0 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
18ef0 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  e..** Return the
18f00 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
18f10 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20   written..**.** 
18f20 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75  nBuf is the amou
18f30 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74  nt of space left
18f40 20 69 6e 20 62 75 66 5b 5d 2e 20 20 54 68 65 20   in buf[].  The 
18f50 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e  caller is respon
18f60 73 69 62 6c 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c  sible.** for all
18f70 6f 63 61 74 69 6e 67 20 65 6e 6f 75 67 68 20 73  ocating enough s
18f80 70 61 63 65 20 74 6f 20 62 75 66 5b 5d 20 74 6f  pace to buf[] to
18f90 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65   hold the entire
18fa0 20 66 69 65 6c 64 2c 20 65 78 63 6c 75 73 69 76   field, exclusiv
18fb0 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 4d 65 6d  e.** of the pMem
18fc0 2d 3e 75 2e 6e 5a 65 72 6f 20 62 79 74 65 73 20  ->u.nZero bytes 
18fd0 66 6f 72 20 61 20 4d 45 4d 5f 5a 65 72 6f 20 76  for a MEM_Zero v
18fe0 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  alue..**.** Retu
18ff0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
19000 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
19010 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66  written into buf
19020 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a  [].  The number.
19030 2a 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  ** of bytes in t
19040 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74  he zero-filled t
19050 61 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20  ail is included 
19060 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  in the return va
19070 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74  lue only.** if t
19080 68 6f 73 65 20 62 79 74 65 73 20 77 65 72 65 20  hose bytes were 
19090 7a 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e  zeroed in buf[].
190a0 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33  .*/ .u32 sqlite3
190b0 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 75 38  VdbeSerialPut(u8
190c0 20 2a 62 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d   *buf, Mem *pMem
190d0 2c 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70  , u32 serial_typ
190e0 65 29 7b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a  e){.  u32 len;..
190f0 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64    /* Integer and
19100 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73   Real */.  if( s
19110 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26  erial_type<=7 &&
19120 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20 29   serial_type>0 )
19130 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20  {.    u64 v;.   
19140 20 75 33 32 20 69 3b 0a 20 20 20 20 69 66 28 20   u32 i;.    if( 
19150 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29  serial_type==7 )
19160 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
19170 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f  sizeof(v)==sizeo
19180 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 29 3b 0a  f(pMem->u.r) );.
19190 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 2c        memcpy(&v,
191a0 20 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 73 69 7a   &pMem->u.r, siz
191b0 65 6f 66 28 76 29 29 3b 0a 20 20 20 20 20 20 73  eof(v));.      s
191c0 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
191d0 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73  oat(v);.    }els
191e0 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 4d 65  e{.      v = pMe
191f0 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20  m->u.i;.    }.  
19200 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69    len = i = sqli
19210 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65  te3SmallTypeSize
19220 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a  s[serial_type];.
19230 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20      assert( i>0 
19240 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  );.    do{.     
19250 20 62 75 66 5b 2d 2d 69 5d 20 3d 20 28 75 38 29   buf[--i] = (u8)
19260 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20  (v&0xFF);.      
19270 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 77 68  v >>= 8;.    }wh
19280 69 6c 65 28 20 69 20 29 3b 0a 20 20 20 20 72 65  ile( i );.    re
19290 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20  turn len;.  }.. 
192a0 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c   /* String or bl
192b0 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69  ob */.  if( seri
192c0 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20  al_type>=12 ){. 
192d0 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
192e0 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61  >n + ((pMem->fla
192f0 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70  gs & MEM_Zero)?p
19300 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a  Mem->u.nZero:0).
19310 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
19320 28 69 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65  (int)sqlite3Vdbe
19330 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
19340 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20  rial_type) );.  
19350 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b    len = pMem->n;
19360 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e 30 20 29  .    if( len>0 )
19370 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65   memcpy(buf, pMe
19380 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  m->z, len);.    
19390 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a  return len;.  }.
193a0 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f  .  /* NULL or co
193b0 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a  nstants 0 or 1 *
193c0 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  /.  return 0;.}.
193d0 0a 2f 2a 20 49 6e 70 75 74 20 22 78 22 20 69 73  ./* Input "x" is
193e0 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 75   a sequence of u
193f0 6e 73 69 67 6e 65 64 20 63 68 61 72 61 63 74 65  nsigned characte
19400 72 73 20 74 68 61 74 20 72 65 70 72 65 73 65 6e  rs that represen
19410 74 20 61 0a 2a 2a 20 62 69 67 2d 65 6e 64 69 61  t a.** big-endia
19420 6e 20 69 6e 74 65 67 65 72 2e 20 20 52 65 74 75  n integer.  Retu
19430 72 6e 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  rn the equivalen
19440 74 20 6e 61 74 69 76 65 20 69 6e 74 65 67 65 72  t native integer
19450 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 4e 45 5f  .*/.#define ONE_
19460 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28  BYTE_INT(x)    (
19470 28 69 38 29 28 78 29 5b 30 5d 29 0a 23 64 65 66  (i8)(x)[0]).#def
19480 69 6e 65 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54  ine TWO_BYTE_INT
19490 28 78 29 20 20 20 20 28 32 35 36 2a 28 69 38 29  (x)    (256*(i8)
194a0 28 28 78 29 5b 30 5d 29 7c 28 78 29 5b 31 5d 29  ((x)[0])|(x)[1])
194b0 0a 23 64 65 66 69 6e 65 20 54 48 52 45 45 5f 42  .#define THREE_B
194c0 59 54 45 5f 49 4e 54 28 78 29 20 20 28 36 35 35  YTE_INT(x)  (655
194d0 33 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c  36*(i8)((x)[0])|
194e0 28 28 78 29 5b 31 5d 3c 3c 38 29 7c 28 78 29 5b  ((x)[1]<<8)|(x)[
194f0 32 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52  2]).#define FOUR
19500 5f 42 59 54 45 5f 55 49 4e 54 28 78 29 20 20 28  _BYTE_UINT(x)  (
19510 28 28 75 33 32 29 28 78 29 5b 30 5d 3c 3c 32 34  ((u32)(x)[0]<<24
19520 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28  )|((x)[1]<<16)|(
19530 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33  (x)[2]<<8)|(x)[3
19540 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f  ]).#define FOUR_
19550 42 59 54 45 5f 49 4e 54 28 78 29 20 28 31 36 37  BYTE_INT(x) (167
19560 37 37 32 31 36 2a 28 69 38 29 28 28 78 29 5b 30  77216*(i8)((x)[0
19570 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c  ])|((x)[1]<<16)|
19580 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b  ((x)[2]<<8)|(x)[
19590 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72  3])../*.** Deser
195a0 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20  ialize the data 
195b0 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20  blob pointed to 
195c0 62 79 20 62 75 66 20 61 73 20 73 65 72 69 61 6c  by buf as serial
195d0 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70   type serial_typ
195e0 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74  e.** and store t
195f0 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65  he result in pMe
19600 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  m.  Return the n
19610 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
19620 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ead..**.** This 
19630 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c  function is impl
19640 65 6d 65 6e 74 65 64 20 61 73 20 74 77 6f 20 73  emented as two s
19650 65 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65 73  eparate routines
19660 20 66 6f 72 20 70 65 72 66 6f 72 6d 61 6e 63 65   for performance
19670 2e 0a 2a 2a 20 54 68 65 20 66 65 77 20 63 61 73  ..** The few cas
19680 65 73 20 74 68 61 74 20 72 65 71 75 69 72 65 20  es that require 
19690 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20  local variables 
196a0 61 72 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69  are broken out i
196b0 6e 74 6f 20 61 20 73 65 70 61 72 61 74 65 0a 2a  nto a separate.*
196c0 2a 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61  * routine so tha
196d0 74 20 69 6e 20 6d 6f 73 74 20 63 61 73 65 73 20  t in most cases 
196e0 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20  the overhead of 
196f0 6d 6f 76 69 6e 67 20 74 68 65 20 73 74 61 63 6b  moving the stack
19700 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 69 73 20 61   pointer.** is a
19710 76 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73 74 61 74  voided..*/ .stat
19720 69 63 20 75 33 32 20 53 51 4c 49 54 45 5f 4e 4f  ic u32 SQLITE_NO
19730 49 4e 4c 49 4e 45 20 73 65 72 69 61 6c 47 65 74  INLINE serialGet
19740 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  (.  const unsign
19750 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20  ed char *buf,   
19760 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64    /* Buffer to d
19770 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20  eserialize from 
19780 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f  */.  u32 serial_
19790 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  type,           
197a0 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
197b0 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  e to deserialize
197c0 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20   */.  Mem *pMem 
197d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197e0 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
197f0 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75  ll to write valu
19800 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 75  e into */.){.  u
19810 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45  64 x = FOUR_BYTE
19820 5f 55 49 4e 54 28 62 75 66 29 3b 0a 20 20 75 33  _UINT(buf);.  u3
19830 32 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  2 y = FOUR_BYTE_
19840 55 49 4e 54 28 62 75 66 2b 34 29 3b 0a 20 20 78  UINT(buf+4);.  x
19850 20 3d 20 28 78 3c 3c 33 32 29 20 2b 20 79 3b 0a   = (x<<32) + y;.
19860 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
19870 65 3d 3d 36 20 29 7b 0a 20 20 20 20 2f 2a 20 45  e==6 ){.    /* E
19880 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39  VIDENCE-OF: R-29
19890 38 35 31 2d 35 32 32 37 32 20 56 61 6c 75 65 20  851-52272 Value 
198a0 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20  is a big-endian 
198b0 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 74 77  64-bit.    ** tw
198c0 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
198d0 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 70 4d  teger. */.    pM
198e0 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a  em->u.i = *(i64*
198f0 29 26 78 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66  )&x;.    pMem->f
19900 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
19910 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
19920 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 7d  em->u.i<0 );.  }
19930 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49  else{.    /* EVI
19940 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 37 33 34  DENCE-OF: R-5734
19950 33 2d 34 39 31 31 34 20 56 61 6c 75 65 20 69 73  3-49114 Value is
19960 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 49 45   a big-endian IE
19970 45 45 20 37 35 34 2d 32 30 30 38 20 36 34 2d 62  EE 754-2008 64-b
19980 69 74 0a 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69  it.    ** floati
19990 6e 67 20 70 6f 69 6e 74 20 6e 75 6d 62 65 72 2e  ng point number.
199a0 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
199b0 28 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66  (NDEBUG) && !def
199c0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
199d0 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29  _FLOATING_POINT)
199e0 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74  .    /* Verify t
199f0 68 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64  hat integers and
19a00 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
19a10 76 61 6c 75 65 73 20 75 73 65 20 74 68 65 20 73  values use the s
19a20 61 6d 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 20  ame.    ** byte 
19a30 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74  order.  Or, that
19a40 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44   if SQLITE_MIXED
19a50 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c  _ENDIAN_64BIT_FL
19a60 4f 41 54 20 69 73 0a 20 20 20 20 2a 2a 20 64 65  OAT is.    ** de
19a70 66 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69  fined that 64-bi
19a80 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  t floating point
19a90 20 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61   values really a
19aa0 72 65 20 6d 69 78 65 64 0a 20 20 20 20 2a 2a 20  re mixed.    ** 
19ab0 65 6e 64 69 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20  endian..    */. 
19ac0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
19ad0 75 36 34 20 74 31 20 3d 20 28 28 75 36 34 29 30  u64 t1 = ((u64)0
19ae0 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a  x3ff00000)<<32;.
19af0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
19b00 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30   double r1 = 1.0
19b10 3b 0a 20 20 20 20 75 36 34 20 74 32 20 3d 20 74  ;.    u64 t2 = t
19b20 31 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64  1;.    swapMixed
19b30 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b  EndianFloat(t2);
19b40 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
19b50 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28  eof(r1)==sizeof(
19b60 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72  t2) && memcmp(&r
19b70 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72  1, &t2, sizeof(r
19b80 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66  1))==0 );.#endif
19b90 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
19ba0 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a  eof(x)==8 && siz
19bb0 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 3d 3d  eof(pMem->u.r)==
19bc0 38 20 29 3b 0a 20 20 20 20 73 77 61 70 4d 69 78  8 );.    swapMix
19bd0 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29  edEndianFloat(x)
19be0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d  ;.    memcpy(&pM
19bf0 65 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20 73 69 7a  em->u.r, &x, siz
19c00 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 70 4d 65  eof(x));.    pMe
19c10 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74  m->flags = sqlit
19c20 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 75 2e  e3IsNaN(pMem->u.
19c30 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20  r) ? MEM_Null : 
19c40 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d 0a 20 20  MEM_Real;.  }.  
19c50 72 65 74 75 72 6e 20 38 3b 0a 7d 0a 75 33 32 20  return 8;.}.u32 
19c60 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
19c70 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e  lGet(.  const un
19c80 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
19c90 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20  ,     /* Buffer 
19ca0 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66  to deserialize f
19cb0 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72  rom */.  u32 ser
19cc0 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20  ial_type,       
19cd0 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c         /* Serial
19ce0 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61   type to deseria
19cf0 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  lize */.  Mem *p
19d00 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  Mem             
19d10 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
19d20 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20  y cell to write 
19d30 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b  value into */.){
19d40 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61  .  switch( seria
19d50 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  l_type ){.    ca
19d60 73 65 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65  se 10:   /* Rese
19d70 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
19d80 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  use */.    case 
19d90 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65  11:   /* Reserve
19da0 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65  d for future use
19db0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20   */.    case 0: 
19dc0 7b 20 20 2f 2a 20 4e 75 6c 6c 20 2a 2f 0a 20 20  {  /* Null */.  
19dd0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
19de0 4f 46 3a 20 52 2d 32 34 30 37 38 2d 30 39 33 37  OF: R-24078-0937
19df0 35 20 56 61 6c 75 65 20 69 73 20 61 20 4e 55 4c  5 Value is a NUL
19e00 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  L. */.      pMem
19e10 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
19e20 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ll;.      break;
19e30 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
19e40 31 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  1: {.      /* EV
19e50 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 38  IDENCE-OF: R-448
19e60 38 35 2d 32 35 31 39 36 20 56 61 6c 75 65 20 69  85-25196 Value i
19e70 73 20 61 6e 20 38 2d 62 69 74 20 74 77 6f 73 2d  s an 8-bit twos-
19e80 63 6f 6d 70 6c 65 6d 65 6e 74 0a 20 20 20 20 20  complement.     
19e90 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a   ** integer. */.
19ea0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
19eb0 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 62  = ONE_BYTE_INT(b
19ec0 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  uf);.      pMem-
19ed0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
19ee0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
19ef0 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
19f00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
19f10 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
19f20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73  2: { /* 2-byte s
19f30 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
19f40 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
19f50 43 45 2d 4f 46 3a 20 52 2d 34 39 37 39 34 2d 33  CE-OF: R-49794-3
19f60 35 30 32 36 20 56 61 6c 75 65 20 69 73 20 61 20  5026 Value is a 
19f70 62 69 67 2d 65 6e 64 69 61 6e 20 31 36 2d 62 69  big-endian 16-bi
19f80 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d  t.      ** twos-
19f90 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67  complement integ
19fa0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  er. */.      pMe
19fb0 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f 42 59 54  m->u.i = TWO_BYT
19fc0 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20  E_INT(buf);.    
19fd0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
19fe0 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
19ff0 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
1a000 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
1a010 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
1a020 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33    case 3: { /* 3
1a030 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1a040 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  eger */.      /*
1a050 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1a060 33 37 38 33 39 2d 35 34 33 30 31 20 56 61 6c 75  37839-54301 Valu
1a070 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61  e is a big-endia
1a080 6e 20 32 34 2d 62 69 74 0a 20 20 20 20 20 20 2a  n 24-bit.      *
1a090 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  * twos-complemen
1a0a0 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  t integer. */.  
1a0b0 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
1a0c0 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 62  THREE_BYTE_INT(b
1a0d0 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  uf);.      pMem-
1a0e0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
1a0f0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1a100 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
1a110 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b  .      return 3;
1a120 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1a130 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73  4: { /* 4-byte s
1a140 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
1a150 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
1a160 43 45 2d 4f 46 3a 20 52 2d 30 31 38 34 39 2d 32  CE-OF: R-01849-2
1a170 36 30 37 39 20 56 61 6c 75 65 20 69 73 20 61 20  6079 Value is a 
1a180 62 69 67 2d 65 6e 64 69 61 6e 20 33 32 2d 62 69  big-endian 32-bi
1a190 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d  t.      ** twos-
1a1a0 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67  complement integ
1a1b0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  er. */.      pMe
1a1c0 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59  m->u.i = FOUR_BY
1a1d0 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 23 69 66  TE_INT(buf);.#if
1a1e0 64 65 66 20 5f 5f 48 50 5f 63 63 20 0a 20 20 20  def __HP_cc .   
1a1f0 20 20 20 2f 2a 20 57 6f 72 6b 20 61 72 6f 75 6e     /* Work aroun
1a200 64 20 61 20 73 69 67 6e 2d 65 78 74 65 6e 73 69  d a sign-extensi
1a210 6f 6e 20 62 75 67 20 69 6e 20 74 68 65 20 48 50  on bug in the HP
1a220 20 63 6f 6d 70 69 6c 65 72 20 66 6f 72 20 48 50   compiler for HP
1a230 2f 55 58 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  /UX */.      if(
1a240 20 62 75 66 5b 30 5d 26 30 78 38 30 20 29 20 70   buf[0]&0x80 ) p
1a250 4d 65 6d 2d 3e 75 2e 69 20 7c 3d 20 30 78 66 66  Mem->u.i |= 0xff
1a260 66 66 66 66 66 66 38 30 30 30 30 30 30 30 4c 4c  ffffff80000000LL
1a270 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 70  ;.#endif.      p
1a280 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
1a290 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74  _Int;.      test
1a2a0 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
1a2b0 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1a2c0 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 4;.    }.    c
1a2d0 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79  ase 5: { /* 6-by
1a2e0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1a2f0 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  r */.      /* EV
1a300 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 30 33  IDENCE-OF: R-503
1a310 38 35 2d 30 39 36 37 34 20 56 61 6c 75 65 20 69  85-09674 Value i
1a320 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 34  s a big-endian 4
1a330 38 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74  8-bit.      ** t
1a340 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69  wos-complement i
1a350 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20  nteger. */.     
1a360 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55   pMem->u.i = FOU
1a370 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b  R_BYTE_UINT(buf+
1a380 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c  2) + (((i64)1)<<
1a390 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54  32)*TWO_BYTE_INT
1a3a0 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65  (buf);.      pMe
1a3b0 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
1a3c0 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  nt;.      testca
1a3d0 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20  se( pMem->u.i<0 
1a3e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1a3f0 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  6;.    }.    cas
1a400 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65  e 6:   /* 8-byte
1a410 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
1a420 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b  */.    case 7: {
1a430 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e   /* IEEE floatin
1a440 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20  g point */.     
1a450 20 2f 2a 20 54 68 65 73 65 20 75 73 65 20 6c 6f   /* These use lo
1a460 63 61 6c 20 76 61 72 69 61 62 6c 65 73 2c 20 73  cal variables, s
1a470 6f 20 64 6f 20 74 68 65 6d 20 69 6e 20 61 20 73  o do them in a s
1a480 65 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65 0a  eparate routine.
1a490 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69        ** to avoi
1a4a0 64 20 68 61 76 69 6e 67 20 74 6f 20 6d 6f 76 65  d having to move
1a4b0 20 74 68 65 20 66 72 61 6d 65 20 70 6f 69 6e 74   the frame point
1a4c0 65 72 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  er in the common
1a4d0 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 72   case */.      r
1a4e0 65 74 75 72 6e 20 73 65 72 69 61 6c 47 65 74 28  eturn serialGet(
1a4f0 62 75 66 2c 73 65 72 69 61 6c 5f 74 79 70 65 2c  buf,serial_type,
1a500 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pMem);.    }.   
1a510 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49   case 8:    /* I
1a520 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20  nteger 0 */.    
1a530 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e  case 9: {  /* In
1a540 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20  teger 1 */.     
1a550 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1a560 20 52 2d 31 32 39 37 36 2d 32 32 38 39 33 20 56   R-12976-22893 V
1a570 61 6c 75 65 20 69 73 20 74 68 65 20 69 6e 74 65  alue is the inte
1a580 67 65 72 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20  ger 0. */.      
1a590 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1a5a0 52 2d 31 38 31 34 33 2d 31 32 31 32 31 20 56 61  R-18143-12121 Va
1a5b0 6c 75 65 20 69 73 20 74 68 65 20 69 6e 74 65 67  lue is the integ
1a5c0 65 72 20 31 2e 20 2a 2f 0a 20 20 20 20 20 20 70  er 1. */.      p
1a5d0 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61  Mem->u.i = seria
1a5e0 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20  l_type-8;.      
1a5f0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
1a600 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
1a610 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
1a620 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
1a630 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1a640 3a 20 52 2d 31 34 36 30 36 2d 33 31 35 36 34 20  : R-14606-31564 
1a650 56 61 6c 75 65 20 69 73 20 61 20 42 4c 4f 42 20  Value is a BLOB 
1a660 74 68 61 74 20 69 73 20 28 4e 2d 31 32 29 2f 32  that is (N-12)/2
1a670 20 62 79 74 65 73 20 69 6e 0a 20 20 20 20 20 20   bytes in.      
1a680 2a 2a 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20 20  ** length..     
1a690 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   ** EVIDENCE-OF:
1a6a0 20 52 2d 32 38 34 30 31 2d 30 30 31 34 30 20 56   R-28401-00140 V
1a6b0 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67  alue is a string
1a6c0 20 69 6e 20 74 68 65 20 74 65 78 74 20 65 6e 63   in the text enc
1a6d0 6f 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20  oding and.      
1a6e0 2a 2a 20 28 4e 2d 31 33 29 2f 32 20 62 79 74 65  ** (N-13)/2 byte
1a6f0 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a  s in length. */.
1a700 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
1a710 73 74 20 75 31 36 20 61 46 6c 61 67 5b 5d 20 3d  st u16 aFlag[] =
1a720 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f   { MEM_Blob|MEM_
1a730 45 70 68 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d  Ephem, MEM_Str|M
1a740 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20 20 20 20  EM_Ephem };.    
1a750 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61    pMem->z = (cha
1a760 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70  r *)buf;.      p
1a770 4d 65 6d 2d 3e 6e 20 3d 20 28 73 65 72 69 61 6c  Mem->n = (serial
1a780 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20  _type-12)/2;.   
1a790 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
1a7a0 20 61 46 6c 61 67 5b 73 65 72 69 61 6c 5f 74 79   aFlag[serial_ty
1a7b0 70 65 26 31 5d 3b 0a 20 20 20 20 20 20 72 65 74  pe&1];.      ret
1a7c0 75 72 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20  urn pMem->n;.   
1a7d0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1a7e0 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  0;.}./*.** This 
1a7f0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
1a800 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 75 66 66  to allocate suff
1a810 69 63 69 65 6e 74 20 73 70 61 63 65 20 66 6f 72  icient space for
1a820 20 61 6e 20 55 6e 70 61 63 6b 65 64 52 65 63 6f   an UnpackedReco
1a830 72 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  rd.** structure 
1a840 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
1a850 62 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c  be used with sql
1a860 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
1a870 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65  pack() if.** the
1a880 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1a890 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1a8a0 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
1a8b0 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a  e pKeyInfo..**.*
1a8c0 2a 20 54 68 65 20 73 70 61 63 65 20 69 73 20 65  * The space is e
1a8d0 69 74 68 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  ither allocated 
1a8e0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 4d  using sqlite3DbM
1a8f0 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72 20 66 72  allocRaw() or fr
1a900 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65  om within.** the
1a910 20 75 6e 61 6c 69 67 6e 65 64 20 62 75 66 66 65   unaligned buffe
1a920 72 20 70 61 73 73 65 64 20 76 69 61 20 74 68 65  r passed via the
1a930 20 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72   second and thir
1a940 64 20 61 72 67 75 6d 65 6e 74 73 20 28 70 72 65  d arguments (pre
1a950 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b  sumably.** stack
1a960 20 73 70 61 63 65 29 2e 20 49 66 20 74 68 65 20   space). If the 
1a970 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70  former, then *pp
1a980 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 61  Free is set to a
1a990 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 73 68   pointer that sh
1a9a0 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74  ould.** be event
1a9b0 75 61 6c 6c 79 20 66 72 65 65 64 20 62 79 20 74  ually freed by t
1a9c0 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20  he caller using 
1a9d0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e  sqlite3DbFree().
1a9e0 20 4f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20   Or, if the .** 
1a9f0 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73  allocation comes
1aa00 20 66 72 6f 6d 20 74 68 65 20 70 53 70 61 63 65   from the pSpace
1aa10 2f 73 7a 53 70 61 63 65 20 62 75 66 66 65 72 2c  /szSpace buffer,
1aa20 20 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20   *ppFree is set 
1aa30 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72  to NULL.** befor
1aa40 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
1aa50 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  ** If an OOM err
1aa60 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  or occurs, NULL 
1aa70 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1aa80 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1aa90 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63  sqlite3VdbeAlloc
1aaa0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a  UnpackedRecord(.
1aab0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
1aac0 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
1aad0 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e    /* Description
1aae0 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a   of the record *
1aaf0 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65  /.  char *pSpace
1ab00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ab10 20 20 20 20 2f 2a 20 55 6e 61 6c 69 67 6e 65 64      /* Unaligned
1ab20 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   space available
1ab30 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61 63   */.  int szSpac
1ab40 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1ab50 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1ab60 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62 79 74   pSpace[] in byt
1ab70 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  es */.  char **p
1ab80 70 46 72 65 65 20 20 20 20 20 20 20 20 20 20 20  pFree           
1ab90 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1aba0 43 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 66 72  Caller should fr
1abb0 65 65 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20  ee this pointer 
1abc0 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64  */.){.  Unpacked
1abd0 52 65 63 6f 72 64 20 2a 70 3b 20 20 20 20 20 20  Record *p;      
1abe0 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63          /* Unpac
1abf0 6b 65 64 20 72 65 63 6f 72 64 20 74 6f 20 72 65  ked record to re
1ac00 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  turn */.  int nO
1ac10 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
1ac20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63            /* Inc
1ac30 72 65 6d 65 6e 74 20 70 53 70 61 63 65 20 62 79  rement pSpace by
1ac40 20 6e 4f 66 66 20 74 6f 20 61 6c 69 67 6e 20 69   nOff to align i
1ac50 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  t */.  int nByte
1ac60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ac70 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1ac80 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72   of bytes requir
1ac90 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a 0a 20 20  ed for *p */..  
1aca0 2f 2a 20 57 65 20 77 61 6e 74 20 74 6f 20 73 68  /* We want to sh
1acb0 69 66 74 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ift the pointer 
1acc0 70 53 70 61 63 65 20 75 70 20 73 75 63 68 20 74  pSpace up such t
1acd0 68 61 74 20 69 74 20 69 73 20 38 2d 62 79 74 65  hat it is 8-byte
1ace0 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a 20 54   aligned..  ** T
1acf0 68 75 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  hus, we need to 
1ad00 63 61 6c 63 75 6c 61 74 65 20 61 20 76 61 6c 75  calculate a valu
1ad10 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77 65 65 6e  e, nOff, between
1ad20 20 30 20 61 6e 64 20 37 2c 20 74 6f 20 73 68 69   0 and 7, to shi
1ad30 66 74 20 0a 20 20 2a 2a 20 69 74 20 62 79 2e 20  ft .  ** it by. 
1ad40 20 49 66 20 70 53 70 61 63 65 20 69 73 20 61 6c   If pSpace is al
1ad50 72 65 61 64 79 20 38 2d 62 79 74 65 20 61 6c 69  ready 8-byte ali
1ad60 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68 6f 75 6c  gned, nOff shoul
1ad70 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a  d be zero..  */.
1ad80 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d 20 28 53    nOff = (8 - (S
1ad90 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
1ada0 28 70 53 70 61 63 65 29 20 26 20 37 29 29 20 26  (pSpace) & 7)) &
1adb0 20 37 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f   7;.  nByte = RO
1adc0 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61  UND8(sizeof(Unpa
1add0 63 6b 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73  ckedRecord)) + s
1ade0 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79  izeof(Mem)*(pKey
1adf0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b  Info->nField+1);
1ae00 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 73 7a 53  .  if( nByte>szS
1ae10 70 61 63 65 2b 6e 4f 66 66 20 29 7b 0a 20 20 20  pace+nOff ){.   
1ae20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65   p = (UnpackedRe
1ae30 63 6f 72 64 20 2a 29 73 71 6c 69 74 65 33 44 62  cord *)sqlite3Db
1ae40 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e  MallocRaw(pKeyIn
1ae50 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a  fo->db, nByte);.
1ae60 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20 28 63      *ppFree = (c
1ae70 68 61 72 20 2a 29 70 3b 0a 20 20 20 20 69 66 28  har *)p;.    if(
1ae80 20 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a   !p ) return 0;.
1ae90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d    }else{.    p =
1aea0 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64   (UnpackedRecord
1aeb0 2a 29 26 70 53 70 61 63 65 5b 6e 4f 66 66 5d 3b  *)&pSpace[nOff];
1aec0 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20 30  .    *ppFree = 0
1aed0 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 61 4d 65 6d  ;.  }..  p->aMem
1aee0 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63 68 61 72   = (Mem*)&((char
1aef0 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65  *)p)[ROUND8(size
1af00 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  of(UnpackedRecor
1af10 64 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  d))];.  assert( 
1af20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
1af30 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 70 2d 3e  rder!=0 );.  p->
1af40 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
1af50 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64  nfo;.  p->nField
1af60 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69   = pKeyInfo->nFi
1af70 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65 74 75 72  eld + 1;.  retur
1af80 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  n p;.}../*.** Gi
1af90 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74  ven the nKey-byt
1afa0 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20  e encoding of a 
1afb0 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d  record in pKey[]
1afc0 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 0a  , populate the .
1afd0 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  ** UnpackedRecor
1afe0 64 20 73 74 72 75 63 74 75 72 65 20 69 6e 64 69  d structure indi
1aff0 63 61 74 65 64 20 62 79 20 74 68 65 20 66 6f 75  cated by the fou
1b000 72 74 68 20 61 72 67 75 6d 65 6e 74 20 77 69 74  rth argument wit
1b010 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  h the.** content
1b020 73 20 6f 66 20 74 68 65 20 64 65 63 6f 64 65 64  s of the decoded
1b030 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69   record..*/ .voi
1b040 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  d sqlite3VdbeRec
1b050 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79  ordUnpack(.  Key
1b060 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
1b070 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
1b080 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65 63  on about the rec
1b090 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20  ord format */.  
1b0a0 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20  int nKey,       
1b0b0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1b0c0 66 20 74 68 65 20 62 69 6e 61 72 79 20 72 65 63  f the binary rec
1b0d0 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  ord */.  const v
1b0e0 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20  oid *pKey,      
1b0f0 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72 65  /* The binary re
1b100 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  cord */.  Unpack
1b110 65 64 52 65 63 6f 72 64 20 2a 70 20 20 20 20 20  edRecord *p     
1b120 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69   /* Populate thi
1b130 73 20 73 74 72 75 63 74 75 72 65 20 62 65 66 6f  s structure befo
1b140 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f  re returning. */
1b150 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  .){.  const unsi
1b160 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20  gned char *aKey 
1b170 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
1b180 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20  d char *)pKey;. 
1b190 20 69 6e 74 20 64 3b 20 0a 20 20 75 33 32 20 69   int d; .  u32 i
1b1a0 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
1b1b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
1b1c0 66 73 65 74 20 69 6e 20 61 4b 65 79 5b 5d 20 74  fset in aKey[] t
1b1d0 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
1b1e0 20 75 31 36 20 75 3b 20 20 20 20 20 20 20 20 20   u16 u;         
1b1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b200 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f   /* Unsigned loo
1b210 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
1b220 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20  32 szHdr;.  Mem 
1b230 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b  *pMem = p->aMem;
1b240 0a 0a 20 20 70 2d 3e 64 65 66 61 75 6c 74 5f 72  ..  p->default_r
1b250 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  c = 0;.  assert(
1b260 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
1b270 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20  NMENT(pMem) );. 
1b280 20 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74   idx = getVarint
1b290 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b  32(aKey, szHdr);
1b2a0 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20  .  d = szHdr;.  
1b2b0 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  u = 0;.  while( 
1b2c0 69 64 78 3c 73 7a 48 64 72 20 26 26 20 64 3c 3d  idx<szHdr && d<=
1b2d0 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75 33 32 20  nKey ){.    u32 
1b2e0 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20  serial_type;..  
1b2f0 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69    idx += getVari
1b300 6e 74 33 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c  nt32(&aKey[idx],
1b310 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20   serial_type);. 
1b320 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70     pMem->enc = p
1b330 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20  KeyInfo->enc;.  
1b340 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65    pMem->db = pKe
1b350 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f  yInfo->db;.    /
1b360 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20  * pMem->flags = 
1b370 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33 56 64 62  0; // sqlite3Vdb
1b380 65 53 65 72 69 61 6c 47 65 74 28 29 20 77 69 6c  eSerialGet() wil
1b390 6c 20 73 65 74 20 74 68 69 73 20 66 6f 72 20 75  l set this for u
1b3a0 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 73  s */.    pMem->s
1b3b0 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20  zMalloc = 0;.   
1b3c0 20 70 4d 65 6d 2d 3e 7a 20 3d 20 30 3b 0a 20 20   pMem->z = 0;.  
1b3d0 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64    d += sqlite3Vd
1b3e0 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
1b3f0 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  y[d], serial_typ
1b400 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d  e, pMem);.    pM
1b410 65 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20 28 2b  em++;.    if( (+
1b420 2b 75 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64 20 29  +u)>=p->nField )
1b430 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 61 73   break;.  }.  as
1b440 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66  sert( u<=pKeyInf
1b450 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b  o->nField + 1 );
1b460 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75  .  p->nField = u
1b470 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
1b480 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73  DEBUG./*.** This
1b490 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72   function compar
1b4a0 65 73 20 74 77 6f 20 69 6e 64 65 78 20 6f 72 20  es two index or 
1b4b0 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6b 65 79  table record key
1b4c0 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61  s in the same wa
1b4d0 79 0a 2a 2a 20 61 73 20 74 68 65 20 73 71 6c 69  y.** as the sqli
1b4e0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1b4f0 70 61 72 65 28 29 20 72 6f 75 74 69 6e 65 2e 20  pare() routine. 
1b500 55 6e 6c 69 6b 65 20 56 64 62 65 52 65 63 6f 72  Unlike VdbeRecor
1b510 64 43 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a 20 74  dCompare(),.** t
1b520 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73  his function des
1b530 65 72 69 61 6c 69 7a 65 73 20 61 6e 64 20 63 6f  erializes and co
1b540 6d 70 61 72 65 73 20 76 61 6c 75 65 73 20 75 73  mpares values us
1b550 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  ing the.** sqlit
1b560 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1b570 29 20 61 6e 64 20 73 71 6c 69 74 65 33 4d 65 6d  ) and sqlite3Mem
1b580 43 6f 6d 70 61 72 65 28 29 20 66 75 6e 63 74 69  Compare() functi
1b590 6f 6e 73 2e 20 49 74 20 69 73 20 75 73 65 64 0a  ons. It is used.
1b5a0 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 73  ** in assert() s
1b5b0 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73  tatements to ens
1b5c0 75 72 65 20 74 68 61 74 20 74 68 65 20 6f 70 74  ure that the opt
1b5d0 69 6d 69 7a 65 64 20 63 6f 64 65 20 69 6e 0a 2a  imized code in.*
1b5e0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  * sqlite3VdbeRec
1b5f0 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72 65 74  ordCompare() ret
1b600 75 72 6e 73 20 72 65 73 75 6c 74 73 20 77 69 74  urns results wit
1b610 68 20 74 68 65 73 65 20 74 77 6f 20 70 72 69 6d  h these two prim
1b620 69 74 69 76 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  itives..**.** Re
1b630 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
1b640 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61   result of compa
1b650 72 69 73 6f 6e 20 69 73 20 65 71 75 69 76 61 6c  rison is equival
1b660 65 6e 74 20 74 6f 20 64 65 73 69 72 65 64 52 65  ent to desiredRe
1b670 73 75 6c 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  sult..** Return 
1b680 66 61 6c 73 65 20 69 66 20 74 68 65 72 65 20 69  false if there i
1b690 73 20 61 20 64 69 73 61 67 72 65 65 6d 65 6e 74  s a disagreement
1b6a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b6b0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1b6c0 65 44 65 62 75 67 28 0a 20 20 69 6e 74 20 6e 4b  eDebug(.  int nK
1b6d0 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
1b6e0 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20  *pKey1, /* Left 
1b6f0 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 55  key */.  const U
1b700 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1b710 50 4b 65 79 32 2c 20 2f 2a 20 52 69 67 68 74 20  PKey2, /* Right 
1b720 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  key */.  int des
1b730 69 72 65 64 52 65 73 75 6c 74 20 20 20 20 20 20  iredResult      
1b740 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 65 63         /* Correc
1b750 74 20 61 6e 73 77 65 72 20 2a 2f 0a 29 7b 0a 20  t answer */.){. 
1b760 20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20 20   u32 d1;        
1b770 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
1b780 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
1b790 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a  t data element *
1b7a0 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20  /.  u32 idx1;   
1b7b0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1b7c0 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
1b7d0 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d  next header elem
1b7e0 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  ent */.  u32 szH
1b7f0 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  dr1;        /* N
1b800 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
1b810 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  n header */.  in
1b820 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  t i = 0;.  int r
1b830 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75  c = 0;.  const u
1b840 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
1b850 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73  ey1 = (const uns
1b860 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65  igned char *)pKe
1b870 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  y1;.  KeyInfo *p
1b880 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d  KeyInfo;.  Mem m
1b890 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f  em1;..  pKeyInfo
1b8a0 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49   = pPKey2->pKeyI
1b8b0 6e 66 6f 3b 0a 20 20 69 66 28 20 70 4b 65 79 49  nfo;.  if( pKeyI
1b8c0 6e 66 6f 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74  nfo->db==0 ) ret
1b8d0 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 31 2e 65 6e  urn 1;.  mem1.en
1b8e0 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
1b8f0 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70  c;.  mem1.db = p
1b900 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f  KeyInfo->db;.  /
1b910 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30  * mem1.flags = 0
1b920 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e  ;  // Will be in
1b930 69 74 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c  itialized by sql
1b940 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1b950 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c  t() */.  VVA_ONL
1b960 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63  Y( mem1.szMalloc
1b970 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20   = 0; ) /* Only 
1b980 6e 65 65 64 65 64 20 62 79 20 61 73 73 65 72 74  needed by assert
1b990 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  () statements */
1b9a0 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73  ..  /* Compilers
1b9b0 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68   may complain th
1b9c0 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70  at mem1.u.i is p
1b9d0 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69  otentially unini
1b9e0 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57  tialized..  ** W
1b9f0 65 20 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69  e could initiali
1ba00 7a 65 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20  ze it, as shown 
1ba10 68 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65  here, to silence
1ba20 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74   those complaint
1ba30 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66  s..  ** But in f
1ba40 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69  act, mem1.u.i wi
1ba50 6c 6c 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c  ll never actuall
1ba60 79 20 62 65 20 75 73 65 64 20 75 6e 69 6e 69 74  y be used uninit
1ba70 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69  ialized, and doi
1ba80 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e  ng .  ** the unn
1ba90 65 63 65 73 73 61 72 79 20 69 6e 69 74 69 61 6c  ecessary initial
1baa0 69 7a 61 74 69 6f 6e 20 68 61 73 20 61 20 6d 65  ization has a me
1bab0 61 73 75 72 61 62 6c 65 20 6e 65 67 61 74 69 76  asurable negativ
1bac0 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20  e performance.  
1bad0 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e 63 65  ** impact, since
1bae0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1baf0 20 61 20 76 65 72 79 20 68 69 67 68 20 72 75 6e   a very high run
1bb00 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65  ner.  And so, we
1bb10 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20   choose.  ** to 
1bb20 69 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70 69  ignore the compi
1bb30 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61 6e 64  ler warnings and
1bb40 20 6c 65 61 76 65 20 74 68 69 73 20 76 61 72 69   leave this vari
1bb50 61 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a  able uninitializ
1bb60 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d  ed..  */.  /*  m
1bb70 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f  em1.u.i = 0;  //
1bb80 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68 65 72   not needed, her
1bb90 65 20 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d  e to silence com
1bba0 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f  piler warning */
1bbb0 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74  .  .  idx1 = get
1bbc0 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20  Varint32(aKey1, 
1bbd0 73 7a 48 64 72 31 29 3b 0a 20 20 69 66 28 20 73  szHdr1);.  if( s
1bbe0 7a 48 64 72 31 3e 39 38 33 30 37 20 29 20 72 65  zHdr1>98307 ) re
1bbf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1bc00 55 50 54 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64  UPT;.  d1 = szHd
1bc10 72 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b  r1;.  assert( pK
1bc20 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70  eyInfo->nField+p
1bc30 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64  KeyInfo->nXField
1bc40 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  >=pPKey2->nField
1bc50 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
1bc60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
1bc70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
1bc80 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
1bc90 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
1bca0 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  d>0 );.  assert(
1bcb0 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c   idx1<=szHdr1 ||
1bcc0 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
1bcd0 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72   do{.    u32 ser
1bce0 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20  ial_type1;..    
1bcf0 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65 72 69  /* Read the seri
1bd00 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68 65  al types for the
1bd10 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e   next element in
1bd20 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20   each key. */.  
1bd30 20 20 69 64 78 31 20 2b 3d 20 67 65 74 56 61 72    idx1 += getVar
1bd40 69 6e 74 33 32 28 20 61 4b 65 79 31 2b 69 64 78  int32( aKey1+idx
1bd50 31 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20  1, serial_type1 
1bd60 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66  );..    /* Verif
1bd70 79 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  y that there is 
1bd80 65 6e 6f 75 67 68 20 6b 65 79 20 73 70 61 63 65  enough key space
1bd90 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f 20 61 76   remaining to av
1bda0 6f 69 64 0a 20 20 20 20 2a 2a 20 61 20 62 75 66  oid.    ** a buf
1bdb0 66 65 72 20 6f 76 65 72 72 65 61 64 2e 20 20 54  fer overread.  T
1bdc0 68 65 20 22 64 31 2b 73 65 72 69 61 6c 5f 74 79  he "d1+serial_ty
1bdd0 70 65 31 2b 32 22 20 73 75 62 65 78 70 72 65 73  pe1+2" subexpres
1bde0 73 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  sion will.    **
1bdf0 20 61 6c 77 61 79 73 20 62 65 20 67 72 65 61 74   always be great
1be00 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
1be10 20 74 6f 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   to the amount o
1be20 66 20 72 65 71 75 69 72 65 64 20 6b 65 79 20 73  f required key s
1be30 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 55 73 65  pace..    ** Use
1be40 20 74 68 61 74 20 61 70 70 72 6f 78 69 6d 61 74   that approximat
1be50 69 6f 6e 20 74 6f 20 61 76 6f 69 64 20 74 68 65  ion to avoid the
1be60 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65 20   more expensive 
1be70 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
1be80 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1be90 54 79 70 65 4c 65 6e 28 29 20 69 6e 20 74 68 65  TypeLen() in the
1bea0 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20   common case..  
1beb0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 31 2b    */.    if( d1+
1bec0 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 3e 28  serial_type1+2>(
1bed0 75 33 32 29 6e 4b 65 79 31 0a 20 20 20 20 20 26  u32)nKey1.     &
1bee0 26 20 64 31 2b 73 71 6c 69 74 65 33 56 64 62 65  & d1+sqlite3Vdbe
1bef0 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
1bf00 72 69 61 6c 5f 74 79 70 65 31 29 3e 28 75 33 32  rial_type1)>(u32
1bf10 29 6e 4b 65 79 31 20 0a 20 20 20 20 29 7b 0a 20  )nKey1 .    ){. 
1bf20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1bf30 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63  }..    /* Extrac
1bf40 74 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20  t the values to 
1bf50 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20  be compared..   
1bf60 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71   */.    d1 += sq
1bf70 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1bf80 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73  et(&aKey1[d1], s
1bf90 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65  erial_type1, &me
1bfa0 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20  m1);..    /* Do 
1bfb0 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20  the comparison. 
1bfc0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
1bfd0 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
1bfe0 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d  (&mem1, &pPKey2-
1bff0 3e 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65 79 49 6e  >aMem[i], pKeyIn
1c000 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b 0a 20  fo->aColl[i]);. 
1c010 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
1c020 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65        assert( me
1c030 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  m1.szMalloc==0 )
1c040 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e  ;  /* See commen
1c050 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  t below */.     
1c060 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61   if( pKeyInfo->a
1c070 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a  SortOrder[i] ){.
1c080 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63          rc = -rc
1c090 3b 20 20 2f 2a 20 49 6e 76 65 72 74 20 74 68 65  ;  /* Invert the
1c0a0 20 72 65 73 75 6c 74 20 66 6f 72 20 44 45 53 43   result for DESC
1c0b0 20 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a   sort order. */.
1c0c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
1c0d0 74 6f 20 64 65 62 75 67 43 6f 6d 70 61 72 65 45  to debugCompareE
1c0e0 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b  nd;.    }.    i+
1c0f0 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78  +;.  }while( idx
1c100 31 3c 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50  1<szHdr1 && i<pP
1c110 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a  Key2->nField );.
1c120 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20  .  /* No memory 
1c130 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76  allocation is ev
1c140 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e  er used on mem1.
1c150 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69    Prove this usi
1c160 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c  ng.  ** the foll
1c170 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20  owing assert(). 
1c180 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29   If the assert()
1c190 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63   fails, it indic
1c1a0 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f  ates a.  ** memo
1c1b0 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65  ry leak and a ne
1c1c0 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74  ed to call sqlit
1c1d0 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
1c1e0 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20  (&mem1)..  */.  
1c1f0 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d  assert( mem1.szM
1c200 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f  alloc==0 );..  /
1c210 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61  * rc==0 here mea
1c220 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74  ns that one of t
1c230 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20  he keys ran out 
1c240 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20  of fields and.  
1c250 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64  ** all the field
1c260 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69  s up to that poi
1c270 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52  nt were equal. R
1c280 65 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c  eturn the defaul
1c290 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  t_rc.  ** value.
1c2a0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 50 4b 65    */.  rc = pPKe
1c2b0 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a  y2->default_rc;.
1c2c0 0a 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64  .debugCompareEnd
1c2d0 3a 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52  :.  if( desiredR
1c2e0 65 73 75 6c 74 3d 3d 30 20 26 26 20 72 63 3d 3d  esult==0 && rc==
1c2f0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
1c300 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c  if( desiredResul
1c310 74 3c 30 20 26 26 20 72 63 3c 30 20 29 20 72 65  t<0 && rc<0 ) re
1c320 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65  turn 1;.  if( de
1c330 73 69 72 65 64 52 65 73 75 6c 74 3e 30 20 26 26  siredResult>0 &&
1c340 20 72 63 3e 30 20 29 20 72 65 74 75 72 6e 20 31   rc>0 ) return 1
1c350 3b 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f  ;.  if( CORRUPT_
1c360 44 42 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  DB ) return 1;. 
1c370 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64   if( pKeyInfo->d
1c380 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1c390 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
1c3a0 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1c3b0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42  ..#if SQLITE_DEB
1c3c0 55 47 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74  UG./*.** Count t
1c3d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65  he number of fie
1c3e0 6c 64 73 20 28 61 2e 6b 2e 61 2e 20 63 6f 6c 75  lds (a.k.a. colu
1c3f0 6d 6e 73 29 20 69 6e 20 74 68 65 20 72 65 63 6f  mns) in the reco
1c400 72 64 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70  rd given by.** p
1c410 4b 65 79 2c 6e 4b 65 79 2e 20 20 54 68 65 20 76  Key,nKey.  The v
1c420 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20  erify that this 
1c430 63 6f 75 6e 74 20 69 73 20 6c 65 73 73 20 74 68  count is less th
1c440 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
1c450 68 65 0a 2a 2a 20 6c 69 6d 69 74 20 67 69 76 65  he.** limit give
1c460 6e 20 62 79 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  n by pKeyInfo->n
1c470 46 69 65 6c 64 20 2b 20 70 4b 65 79 49 6e 66 6f  Field + pKeyInfo
1c480 2d 3e 6e 58 46 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a  ->nXField..**.**
1c490 20 49 66 20 74 68 69 73 20 63 6f 6e 73 74 72 61   If this constra
1c4a0 69 6e 74 20 69 73 20 6e 6f 74 20 73 61 74 69 73  int is not satis
1c4b0 66 69 65 64 2c 20 69 74 20 6d 65 61 6e 73 20 74  fied, it means t
1c4c0 68 61 74 20 74 68 65 20 68 69 67 68 2d 73 70 65  hat the high-spe
1c4d0 65 64 0a 2a 2a 20 76 64 62 65 52 65 63 6f 72 64  ed.** vdbeRecord
1c4e0 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64  CompareInt() and
1c4f0 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1c500 72 65 53 74 72 69 6e 67 28 29 20 72 6f 75 74 69  reString() routi
1c510 6e 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20  nes will.** not 
1c520 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 20  work correctly. 
1c530 20 49 66 20 74 68 69 73 20 61 73 73 65 72 74 28   If this assert(
1c540 29 20 65 76 65 72 20 66 69 72 65 73 2c 20 69 74  ) ever fires, it
1c550 20 70 72 6f 62 61 62 6c 79 20 6d 65 61 6e 73 0a   probably means.
1c560 2a 2a 20 74 68 61 74 20 74 68 65 20 4b 65 79 49  ** that the KeyI
1c570 6e 66 6f 2e 6e 46 69 65 6c 64 20 6f 72 20 4b 65  nfo.nField or Ke
1c580 79 49 6e 66 6f 2e 6e 58 46 69 65 6c 64 20 76 61  yInfo.nXField va
1c590 6c 75 65 73 20 77 65 72 65 20 63 6f 6d 70 75 74  lues were comput
1c5a0 65 64 0a 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c  ed.** incorrectl
1c5b0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
1c5c0 64 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c  d vdbeAssertFiel
1c5d0 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69  dCountWithinLimi
1c5e0 74 73 28 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20  ts(.  int nKey, 
1c5f0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1c600 2c 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72  ,   /* The recor
1c610 64 20 74 6f 20 76 65 72 69 66 79 20 2a 2f 20 0a  d to verify */ .
1c620 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e 66 6f 20    const KeyInfo 
1c630 2a 70 4b 65 79 49 6e 66 6f 20 20 20 20 20 20 20  *pKeyInfo       
1c640 2f 2a 20 43 6f 6d 70 61 72 65 20 73 69 7a 65 20  /* Compare size 
1c650 77 69 74 68 20 74 68 69 73 20 4b 65 79 49 6e 66  with this KeyInf
1c660 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 46  o */.){.  int nF
1c670 69 65 6c 64 20 3d 20 30 3b 0a 20 20 75 33 32 20  ield = 0;.  u32 
1c680 73 7a 48 64 72 3b 0a 20 20 75 33 32 20 69 64 78  szHdr;.  u32 idx
1c690 3b 0a 20 20 75 33 32 20 6e 6f 74 55 73 65 64 3b  ;.  u32 notUsed;
1c6a0 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
1c6b0 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28  d char *aKey = (
1c6c0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1c6d0 68 61 72 2a 29 70 4b 65 79 3b 0a 0a 20 20 69 66  har*)pKey;..  if
1c6e0 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72  ( CORRUPT_DB ) r
1c6f0 65 74 75 72 6e 3b 0a 20 20 69 64 78 20 3d 20 67  eturn;.  idx = g
1c700 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c  etVarint32(aKey,
1c710 20 73 7a 48 64 72 29 3b 0a 20 20 61 73 73 65 72   szHdr);.  asser
1c720 74 28 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20  t( nKey>=0 );.  
1c730 61 73 73 65 72 74 28 20 73 7a 48 64 72 3c 3d 28  assert( szHdr<=(
1c740 75 33 32 29 6e 4b 65 79 20 29 3b 0a 20 20 77 68  u32)nKey );.  wh
1c750 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20 29  ile( idx<szHdr )
1c760 7b 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74  {.    idx += get
1c770 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2b 69 64  Varint32(aKey+id
1c780 78 2c 20 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20  x, notUsed);.   
1c790 20 6e 46 69 65 6c 64 2b 2b 3b 0a 20 20 7d 0a 20   nField++;.  }. 
1c7a0 20 61 73 73 65 72 74 28 20 6e 46 69 65 6c 64 20   assert( nField 
1c7b0 3c 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  <= pKeyInfo->nFi
1c7c0 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58  eld+pKeyInfo->nX
1c7d0 46 69 65 6c 64 20 29 3b 0a 7d 0a 23 65 6c 73 65  Field );.}.#else
1c7e0 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 41 73  .# define vdbeAs
1c7f0 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69  sertFieldCountWi
1c800 74 68 69 6e 4c 69 6d 69 74 73 28 41 2c 42 2c 43  thinLimits(A,B,C
1c810 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1c820 42 6f 74 68 20 2a 70 4d 65 6d 31 20 61 6e 64 20  Both *pMem1 and 
1c830 2a 70 4d 65 6d 32 20 63 6f 6e 74 61 69 6e 20 73  *pMem2 contain s
1c840 74 72 69 6e 67 20 76 61 6c 75 65 73 2e 20 43 6f  tring values. Co
1c850 6d 70 61 72 65 20 74 68 65 20 74 77 6f 20 76 61  mpare the two va
1c860 6c 75 65 73 0a 2a 2a 20 75 73 69 6e 67 20 74 68  lues.** using th
1c870 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
1c880 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 41 73 20 75  ence pColl. As u
1c890 73 75 61 6c 2c 20 72 65 74 75 72 6e 20 61 20 6e  sual, return a n
1c8a0 65 67 61 74 69 76 65 20 2c 20 7a 65 72 6f 0a 2a  egative , zero.*
1c8b0 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 76 61  * or positive va
1c8c0 6c 75 65 20 69 66 20 2a 70 4d 65 6d 31 20 69 73  lue if *pMem1 is
1c8d0 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
1c8e0 6c 20 74 6f 20 6f 72 20 67 72 65 61 74 65 72 20  l to or greater 
1c8f0 74 68 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c  than .** *pMem2,
1c900 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 53   respectively. S
1c910 69 6d 69 6c 61 72 20 69 6e 20 73 70 69 72 69 74  imilar in spirit
1c920 20 74 6f 20 22 72 63 20 3d 20 28 2a 70 4d 65 6d   to "rc = (*pMem
1c930 31 29 20 2d 20 28 2a 70 4d 65 6d 32 29 3b 22 2e  1) - (*pMem2);".
1c940 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
1c950 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72  dbeCompareMemStr
1c960 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20 4d 65 6d  ing(.  const Mem
1c970 20 2a 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e 73 74   *pMem1,.  const
1c980 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20 20 63   Mem *pMem2,.  c
1c990 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43  onst CollSeq *pC
1c9a0 6f 6c 6c 2c 0a 20 20 75 38 20 2a 70 72 63 45 72  oll,.  u8 *prcEr
1c9b0 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
1c9c0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20         /* If an 
1c9d0 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 73 65 74 20  OOM occurs, set 
1c9e0 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  to SQLITE_NOMEM 
1c9f0 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 4d 65 6d  */.){.  if( pMem
1ca00 31 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65  1->enc==pColl->e
1ca10 6e 63 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  nc ){.    /* The
1ca20 20 73 74 72 69 6e 67 73 20 61 72 65 20 61 6c 72   strings are alr
1ca30 65 61 64 79 20 69 6e 20 74 68 65 20 63 6f 72 72  eady in the corr
1ca40 65 63 74 20 65 6e 63 6f 64 69 6e 67 2e 20 20 43  ect encoding.  C
1ca50 61 6c 6c 20 74 68 65 0a 20 20 20 20 20 2a 2a 20  all the.     ** 
1ca60 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
1ca70 69 6f 6e 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a  ion directly */.
1ca80 20 20 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c      return pColl
1ca90 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55  ->xCmp(pColl->pU
1caa0 73 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65  ser,pMem1->n,pMe
1cab0 6d 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70  m1->z,pMem2->n,p
1cac0 4d 65 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73  Mem2->z);.  }els
1cad0 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  e{.    int rc;. 
1cae0 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 76     const void *v
1caf0 31 2c 20 2a 76 32 3b 0a 20 20 20 20 69 6e 74 20  1, *v2;.    int 
1cb00 6e 31 2c 20 6e 32 3b 0a 20 20 20 20 4d 65 6d 20  n1, n2;.    Mem 
1cb10 63 31 3b 0a 20 20 20 20 4d 65 6d 20 63 32 3b 0a  c1;.    Mem c2;.
1cb20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1cb30 65 6d 49 6e 69 74 28 26 63 31 2c 20 70 4d 65 6d  emInit(&c1, pMem
1cb40 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  1->db, MEM_Null)
1cb50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1cb60 65 4d 65 6d 49 6e 69 74 28 26 63 32 2c 20 70 4d  eMemInit(&c2, pM
1cb70 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c  em1->db, MEM_Nul
1cb80 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  l);.    sqlite3V
1cb90 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70  dbeMemShallowCop
1cba0 79 28 26 63 31 2c 20 70 4d 65 6d 31 2c 20 4d 45  y(&c1, pMem1, ME
1cbb0 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 73 71  M_Ephem);.    sq
1cbc0 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c  lite3VdbeMemShal
1cbd0 6c 6f 77 43 6f 70 79 28 26 63 32 2c 20 70 4d 65  lowCopy(&c2, pMe
1cbe0 6d 32 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a  m2, MEM_Ephem);.
1cbf0 20 20 20 20 76 31 20 3d 20 73 71 6c 69 74 65 33      v1 = sqlite3
1cc00 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74  ValueText((sqlit
1cc10 65 33 5f 76 61 6c 75 65 2a 29 26 63 31 2c 20 70  e3_value*)&c1, p
1cc20 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20  Coll->enc);.    
1cc30 6e 31 20 3d 20 76 31 3d 3d 30 20 3f 20 30 20 3a  n1 = v1==0 ? 0 :
1cc40 20 63 31 2e 6e 3b 0a 20 20 20 20 76 32 20 3d 20   c1.n;.    v2 = 
1cc50 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
1cc60 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
1cc70 29 26 63 32 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63  )&c2, pColl->enc
1cc80 29 3b 0a 20 20 20 20 6e 32 20 3d 20 76 32 3d 3d  );.    n2 = v2==
1cc90 30 20 3f 20 30 20 3a 20 63 32 2e 6e 3b 0a 20 20  0 ? 0 : c2.n;.  
1cca0 20 20 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43    rc = pColl->xC
1ccb0 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c  mp(pColl->pUser,
1ccc0 20 6e 31 2c 20 76 31 2c 20 6e 32 2c 20 76 32 29   n1, v1, n2, v2)
1ccd0 3b 0a 20 20 20 20 69 66 28 20 28 76 31 3d 3d 30  ;.    if( (v1==0
1cce0 20 7c 7c 20 76 32 3d 3d 30 29 20 26 26 20 70 72   || v2==0) && pr
1ccf0 63 45 72 72 20 29 20 2a 70 72 63 45 72 72 20 3d  cErr ) *prcErr =
1cd00 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
1cd10 50 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  PT;.    sqlite3V
1cd20 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63  dbeMemRelease(&c
1cd30 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
1cd40 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63  dbeMemRelease(&c
1cd50 32 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  2);.    return r
1cd60 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c;.  }.}../*.** 
1cd70 54 68 65 20 69 6e 70 75 74 20 70 42 6c 6f 62 20  The input pBlob 
1cd80 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
1cd90 20 62 65 20 61 20 42 6c 6f 62 20 74 68 61 74 20   be a Blob that 
1cda0 69 73 20 6e 6f 74 20 6d 61 72 6b 65 64 0a 2a 2a  is not marked.**
1cdb0 20 77 69 74 68 20 4d 45 4d 5f 5a 65 72 6f 2e 20   with MEM_Zero. 
1cdc0 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
1cdd0 69 74 20 63 6f 75 6c 64 20 62 65 20 61 20 7a 65  it could be a ze
1cde0 72 6f 2d 62 6c 6f 62 2e 0a 2a 2f 0a 73 74 61 74  ro-blob..*/.stat
1cdf0 69 63 20 69 6e 74 20 69 73 41 6c 6c 5a 65 72 6f  ic int isAllZero
1ce00 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
1ce10 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 3b  int n){.  int i;
1ce20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b  .  for(i=0; i<n;
1ce30 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   i++){.    if( z
1ce40 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  [i] ) return 0;.
1ce50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
1ce60 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
1ce70 20 74 77 6f 20 62 6c 6f 62 73 2e 20 20 52 65 74   two blobs.  Ret
1ce80 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  urn negative, ze
1ce90 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ro, or positive 
1cea0 69 66 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  if the first.** 
1ceb0 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
1cec0 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74  ual to, or great
1ced0 65 72 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f  er than the seco
1cee0 6e 64 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  nd, respectively
1cef0 2e 0a 2a 2a 20 49 66 20 6f 6e 65 20 62 6c 6f 62  ..** If one blob
1cf00 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20   is a prefix of 
1cf10 74 68 65 20 6f 74 68 65 72 2c 20 74 68 65 6e 20  the other, then 
1cf20 74 68 65 20 73 68 6f 72 74 65 72 20 69 73 20 74  the shorter is t
1cf30 68 65 20 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 73 74  he lessor..*/.st
1cf40 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
1cf50 4c 49 4e 45 20 69 6e 74 20 73 71 6c 69 74 65 33  LINE int sqlite3
1cf60 42 6c 6f 62 43 6f 6d 70 61 72 65 28 63 6f 6e 73  BlobCompare(cons
1cf70 74 20 4d 65 6d 20 2a 70 42 31 2c 20 63 6f 6e 73  t Mem *pB1, cons
1cf80 74 20 4d 65 6d 20 2a 70 42 32 29 7b 0a 20 20 69  t Mem *pB2){.  i
1cf90 6e 74 20 63 3b 0a 20 20 69 6e 74 20 6e 31 20 3d  nt c;.  int n1 =
1cfa0 20 70 42 31 2d 3e 6e 3b 0a 20 20 69 6e 74 20 6e   pB1->n;.  int n
1cfb0 32 20 3d 20 70 42 32 2d 3e 6e 3b 0a 0a 20 20 2f  2 = pB2->n;..  /
1cfc0 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65  * It is possible
1cfd0 20 74 6f 20 68 61 76 65 20 61 20 42 6c 6f 62 20   to have a Blob 
1cfe0 76 61 6c 75 65 20 74 68 61 74 20 68 61 73 20 73  value that has s
1cff0 6f 6d 65 20 6e 6f 6e 2d 7a 65 72 6f 20 63 6f 6e  ome non-zero con
1d000 74 65 6e 74 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77  tent.  ** follow
1d010 65 64 20 62 79 20 7a 65 72 6f 20 63 6f 6e 74 65  ed by zero conte
1d020 6e 74 2e 20 20 42 75 74 20 74 68 61 74 20 6f 6e  nt.  But that on
1d030 6c 79 20 63 6f 6d 65 73 20 75 70 20 66 6f 72 20  ly comes up for 
1d040 42 6c 6f 62 73 20 66 6f 72 6d 65 64 0a 20 20 2a  Blobs formed.  *
1d050 2a 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65  * by the OP_Make
1d060 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2c 20 61  Record opcode, a
1d070 6e 64 20 73 75 63 68 20 42 6c 6f 62 73 20 6e 65  nd such Blobs ne
1d080 76 65 72 20 67 65 74 20 70 61 73 73 65 64 20 69  ver get passed i
1d090 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  nto.  ** sqlite3
1d0a0 4d 65 6d 43 6f 6d 70 61 72 65 28 29 2e 20 2a 2f  MemCompare(). */
1d0b0 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 31 2d  .  assert( (pB1-
1d0c0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
1d0d0 6f 29 3d 3d 30 20 7c 7c 20 6e 31 3d 3d 30 20 29  o)==0 || n1==0 )
1d0e0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 32  ;.  assert( (pB2
1d0f0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
1d100 72 6f 29 3d 3d 30 20 7c 7c 20 6e 32 3d 3d 30 20  ro)==0 || n2==0 
1d110 29 3b 0a 0a 20 20 69 66 28 20 28 70 42 31 2d 3e  );..  if( (pB1->
1d120 66 6c 61 67 73 7c 70 42 32 2d 3e 66 6c 61 67 73  flags|pB2->flags
1d130 29 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  ) & MEM_Zero ){.
1d140 20 20 20 20 69 66 28 20 70 42 31 2d 3e 66 6c 61      if( pB1->fla
1d150 67 73 20 26 20 70 42 32 2d 3e 66 6c 61 67 73 20  gs & pB2->flags 
1d160 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20  & MEM_Zero ){.  
1d170 20 20 20 20 72 65 74 75 72 6e 20 70 42 31 2d 3e      return pB1->
1d180 75 2e 6e 5a 65 72 6f 20 2d 20 70 42 32 2d 3e 75  u.nZero - pB2->u
1d190 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d 65 6c 73  .nZero;.    }els
1d1a0 65 20 69 66 28 20 70 42 31 2d 3e 66 6c 61 67 73  e if( pB1->flags
1d1b0 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
1d1c0 20 20 20 20 20 69 66 28 20 21 69 73 41 6c 6c 5a       if( !isAllZ
1d1d0 65 72 6f 28 70 42 32 2d 3e 7a 2c 20 70 42 32 2d  ero(pB2->z, pB2-
1d1e0 3e 6e 29 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  >n) ) return -1;
1d1f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 42  .      return pB
1d200 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20 6e 32 3b  1->u.nZero - n2;
1d210 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d220 20 20 69 66 28 20 21 69 73 41 6c 6c 5a 65 72 6f    if( !isAllZero
1d230 28 70 42 31 2d 3e 7a 2c 20 70 42 31 2d 3e 6e 29  (pB1->z, pB1->n)
1d240 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20   ) return +1;.  
1d250 20 20 20 20 72 65 74 75 72 6e 20 6e 31 20 2d 20      return n1 - 
1d260 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  pB2->u.nZero;.  
1d270 20 20 7d 0a 20 20 7d 0a 20 20 63 20 3d 20 6d 65    }.  }.  c = me
1d280 6d 63 6d 70 28 70 42 31 2d 3e 7a 2c 20 70 42 32  mcmp(pB1->z, pB2
1d290 2d 3e 7a 2c 20 6e 31 3e 6e 32 20 3f 20 6e 32 20  ->z, n1>n2 ? n2 
1d2a0 3a 20 6e 31 29 3b 0a 20 20 69 66 28 20 63 20 29  : n1);.  if( c )
1d2b0 20 72 65 74 75 72 6e 20 63 3b 0a 20 20 72 65 74   return c;.  ret
1d2c0 75 72 6e 20 6e 31 20 2d 20 6e 32 3b 0a 7d 0a 0a  urn n1 - n2;.}..
1d2d0 2f 2a 0a 2a 2a 20 44 6f 20 61 20 63 6f 6d 70 61  /*.** Do a compa
1d2e0 72 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 61 20  rison between a 
1d2f0 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e  64-bit signed in
1d300 74 65 67 65 72 20 61 6e 64 20 61 20 36 34 2d 62  teger and a 64-b
1d310 69 74 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e  it floating-poin
1d320 74 0a 2a 2a 20 6e 75 6d 62 65 72 2e 20 20 52 65  t.** number.  Re
1d330 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a  turn negative, z
1d340 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
1d350 20 69 66 20 74 68 65 20 66 69 72 73 74 20 28 69   if the first (i
1d360 36 34 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e  64) is less than
1d370 2c 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 2c 20 6f  ,.** equal to, o
1d380 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
1d390 68 65 20 73 65 63 6f 6e 64 20 28 64 6f 75 62 6c  he second (doubl
1d3a0 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
1d3b0 74 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61  t sqlite3IntFloa
1d3c0 74 43 6f 6d 70 61 72 65 28 69 36 34 20 69 2c 20  tCompare(i64 i, 
1d3d0 64 6f 75 62 6c 65 20 72 29 7b 0a 20 20 69 66 28  double r){.  if(
1d3e0 20 73 69 7a 65 6f 66 28 4c 4f 4e 47 44 4f 55 42   sizeof(LONGDOUB
1d3f0 4c 45 5f 54 59 50 45 29 3e 38 20 29 7b 0a 20 20  LE_TYPE)>8 ){.  
1d400 20 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50    LONGDOUBLE_TYP
1d410 45 20 78 20 3d 20 28 4c 4f 4e 47 44 4f 55 42 4c  E x = (LONGDOUBL
1d420 45 5f 54 59 50 45 29 69 3b 0a 20 20 20 20 69 66  E_TYPE)i;.    if
1d430 28 20 78 3c 72 20 29 20 72 65 74 75 72 6e 20 2d  ( x<r ) return -
1d440 31 3b 0a 20 20 20 20 69 66 28 20 78 3e 72 20 29  1;.    if( x>r )
1d450 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20   return +1;.    
1d460 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73  return 0;.  }els
1d470 65 7b 0a 20 20 20 20 69 36 34 20 79 3b 0a 20 20  e{.    i64 y;.  
1d480 20 20 64 6f 75 62 6c 65 20 73 3b 0a 20 20 20 20    double s;.    
1d490 69 66 28 20 72 3c 2d 39 32 32 33 33 37 32 30 33  if( r<-922337203
1d4a0 36 38 35 34 37 37 35 38 30 38 2e 30 20 29 20 72  6854775808.0 ) r
1d4b0 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 69 66  eturn +1;.    if
1d4c0 28 20 72 3e 39 32 32 33 33 37 32 30 33 36 38 35  ( r>922337203685
1d4d0 34 37 37 35 38 30 37 2e 30 20 29 20 72 65 74 75  4775807.0 ) retu
1d4e0 72 6e 20 2d 31 3b 0a 20 20 20 20 79 20 3d 20 28  rn -1;.    y = (
1d4f0 69 36 34 29 72 3b 0a 20 20 20 20 69 66 28 20 69  i64)r;.    if( i
1d500 3c 79 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  <y ) return -1;.
1d510 20 20 20 20 69 66 28 20 69 3e 79 20 29 7b 0a 20      if( i>y ){. 
1d520 20 20 20 20 20 69 66 28 20 79 3d 3d 53 4d 41 4c       if( y==SMAL
1d530 4c 45 53 54 5f 49 4e 54 36 34 20 26 26 20 72 3e  LEST_INT64 && r>
1d540 30 2e 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  0.0 ) return -1;
1d550 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2b 31  .      return +1
1d560 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 20 3d 20  ;.    }.    s = 
1d570 28 64 6f 75 62 6c 65 29 69 3b 0a 20 20 20 20 69  (double)i;.    i
1d580 66 28 20 73 3c 72 20 29 20 72 65 74 75 72 6e 20  f( s<r ) return 
1d590 2d 31 3b 0a 20 20 20 20 69 66 28 20 73 3e 72 20  -1;.    if( s>r 
1d5a0 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20  ) return +1;.   
1d5b0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d   return 0;.  }.}
1d5c0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
1d5d0 74 68 65 20 76 61 6c 75 65 73 20 63 6f 6e 74 61  the values conta
1d5e0 69 6e 65 64 20 62 79 20 74 68 65 20 74 77 6f 20  ined by the two 
1d5f0 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2c 20 72 65  memory cells, re
1d600 74 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61 74  turning.** negat
1d610 69 76 65 2c 20 7a 65 72 6f 20 6f 72 20 70 6f 73  ive, zero or pos
1d620 69 74 69 76 65 20 69 66 20 70 4d 65 6d 31 20 69  itive if pMem1 i
1d630 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
1d640 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65  al to, or greate
1d650 72 0a 2a 2a 20 74 68 61 6e 20 70 4d 65 6d 32 2e  r.** than pMem2.
1d660 20 53 6f 72 74 69 6e 67 20 6f 72 64 65 72 20 69   Sorting order i
1d670 73 20 4e 55 4c 4c 27 73 20 66 69 72 73 74 2c 20  s NULL's first, 
1d680 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6e 75 6d 62  followed by numb
1d690 65 72 73 20 28 69 6e 74 65 67 65 72 73 0a 2a 2a  ers (integers.**
1d6a0 20 61 6e 64 20 72 65 61 6c 73 29 20 73 6f 72 74   and reals) sort
1d6b0 65 64 20 6e 75 6d 65 72 69 63 61 6c 6c 79 2c 20  ed numerically, 
1d6c0 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65 78 74  followed by text
1d6d0 20 6f 72 64 65 72 65 64 20 62 79 20 74 68 65 20   ordered by the 
1d6e0 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
1d6f0 75 65 6e 63 65 20 70 43 6f 6c 6c 20 61 6e 64 20  uence pColl and 
1d700 66 69 6e 61 6c 6c 79 20 62 6c 6f 62 27 73 20 6f  finally blob's o
1d710 72 64 65 72 65 64 20 62 79 20 6d 65 6d 63 6d 70  rdered by memcmp
1d720 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55  ()..**.** Two NU
1d730 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f  LL values are co
1d740 6e 73 69 64 65 72 65 64 20 65 71 75 61 6c 20 62  nsidered equal b
1d750 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
1d760 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d  .*/.int sqlite3M
1d770 65 6d 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20  emCompare(const 
1d780 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73  Mem *pMem1, cons
1d790 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f  t Mem *pMem2, co
1d7a0 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  nst CollSeq *pCo
1d7b0 6c 6c 29 7b 0a 20 20 69 6e 74 20 66 31 2c 20 66  ll){.  int f1, f
1d7c0 32 3b 0a 20 20 69 6e 74 20 63 6f 6d 62 69 6e 65  2;.  int combine
1d7d0 64 5f 66 6c 61 67 73 3b 0a 0a 20 20 66 31 20 3d  d_flags;..  f1 =
1d7e0 20 70 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a 20   pMem1->flags;. 
1d7f0 20 66 32 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c 61   f2 = pMem2->fla
1d800 67 73 3b 0a 20 20 63 6f 6d 62 69 6e 65 64 5f 66  gs;.  combined_f
1d810 6c 61 67 73 20 3d 20 66 31 7c 66 32 3b 0a 20 20  lags = f1|f2;.  
1d820 61 73 73 65 72 74 28 20 28 63 6f 6d 62 69 6e 65  assert( (combine
1d830 64 5f 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f  d_flags & MEM_Ro
1d840 77 53 65 74 29 3d 3d 30 20 29 3b 0a 20 0a 20 20  wSet)==0 );. .  
1d850 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20  /* If one value 
1d860 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69 73 20 6c  is NULL, it is l
1d870 65 73 73 20 74 68 61 6e 20 74 68 65 20 6f 74 68  ess than the oth
1d880 65 72 2e 20 49 66 20 62 6f 74 68 20 76 61 6c 75  er. If both valu
1d890 65 73 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c  es.  ** are NULL
1d8a0 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f  , return 0..  */
1d8b0 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f  .  if( combined_
1d8c0 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29  flags&MEM_Null )
1d8d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 66 32  {.    return (f2
1d8e0 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66 31  &MEM_Null) - (f1
1d8f0 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a  &MEM_Null);.  }.
1d900 0a 20 20 2f 2a 20 41 74 20 6c 65 61 73 74 20 6f  .  /* At least o
1d910 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20 76 61  ne of the two va
1d920 6c 75 65 73 20 69 73 20 61 20 6e 75 6d 62 65 72  lues is a number
1d930 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62  .  */.  if( comb
1d940 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d 5f  ined_flags&(MEM_
1d950 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29 7b  Int|MEM_Real) ){
1d960 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20 66  .    if( (f1 & f
1d970 32 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20  2 & MEM_Int)!=0 
1d980 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  ){.      if( pMe
1d990 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32 2d  m1->u.i < pMem2-
1d9a0 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2d 31  >u.i ) return -1
1d9b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
1d9c0 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e  1->u.i > pMem2->
1d9d0 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2b 31 3b  u.i ) return +1;
1d9e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1d9f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1da00 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 52 65  f1 & f2 & MEM_Re
1da10 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
1da20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3c  if( pMem1->u.r <
1da30 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65   pMem2->u.r ) re
1da40 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69  turn -1;.      i
1da50 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3e 20  f( pMem1->u.r > 
1da60 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74  pMem2->u.r ) ret
1da70 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65  urn +1;.      re
1da80 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
1da90 20 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 49 6e    if( (f1&MEM_In
1daa0 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  t)!=0 ){.      i
1dab0 66 28 20 28 66 32 26 4d 45 4d 5f 52 65 61 6c 29  f( (f2&MEM_Real)
1dac0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
1dad0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 74  eturn sqlite3Int
1dae0 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d 65  FloatCompare(pMe
1daf0 6d 31 2d 3e 75 2e 69 2c 20 70 4d 65 6d 32 2d 3e  m1->u.i, pMem2->
1db00 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  u.r);.      }els
1db10 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  e{.        retur
1db20 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n -1;.      }.  
1db30 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31 26    }.    if( (f1&
1db40 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a  MEM_Real)!=0 ){.
1db50 20 20 20 20 20 20 69 66 28 20 28 66 32 26 4d 45        if( (f2&ME
1db60 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20  M_Int)!=0 ){.   
1db70 20 20 20 20 20 72 65 74 75 72 6e 20 2d 73 71 6c       return -sql
1db80 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70  ite3IntFloatComp
1db90 61 72 65 28 70 4d 65 6d 32 2d 3e 75 2e 69 2c 20  are(pMem2->u.i, 
1dba0 70 4d 65 6d 31 2d 3e 75 2e 72 29 3b 0a 20 20 20  pMem1->u.r);.   
1dbb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1dbc0 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
1dbd0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
1dbe0 65 74 75 72 6e 20 2b 31 3b 0a 20 20 7d 0a 0a 20  eturn +1;.  }.. 
1dbf0 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65   /* If one value
1dc00 20 69 73 20 61 20 73 74 72 69 6e 67 20 61 6e 64   is a string and
1dc10 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 61 20   the other is a 
1dc20 62 6c 6f 62 2c 20 74 68 65 20 73 74 72 69 6e 67  blob, the string
1dc30 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49   is less..  ** I
1dc40 66 20 62 6f 74 68 20 61 72 65 20 73 74 72 69 6e  f both are strin
1dc50 67 73 2c 20 63 6f 6d 70 61 72 65 20 75 73 69 6e  gs, compare usin
1dc60 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  g the collating 
1dc70 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  functions..  */.
1dc80 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66    if( combined_f
1dc90 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a  lags&MEM_Str ){.
1dca0 20 20 20 20 69 66 28 20 28 66 31 20 26 20 4d 45      if( (f1 & ME
1dcb0 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20  M_Str)==0 ){.   
1dcc0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1dcd0 20 7d 0a 20 20 20 20 69 66 28 20 28 66 32 20 26   }.    if( (f2 &
1dce0 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a   MEM_Str)==0 ){.
1dcf0 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
1dd00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
1dd10 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d  rt( pMem1->enc==
1dd20 70 4d 65 6d 32 2d 3e 65 6e 63 20 7c 7c 20 70 4d  pMem2->enc || pM
1dd30 65 6d 31 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  em1->db->mallocF
1dd40 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 61 73 73  ailed );.    ass
1dd50 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d  ert( pMem1->enc=
1dd60 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20  =SQLITE_UTF8 || 
1dd70 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 65  .            pMe
1dd80 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  m1->enc==SQLITE_
1dd90 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d 65 6d 31  UTF16LE || pMem1
1dda0 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ->enc==SQLITE_UT
1ddb0 46 31 36 42 45 20 29 3b 0a 0a 20 20 20 20 2f 2a  F16BE );..    /*
1ddc0 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   The collation s
1ddd0 65 71 75 65 6e 63 65 20 6d 75 73 74 20 62 65 20  equence must be 
1dde0 64 65 66 69 6e 65 64 20 61 74 20 74 68 69 73 20  defined at this 
1ddf0 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69 66 0a 20  point, even if. 
1de00 20 20 20 2a 2a 20 74 68 65 20 75 73 65 72 20 64     ** the user d
1de10 65 6c 65 74 65 73 20 74 68 65 20 63 6f 6c 6c 61  eletes the colla
1de20 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 61 66  tion sequence af
1de30 74 65 72 20 74 68 65 20 76 64 62 65 20 70 72 6f  ter the vdbe pro
1de40 67 72 61 6d 20 69 73 0a 20 20 20 20 2a 2a 20 63  gram is.    ** c
1de50 6f 6d 70 69 6c 65 64 20 28 74 68 69 73 20 77 61  ompiled (this wa
1de60 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 74 68 65  s not always the
1de70 20 63 61 73 65 29 2e 0a 20 20 20 20 2a 2f 0a 20   case)..    */. 
1de80 20 20 20 61 73 73 65 72 74 28 20 21 70 43 6f 6c     assert( !pCol
1de90 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  l || pColl->xCmp
1dea0 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 43 6f   );..    if( pCo
1deb0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ll ){.      retu
1dec0 72 6e 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65  rn vdbeCompareMe
1ded0 6d 53 74 72 69 6e 67 28 70 4d 65 6d 31 2c 20 70  mString(pMem1, p
1dee0 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20 30 29 3b  Mem2, pColl, 0);
1def0 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 66  .    }.    /* If
1df00 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20   a NULL pointer 
1df10 77 61 73 20 70 61 73 73 65 64 20 61 73 20 74 68  was passed as th
1df20 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e 63 74 69  e collate functi
1df30 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  on, fall through
1df40 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 62  .    ** to the b
1df50 6c 6f 62 20 63 61 73 65 20 61 6e 64 20 75 73 65  lob case and use
1df60 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20   memcmp().  */. 
1df70 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74 68 20 76   }. .  /* Both v
1df80 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 62 6c  alues must be bl
1df90 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65 20 75 73  obs.  Compare us
1dfa0 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a  ing memcmp().  *
1dfb0 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  /.  return sqlit
1dfc0 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70 4d  e3BlobCompare(pM
1dfd0 65 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a 7d 0a 0a  em1, pMem2);.}..
1dfe0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ./*.** The first
1dff0 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
1e000 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
1e010 6e 20 69 73 20 61 20 73 65 72 69 61 6c 2d 74 79  n is a serial-ty
1e020 70 65 20 74 68 61 74 0a 2a 2a 20 63 6f 72 72 65  pe that.** corre
1e030 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 69 6e 74  sponds to an int
1e040 65 67 65 72 20 2d 20 61 6c 6c 20 76 61 6c 75 65  eger - all value
1e050 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20  s between 1 and 
1e060 39 20 69 6e 63 6c 75 73 69 76 65 20 0a 2a 2a 20  9 inclusive .** 
1e070 65 78 63 65 70 74 20 37 2e 20 54 68 65 20 73 65  except 7. The se
1e080 63 6f 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 61  cond points to a
1e090 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
1e0a0 6e 67 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61  ng an integer va
1e0b0 6c 75 65 0a 2a 2a 20 73 65 72 69 61 6c 69 7a 65  lue.** serialize
1e0c0 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 73  d according to s
1e0d0 65 72 69 61 6c 5f 74 79 70 65 2e 20 54 68 69 73  erial_type. This
1e0e0 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69   function deseri
1e0f0 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64 20 72 65  alizes.** and re
1e100 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 2e  turns the value.
1e110 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 76  .*/.static i64 v
1e120 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49  dbeRecordDecodeI
1e130 6e 74 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79  nt(u32 serial_ty
1e140 70 65 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b  pe, const u8 *aK
1e150 65 79 29 7b 0a 20 20 75 33 32 20 79 3b 0a 20 20  ey){.  u32 y;.  
1e160 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
1e170 44 42 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79  DB || (serial_ty
1e180 70 65 3e 3d 31 20 26 26 20 73 65 72 69 61 6c 5f  pe>=1 && serial_
1e190 74 79 70 65 3c 3d 39 20 26 26 20 73 65 72 69 61  type<=9 && seria
1e1a0 6c 5f 74 79 70 65 21 3d 37 29 20 29 3b 0a 20 20  l_type!=7) );.  
1e1b0 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74  switch( serial_t
1e1c0 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
1e1d0 30 3a 0a 20 20 20 20 63 61 73 65 20 31 3a 0a 20  0:.    case 1:. 
1e1e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1e1f0 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1e200 20 20 20 20 20 72 65 74 75 72 6e 20 4f 4e 45 5f       return ONE_
1e210 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1e220 20 20 20 20 63 61 73 65 20 32 3a 0a 20 20 20 20      case 2:.    
1e230 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1e240 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1e250 20 20 72 65 74 75 72 6e 20 54 57 4f 5f 42 59 54    return TWO_BYT
1e260 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1e270 20 63 61 73 65 20 33 3a 0a 20 20 20 20 20 20 74   case 3:.      t
1e280 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d  estcase( aKey[0]
1e290 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72  &0x80 );.      r
1e2a0 65 74 75 72 6e 20 54 48 52 45 45 5f 42 59 54 45  eturn THREE_BYTE
1e2b0 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1e2c0 63 61 73 65 20 34 3a 20 7b 0a 20 20 20 20 20 20  case 4: {.      
1e2d0 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
1e2e0 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
1e2f0 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  y = FOUR_BYTE_UI
1e300 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1e310 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69 6e  return (i64)*(in
1e320 74 2a 29 26 79 3b 0a 20 20 20 20 7d 0a 20 20 20  t*)&y;.    }.   
1e330 20 63 61 73 65 20 35 3a 20 7b 0a 20 20 20 20 20   case 5: {.     
1e340 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
1e350 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
1e360 20 72 65 74 75 72 6e 20 46 4f 55 52 5f 42 59 54   return FOUR_BYT
1e370 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b  E_UINT(aKey+2) +
1e380 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a   (((i64)1)<<32)*
1e390 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  TWO_BYTE_INT(aKe
1e3a0 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  y);.    }.    ca
1e3b0 73 65 20 36 3a 20 7b 0a 20 20 20 20 20 20 75 36  se 6: {.      u6
1e3c0 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  4 x = FOUR_BYTE_
1e3d0 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  UINT(aKey);.    
1e3e0 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1e3f0 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1e400 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20    x = (x<<32) | 
1e410 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
1e420 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 72 65  Key+4);.      re
1e430 74 75 72 6e 20 28 69 36 34 29 2a 28 69 36 34 2a  turn (i64)*(i64*
1e440 29 26 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  )&x;.    }.  }..
1e450 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c    return (serial
1e460 5f 74 79 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a 2f  _type - 8);.}../
1e470 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1e480 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20  on compares the 
1e490 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f  two table rows o
1e4a0 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a  r index records.
1e4b0 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ** specified by 
1e4c0 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61  {nKey1, pKey1} a
1e4d0 6e 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72  nd pPKey2.  It r
1e4e0 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76  eturns a negativ
1e4f0 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f  e, zero.** or po
1e500 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20 69  sitive integer i
1e510 66 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74  f key1 is less t
1e520 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72  han, equal to or
1e530 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61   .** greater tha
1e540 6e 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b  n key2.  The {nK
1e550 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20  ey1, pKey1} key 
1e560 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a  must be a blob.*
1e570 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65  * created by the
1e580 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
1e590 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42  pcode of the VDB
1e5a0 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a  E.  The pPKey2.*
1e5b0 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20  * key must be a 
1e5c0 70 61 72 73 65 64 20 6b 65 79 20 73 75 63 68 20  parsed key such 
1e5d0 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
1e5e0 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50  .** sqlite3VdbeP
1e5f0 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a  arseRecord..**.*
1e600 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 53  * If argument bS
1e610 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  kip is non-zero,
1e620 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
1e630 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
1e640 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 64 65  as already.** de
1e650 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68  termined that th
1e660 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f  e first fields o
1e670 66 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 65  f the keys are e
1e680 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31  qual..**.** Key1
1e690 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74   and Key2 do not
1e6a0 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e   have to contain
1e6b0 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
1e6c0 20 6f 66 20 66 69 65 6c 64 73 2e 20 49 66 20 61   of fields. If a
1e6d0 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73 20 74 68  ll .** fields th
1e6e0 61 74 20 61 70 70 65 61 72 20 69 6e 20 62 6f 74  at appear in bot
1e6f0 68 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c  h keys are equal
1e700 2c 20 74 68 65 6e 20 70 50 4b 65 79 32 2d 3e 64  , then pPKey2->d
1e710 65 66 61 75 6c 74 5f 72 63 20 69 73 20 0a 2a 2a  efault_rc is .**
1e720 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
1e730 20 49 66 20 64 61 74 61 62 61 73 65 20 63 6f 72   If database cor
1e740 72 75 70 74 69 6f 6e 20 69 73 20 64 69 73 63 6f  ruption is disco
1e750 76 65 72 65 64 2c 20 73 65 74 20 70 50 4b 65 79  vered, set pPKey
1e760 32 2d 3e 65 72 72 43 6f 64 65 20 74 6f 20 0a 2a  2->errCode to .*
1e770 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  * SQLITE_CORRUPT
1e780 20 61 6e 64 20 72 65 74 75 72 6e 20 30 2e 20 49   and return 0. I
1e790 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69  f an OOM error i
1e7a0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 0a  s encountered, .
1e7b0 2a 2a 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f  ** pPKey2->errCo
1e7c0 64 65 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  de is set to SQL
1e7d0 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 2c 20 69  ITE_NOMEM and, i
1e7e0 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  f it is not NULL
1e7f0 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d  , the.** malloc-
1e800 66 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74 20  failed flag set 
1e810 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  on database hand
1e820 6c 65 20 28 70 50 4b 65 79 32 2d 3e 70 4b 65 79  le (pPKey2->pKey
1e830 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a 69 6e  Info->db)..*/.in
1e840 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  t sqlite3VdbeRec
1e850 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b  ordCompareWithSk
1e860 69 70 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  ip(.  int nKey1,
1e870 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
1e880 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65  y1,   /* Left ke
1e890 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
1e8a0 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 20  ecord *pPKey2,  
1e8b0 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
1e8c0 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 53 6b  key */.  int bSk
1e8d0 69 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ip              
1e8e0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
1e8f0 72 75 65 2c 20 73 6b 69 70 20 74 68 65 20 66 69  rue, skip the fi
1e900 72 73 74 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a  rst field */.){.
1e910 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20    u32 d1;       
1e920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e930 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
1e940 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
1e950 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  data element */.
1e960 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
1e970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e980 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65    /* Index of ne
1e990 78 74 20 66 69 65 6c 64 20 74 6f 20 63 6f 6d 70  xt field to comp
1e9a0 61 72 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  are */.  u32 szH
1e9b0 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  dr1;            
1e9c0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1e9d0 20 6f 66 20 72 65 63 6f 72 64 20 68 65 61 64 65   of record heade
1e9e0 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  r in bytes */.  
1e9f0 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20  u32 idx1;       
1ea00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea10 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72  /* Offset of fir
1ea20 73 74 20 74 79 70 65 20 69 6e 20 68 65 61 64 65  st type in heade
1ea30 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  r */.  int rc = 
1ea40 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1ea50 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1ea60 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d 20   value */.  Mem 
1ea70 2a 70 52 68 73 20 3d 20 70 50 4b 65 79 32 2d 3e  *pRhs = pPKey2->
1ea80 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 4e  aMem;       /* N
1ea90 65 78 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b  ext field of pPK
1eaa0 65 79 32 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a  ey2 to compare *
1eab0 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
1eac0 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e  yInfo = pPKey2->
1ead0 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 63 6f 6e 73  pKeyInfo;.  cons
1eae0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1eaf0 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20  *aKey1 = (const 
1eb00 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
1eb10 70 4b 65 79 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d  pKey1;.  Mem mem
1eb20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 62 53 6b 69  1;..  /* If bSki
1eb30 70 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  p is true, then 
1eb40 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  the caller has a
1eb50 6c 72 65 61 64 79 20 64 65 74 65 72 6d 69 6e 65  lready determine
1eb60 64 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74  d that the first
1eb70 0a 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e  .  ** two elemen
1eb80 74 73 20 69 6e 20 74 68 65 20 6b 65 79 73 20 61  ts in the keys a
1eb90 72 65 20 65 71 75 61 6c 2e 20 46 69 78 20 74 68  re equal. Fix th
1eba0 65 20 76 61 72 69 6f 75 73 20 73 74 61 63 6b 20  e various stack 
1ebb0 76 61 72 69 61 62 6c 65 73 20 73 6f 0a 20 20 2a  variables so.  *
1ebc0 2a 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74  * that this rout
1ebd0 69 6e 65 20 62 65 67 69 6e 73 20 63 6f 6d 70 61  ine begins compa
1ebe0 72 69 6e 67 20 61 74 20 74 68 65 20 73 65 63 6f  ring at the seco
1ebf0 6e 64 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 69  nd field. */.  i
1ec00 66 28 20 62 53 6b 69 70 20 29 7b 0a 20 20 20 20  f( bSkip ){.    
1ec10 75 33 32 20 73 31 3b 0a 20 20 20 20 69 64 78 31  u32 s1;.    idx1
1ec20 20 3d 20 31 20 2b 20 67 65 74 56 61 72 69 6e 74   = 1 + getVarint
1ec30 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 31  32(&aKey1[1], s1
1ec40 29 3b 0a 20 20 20 20 73 7a 48 64 72 31 20 3d 20  );.    szHdr1 = 
1ec50 61 4b 65 79 31 5b 30 5d 3b 0a 20 20 20 20 64 31  aKey1[0];.    d1
1ec60 20 3d 20 73 7a 48 64 72 31 20 2b 20 73 71 6c 69   = szHdr1 + sqli
1ec70 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
1ec80 65 4c 65 6e 28 73 31 29 3b 0a 20 20 20 20 69 20  eLen(s1);.    i 
1ec90 3d 20 31 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b  = 1;.    pRhs++;
1eca0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64  .  }else{.    id
1ecb0 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x1 = getVarint32
1ecc0 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b  (aKey1, szHdr1);
1ecd0 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31  .    d1 = szHdr1
1ece0 3b 0a 20 20 20 20 69 66 28 20 64 31 3e 28 75 6e  ;.    if( d1>(un
1ecf0 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 20  signed)nKey1 ){ 
1ed00 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65  .      pPKey2->e
1ed10 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c  rrCode = (u8)SQL
1ed20 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1ed30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
1ed40 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e  ;  /* Corruption
1ed50 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 20   */.    }.    i 
1ed60 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 56 56 41 5f  = 0;.  }..  VVA_
1ed70 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  ONLY( mem1.szMal
1ed80 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e  loc = 0; ) /* On
1ed90 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73  ly needed by ass
1eda0 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1edb0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
1edc0 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
1edd0 6e 46 69 65 6c 64 2b 70 50 4b 65 79 32 2d 3e 70  nField+pPKey2->p
1ede0 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64  KeyInfo->nXField
1edf0 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  >=pPKey2->nField
1ee00 20 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52   .       || CORR
1ee10 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  UPT_DB );.  asse
1ee20 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  rt( pPKey2->pKey
1ee30 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
1ee40 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
1ee50 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1ee60 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20  o->nField>0 );. 
1ee70 20 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73   assert( idx1<=s
1ee80 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54  zHdr1 || CORRUPT
1ee90 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20  _DB );.  do{.   
1eea0 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
1eeb0 3b 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  ;..    /* RHS is
1eec0 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20   an integer */. 
1eed0 20 20 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61     if( pRhs->fla
1eee0 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a  gs & MEM_Int ){.
1eef0 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70        serial_typ
1ef00 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b  e = aKey1[idx1];
1ef10 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1ef20 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32   serial_type==12
1ef30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   );.      if( se
1ef40 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b  rial_type>=10 ){
1ef50 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31  .        rc = +1
1ef60 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1ef70 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30  ( serial_type==0
1ef80 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1ef90 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
1efa0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1efb0 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==7 ){.        s
1efc0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1efd0 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  Get(&aKey1[d1], 
1efe0 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65  serial_type, &me
1eff0 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  m1);.        rc 
1f000 3d 20 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f  = -sqlite3IntFlo
1f010 61 74 43 6f 6d 70 61 72 65 28 70 52 68 73 2d 3e  atCompare(pRhs->
1f020 75 2e 69 2c 20 6d 65 6d 31 2e 75 2e 72 29 3b 0a  u.i, mem1.u.r);.
1f030 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f040 20 20 20 20 20 69 36 34 20 6c 68 73 20 3d 20 76       i64 lhs = v
1f050 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49  dbeRecordDecodeI
1f060 6e 74 28 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  nt(serial_type, 
1f070 26 61 4b 65 79 31 5b 64 31 5d 29 3b 0a 20 20 20  &aKey1[d1]);.   
1f080 20 20 20 20 20 69 36 34 20 72 68 73 20 3d 20 70       i64 rhs = p
1f090 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20  Rhs->u.i;.      
1f0a0 20 20 69 66 28 20 6c 68 73 3c 72 68 73 20 29 7b    if( lhs<rhs ){
1f0b0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1f0c0 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  -1;.        }els
1f0d0 65 20 69 66 28 20 6c 68 73 3e 72 68 73 20 29 7b  e if( lhs>rhs ){
1f0e0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1f0f0 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  +1;.        }.  
1f100 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1f110 20 2f 2a 20 52 48 53 20 69 73 20 72 65 61 6c 20   /* RHS is real 
1f120 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  */.    else if( 
1f130 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pRhs->flags & ME
1f140 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20  M_Real ){.      
1f150 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b  serial_type = aK
1f160 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20  ey1[idx1];.     
1f170 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1f180 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20  >=10 ){.        
1f190 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 73 20  /* Serial types 
1f1a0 31 32 20 6f 72 20 67 72 65 61 74 65 72 20 61 72  12 or greater ar
1f1b0 65 20 73 74 72 69 6e 67 73 20 61 6e 64 20 62 6c  e strings and bl
1f1c0 6f 62 73 20 28 67 72 65 61 74 65 72 20 74 68 61  obs (greater tha
1f1d0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  n.        ** num
1f1e0 62 65 72 73 29 2e 20 54 79 70 65 73 20 31 30 20  bers). Types 10 
1f1f0 61 6e 64 20 31 31 20 61 72 65 20 63 75 72 72 65  and 11 are curre
1f200 6e 74 6c 79 20 22 72 65 73 65 72 76 65 64 20 66  ntly "reserved f
1f210 6f 72 20 66 75 74 75 72 65 20 0a 20 20 20 20 20  or future .     
1f220 20 20 20 2a 2a 20 75 73 65 22 2c 20 73 6f 20 69     ** use", so i
1f230 74 20 64 6f 65 73 6e 27 74 20 72 65 61 6c 6c 79  t doesn't really
1f240 20 6d 61 74 74 65 72 20 77 68 61 74 20 74 68 65   matter what the
1f250 20 72 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70   results of comp
1f260 61 72 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  aring.        **
1f270 20 74 68 65 6d 20 74 6f 20 6e 75 6d 62 65 72 69   them to numberi
1f280 63 20 76 61 6c 75 65 73 20 61 72 65 2e 20 20 2a  c values are.  *
1f290 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b  /.        rc = +
1f2a0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
1f2b0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
1f2c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
1f2d0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
1f2e0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
1f2f0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1f300 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69  &aKey1[d1], seri
1f310 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b  al_type, &mem1);
1f320 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 65 72  .        if( ser
1f330 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20  ial_type==7 ){. 
1f340 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d           if( mem
1f350 31 2e 75 2e 72 3c 70 52 68 73 2d 3e 75 2e 72 20  1.u.r<pRhs->u.r 
1f360 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1f370 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  c = -1;.        
1f380 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 31    }else if( mem1
1f390 2e 75 2e 72 3e 70 52 68 73 2d 3e 75 2e 72 20 29  .u.r>pRhs->u.r )
1f3a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
1f3b0 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 20   = +1;.         
1f3c0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
1f3d0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1f3e0 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74   sqlite3IntFloat
1f3f0 43 6f 6d 70 61 72 65 28 6d 65 6d 31 2e 75 2e 69  Compare(mem1.u.i
1f400 2c 20 70 52 68 73 2d 3e 75 2e 72 29 3b 0a 20 20  , pRhs->u.r);.  
1f410 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1f420 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48      }..    /* RH
1f430 53 20 69 73 20 61 20 73 74 72 69 6e 67 20 2a 2f  S is a string */
1f440 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52  .    else if( pR
1f450 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
1f460 53 74 72 20 29 7b 0a 20 20 20 20 20 20 67 65 74  Str ){.      get
1f470 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b  Varint32(&aKey1[
1f480 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  idx1], serial_ty
1f490 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  pe);.      testc
1f4a0 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ase( serial_type
1f4b0 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66  ==12 );.      if
1f4c0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32  ( serial_type<12
1f4d0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1f4e0 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
1f4f0 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79   if( !(serial_ty
1f500 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20  pe & 0x01) ){.  
1f510 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20        rc = +1;. 
1f520 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f530 20 20 20 20 6d 65 6d 31 2e 6e 20 3d 20 28 73 65      mem1.n = (se
1f540 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20  rial_type - 12) 
1f550 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73  / 2;.        tes
1f560 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e  tcase( (d1+mem1.
1f570 6e 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b  n)==(unsigned)nK
1f580 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ey1 );.        t
1f590 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d  estcase( (d1+mem
1f5a0 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65  1.n+1)==(unsigne
1f5b0 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20  d)nKey1 );.     
1f5c0 20 20 20 69 66 28 20 28 64 31 2b 6d 65 6d 31 2e     if( (d1+mem1.
1f5d0 6e 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e  n) > (unsigned)n
1f5e0 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20  Key1 ){.        
1f5f0 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64    pPKey2->errCod
1f600 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43  e = (u8)SQLITE_C
1f610 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1f620 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
1f630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f640 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  /* Corruption */
1f650 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1f660 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  f( pKeyInfo->aCo
1f670 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20  ll[i] ){.       
1f680 20 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b     mem1.enc = pK
1f690 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20  eyInfo->enc;.   
1f6a0 20 20 20 20 20 20 20 6d 65 6d 31 2e 64 62 20 3d         mem1.db =
1f6b0 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20   pKeyInfo->db;. 
1f6c0 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 66 6c           mem1.fl
1f6d0 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20  ags = MEM_Str;. 
1f6e0 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 7a 20           mem1.z 
1f6f0 3d 20 28 63 68 61 72 2a 29 26 61 4b 65 79 31 5b  = (char*)&aKey1[
1f700 64 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72  d1];.          r
1f710 63 20 3d 20 76 64 62 65 43 6f 6d 70 61 72 65 4d  c = vdbeCompareM
1f720 65 6d 53 74 72 69 6e 67 28 0a 20 20 20 20 20 20  emString(.      
1f730 20 20 20 20 20 20 20 20 26 6d 65 6d 31 2c 20 70          &mem1, p
1f740 52 68 73 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  Rhs, pKeyInfo->a
1f750 43 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b 65 79 32  Coll[i], &pPKey2
1f760 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20  ->errCode.      
1f770 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d      );.        }
1f780 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1f790 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d  int nCmp = MIN(m
1f7a0 65 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b  em1.n, pRhs->n);
1f7b0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1f7c0 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31  memcmp(&aKey1[d1
1f7d0 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70  ], pRhs->z, nCmp
1f7e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1f7f0 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6d 65   rc==0 ) rc = me
1f800 6d 31 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b 20  m1.n - pRhs->n; 
1f810 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1f820 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1f830 20 52 48 53 20 69 73 20 61 20 62 6c 6f 62 20 2a   RHS is a blob *
1f840 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70  /.    else if( p
1f850 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Rhs->flags & MEM
1f860 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 61  _Blob ){.      a
1f870 73 73 65 72 74 28 20 28 70 52 68 73 2d 3e 66 6c  ssert( (pRhs->fl
1f880 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d  ags & MEM_Zero)=
1f890 3d 30 20 7c 7c 20 70 52 68 73 2d 3e 6e 3d 3d 30  =0 || pRhs->n==0
1f8a0 20 29 3b 0a 20 20 20 20 20 20 67 65 74 56 61 72   );.      getVar
1f8b0 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78  int32(&aKey1[idx
1f8c0 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29  1], serial_type)
1f8d0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f8e0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31  ( serial_type==1
1f8f0 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  2 );.      if( s
1f900 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c 7c  erial_type<12 ||
1f910 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20   (serial_type & 
1f920 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20  0x01) ){.       
1f930 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1f940 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
1f950 6e 74 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61  nt nStr = (seria
1f960 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32  l_type - 12) / 2
1f970 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1f980 73 65 28 20 28 64 31 2b 6e 53 74 72 29 3d 3d 28  se( (d1+nStr)==(
1f990 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1f9a0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1f9b0 73 65 28 20 28 64 31 2b 6e 53 74 72 2b 31 29 3d  se( (d1+nStr+1)=
1f9c0 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
1f9d0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1f9e0 28 64 31 2b 6e 53 74 72 29 20 3e 20 28 75 6e 73  (d1+nStr) > (uns
1f9f0 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20  igned)nKey1 ){. 
1fa00 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d           pPKey2-
1fa10 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53  >errCode = (u8)S
1fa20 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1fa30 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  PT;.          re
1fa40 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1fa50 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70         /* Corrup
1fa60 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
1fa70 7d 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e  }else if( pRhs->
1fa80 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
1fa90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
1faa0 28 20 21 69 73 41 6c 6c 5a 65 72 6f 28 28 63 6f  ( !isAllZero((co
1fab0 6e 73 74 20 63 68 61 72 2a 29 26 61 4b 65 79 31  nst char*)&aKey1
1fac0 5b 64 31 5d 2c 6e 53 74 72 29 20 29 7b 0a 20 20  [d1],nStr) ){.  
1fad0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
1fae0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
1faf0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
1fb00 63 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d  c = nStr - pRhs-
1fb10 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20  >u.nZero;.      
1fb20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
1fb30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
1fb40 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 53  nt nCmp = MIN(nS
1fb50 74 72 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20  tr, pRhs->n);.  
1fb60 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d          rc = mem
1fb70 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  cmp(&aKey1[d1], 
1fb80 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a  pRhs->z, nCmp);.
1fb90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1fba0 3d 3d 30 20 29 20 72 63 20 3d 20 6e 53 74 72 20  ==0 ) rc = nStr 
1fbb0 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20 20 20 20 20  - pRhs->n;.     
1fbc0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1fbd0 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69   }..    /* RHS i
1fbe0 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c  s null */.    el
1fbf0 73 65 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c  se{.      serial
1fc00 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64  _type = aKey1[id
1fc10 78 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  x1];.      rc = 
1fc20 28 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 30 29  (serial_type!=0)
1fc30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1fc40 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
1fc50 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  if( pKeyInfo->aS
1fc60 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20  ortOrder[i] ){. 
1fc70 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b         rc = -rc;
1fc80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
1fc90 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72  ssert( vdbeRecor
1fca0 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b  dCompareDebug(nK
1fcb0 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1fcc0 79 32 2c 20 72 63 29 20 29 3b 0a 20 20 20 20 20  y2, rc) );.     
1fcd0 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a   assert( mem1.sz
1fce0 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a  Malloc==0 );  /*
1fcf0 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c   See comment bel
1fd00 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  ow */.      retu
1fd10 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
1fd20 20 20 69 2b 2b 3b 0a 20 20 20 20 70 52 68 73 2b    i++;.    pRhs+
1fd30 2b 3b 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c  +;.    d1 += sql
1fd40 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1fd50 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
1fd60 65 29 3b 0a 20 20 20 20 69 64 78 31 20 2b 3d 20  e);.    idx1 += 
1fd70 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e  sqlite3VarintLen
1fd80 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20  (serial_type);. 
1fd90 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 28 75   }while( idx1<(u
1fda0 6e 73 69 67 6e 65 64 29 73 7a 48 64 72 31 20 26  nsigned)szHdr1 &
1fdb0 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65  & i<pPKey2->nFie
1fdc0 6c 64 20 26 26 20 64 31 3c 3d 28 75 6e 73 69 67  ld && d1<=(unsig
1fdd0 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 0a 20 20  ned)nKey1 );..  
1fde0 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c  /* No memory all
1fdf0 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20  ocation is ever 
1fe00 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50  used on mem1.  P
1fe10 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a  rove this using.
1fe20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
1fe30 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49 66  ng assert().  If
1fe40 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66 61   the assert() fa
1fe50 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65  ils, it indicate
1fe60 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20  s a.  ** memory 
1fe70 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20  leak and a need 
1fe80 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56  to call sqlite3V
1fe90 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
1fea0 65 6d 31 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65  em1).  */.  asse
1feb0 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  rt( mem1.szMallo
1fec0 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63  c==0 );..  /* rc
1fed0 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74  ==0 here means t
1fee0 68 61 74 20 6f 6e 65 20 6f 72 20 62 6f 74 68 20  hat one or both 
1fef0 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20  of the keys ran 
1ff00 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e  out of fields an
1ff10 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66  d.  ** all the f
1ff20 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74  ields up to that
1ff30 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61   point were equa
1ff40 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  l. Return the de
1ff50 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61  fault_rc.  ** va
1ff60 6c 75 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  lue.  */.  asser
1ff70 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 0a 20  t( CORRUPT_DB . 
1ff80 20 20 20 20 20 20 7c 7c 20 76 64 62 65 52 65 63        || vdbeRec
1ff90 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
1ffa0 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1ffb0 4b 65 79 32 2c 20 70 50 4b 65 79 32 2d 3e 64 65  Key2, pPKey2->de
1ffc0 66 61 75 6c 74 5f 72 63 29 20 0a 20 20 20 20 20  fault_rc) .     
1ffd0 20 20 7c 7c 20 70 4b 65 79 49 6e 66 6f 2d 3e 64    || pKeyInfo->d
1ffe0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a  b->mallocFailed.
1fff0 20 20 29 3b 0a 20 20 70 50 4b 65 79 32 2d 3e 65    );.  pPKey2->e
20000 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 72 65 74  qSeen = 1;.  ret
20010 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  urn pPKey2->defa
20020 75 6c 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  ult_rc;.}.int sq
20030 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
20040 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b  ompare(.  int nK
20050 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
20060 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66  *pKey1,   /* Lef
20070 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63  t key */.  Unpac
20080 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
20090 32 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69  2          /* Ri
200a0 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20  ght key */.){.  
200b0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
200c0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57  beRecordCompareW
200d0 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70  ithSkip(nKey1, p
200e0 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 30 29  Key1, pPKey2, 0)
200f0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
20100 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20   function is an 
20110 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f  optimized versio
20120 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65  n of sqlite3Vdbe
20130 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
20140 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68 65  .** that (a) the
20150 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20   first field of 
20160 70 50 4b 65 79 32 20 69 73 20 61 6e 20 69 6e 74  pPKey2 is an int
20170 65 67 65 72 2c 20 61 6e 64 20 28 62 29 20 74 68  eger, and (b) th
20180 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68 65  e .** size-of-he
20190 61 64 65 72 20 76 61 72 69 6e 74 20 61 74 20 74  ader varint at t
201a0 68 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65  he start of (pKe
201b0 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69  y1/nKey1) fits i
201c0 6e 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 62 79  n a single.** by
201d0 74 65 20 28 69 2e 65 2e 20 69 73 20 6c 65 73 73  te (i.e. is less
201e0 20 74 68 61 6e 20 31 32 38 29 2e 0a 2a 2a 0a 2a   than 128)..**.*
201f0 2a 20 54 6f 20 61 76 6f 69 64 20 63 6f 6e 63 65  * To avoid conce
20200 72 6e 73 20 61 62 6f 75 74 20 62 75 66 66 65 72  rns about buffer
20210 20 6f 76 65 72 72 65 61 64 73 2c 20 74 68 69 73   overreads, this
20220 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
20230 20 75 73 65 64 0a 2a 2a 20 6f 6e 20 73 63 68 65   used.** on sche
20240 6d 61 73 20 77 68 65 72 65 20 74 68 65 20 6d 61  mas where the ma
20250 78 69 6d 75 6d 20 76 61 6c 69 64 20 68 65 61 64  ximum valid head
20260 65 72 20 73 69 7a 65 20 69 73 20 36 33 20 62 79  er size is 63 by
20270 74 65 73 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a  tes or less..*/.
20280 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52  static int vdbeR
20290 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28  ecordCompareInt(
202a0 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
202b0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
202c0 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
202d0 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
202e0 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20   *pPKey2        
202f0 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
20300 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  ){.  const u8 *a
20310 4b 65 79 20 3d 20 26 28 28 63 6f 6e 73 74 20 75  Key = &((const u
20320 38 2a 29 70 4b 65 79 31 29 5b 2a 28 63 6f 6e 73  8*)pKey1)[*(cons
20330 74 20 75 38 2a 29 70 4b 65 79 31 20 26 20 30 78  t u8*)pKey1 & 0x
20340 33 46 5d 3b 0a 20 20 69 6e 74 20 73 65 72 69 61  3F];.  int seria
20350 6c 5f 74 79 70 65 20 3d 20 28 28 63 6f 6e 73 74  l_type = ((const
20360 20 75 38 2a 29 70 4b 65 79 31 29 5b 31 5d 3b 0a   u8*)pKey1)[1];.
20370 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 75 33 32    int res;.  u32
20380 20 79 3b 0a 20 20 75 36 34 20 78 3b 0a 20 20 69   y;.  u64 x;.  i
20390 36 34 20 76 3b 0a 20 20 69 36 34 20 6c 68 73 3b  64 v;.  i64 lhs;
203a0 0a 0a 20 20 76 64 62 65 41 73 73 65 72 74 46 69  ..  vdbeAssertFi
203b0 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69  eldCountWithinLi
203c0 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79  mits(nKey1, pKey
203d0 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  1, pPKey2->pKeyI
203e0 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nfo);.  assert( 
203f0 28 2a 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d 30  (*(u8*)pKey1)<=0
20400 78 33 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  x3F || CORRUPT_D
20410 42 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73  B );.  switch( s
20420 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20  erial_type ){.  
20430 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31    case 1: { /* 1
20440 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
20450 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68  eger */.      lh
20460 73 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54  s = ONE_BYTE_INT
20470 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65  (aKey);.      te
20480 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
20490 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
204a0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20    }.    case 2: 
204b0 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e  { /* 2-byte sign
204c0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
204d0 20 20 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42 59      lhs = TWO_BY
204e0 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
204f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
20500 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
20510 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
20520 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74  se 3: { /* 3-byt
20530 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
20540 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   */.      lhs = 
20550 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61  THREE_BYTE_INT(a
20560 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
20570 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
20580 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20590 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20  }.    case 4: { 
205a0 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 4-byte signed
205b0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
205c0 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f    y = FOUR_BYTE_
205d0 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  UINT(aKey);.    
205e0 20 20 6c 68 73 20 3d 20 28 69 36 34 29 2a 28 69    lhs = (i64)*(i
205f0 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20 20 74 65  nt*)&y;.      te
20600 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
20610 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
20620 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20    }.    case 5: 
20630 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e  { /* 6-byte sign
20640 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
20650 20 20 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f 42      lhs = FOUR_B
20660 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29  YTE_UINT(aKey+2)
20670 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32   + (((i64)1)<<32
20680 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61  )*TWO_BYTE_INT(a
20690 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
206a0 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
206b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
206c0 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b 20  }.    case 6: { 
206d0 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 8-byte signed
206e0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
206f0 20 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f    x = FOUR_BYTE_
20700 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  UINT(aKey);.    
20710 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20    x = (x<<32) | 
20720 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
20730 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c 68  Key+4);.      lh
20740 73 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20  s = *(i64*)&x;. 
20750 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
20760 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
20770 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
20780 61 73 65 20 38 3a 20 0a 20 20 20 20 20 20 6c 68  ase 8: .      lh
20790 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  s = 0;.      bre
207a0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 39 3a 0a  ak;.    case 9:.
207b0 20 20 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a 20        lhs = 1;. 
207c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
207d0 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 63 6f   /* This case co
207e0 75 6c 64 20 62 65 20 72 65 6d 6f 76 65 64 20 77  uld be removed w
207f0 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20  ithout changing 
20800 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 72  the results of r
20810 75 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  unning.    ** th
20820 69 73 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64 69  is code. Includi
20830 6e 67 20 69 74 20 63 61 75 73 65 73 20 67 63 63  ng it causes gcc
20840 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 66   to generate a f
20850 61 73 74 65 72 20 73 77 69 74 63 68 20 0a 20 20  aster switch .  
20860 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28    ** statement (
20870 73 69 6e 63 65 20 74 68 65 20 72 61 6e 67 65 20  since the range 
20880 6f 66 20 73 77 69 74 63 68 20 74 61 72 67 65 74  of switch target
20890 73 20 6e 6f 77 20 73 74 61 72 74 73 20 61 74 20  s now starts at 
208a0 7a 65 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a 20  zero and.    ** 
208b0 69 73 20 63 6f 6e 74 69 67 75 6f 75 73 29 20 62  is contiguous) b
208c0 75 74 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73  ut does not caus
208d0 65 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65 20  e any duplicate 
208e0 63 6f 64 65 20 74 6f 20 62 65 20 67 65 6e 65 72  code to be gener
208f0 61 74 65 64 0a 20 20 20 20 2a 2a 20 28 61 73 20  ated.    ** (as 
20900 67 63 63 20 69 73 20 63 6c 65 76 65 72 20 65 6e  gcc is clever en
20910 6f 75 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65 20  ough to combine 
20920 74 68 65 20 74 77 6f 20 6c 69 6b 65 20 63 61 73  the two like cas
20930 65 73 29 2e 20 4f 74 68 65 72 20 0a 20 20 20 20  es). Other .    
20940 2a 2a 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69 67  ** compilers mig
20950 68 74 20 62 65 20 73 69 6d 69 6c 61 72 2e 20 20  ht be similar.  
20960 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 30 3a 20  */ .    case 0: 
20970 63 61 73 65 20 37 3a 0a 20 20 20 20 20 20 72 65  case 7:.      re
20980 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
20990 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b  RecordCompare(nK
209a0 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
209b0 79 32 29 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c  y2);..    defaul
209c0 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
209d0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
209e0 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20  dCompare(nKey1, 
209f0 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a  pKey1, pPKey2);.
20a00 20 20 7d 0a 0a 20 20 76 20 3d 20 70 50 4b 65 79    }..  v = pPKey
20a10 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a  2->aMem[0].u.i;.
20a20 20 20 69 66 28 20 76 3e 6c 68 73 20 29 7b 0a 20    if( v>lhs ){. 
20a30 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
20a40 3e 72 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  >r1;.  }else if(
20a50 20 76 3c 6c 68 73 20 29 7b 0a 20 20 20 20 72 65   v<lhs ){.    re
20a60 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a  s = pPKey2->r2;.
20a70 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 4b 65    }else if( pPKe
20a80 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a  y2->nField>1 ){.
20a90 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74      /* The first
20aa0 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74   fields of the t
20ab0 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75 61  wo keys are equa
20ac0 6c 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74  l. Compare the t
20ad0 72 61 69 6c 69 6e 67 20 0a 20 20 20 20 2a 2a 20  railing .    ** 
20ae0 66 69 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 20 20  fields.  */.    
20af0 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
20b00 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69  eRecordCompareWi
20b10 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b  thSkip(nKey1, pK
20b20 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b  ey1, pPKey2, 1);
20b30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
20b40 20 54 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   The first field
20b50 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79  s of the two key
20b60 73 20 61 72 65 20 65 71 75 61 6c 20 61 6e 64 20  s are equal and 
20b70 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74 72 61  there are no tra
20b80 69 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 66 69 65  iling.    ** fie
20b90 6c 64 73 2e 20 52 65 74 75 72 6e 20 70 50 4b 65  lds. Return pPKe
20ba0 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69  y2->default_rc i
20bb0 6e 20 74 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a  n this case. */.
20bc0 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
20bd0 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20  ->default_rc;.  
20be0 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e    pPKey2->eqSeen
20bf0 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 61 73 73   = 1;.  }..  ass
20c00 65 72 74 28 20 76 64 62 65 52 65 63 6f 72 64 43  ert( vdbeRecordC
20c10 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79  ompareDebug(nKey
20c20 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
20c30 2c 20 72 65 73 29 20 29 3b 0a 20 20 72 65 74 75  , res) );.  retu
20c40 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn res;.}../*.**
20c50 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
20c60 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76  s an optimized v
20c70 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  ersion of sqlite
20c80 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
20c90 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61  re() .** that (a
20ca0 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  ) the first fiel
20cb0 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61  d of pPKey2 is a
20cc0 20 73 74 72 69 6e 67 2c 20 74 68 61 74 20 28 62   string, that (b
20cd0 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  ) the first fiel
20ce0 64 0a 2a 2a 20 75 73 65 73 20 74 68 65 20 63 6f  d.** uses the co
20cf0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
20d00 20 42 49 4e 41 52 59 20 61 6e 64 20 28 63 29 20   BINARY and (c) 
20d10 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66  that the size-of
20d20 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 0a  -header varint .
20d30 2a 2a 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ** at the start 
20d40 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29  of (pKey1/nKey1)
20d50 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c   fits in a singl
20d60 65 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  e byte..*/.stati
20d70 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64  c int vdbeRecord
20d80 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 0a 20  CompareString(. 
20d90 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
20da0 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f  t void *pKey1, /
20db0 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
20dc0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
20dd0 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a  pPKey2        /*
20de0 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b   Right key */.){
20df0 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65  .  const u8 *aKe
20e00 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29  y1 = (const u8*)
20e10 70 4b 65 79 31 3b 0a 20 20 69 6e 74 20 73 65 72  pKey1;.  int ser
20e20 69 61 6c 5f 74 79 70 65 3b 0a 20 20 69 6e 74 20  ial_type;.  int 
20e30 72 65 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  res;..  assert( 
20e40 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e  pPKey2->aMem[0].
20e50 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
20e60 29 3b 0a 20 20 76 64 62 65 41 73 73 65 72 74 46  );.  vdbeAssertF
20e70 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c  ieldCountWithinL
20e80 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65  imits(nKey1, pKe
20e90 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  y1, pPKey2->pKey
20ea0 49 6e 66 6f 29 3b 0a 20 20 67 65 74 56 61 72 69  Info);.  getVari
20eb0 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20  nt32(&aKey1[1], 
20ec0 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
20ed0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
20ee0 31 32 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  12 ){.    res = 
20ef0 70 50 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20 20  pPKey2->r1;     
20f00 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31   /* (pKey1/nKey1
20f10 29 20 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 72  ) is a number or
20f20 20 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c   a null */.  }el
20f30 73 65 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f  se if( !(serial_
20f40 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 20  type & 0x01) ){ 
20f50 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79  .    res = pPKey
20f60 32 2d 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20 28  2->r2;      /* (
20f70 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20  pKey1/nKey1) is 
20f80 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73  a blob */.  }els
20f90 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b  e{.    int nCmp;
20fa0 0a 20 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a 20  .    int nStr;. 
20fb0 20 20 20 69 6e 74 20 73 7a 48 64 72 20 3d 20 61     int szHdr = a
20fc0 4b 65 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53  Key1[0];..    nS
20fd0 74 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  tr = (serial_typ
20fe0 65 2d 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 69  e-12) / 2;.    i
20ff0 66 28 20 28 73 7a 48 64 72 20 2b 20 6e 53 74 72  f( (szHdr + nStr
21000 29 20 3e 20 6e 4b 65 79 31 20 29 7b 0a 20 20 20  ) > nKey1 ){.   
21010 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f     pPKey2->errCo
21020 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f  de = (u8)SQLITE_
21030 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
21040 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
21050 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a   /* Corruption *
21060 2f 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6d 70  /.    }.    nCmp
21070 20 3d 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d 3e   = MIN( pPKey2->
21080 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20  aMem[0].n, nStr 
21090 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 6d 65 6d  );.    res = mem
210a0 63 6d 70 28 26 61 4b 65 79 31 5b 73 7a 48 64 72  cmp(&aKey1[szHdr
210b0 5d 2c 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b  ], pPKey2->aMem[
210c0 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20  0].z, nCmp);..  
210d0 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
210e0 20 20 20 20 20 20 72 65 73 20 3d 20 6e 53 74 72        res = nStr
210f0 20 2d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b   - pPKey2->aMem[
21100 30 5d 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  0].n;.      if( 
21110 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
21120 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46    if( pPKey2->nF
21130 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20 20  ield>1 ){.      
21140 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65      res = sqlite
21150 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
21160 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31  reWithSkip(nKey1
21170 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
21180 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   1);.        }el
21190 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65  se{.          re
211a0 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  s = pPKey2->defa
211b0 75 6c 74 5f 72 63 3b 0a 20 20 20 20 20 20 20 20  ult_rc;.        
211c0 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e    pPKey2->eqSeen
211d0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
211e0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
211f0 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  res>0 ){.       
21200 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
21210 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  2;.      }else{.
21220 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50          res = pP
21230 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 20 20  Key2->r1;.      
21240 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
21250 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  res>0 ){.      r
21260 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b  es = pPKey2->r2;
21270 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21280 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
21290 72 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r1;.    }.  }.. 
212a0 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63   assert( vdbeRec
212b0 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
212c0 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
212d0 4b 65 79 32 2c 20 72 65 73 29 0a 20 20 20 20 20  Key2, res).     
212e0 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 0a    || CORRUPT_DB.
212f0 20 20 20 20 20 20 20 7c 7c 20 70 50 4b 65 79 32         || pPKey2
21300 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e  ->pKeyInfo->db->
21310 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29  mallocFailed.  )
21320 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
21330 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
21340 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
21350 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
21360 64 43 6f 6d 70 61 72 65 28 29 20 63 6f 6d 70 61  dCompare() compa
21370 74 69 62 6c 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  tible function.*
21380 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 63  * suitable for c
21390 6f 6d 70 61 72 69 6e 67 20 73 65 72 69 61 6c 69  omparing seriali
213a0 7a 65 64 20 72 65 63 6f 72 64 73 20 74 6f 20 74  zed records to t
213b0 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f  he unpacked reco
213c0 72 64 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20  rd passed.** as 
213d0 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
213e0 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f 6d 70  t..*/.RecordComp
213f0 61 72 65 20 73 71 6c 69 74 65 33 56 64 62 65 46  are sqlite3VdbeF
21400 69 6e 64 43 6f 6d 70 61 72 65 28 55 6e 70 61 63  indCompare(Unpac
21410 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20  kedRecord *p){. 
21420 20 2f 2a 20 76 61 72 69 6e 74 52 65 63 6f 72 64   /* varintRecord
21430 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64  CompareInt() and
21440 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d   varintRecordCom
21450 70 61 72 65 53 74 72 69 6e 67 28 29 20 62 6f 74  pareString() bot
21460 68 20 61 73 73 75 6d 65 0a 20 20 2a 2a 20 74 68  h assume.  ** th
21470 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68  at the size-of-h
21480 65 61 64 65 72 20 76 61 72 69 6e 74 20 74 68 61  eader varint tha
21490 74 20 6f 63 63 75 72 73 20 61 74 20 74 68 65 20  t occurs at the 
214a0 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 72 65  start of each re
214b0 63 6f 72 64 0a 20 20 2a 2a 20 66 69 74 73 20 69  cord.  ** fits i
214c0 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  n a single byte 
214d0 28 69 2e 65 2e 20 69 73 20 31 32 37 20 6f 72 20  (i.e. is 127 or 
214e0 6c 65 73 73 29 2e 20 76 61 72 69 6e 74 52 65 63  less). varintRec
214f0 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 0a  ordCompareInt().
21500 20 20 2a 2a 20 61 6c 73 6f 20 61 73 73 75 6d 65    ** also assume
21510 73 20 74 68 61 74 20 69 74 20 69 73 20 73 61 66  s that it is saf
21520 65 20 74 6f 20 6f 76 65 72 72 65 61 64 20 61 20  e to overread a 
21530 62 75 66 66 65 72 20 62 79 20 61 74 20 6c 65 61  buffer by at lea
21540 73 74 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61 78  st the .  ** max
21550 69 6d 75 6d 20 70 6f 73 73 69 62 6c 65 20 6c 65  imum possible le
21560 67 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20  gal header size 
21570 70 6c 75 73 20 38 20 62 79 74 65 73 2e 20 42 65  plus 8 bytes. Be
21580 63 61 75 73 65 20 74 68 65 72 65 20 69 73 0a 20  cause there is. 
21590 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74   ** guaranteed t
215a0 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20 37 34  o be at least 74
215b0 20 28 62 75 74 20 6e 6f 74 20 31 33 36 29 20 62   (but not 136) b
215c0 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20  ytes of padding 
215d0 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 0a 20  following each. 
215e0 20 2a 2a 20 62 75 66 66 65 72 20 70 61 73 73 65   ** buffer passe
215f0 64 20 74 6f 20 76 61 72 69 6e 74 52 65 63 6f 72  d to varintRecor
21600 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 74 68  dCompareInt() th
21610 69 73 20 6d 61 6b 65 73 20 69 74 20 63 6f 6e 76  is makes it conv
21620 65 6e 69 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 6c  enient to.  ** l
21630 69 6d 69 74 20 74 68 65 20 73 69 7a 65 20 6f 66  imit the size of
21640 20 74 68 65 20 68 65 61 64 65 72 20 74 6f 20 36   the header to 6
21650 34 20 62 79 74 65 73 20 69 6e 20 63 61 73 65 73  4 bytes in cases
21660 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74   where the first
21670 20 66 69 65 6c 64 0a 20 20 2a 2a 20 69 73 20 61   field.  ** is a
21680 6e 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 0a  n integer..  **.
21690 20 20 2a 2a 20 54 68 65 20 65 61 73 69 65 73 74    ** The easiest
216a0 20 77 61 79 20 74 6f 20 65 6e 66 6f 72 63 65 20   way to enforce 
216b0 74 68 69 73 20 6c 69 6d 69 74 20 69 73 20 74 6f  this limit is to
216c0 20 63 6f 6e 73 69 64 65 72 20 6f 6e 6c 79 20 72   consider only r
216d0 65 63 6f 72 64 73 20 77 69 74 68 0a 20 20 2a 2a  ecords with.  **
216e0 20 31 33 20 66 69 65 6c 64 73 20 6f 72 20 6c 65   13 fields or le
216f0 73 73 2e 20 49 66 20 74 68 65 20 66 69 72 73 74  ss. If the first
21700 20 66 69 65 6c 64 20 69 73 20 61 6e 20 69 6e 74   field is an int
21710 65 67 65 72 2c 20 74 68 65 20 6d 61 78 69 6d 75  eger, the maximu
21720 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a 20 68 65 61  m legal.  ** hea
21730 64 65 72 20 73 69 7a 65 20 69 73 20 28 31 32 2a  der size is (12*
21740 35 20 2b 20 31 20 2b 20 31 29 20 62 79 74 65 73  5 + 1 + 1) bytes
21750 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e  .  */.  if( (p->
21760 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
21770 20 2b 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e   + p->pKeyInfo->
21780 6e 58 46 69 65 6c 64 29 3c 3d 31 33 20 29 7b 0a  nXField)<=13 ){.
21790 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
217a0 70 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73  p->aMem[0].flags
217b0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4b 65  ;.    if( p->pKe
217c0 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
217d0 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 70 2d  r[0] ){.      p-
217e0 3e 72 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  >r1 = 1;.      p
217f0 2d 3e 72 32 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  ->r2 = -1;.    }
21800 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72  else{.      p->r
21810 31 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d  1 = -1;.      p-
21820 3e 72 32 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  >r2 = 1;.    }. 
21830 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
21840 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a 20 20 20 20  MEM_Int) ){.    
21850 20 20 72 65 74 75 72 6e 20 76 64 62 65 52 65 63    return vdbeRec
21860 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 3b 0a 20  ordCompareInt;. 
21870 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73     }.    testcas
21880 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  e( flags & MEM_R
21890 65 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  eal );.    testc
218a0 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d  ase( flags & MEM
218b0 5f 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 74 65 73  _Null );.    tes
218c0 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d  tcase( flags & M
218d0 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 69  EM_Blob );.    i
218e0 66 28 20 28 66 6c 61 67 73 20 26 20 28 4d 45 4d  f( (flags & (MEM
218f0 5f 52 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d  _Real|MEM_Null|M
21900 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 26 26 20  EM_Blob))==0 && 
21910 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  p->pKeyInfo->aCo
21920 6c 6c 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  ll[0]==0 ){.    
21930 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 20    assert( flags 
21940 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 20  & MEM_Str );.   
21950 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 52 65     return vdbeRe
21960 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e  cordCompareStrin
21970 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  g;.    }.  }..  
21980 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
21990 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b  beRecordCompare;
219a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70  .}../*.** pCur p
219b0 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65  oints at an inde
219c0 78 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20  x entry created 
219d0 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b  using the OP_Mak
219e0 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a  eRecord opcode..
219f0 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 69  ** Read the rowi
21a00 64 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c  d (the last fiel
21a10 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29  d in the record)
21a20 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e   and store it in
21a30 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75   *rowid..** Retu
21a40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
21a50 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73  everything works
21a60 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  , or an error co
21a70 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a  de otherwise..**
21a80 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20 62  .** pCur might b
21a90 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65  e pointing to te
21aa0 78 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  xt obtained from
21ab0 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
21ac0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20  ase file..** So 
21ad0 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e  the content cann
21ae0 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 20  ot be trusted.  
21af0 44 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  Do appropriate c
21b00 68 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e  hecks on the con
21b10 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tent..*/.int sql
21b20 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64  ite3VdbeIdxRowid
21b30 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42 74  (sqlite3 *db, Bt
21b40 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36  Cursor *pCur, i6
21b50 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34  4 *rowid){.  i64
21b60 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20   nCellKey = 0;. 
21b70 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73   int rc;.  u32 s
21b80 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  zHdr;        /* 
21b90 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  Size of the head
21ba0 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65  er */.  u32 type
21bb0 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72  Rowid;    /* Ser
21bc0 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20  ial type of the 
21bd0 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c  rowid */.  u32 l
21be0 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20  enRowid;     /* 
21bf0 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69  Size of the rowi
21c00 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b  d */.  Mem m, v;
21c10 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73  ..  /* Get the s
21c20 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ize of the index
21c30 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e   entry.  Only in
21c40 64 69 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66  dices entries of
21c50 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20   less.  ** than 
21c60 32 47 69 42 20 61 72 65 20 73 75 70 70 6f 72 74  2GiB are support
21c70 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67   - anything larg
21c80 65 20 6d 75 73 74 20 62 65 20 64 61 74 61 62 61  e must be databa
21c90 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
21ca0 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69   ** Any corrupti
21cb0 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 69  on is detected i
21cc0 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  n sqlite3BtreePa
21cd0 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68  rseCellPtr(), th
21ce0 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68  ough, so.  ** th
21cf0 69 73 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65  is code can safe
21d00 6c 79 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e  ly assume that n
21d10 43 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69  CellKey is 32-bi
21d20 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ts  .  */.  asse
21d30 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
21d40 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43  CursorIsValid(pC
21d50 75 72 29 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65  ur) );.  nCellKe
21d60 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  y = sqlite3Btree
21d70 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72  PayloadSize(pCur
21d80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43  );.  assert( (nC
21d90 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f  ellKey & SQLITE_
21da0 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e  MAX_U32)==(u64)n
21db0 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a  CellKey );..  /*
21dc0 20 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d   Read in the com
21dd0 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66  plete content of
21de0 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
21df0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
21e00 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c  eMemInit(&m, db,
21e10 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   0);.  rc = sqli
21e20 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74  te3VdbeMemFromBt
21e30 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33  ree(pCur, 0, (u3
21e40 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26  2)nCellKey, 1, &
21e50 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  m);.  if( rc ){.
21e60 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
21e70 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64   }..  /* The ind
21e80 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65  ex entry must be
21e90 67 69 6e 20 77 69 74 68 20 61 20 68 65 61 64 65  gin with a heade
21ea0 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69  r size */.  (voi
21eb0 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75  d)getVarint32((u
21ec0 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a  8*)m.z, szHdr);.
21ed0 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64    testcase( szHd
21ee0 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61  r==3 );.  testca
21ef0 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29  se( szHdr==m.n )
21f00 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
21f10 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74  (szHdr<3 || (int
21f20 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20  )szHdr>m.n) ){. 
21f30 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69     goto idx_rowi
21f40 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20  d_corruption;.  
21f50 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73 74  }..  /* The last
21f60 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e   field of the in
21f70 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61 6e  dex should be an
21f80 20 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20 52   integer - the R
21f90 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66  OWID..  ** Verif
21fa0 79 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  y that the last 
21fb0 65 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73 20  entry really is 
21fc0 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  an integer. */. 
21fd0 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74   (void)getVarint
21fe0 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48  32((u8*)&m.z[szH
21ff0 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64  dr-1], typeRowid
22000 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
22010 79 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20  ypeRowid==1 );. 
22020 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
22030 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73  owid==2 );.  tes
22040 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
22050 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==3 );.  testcas
22060 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34 20  e( typeRowid==4 
22070 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
22080 79 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20  ypeRowid==5 );. 
22090 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
220a0 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73  owid==6 );.  tes
220b0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
220c0 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==8 );.  testcas
220d0 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39 20  e( typeRowid==9 
220e0 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
220f0 79 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c  y(typeRowid<1 ||
22100 20 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20   typeRowid>9 || 
22110 74 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b  typeRowid==7) ){
22120 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f  .    goto idx_ro
22130 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a  wid_corruption;.
22140 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d    }.  lenRowid =
22150 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
22160 65 53 69 7a 65 73 5b 74 79 70 65 52 6f 77 69 64  eSizes[typeRowid
22170 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  ];.  testcase( (
22180 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c  u32)m.n==szHdr+l
22190 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28  enRowid );.  if(
221a0 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d   unlikely((u32)m
221b0 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69  .n<szHdr+lenRowi
221c0 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  d) ){.    goto i
221d0 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
221e0 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ion;.  }..  /* F
221f0 65 74 63 68 20 74 68 65 20 69 6e 74 65 67 65 72  etch the integer
22200 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20   off the end of 
22210 74 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64  the index record
22220 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
22230 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29  eSerialGet((u8*)
22240 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69  &m.z[m.n-lenRowi
22250 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26  d], typeRowid, &
22260 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76  v);.  *rowid = v
22270 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56  .u.i;.  sqlite3V
22280 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
22290 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
222a0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  TE_OK;..  /* Jum
222b0 70 20 68 65 72 65 20 69 66 20 64 61 74 61 62 61  p here if databa
222c0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  se corruption is
222d0 20 64 65 74 65 63 74 65 64 20 61 66 74 65 72 20   detected after 
222e0 6d 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20  m has been.  ** 
222f0 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65  allocated.  Free
22300 20 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e   the m object an
22310 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
22320 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f  CORRUPT. */.idx_
22330 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e  rowid_corruption
22340 3a 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e  :.  testcase( m.
22350 73 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20  szMalloc!=0 );. 
22360 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
22370 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
22380 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
22390 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a  UPT_BKPT;.}../*.
223a0 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b  ** Compare the k
223b0 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ey of the index 
223c0 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f  entry that curso
223d0 72 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67  r pC is pointing
223e0 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74   to against.** t
223f0 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e  he key string in
22400 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69   pUnpacked.  Wri
22410 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20  te into *pRes a 
22420 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69  number.** that i
22430 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  s negative, zero
22440 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  , or positive if
22450 20 70 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e   pC is less than
22460 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f  , equal to,.** o
22470 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70  r greater than p
22480 55 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72  Unpacked.  Retur
22490 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
224a0 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55  uccess..**.** pU
224b0 6e 70 61 63 6b 65 64 20 69 73 20 65 69 74 68 65  npacked is eithe
224c0 72 20 63 72 65 61 74 65 64 20 77 69 74 68 6f 75  r created withou
224d0 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20  t a rowid or is 
224e0 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61  truncated so tha
224f0 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68  t it.** omits th
22500 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65  e rowid at the e
22510 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61  nd.  The rowid a
22520 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
22530 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20   index entry.** 
22540 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65  is ignored as we
22550 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73  ll.  Hence, this
22560 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f   routine only co
22570 6d 70 61 72 65 73 20 74 68 65 20 70 72 65 66 69  mpares the prefi
22580 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b  xes .** of the k
22590 65 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65  eys prior to the
225a0 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f   final rowid, no
225b0 74 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  t the entire key
225c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
225d0 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72  VdbeIdxKeyCompar
225e0 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
225f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22600 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
22610 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
22620 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
22630 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22640 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
22650 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69   to compare agai
22660 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  nst */.  Unpacke
22670 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b  dRecord *pUnpack
22680 65 64 2c 20 20 20 20 20 20 20 2f 2a 20 55 6e 70  ed,       /* Unp
22690 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  acked version of
226a0 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 72   key */.  int *r
226b0 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  es              
226c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
226d0 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ite the comparis
226e0 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  on result here *
226f0 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c  /.){.  i64 nCell
22700 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Key = 0;.  int r
22710 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  c;.  BtCursor *p
22720 43 75 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20  Cur;.  Mem m;.. 
22730 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75   assert( pC->eCu
22740 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
22750 54 52 45 45 20 29 3b 0a 20 20 70 43 75 72 20 3d  TREE );.  pCur =
22760 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b   pC->uc.pCursor;
22770 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
22780 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
22790 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20  alid(pCur) );.  
227a0 6e 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74  nCellKey = sqlit
227b0 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69  e3BtreePayloadSi
227c0 7a 65 28 70 43 75 72 29 3b 0a 20 20 2f 2a 20 6e  ze(pCur);.  /* n
227d0 43 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77  CellKey will alw
227e0 61 79 73 20 62 65 20 62 65 74 77 65 65 6e 20 30  ays be between 0
227f0 20 61 6e 64 20 30 78 66 66 66 66 66 66 66 66 20   and 0xffffffff 
22800 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77  because of the w
22810 61 79 0a 20 20 2a 2a 20 74 68 61 74 20 62 74 72  ay.  ** that btr
22820 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
22830 20 61 6e 64 20 73 71 6c 69 74 65 33 47 65 74 56   and sqlite3GetV
22840 61 72 69 6e 74 33 32 28 29 20 61 72 65 20 69 6d  arint32() are im
22850 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69  plemented */.  i
22860 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c  f( nCellKey<=0 |
22870 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66  | nCellKey>0x7ff
22880 66 66 66 66 66 20 29 7b 0a 20 20 20 20 2a 72 65  fffff ){.    *re
22890 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  s = 0;.    retur
228a0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
228b0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c  _BKPT;.  }.  sql
228c0 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28  ite3VdbeMemInit(
228d0 26 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63  &m, db, 0);.  rc
228e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
228f0 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c  mFromBtree(pCur,
22900 20 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65   0, (u32)nCellKe
22910 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28  y, 1, &m);.  if(
22920 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
22930 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 72 65 73  n rc;.  }.  *res
22940 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
22950 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c  cordCompare(m.n,
22960 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29   m.z, pUnpacked)
22970 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
22980 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
22990 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
229a0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
229b0 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
229c0 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65  e value to be re
229d0 74 75 72 6e 65 64 20 62 79 20 73 75 62 73 65 71  turned by subseq
229e0 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  uent calls to.**
229f0 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
22a00 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  () on the databa
22a10 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20  se handle 'db'. 
22a20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
22a30 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 73  VdbeSetChanges(s
22a40 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
22a50 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65  nChange){.  asse
22a60 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
22a70 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
22a80 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e  ) );.  db->nChan
22a90 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20  ge = nChange;.  
22aa0 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65  db->nTotalChange
22ab0 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a   += nChange;.}..
22ac0 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67  /*.** Set a flag
22ad0 20 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20   in the vdbe to 
22ae0 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
22af0 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69  e counter when i
22b00 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a  t is finalised.*
22b10 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76  * or reset..*/.v
22b20 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
22b30 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65  ountChanges(Vdbe
22b40 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67   *v){.  v->chang
22b50 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f  eCntOn = 1;.}../
22b60 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20  *.** Mark every 
22b70 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
22b80 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  nt associated wi
22b90 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  th a database co
22ba0 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65  nnection.** as e
22bb0 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  xpired..**.** An
22bc0 20 65 78 70 69 72 65 64 20 73 74 61 74 65 6d 65   expired stateme
22bd0 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65  nt means that re
22be0 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74  compilation of t
22bf0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a  he statement is.
22c00 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53  ** recommend.  S
22c10 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65  tatements expire
22c20 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70   when things hap
22c30 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68  pen that make th
22c40 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20  eir.** programs 
22c50 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76  obsolete.  Remov
22c60 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64  ing user-defined
22c70 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f   functions or co
22c80 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65  llating.** seque
22c90 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e  nces, or changin
22ca0 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  g an authorizati
22cb0 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20  on function are 
22cc0 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20  the types of.** 
22cd0 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65  things that make
22ce0 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
22cf0 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a  ents obsolete..*
22d00 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
22d10 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
22d20 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a  ements(sqlite3 *
22d30 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a  db){.  Vdbe *p;.
22d40 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56    for(p = db->pV
22d50 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  dbe; p; p=p->pNe
22d60 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69  xt){.    p->expi
22d70 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  red = 1;.  }.}..
22d80 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
22d90 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69   database associ
22da0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64  ated with the Vd
22db0 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a  be..*/.sqlite3 *
22dc0 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 56 64  sqlite3VdbeDb(Vd
22dd0 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e  be *v){.  return
22de0 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   v->db;.}../*.**
22df0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
22e00 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  r to an sqlite3_
22e10 76 61 6c 75 65 20 73 74 72 75 63 74 75 72 65 20  value structure 
22e20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76  containing the v
22e30 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61  alue bound.** pa
22e40 72 61 6d 65 74 65 72 20 69 56 61 72 20 6f 66 20  rameter iVar of 
22e50 56 4d 20 76 2e 20 45 78 63 65 70 74 2c 20 69 66  VM v. Except, if
22e60 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e   the value is an
22e70 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72   SQL NULL, retur
22e80 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e  n .** 0 instead.
22e90 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55   Unless it is NU
22ea0 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66 69 6e 69  LL, apply affini
22eb0 74 79 20 61 66 66 20 28 6f 6e 65 20 6f 66 20 74  ty aff (one of t
22ec0 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a  he SQLITE_AFF_*.
22ed0 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f  ** constants) to
22ee0 20 74 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72   the value befor
22ef0 65 20 72 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a  e returning it..
22f00 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
22f10 65 64 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65  ed value must be
22f20 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
22f30 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74  ller using sqlit
22f40 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a  e3ValueFree()..*
22f50 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  /.sqlite3_value 
22f60 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 42  *sqlite3VdbeGetB
22f70 6f 75 6e 64 56 61 6c 75 65 28 56 64 62 65 20 2a  oundValue(Vdbe *
22f80 76 2c 20 69 6e 74 20 69 56 61 72 2c 20 75 38 20  v, int iVar, u8 
22f90 61 66 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20  aff){.  assert( 
22fa0 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20  iVar>0 );.  if( 
22fb0 76 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d  v ){.    Mem *pM
22fc0 65 6d 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56  em = &v->aVar[iV
22fd0 61 72 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20 30  ar-1];.    if( 0
22fe0 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  ==(pMem->flags &
22ff0 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20   MEM_Null) ){.  
23000 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
23010 65 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65  e *pRet = sqlite
23020 33 56 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29  3ValueNew(v->db)
23030 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 74  ;.      if( pRet
23040 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
23050 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28  te3VdbeMemCopy((
23060 4d 65 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d  Mem *)pRet, pMem
23070 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
23080 65 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69  e3ValueApplyAffi
23090 6e 69 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20  nity(pRet, aff, 
230a0 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
230b0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
230c0 72 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20  rn pRet;.    }. 
230d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
230e0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72  ../*.** Configur
230f0 65 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20 69  e SQL variable i
23100 56 61 72 20 73 6f 20 74 68 61 74 20 62 69 6e 64  Var so that bind
23110 69 6e 67 20 61 20 6e 65 77 20 76 61 6c 75 65 20  ing a new value 
23120 74 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a  to it signals.**
23130 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f 70   to sqlite3_reop
23140 74 69 6d 69 7a 65 28 29 20 74 68 61 74 20 72 65  timize() that re
23150 2d 70 72 65 70 61 72 69 6e 67 20 74 68 65 20 73  -preparing the s
23160 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 72 65 73  tatement may res
23170 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74  ult.** in a bett
23180 65 72 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a  er query plan..*
23190 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
231a0 62 65 53 65 74 56 61 72 6d 61 73 6b 28 56 64 62  beSetVarmask(Vdb
231b0 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 29 7b  e *v, int iVar){
231c0 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72 3e  .  assert( iVar>
231d0 30 20 29 3b 0a 20 20 69 66 28 20 69 56 61 72 3e  0 );.  if( iVar>
231e0 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70  32 ){.    v->exp
231f0 6d 61 73 6b 20 3d 20 30 78 66 66 66 66 66 66 66  mask = 0xfffffff
23200 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  f;.  }else{.    
23210 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28  v->expmask |= ((
23220 75 33 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31  u32)1 << (iVar-1
23230 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  ));.  }.}..#ifnd
23240 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
23250 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a  IRTUALTABLE./*.*
23260 2a 20 54 72 61 6e 73 66 65 72 20 65 72 72 6f 72  * Transfer error
23270 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 66 72   message text fr
23280 6f 6d 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74  om an sqlite3_vt
23290 61 62 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74  ab.zErrMsg (text
232a0 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65   stored.** in me
232b0 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
232c0 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
232d0 63 29 20 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a  c) into a Vdbe.z
232e0 45 72 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f  ErrMsg (text sto
232f0 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  red.** in memory
23300 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
23310 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e  qlite3DbMalloc).
23320 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23330 56 74 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67  VtabImportErrmsg
23340 28 56 64 62 65 20 2a 70 2c 20 73 71 6c 69 74 65  (Vdbe *p, sqlite
23350 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a  3_vtab *pVtab){.
23360 20 20 69 66 28 20 70 56 74 61 62 2d 3e 7a 45 72    if( pVtab->zEr
23370 72 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69  rMsg ){.    sqli
23380 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
23390 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
233a0 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
233b0 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d  g);.    p->zErrM
233c0 73 67 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  sg = sqlite3DbSt
233d0 72 44 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e  rDup(db, pVtab->
233e0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71  zErrMsg);.    sq
233f0 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61 62  lite3_free(pVtab
23400 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
23410 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d  pVtab->zErrMsg =
23420 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   0;.  }.}.#endif
23430 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
23440 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
23450 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
23460 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
23470 48 4f 4f 4b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  HOOK../*.** If t
23480 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
23490 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  nt is not NULL, 
234a0 72 65 6c 65 61 73 65 20 61 6e 79 20 61 6c 6c 6f  release any allo
234b0 63 61 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74  cations associat
234c0 65 64 20 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ed .** with the 
234d0 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 69 6e 20  memory cells in 
234e0 74 68 65 20 70 2d 3e 61 4d 65 6d 5b 5d 20 61 72  the p->aMem[] ar
234f0 72 61 79 2e 20 41 6c 73 6f 20 66 72 65 65 20 74  ray. Also free t
23500 68 65 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  he UnpackedRecor
23510 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69  d.** structure i
23520 74 73 65 6c 66 2c 20 75 73 69 6e 67 20 73 71 6c  tself, using sql
23530 69 74 65 33 44 62 46 72 65 65 28 29 2e 0a 2a 2a  ite3DbFree()..**
23540 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
23550 6e 20 69 73 20 75 73 65 64 20 74 6f 20 66 72 65  n is used to fre
23560 65 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  e UnpackedRecord
23570 20 73 74 72 75 63 74 75 72 65 73 20 61 6c 6c 6f   structures allo
23580 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20  cated by.** the 
23590 76 64 62 65 55 6e 70 61 63 6b 52 65 63 6f 72 64  vdbeUnpackRecord
235a0 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 75 6e  () function foun
235b0 64 20 69 6e 20 76 64 62 65 61 70 69 2e 63 2e 0a  d in vdbeapi.c..
235c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
235d0 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28  dbeFreeUnpacked(
235e0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 55 6e 70  sqlite3 *db, Unp
235f0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b  ackedRecord *p){
23600 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
23610 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
23620 3d 30 3b 20 69 3c 70 2d 3e 6e 46 69 65 6c 64 3b  =0; i<p->nField;
23630 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 4d 65 6d   i++){.      Mem
23640 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65   *pMem = &p->aMe
23650 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  m[i];.      if( 
23660 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 20  pMem->zMalloc ) 
23670 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
23680 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20 20  lease(pMem);.   
23690 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
236a0 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d  Free(db, p);.  }
236b0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
236c0 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50  ITE_ENABLE_PREUP
236d0 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23 69  DATE_HOOK */..#i
236e0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
236f0 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f  LE_PREUPDATE_HOO
23700 4b 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  K./*.** Invoke t
23710 68 65 20 70 72 65 2d 75 70 64 61 74 65 20 68 6f  he pre-update ho
23720 6f 6b 2e 20 49 66 20 74 68 69 73 20 69 73 20 61  ok. If this is a
23730 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
23740 54 45 20 70 72 65 2d 75 70 64 61 74 65 20 63 61  TE pre-update ca
23750 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 63 75 72 73  ll,.** then curs
23760 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
23770 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
23780 20 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74 6f   should point to
23790 20 74 68 65 20 72 6f 77 20 61 62 6f 75 74 0a 2a   the row about.*
237a0 2a 20 74 6f 20 62 65 20 75 70 64 61 74 65 20 6f  * to be update o
237b0 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68  r deleted. If th
237c0 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 61  e application ca
237d0 6c 6c 73 20 73 71 6c 69 74 65 33 5f 70 72 65 75  lls sqlite3_preu
237e0 70 64 61 74 65 5f 6f 6c 64 28 29 2c 0a 2a 2a 20  pdate_old(),.** 
237f0 74 68 65 20 72 65 71 75 69 72 65 64 20 76 61 6c  the required val
23800 75 65 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20  ue will be read 
23810 66 72 6f 6d 20 74 68 65 20 72 6f 77 20 74 68 65  from the row the
23820 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74   cursor points t
23830 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  o..*/.void sqlit
23840 65 33 56 64 62 65 50 72 65 55 70 64 61 74 65 48  e3VdbePreUpdateH
23850 6f 6f 6b 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  ook(.  Vdbe *v, 
23860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23870 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 70         /* Vdbe p
23880 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 20 69  re-update hook i
23890 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 2a 2f 0a  s invoked by */.
238a0 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
238b0 73 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sr,             
238c0 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 67    /* Cursor to g
238d0 72 61 62 20 6f 6c 64 2e 2a 20 76 61 6c 75 65 73  rab old.* values
238e0 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f   from */.  int o
238f0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
23900 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
23910 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 55 50 44  LITE_INSERT, UPD
23920 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 2a 2f  ATE or DELETE */
23930 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
23940 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Db,             
23950 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
23960 61 6d 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ame */.  Table *
23970 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  pTab,           
23980 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64 69           /* Modi
23990 66 69 65 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20  fied table */.  
239a0 69 36 34 20 69 4b 65 79 31 2c 20 20 20 20 20 20  i64 iKey1,      
239b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239c0 2f 2a 20 49 6e 69 74 69 61 6c 20 6b 65 79 20 76  /* Initial key v
239d0 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  alue */.  int iR
239e0 65 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  eg              
239f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
23a00 69 73 74 65 72 20 66 6f 72 20 6e 65 77 2e 2a 20  ister for new.* 
23a10 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 73  record */.){.  s
23a20 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 2d 3e  qlite3 *db = v->
23a30 64 62 3b 0a 20 20 69 36 34 20 69 4b 65 79 32 3b  db;.  i64 iKey2;
23a40 0a 20 20 50 72 65 55 70 64 61 74 65 20 70 72 65  .  PreUpdate pre
23a50 75 70 64 61 74 65 3b 0a 20 20 63 6f 6e 73 74 20  update;.  const 
23a60 63 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70 54 61  char *zTbl = pTa
23a70 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73 74 61 74  b->zName;.  stat
23a80 69 63 20 63 6f 6e 73 74 20 75 38 20 66 61 6b 65  ic const u8 fake
23a90 53 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 0a  SortOrder = 0;..
23aa0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 50    assert( db->pP
23ab0 72 65 55 70 64 61 74 65 3d 3d 30 20 29 3b 0a 20  reUpdate==0 );. 
23ac0 20 6d 65 6d 73 65 74 28 26 70 72 65 75 70 64 61   memset(&preupda
23ad0 74 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 72  te, 0, sizeof(Pr
23ae0 65 55 70 64 61 74 65 29 29 3b 0a 20 20 69 66 28  eUpdate));.  if(
23af0 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41   op==SQLITE_UPDA
23b00 54 45 20 29 7b 0a 20 20 20 20 69 4b 65 79 32 20  TE ){.    iKey2 
23b10 3d 20 76 2d 3e 61 4d 65 6d 5b 69 52 65 67 5d 2e  = v->aMem[iReg].
23b20 75 2e 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  u.i;.  }else{.  
23b30 20 20 69 4b 65 79 32 20 3d 20 69 4b 65 79 31 3b    iKey2 = iKey1;
23b40 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
23b50 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54  pCsr->nField==pT
23b60 61 62 2d 3e 6e 43 6f 6c 20 0a 20 20 20 20 20 20  ab->nCol .      
23b70 20 7c 7c 20 28 70 43 73 72 2d 3e 6e 46 69 65 6c   || (pCsr->nFiel
23b80 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 20  d==pTab->nCol+1 
23b90 26 26 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45  && op==SQLITE_DE
23ba0 4c 45 54 45 20 26 26 20 69 52 65 67 3d 3d 2d 31  LETE && iReg==-1
23bb0 29 0a 20 20 29 3b 0a 0a 20 20 70 72 65 75 70 64  ).  );..  preupd
23bc0 61 74 65 2e 76 20 3d 20 76 3b 0a 20 20 70 72 65  ate.v = v;.  pre
23bd0 75 70 64 61 74 65 2e 70 43 73 72 20 3d 20 70 43  update.pCsr = pC
23be0 73 72 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e  sr;.  preupdate.
23bf0 6f 70 20 3d 20 6f 70 3b 0a 20 20 70 72 65 75 70  op = op;.  preup
23c00 64 61 74 65 2e 69 4e 65 77 52 65 67 20 3d 20 69  date.iNewReg = i
23c10 52 65 67 3b 0a 20 20 70 72 65 75 70 64 61 74 65  Reg;.  preupdate
23c20 2e 6b 65 79 69 6e 66 6f 2e 64 62 20 3d 20 64 62  .keyinfo.db = db
23c30 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65  ;.  preupdate.ke
23c40 79 69 6e 66 6f 2e 65 6e 63 20 3d 20 45 4e 43 28  yinfo.enc = ENC(
23c50 64 62 29 3b 0a 20 20 70 72 65 75 70 64 61 74 65  db);.  preupdate
23c60 2e 6b 65 79 69 6e 66 6f 2e 6e 46 69 65 6c 64 20  .keyinfo.nField 
23c70 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  = pTab->nCol;.  
23c80 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66  preupdate.keyinf
23c90 6f 2e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  o.aSortOrder = (
23ca0 75 38 2a 29 26 66 61 6b 65 53 6f 72 74 4f 72 64  u8*)&fakeSortOrd
23cb0 65 72 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e  er;.  preupdate.
23cc0 69 4b 65 79 31 20 3d 20 69 4b 65 79 31 3b 0a 20  iKey1 = iKey1;. 
23cd0 20 70 72 65 75 70 64 61 74 65 2e 69 4b 65 79 32   preupdate.iKey2
23ce0 20 3d 20 69 4b 65 79 32 3b 0a 20 20 70 72 65 75   = iKey2;.  preu
23cf0 70 64 61 74 65 2e 69 50 4b 65 79 20 3d 20 70 54  pdate.iPKey = pT
23d00 61 62 2d 3e 69 50 4b 65 79 3b 0a 0a 20 20 64 62  ab->iPKey;..  db
23d10 2d 3e 70 50 72 65 55 70 64 61 74 65 20 3d 20 26  ->pPreUpdate = &
23d20 70 72 65 75 70 64 61 74 65 3b 0a 20 20 64 62 2d  preupdate;.  db-
23d30 3e 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62  >xPreUpdateCallb
23d40 61 63 6b 28 64 62 2d 3e 70 50 72 65 55 70 64 61  ack(db->pPreUpda
23d50 74 65 41 72 67 2c 20 64 62 2c 20 6f 70 2c 20 7a  teArg, db, op, z
23d60 44 62 2c 20 7a 54 62 6c 2c 20 69 4b 65 79 31 2c  Db, zTbl, iKey1,
23d70 20 69 4b 65 79 32 29 3b 0a 20 20 64 62 2d 3e 70   iKey2);.  db->p
23d80 50 72 65 55 70 64 61 74 65 20 3d 20 30 3b 0a 20  PreUpdate = 0;. 
23d90 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
23da0 62 2c 20 70 72 65 75 70 64 61 74 65 2e 61 52 65  b, preupdate.aRe
23db0 63 6f 72 64 29 3b 0a 20 20 76 64 62 65 46 72 65  cord);.  vdbeFre
23dc0 65 55 6e 70 61 63 6b 65 64 28 64 62 2c 20 70 72  eUnpacked(db, pr
23dd0 65 75 70 64 61 74 65 2e 70 55 6e 70 61 63 6b 65  eupdate.pUnpacke
23de0 64 29 3b 0a 20 20 76 64 62 65 46 72 65 65 55 6e  d);.  vdbeFreeUn
23df0 70 61 63 6b 65 64 28 64 62 2c 20 70 72 65 75 70  packed(db, preup
23e00 64 61 74 65 2e 70 4e 65 77 55 6e 70 61 63 6b 65  date.pNewUnpacke
23e10 64 29 3b 0a 20 20 69 66 28 20 70 72 65 75 70 64  d);.  if( preupd
23e20 61 74 65 2e 61 4e 65 77 20 29 7b 0a 20 20 20 20  ate.aNew ){.    
23e30 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
23e40 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 46 69 65  =0; i<pCsr->nFie
23e50 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; i++){.      
23e60 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
23e70 6c 65 61 73 65 28 26 70 72 65 75 70 64 61 74 65  lease(&preupdate
23e80 2e 61 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 7d  .aNew[i]);.    }
23e90 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
23ea0 65 65 28 64 62 2c 20 70 72 65 75 70 64 61 74 65  ee(db, preupdate
23eb0 2e 61 4e 65 77 29 3b 0a 20 20 7d 0a 7d 0a 23 65  .aNew);.  }.}.#e
23ec0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
23ed0 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
23ee0 48 4f 4f 4b 20 2a 2f 0a                          HOOK */.