/ Hex Artifact Content
Login

Artifact 0ce759dca1d1662f45f60a9336bf84b5cd15debf:


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 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
02d0: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64  ..../*.** When d
02e0: 65 62 75 67 67 69 6e 67 20 74 68 65 20 63 6f 64  ebugging the cod
02f0: 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 61  e generator in a
0300: 20 73 79 6d 62 6f 6c 69 63 20 64 65 62 75 67 67   symbolic debugg
0310: 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a 20 73  er, one can.** s
0320: 65 74 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  et the sqlite3Vd
0330: 62 65 41 64 64 6f 70 54 72 61 63 65 20 74 6f 20  beAddopTrace to 
0340: 31 20 61 6e 64 20 61 6c 6c 20 6f 70 63 6f 64 65  1 and all opcode
0350: 73 20 77 69 6c 6c 20 62 65 20 70 72 69 6e 74 65  s will be printe
0360: 64 0a 2a 2a 20 61 73 20 74 68 65 79 20 61 72 65  d.** as they are
0370: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
0380: 73 74 72 75 63 74 69 6f 6e 20 73 74 72 65 61 6d  struction stream
0390: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
03a0: 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  TE_DEBUG.int sql
03b0: 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61  ite3VdbeAddopTra
03c0: 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ce = 0;.#endif..
03d0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
03e0: 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74 61  new virtual data
03f0: 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f 0a  base engine..*/.
0400: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64 62  Vdbe *sqlite3Vdb
0410: 65 43 72 65 61 74 65 28 73 71 6c 69 74 65 33 20  eCreate(sqlite3 
0420: 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
0430: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62  .  p = sqlite3Db
0440: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
0450: 69 7a 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20  izeof(Vdbe) );. 
0460: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
0470: 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  rn 0;.  p->db = 
0480: 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56  db;.  if( db->pV
0490: 64 62 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70  dbe ){.    db->p
04a0: 56 64 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Vdbe->pPrev = p;
04b0: 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20  .  }.  p->pNext 
04c0: 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70  = db->pVdbe;.  p
04d0: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64  ->pPrev = 0;.  d
04e0: 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20  b->pVdbe = p;.  
04f0: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
0500: 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65  MAGIC_INIT;.  re
0510: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
0520: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51   Remember the SQ
0530: 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70  L string for a p
0540: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
0550: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
0560: 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64 62  e3VdbeSetSql(Vdb
0570: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
0580: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20   *z, int n, int 
0590: 69 73 50 72 65 70 61 72 65 56 32 29 7b 0a 20 20  isPrepareV2){.  
05a0: 61 73 73 65 72 74 28 20 69 73 50 72 65 70 61 72  assert( isPrepar
05b0: 65 56 32 3d 3d 31 20 7c 7c 20 69 73 50 72 65 70  eV2==1 || isPrep
05c0: 61 72 65 56 32 3d 3d 30 20 29 3b 0a 20 20 69 66  areV2==0 );.  if
05d0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
05e0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
05f0: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20  ITE_OMIT_TRACE) 
0600: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
0610: 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47  TE_ENABLE_SQLLOG
0620: 29 0a 20 20 69 66 28 20 21 69 73 50 72 65 70 61  ).  if( !isPrepa
0630: 72 65 56 32 20 29 20 72 65 74 75 72 6e 3b 0a 23  reV2 ) return;.#
0640: 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
0650: 70 2d 3e 7a 53 71 6c 3d 3d 30 20 29 3b 0a 20 20  p->zSql==0 );.  
0660: 70 2d 3e 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  p->zSql = sqlite
0670: 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62  3DbStrNDup(p->db
0680: 2c 20 7a 2c 20 6e 29 3b 0a 20 20 70 2d 3e 69 73  , z, n);.  p->is
0690: 50 72 65 70 61 72 65 56 32 20 3d 20 28 75 38 29  PrepareV2 = (u8)
06a0: 69 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a  isPrepareV2;.}..
06b0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
06c0: 20 53 51 4c 20 61 73 73 6f 63 69 61 74 65 64 20   SQL associated 
06d0: 77 69 74 68 20 61 20 70 72 65 70 61 72 65 64 20  with a prepared 
06e0: 73 74 61 74 65 6d 65 6e 74 0a 2a 2f 0a 63 6f 6e  statement.*/.con
06f0: 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
0700: 5f 73 71 6c 28 73 71 6c 69 74 65 33 5f 73 74 6d  _sql(sqlite3_stm
0710: 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20 56 64 62  t *pStmt){.  Vdb
0720: 65 20 2a 70 20 3d 20 28 56 64 62 65 20 2a 29 70  e *p = (Vdbe *)p
0730: 53 74 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 28  Stmt;.  return (
0740: 70 20 26 26 20 70 2d 3e 69 73 50 72 65 70 61 72  p && p->isPrepar
0750: 65 56 32 29 20 3f 20 70 2d 3e 7a 53 71 6c 20 3a  eV2) ? p->zSql :
0760: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61   0;.}../*.** Swa
0770: 70 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 65  p all content be
0780: 74 77 65 65 6e 20 74 77 6f 20 56 44 42 45 20 73  tween two VDBE s
0790: 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f  tructures..*/.vo
07a0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 77  id sqlite3VdbeSw
07b0: 61 70 28 56 64 62 65 20 2a 70 41 2c 20 56 64 62  ap(Vdbe *pA, Vdb
07c0: 65 20 2a 70 42 29 7b 0a 20 20 56 64 62 65 20 74  e *pB){.  Vdbe t
07d0: 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20 20 63 68 61  mp, *pTmp;.  cha
07e0: 72 20 2a 7a 54 6d 70 3b 0a 20 20 61 73 73 65 72  r *zTmp;.  asser
07f0: 74 28 20 70 41 2d 3e 64 62 3d 3d 70 42 2d 3e 64  t( pA->db==pB->d
0800: 62 20 29 3b 0a 20 20 74 6d 70 20 3d 20 2a 70 41  b );.  tmp = *pA
0810: 3b 0a 20 20 2a 70 41 20 3d 20 2a 70 42 3b 0a 20  ;.  *pA = *pB;. 
0820: 20 2a 70 42 20 3d 20 74 6d 70 3b 0a 20 20 70 54   *pB = tmp;.  pT
0830: 6d 70 20 3d 20 70 41 2d 3e 70 4e 65 78 74 3b 0a  mp = pA->pNext;.
0840: 20 20 70 41 2d 3e 70 4e 65 78 74 20 3d 20 70 42    pA->pNext = pB
0850: 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 42 2d 3e 70  ->pNext;.  pB->p
0860: 4e 65 78 74 20 3d 20 70 54 6d 70 3b 0a 20 20 70  Next = pTmp;.  p
0870: 54 6d 70 20 3d 20 70 41 2d 3e 70 50 72 65 76 3b  Tmp = pA->pPrev;
0880: 0a 20 20 70 41 2d 3e 70 50 72 65 76 20 3d 20 70  .  pA->pPrev = p
0890: 42 2d 3e 70 50 72 65 76 3b 0a 20 20 70 42 2d 3e  B->pPrev;.  pB->
08a0: 70 50 72 65 76 20 3d 20 70 54 6d 70 3b 0a 20 20  pPrev = pTmp;.  
08b0: 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b  zTmp = pA->zSql;
08c0: 0a 20 20 70 41 2d 3e 7a 53 71 6c 20 3d 20 70 42  .  pA->zSql = pB
08d0: 2d 3e 7a 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53  ->zSql;.  pB->zS
08e0: 71 6c 20 3d 20 7a 54 6d 70 3b 0a 20 20 70 42 2d  ql = zTmp;.  pB-
08f0: 3e 69 73 50 72 65 70 61 72 65 56 32 20 3d 20 70  >isPrepareV2 = p
0900: 41 2d 3e 69 73 50 72 65 70 61 72 65 56 32 3b 0a  A->isPrepareV2;.
0910: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
0920: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 75 72  _DEBUG./*.** Tur
0930: 6e 20 74 72 61 63 69 6e 67 20 6f 6e 20 6f 72 20  n tracing on or 
0940: 6f 66 66 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  off.*/.void sqli
0950: 74 65 33 56 64 62 65 54 72 61 63 65 28 56 64 62  te3VdbeTrace(Vdb
0960: 65 20 2a 70 2c 20 46 49 4c 45 20 2a 74 72 61 63  e *p, FILE *trac
0970: 65 29 7b 0a 20 20 70 2d 3e 74 72 61 63 65 20 3d  e){.  p->trace =
0980: 20 74 72 61 63 65 3b 0a 7d 0a 23 65 6e 64 69 66   trace;.}.#endif
0990: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74  ../*.** Resize t
09a0: 68 65 20 56 64 62 65 2e 61 4f 70 20 61 72 72 61  he Vdbe.aOp arra
09b0: 79 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20  y so that it is 
09c0: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 20  at least one op 
09d0: 6c 61 72 67 65 72 20 74 68 61 6e 20 0a 2a 2a 20  larger than .** 
09e0: 69 74 20 77 61 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  it was..**.** If
09f0: 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72   an out-of-memor
0a00: 79 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  y error occurs w
0a10: 68 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74 68  hile resizing th
0a20: 65 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e 0a  e array, return.
0a30: 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  ** SQLITE_NOMEM.
0a40: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 56 64   In this case Vd
0a50: 62 65 2e 61 4f 70 20 61 6e 64 20 56 64 62 65 2e  be.aOp and Vdbe.
0a60: 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20  nOpAlloc remain 
0a70: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 28 74  .** unchanged (t
0a80: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 61  his is so that a
0a90: 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61  ny opcodes alrea
0aa0: 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e  dy allocated can
0ab0: 20 62 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74 6c   be .** correctl
0ac0: 79 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 61 6c  y deallocated al
0ad0: 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72 65 73  ong with the res
0ae0: 74 20 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a  t of the Vdbe)..
0af0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 72  */.static int gr
0b00: 6f 77 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a  owOpArray(Vdbe *
0b10: 70 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4e  p){.  VdbeOp *pN
0b20: 65 77 3b 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d  ew;.  int nNew =
0b30: 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20   (p->nOpAlloc ? 
0b40: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20  p->nOpAlloc*2 : 
0b50: 28 69 6e 74 29 28 31 30 32 34 2f 73 69 7a 65 6f  (int)(1024/sizeo
0b60: 66 28 4f 70 29 29 29 3b 0a 20 20 70 4e 65 77 20  f(Op)));.  pNew 
0b70: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
0b80: 6f 63 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70  oc(p->db, p->aOp
0b90: 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 4f 70  , nNew*sizeof(Op
0ba0: 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29  ));.  if( pNew )
0bb0: 7b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  {.    p->nOpAllo
0bc0: 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
0bd0: 6c 6f 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20 70  locSize(p->db, p
0be0: 4e 65 77 29 2f 73 69 7a 65 6f 66 28 4f 70 29 3b  New)/sizeof(Op);
0bf0: 0a 20 20 20 20 70 2d 3e 61 4f 70 20 3d 20 70 4e  .    p->aOp = pN
0c00: 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ew;.  }.  return
0c10: 20 28 70 4e 65 77 20 3f 20 53 51 4c 49 54 45 5f   (pNew ? SQLITE_
0c20: 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  OK : SQLITE_NOME
0c30: 4d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  M);.}../*.** Add
0c40: 20 61 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69   a new instructi
0c50: 6f 6e 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  on to the list o
0c60: 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 63  f instructions c
0c70: 75 72 72 65 6e 74 20 69 6e 20 74 68 65 0a 2a 2a  urrent in the.**
0c80: 20 56 44 42 45 2e 20 20 52 65 74 75 72 6e 20 74   VDBE.  Return t
0c90: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
0ca0: 65 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f  e new instructio
0cb0: 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  n..**.** Paramet
0cc0: 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20  ers:.**.**    p 
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 6f                Po
0ce0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 56 44 42  inter to the VDB
0cf0: 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 70 20 20 20  E.**.**    op   
0d00: 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20 6f             The o
0d10: 70 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 69  pcode for this i
0d20: 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a  nstruction.**.**
0d30: 20 20 20 20 70 31 2c 20 70 32 2c 20 70 33 20 20      p1, p2, p3  
0d40: 20 20 20 20 4f 70 65 72 61 6e 64 73 0a 2a 2a 0a      Operands.**.
0d50: 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  ** Use the sqlit
0d60: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
0d70: 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f  el() function to
0d80: 20 66 69 78 20 61 6e 20 61 64 64 72 65 73 73 20   fix an address 
0d90: 61 6e 64 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74  and.** the sqlit
0da0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 29  e3VdbeChangeP4()
0db0: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63 68 61   function to cha
0dc0: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
0dd0: 20 74 68 65 20 50 34 0a 2a 2a 20 6f 70 65 72 61   the P4.** opera
0de0: 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
0df0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 56 64 62  e3VdbeAddOp3(Vdb
0e00: 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
0e10: 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20 69 6e  t p1, int p2, in
0e20: 74 20 70 33 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  t p3){.  int i;.
0e30: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a    VdbeOp *pOp;..
0e40: 20 20 69 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20    i = p->nOp;.  
0e50: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
0e60: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
0e70: 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  T );.  assert( o
0e80: 70 3e 30 20 26 26 20 6f 70 3c 30 78 66 66 20 29  p>0 && op<0xff )
0e90: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 41 6c  ;.  if( p->nOpAl
0ea0: 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20 69 66  loc<=i ){.    if
0eb0: 28 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70 29  ( growOpArray(p)
0ec0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
0ed0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
0ee0: 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20  p->nOp++;.  pOp 
0ef0: 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  = &p->aOp[i];.  
0f00: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 28 75  pOp->opcode = (u
0f10: 38 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35 20  8)op;.  pOp->p5 
0f20: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d  = 0;.  pOp->p1 =
0f30: 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d   p1;.  pOp->p2 =
0f40: 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d   p2;.  pOp->p3 =
0f50: 20 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70   p3;.  pOp->p4.p
0f60: 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34 74   = 0;.  pOp->p4t
0f70: 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44  ype = P4_NOTUSED
0f80: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
0f90: 44 45 42 55 47 0a 20 20 70 4f 70 2d 3e 7a 43 6f  DEBUG.  pOp->zCo
0fa0: 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28  mment = 0;.  if(
0fb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 6f   sqlite3VdbeAddo
0fc0: 70 54 72 61 63 65 20 29 20 73 71 6c 69 74 65 33  pTrace ) sqlite3
0fd0: 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69  VdbePrintOp(0, i
0fe0: 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23  , &p->aOp[i]);.#
0ff0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 56 44 42  endif.#ifdef VDB
1000: 45 5f 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70 2d  E_PROFILE.  pOp-
1010: 3e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 70  >cycles = 0;.  p
1020: 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65 6e  Op->cnt = 0;.#en
1030: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  dif.  return i;.
1040: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
1050: 65 41 64 64 4f 70 30 28 56 64 62 65 20 2a 70 2c  eAddOp0(Vdbe *p,
1060: 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74 75   int op){.  retu
1070: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
1080: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30  dOp3(p, op, 0, 0
1090: 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
10a0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 56 64  te3VdbeAddOp1(Vd
10b0: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
10c0: 6e 74 20 70 31 29 7b 0a 20 20 72 65 74 75 72 6e  nt p1){.  return
10d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10e0: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c  p3(p, op, p1, 0,
10f0: 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   0);.}.int sqlit
1100: 65 33 56 64 62 65 41 64 64 4f 70 32 28 56 64 62  e3VdbeAddOp2(Vdb
1110: 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
1120: 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20  t p1, int p2){. 
1130: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1140: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
1150: 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a   p1, p2, 0);.}..
1160: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70  ./*.** Add an op
1170: 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64  code that includ
1180: 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20  es the p4 value 
1190: 61 73 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  as a pointer..*/
11a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
11b0: 41 64 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a  AddOp4(.  Vdbe *
11c0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
11d0: 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20   Add the opcode 
11e0: 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20  to this VM */.  
11f0: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
1200: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f      /* The new o
1210: 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70  pcode */.  int p
1220: 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1,             /
1230: 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64  * The P1 operand
1240: 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20   */.  int p2,   
1250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1260: 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P2 operand */. 
1270: 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20   int p3,        
1280: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f       /* The P3 o
1290: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73  perand */.  cons
12a0: 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20  t char *zP4,    
12b0: 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e  /* The P4 operan
12c0: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70  d */.  int p4typ
12d0: 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34  e          /* P4
12e0: 20 6f 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f   operand type */
12f0: 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d  .){.  int addr =
1300: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1310: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
1320: 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33  , p3);.  sqlite3
1330: 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20  VdbeChangeP4(p, 
1340: 61 64 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70  addr, zP4, p4typ
1350: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64  e);.  return add
1360: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  r;.}../*.** Add 
1370: 61 6e 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d  an OP_ParseSchem
1380: 61 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20  a opcode.  This 
1390: 72 6f 75 74 69 6e 65 20 69 73 20 62 72 6f 6b 65  routine is broke
13a0: 6e 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 71  n out from.** sq
13b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
13c0: 29 20 73 69 6e 63 65 20 69 74 20 6e 65 65 64 73  ) since it needs
13d0: 20 74 6f 20 61 6c 73 6f 20 6e 65 65 64 73 20 74   to also needs t
13e0: 6f 20 6d 61 72 6b 20 61 6c 6c 20 62 74 72 65 65  o mark all btree
13f0: 73 0a 2a 2a 20 61 73 20 68 61 76 69 6e 67 20 62  s.** as having b
1400: 65 65 6e 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  een used..**.** 
1410: 54 68 65 20 7a 57 68 65 72 65 20 73 74 72 69 6e  The zWhere strin
1420: 67 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  g must have been
1430: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
1440: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
1450: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1460: 20 77 69 6c 6c 20 74 61 6b 65 20 6f 77 6e 65 72   will take owner
1470: 73 68 69 70 20 6f 66 20 74 68 65 20 61 6c 6c 6f  ship of the allo
1480: 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f  cated memory..*/
1490: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
14a0: 65 41 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f  eAddParseSchemaO
14b0: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  p(Vdbe *p, int i
14c0: 44 62 2c 20 63 68 61 72 20 2a 7a 57 68 65 72 65  Db, char *zWhere
14d0: 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69 6e  ){.  int j;.  in
14e0: 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33  t addr = sqlite3
14f0: 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 4f 50  VdbeAddOp3(p, OP
1500: 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44  _ParseSchema, iD
1510: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69  b, 0, 0);.  sqli
1520: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
1530: 70 2c 20 61 64 64 72 2c 20 7a 57 68 65 72 65 2c  p, addr, zWhere,
1540: 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
1550: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62  for(j=0; j<p->db
1560: 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 20 73 71 6c 69  ->nDb; j++) sqli
1570: 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
1580: 28 70 2c 20 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (p, j);.}../*.**
1590: 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74   Add an opcode t
15a0: 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65  hat includes the
15b0: 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 6e 20   p4 value as an 
15c0: 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20  integer..*/.int 
15d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15e0: 34 49 6e 74 28 0a 20 20 56 64 62 65 20 2a 70 2c  4Int(.  Vdbe *p,
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1600: 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f  dd the opcode to
1610: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
1620: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
1630: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63    /* The new opc
1640: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c  ode */.  int p1,
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1660: 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a  The P1 operand *
1670: 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20  /.  int p2,     
1680: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1690: 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  2 operand */.  i
16a0: 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20  nt p3,          
16b0: 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65     /* The P3 ope
16c0: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34  rand */.  int p4
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16e0: 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   The P4 operand 
16f0: 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f  as an integer */
1700: 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d  .){.  int addr =
1710: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1720: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
1730: 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33  , p3);.  sqlite3
1740: 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20  VdbeChangeP4(p, 
1750: 61 64 64 72 2c 20 53 51 4c 49 54 45 5f 49 4e 54  addr, SQLITE_INT
1760: 5f 54 4f 5f 50 54 52 28 70 34 29 2c 20 50 34 5f  _TO_PTR(p4), P4_
1770: 49 4e 54 33 32 29 3b 0a 20 20 72 65 74 75 72 6e  INT32);.  return
1780: 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
1790: 43 72 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d  Create a new sym
17a0: 62 6f 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20  bolic label for 
17b0: 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
17c0: 68 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62  hat has yet to b
17d0: 65 0a 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65  e.** coded.  The
17e0: 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20   symbolic label 
17f0: 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61  is really just a
1800: 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
1810: 2e 20 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20  .  The.** label 
1820: 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 74  can be used as t
1830: 68 65 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61  he P2 value of a
1840: 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61  n operation.  La
1850: 74 65 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65  ter, when.** the
1860: 20 6c 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76   label is resolv
1870: 65 64 20 74 6f 20 61 20 73 70 65 63 69 66 69 63  ed to a specific
1880: 20 61 64 64 72 65 73 73 2c 20 74 68 65 20 56 44   address, the VD
1890: 42 45 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20  BE will scan.** 
18a0: 74 68 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72  through its oper
18b0: 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63  ation list and c
18c0: 68 61 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73  hange all values
18d0: 20 6f 66 20 50 32 20 77 68 69 63 68 20 6d 61 74   of P2 which mat
18e0: 63 68 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20  ch.** the label 
18f0: 69 6e 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65  into the resolve
1900: 64 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a  d address..**.**
1910: 20 54 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20   The VDBE knows 
1920: 74 68 61 74 20 61 20 50 32 20 76 61 6c 75 65 20  that a P2 value 
1930: 69 73 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75  is a label becau
1940: 73 65 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a  se labels are.**
1950: 20 61 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65   always negative
1960: 20 61 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61   and P2 values a
1970: 72 65 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65  re suppose to be
1980: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a   non-negative..*
1990: 2a 20 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74  * Hence, a negat
19a0: 69 76 65 20 50 32 20 76 61 6c 75 65 20 69 73 20  ive P2 value is 
19b0: 61 20 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73  a label that has
19c0: 20 79 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c   yet to be resol
19d0: 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20  ved..**.** Zero 
19e0: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61  is returned if a
19f0: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e   malloc() fails.
1a00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
1a10: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62  dbeMakeLabel(Vdb
1a20: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 20 3d  e *p){.  int i =
1a30: 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20   p->nLabel++;.  
1a40: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
1a50: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
1a60: 54 20 29 3b 0a 20 20 69 66 28 20 28 69 20 26 20  T );.  if( (i & 
1a70: 28 69 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20  (i-1))==0 ){.   
1a80: 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 73 71 6c   p->aLabel = sql
1a90: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
1aa0: 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c  ree(p->db, p->aL
1ab0: 61 62 65 6c 2c 20 0a 20 20 20 20 20 20 20 20 20  abel, .         
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
1ae0: 2a 32 2b 31 29 2a 73 69 7a 65 6f 66 28 70 2d 3e  *2+1)*sizeof(p->
1af0: 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20 7d  aLabel[0]));.  }
1b00: 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c  .  if( p->aLabel
1b10: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65   ){.    p->aLabe
1b20: 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20  l[i] = -1;.  }. 
1b30: 20 72 65 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a   return -1-i;.}.
1b40: 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c  ./*.** Resolve l
1b50: 61 62 65 6c 20 22 78 22 20 74 6f 20 62 65 20 74  abel "x" to be t
1b60: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
1b70: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
1b80: 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65  on to.** be inse
1b90: 72 74 65 64 2e 20 20 54 68 65 20 70 61 72 61 6d  rted.  The param
1ba0: 65 74 65 72 20 22 78 22 20 6d 75 73 74 20 68 61  eter "x" must ha
1bb0: 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  ve been obtained
1bc0: 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72   from.** a prior
1bd0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
1be0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e  VdbeMakeLabel().
1bf0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1c00: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1c10: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 78 29  (Vdbe *p, int x)
1c20: 7b 0a 20 20 69 6e 74 20 6a 20 3d 20 2d 31 2d 78  {.  int j = -1-x
1c30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
1c40: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
1c50: 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72  _INIT );.  asser
1c60: 74 28 20 6a 3e 3d 30 20 26 26 20 6a 3c 70 2d 3e  t( j>=0 && j<p->
1c70: 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 69 66 28 20  nLabel );.  if( 
1c80: 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20  p->aLabel ){.   
1c90: 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20   p->aLabel[j] = 
1ca0: 70 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f  p->nOp;.  }.}../
1cb0: 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56 44  *.** Mark the VD
1cc0: 42 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20 63  BE as one that c
1cd0: 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f  an only be run o
1ce0: 6e 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64  ne time..*/.void
1cf0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 75 6e 4f   sqlite3VdbeRunO
1d00: 6e 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a 70 29  nlyOnce(Vdbe *p)
1d10: 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e  {.  p->runOnlyOn
1d20: 63 65 20 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64 65  ce = 1;.}..#ifde
1d30: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2f  f SQLITE_DEBUG /
1d40: 2a 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d  * sqlite3AssertM
1d50: 61 79 41 62 6f 72 74 28 29 20 6c 6f 67 69 63 20  ayAbort() logic 
1d60: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  */../*.** The fo
1d70: 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 61 6e 64  llowing type and
1d80: 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 75 73   function are us
1d90: 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
1da0: 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65  rough all opcode
1db0: 73 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65 20 6d  s.** in a Vdbe m
1dc0: 61 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64 20  ain program and 
1dd0: 65 61 63 68 20 6f 66 20 74 68 65 20 73 75 62 2d  each of the sub-
1de0: 70 72 6f 67 72 61 6d 73 20 28 74 72 69 67 67 65  programs (trigge
1df0: 72 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69  rs) it may .** i
1e00: 6e 76 6f 6b 65 20 64 69 72 65 63 74 6c 79 20 6f  nvoke directly o
1e10: 72 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 49 74  r indirectly. It
1e20: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
1e30: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
1e40: 2a 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20  *   Op *pOp;.** 
1e50: 20 20 56 64 62 65 4f 70 49 74 65 72 20 73 49 74    VdbeOpIter sIt
1e60: 65 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73  er;.**.**   mems
1e70: 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69  et(&sIter, 0, si
1e80: 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a  zeof(sIter));.**
1e90: 20 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 20     sIter.v = v; 
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 76 20             // v 
1ec0: 69 73 20 6f 66 20 74 79 70 65 20 56 64 62 65 2a  is of type Vdbe*
1ed0: 20 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 28 70   .**   while( (p
1ee0: 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28  Op = opIterNext(
1ef0: 26 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20  &sIter)) ){.**  
1f00: 20 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69     // Do somethi
1f10: 6e 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20  ng with pOp.**  
1f20: 20 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 44   }.**   sqlite3D
1f30: 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74  bFree(v->db, sIt
1f40: 65 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a  er.apSub);.** .*
1f50: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1f60: 20 56 64 62 65 4f 70 49 74 65 72 20 56 64 62 65   VdbeOpIter Vdbe
1f70: 4f 70 49 74 65 72 3b 0a 73 74 72 75 63 74 20 56  OpIter;.struct V
1f80: 64 62 65 4f 70 49 74 65 72 20 7b 0a 20 20 56 64  dbeOpIter {.  Vd
1f90: 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
1fa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65           /* Vdbe
1fb0: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
1fc0: 75 67 68 20 74 68 65 20 6f 70 63 6f 64 65 73 20  ugh the opcodes 
1fd0: 6f 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72  of */.  SubProgr
1fe0: 61 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20 20 20  am **apSub;     
1ff0: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73     /* Array of s
2000: 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20  ubprograms */.  
2010: 69 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20 20  int nSub;       
2020: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2030: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
2040: 69 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e  in apSub */.  in
2050: 74 20 69 41 64 64 72 3b 20 20 20 20 20 20 20 20  t iAddr;        
2060: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
2070: 65 73 73 20 6f 66 20 6e 65 78 74 20 69 6e 73 74  ess of next inst
2080: 72 75 63 74 69 6f 6e 20 74 6f 20 72 65 74 75 72  ruction to retur
2090: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b  n */.  int iSub;
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b0: 20 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72    /* 0 = main pr
20c0: 6f 67 72 61 6d 2c 20 31 20 3d 20 66 69 72 73 74  ogram, 1 = first
20d0: 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 65 74 63   sub-program etc
20e0: 2e 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f  . */.};.static O
20f0: 70 20 2a 6f 70 49 74 65 72 4e 65 78 74 28 56 64  p *opIterNext(Vd
2100: 62 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20 20  beOpIter *p){.  
2110: 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a  Vdbe *v = p->v;.
2120: 20 20 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a    Op *pRet = 0;.
2130: 20 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74    Op *aOp;.  int
2140: 20 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e   nOp;..  if( p->
2150: 69 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b  iSub<=p->nSub ){
2160: 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 53 75  ..    if( p->iSu
2170: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 4f  b==0 ){.      aO
2180: 70 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20  p = v->aOp;.    
2190: 20 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a    nOp = v->nOp;.
21a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21b0: 20 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b   aOp = p->apSub[
21c0: 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b  p->iSub-1]->aOp;
21d0: 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e  .      nOp = p->
21e0: 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d  apSub[p->iSub-1]
21f0: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20  ->nOp;.    }.   
2200: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 41 64 64   assert( p->iAdd
2210: 72 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52  r<nOp );..    pR
2220: 65 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64  et = &aOp[p->iAd
2230: 64 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64  dr];.    p->iAdd
2240: 72 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  r++;.    if( p->
2250: 69 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20  iAddr==nOp ){.  
2260: 20 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20      p->iSub++;. 
2270: 20 20 20 20 20 70 2d 3e 69 41 64 64 72 20 3d 20       p->iAddr = 
2280: 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  0;.    }.  .    
2290: 69 66 28 20 70 52 65 74 2d 3e 70 34 74 79 70 65  if( pRet->p4type
22a0: 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  ==P4_SUBPROGRAM 
22b0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79  ){.      int nBy
22c0: 74 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29  te = (p->nSub+1)
22d0: 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72  *sizeof(SubProgr
22e0: 61 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  am*);.      int 
22f0: 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  j;.      for(j=0
2300: 3b 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b  ; j<p->nSub; j++
2310: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
2320: 2d 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74  ->apSub[j]==pRet
2330: 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20  ->p4.pProgram ) 
2340: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
2350: 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e       if( j==p->n
2360: 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Sub ){.        p
2370: 2d 3e 61 70 53 75 62 20 3d 20 73 71 6c 69 74 65  ->apSub = sqlite
2380: 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65  3DbReallocOrFree
2390: 28 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62  (v->db, p->apSub
23a0: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
23b0: 20 20 69 66 28 20 21 70 2d 3e 61 70 53 75 62 20    if( !p->apSub 
23c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52 65  ){.          pRe
23d0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
23e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
23f0: 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62  p->apSub[p->nSub
2400: 2b 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70  ++] = pRet->p4.p
2410: 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20  Program;.       
2420: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2430: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
2440: 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  Ret;.}../*.** Ch
2450: 65 63 6b 20 69 66 20 74 68 65 20 70 72 6f 67 72  eck if the progr
2460: 61 6d 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  am stored in the
2470: 20 56 4d 20 61 73 73 6f 63 69 61 74 65 64 20 77   VM associated w
2480: 69 74 68 20 70 50 61 72 73 65 20 6d 61 79 0a 2a  ith pParse may.*
2490: 2a 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52 54  * throw an ABORT
24a0: 20 65 78 63 65 70 74 69 6f 6e 20 28 63 61 75 73   exception (caus
24b0: 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ing the statemen
24c0: 74 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74 69 72  t, but not entir
24d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e transaction.**
24e0: 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
24f0: 63 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64 69 74  ck). This condit
2500: 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20 74  ion is true if t
2510: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20  he main program 
2520: 6f 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72  or any.** sub-pr
2530: 6f 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20  ograms contains 
2540: 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
2550: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  wing:.**.**   * 
2560: 20 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50 31   OP_Halt with P1
2570: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
2580: 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f  NT and P2=OE_Abo
2590: 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48  rt..**   *  OP_H
25a0: 61 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68 20 50  altIfNull with P
25b0: 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  1=SQLITE_CONSTRA
25c0: 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62  INT and P2=OE_Ab
25d0: 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  ort..**   *  OP_
25e0: 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20  Destroy.**   *  
25f0: 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20 20  OP_VUpdate.**   
2600: 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a  *  OP_VRename.**
2610: 20 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74     *  OP_FkCount
2620: 65 72 20 77 69 74 68 20 50 32 3d 3d 30 20 28 69  er with P2==0 (i
2630: 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e  mmediate foreign
2640: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 29   key constraint)
2650: 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63  .**.** Then chec
2660: 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  k that the value
2670: 20 6f 66 20 50 61 72 73 65 2e 6d 61 79 41 62 6f   of Parse.mayAbo
2680: 72 74 20 69 73 20 74 72 75 65 20 69 66 20 61 6e  rt is true if an
2690: 0a 2a 2a 20 41 42 4f 52 54 20 6d 61 79 20 62 65  .** ABORT may be
26a0: 20 74 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73   thrown, or fals
26b0: 65 20 6f 74 68 65 72 77 69 73 65 2e 20 52 65 74  e otherwise. Ret
26c0: 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 64  urn true if it d
26d0: 6f 65 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72  oes.** match, or
26e0: 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   false otherwise
26f0: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
2700: 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62  is intended to b
2710: 65 20 75 73 65 64 20 61 73 0a 2a 2a 20 70 61 72  e used as.** par
2720: 74 20 6f 66 20 61 6e 20 61 73 73 65 72 74 20 73  t of an assert s
2730: 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20  tatement in the 
2740: 63 6f 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61  compiler. Simila
2750: 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73  r to:.**.**   as
2760: 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62  sert( sqlite3Vdb
2770: 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  eAssertMayAbort(
2780: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70  pParse->pVdbe, p
2790: 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29  Parse->mayAbort)
27a0: 20 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   );.*/.int sqlit
27b0: 65 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41  e3VdbeAssertMayA
27c0: 62 6f 72 74 28 56 64 62 65 20 2a 76 2c 20 69 6e  bort(Vdbe *v, in
27d0: 74 20 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20 69  t mayAbort){.  i
27e0: 6e 74 20 68 61 73 41 62 6f 72 74 20 3d 20 30 3b  nt hasAbort = 0;
27f0: 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64  .  Op *pOp;.  Vd
2800: 62 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a  beOpIter sIter;.
2810: 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72 2c    memset(&sIter,
2820: 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65 72   0, sizeof(sIter
2830: 29 29 3b 0a 20 20 73 49 74 65 72 2e 76 20 3d 20  ));.  sIter.v = 
2840: 76 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 70 4f  v;..  while( (pO
2850: 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26  p = opIterNext(&
2860: 73 49 74 65 72 29 29 21 3d 30 20 29 7b 0a 20 20  sIter))!=0 ){.  
2870: 20 20 69 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70    int opcode = p
2880: 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20  Op->opcode;.    
2890: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44  if( opcode==OP_D
28a0: 65 73 74 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65  estroy || opcode
28b0: 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c 20  ==OP_VUpdate || 
28c0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61  opcode==OP_VRena
28d0: 6d 65 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  me .#ifndef SQLI
28e0: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
28f0: 4b 45 59 0a 20 20 20 20 20 7c 7c 20 28 6f 70 63  KEY.     || (opc
2900: 6f 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65  ode==OP_FkCounte
2910: 72 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20  r && pOp->p1==0 
2920: 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 29 20 0a  && pOp->p2==1) .
2930: 23 65 6e 64 69 66 0a 20 20 20 20 20 7c 7c 20 28  #endif.     || (
2940: 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74  (opcode==OP_Halt
2950: 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48   || opcode==OP_H
2960: 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20  altIfNull) .    
2970: 20 20 26 26 20 28 70 4f 70 2d 3e 70 31 3d 3d 53    && (pOp->p1==S
2980: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
2990: 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f   && pOp->p2==OE_
29a0: 41 62 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a 20  Abort)).    ){. 
29b0: 20 20 20 20 20 68 61 73 41 62 6f 72 74 20 3d 20       hasAbort = 
29c0: 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
29d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
29e0: 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c  te3DbFree(v->db,
29f0: 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a   sIter.apSub);..
2a00: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65    /* Return true
2a10: 20 69 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61   if hasAbort==ma
2a20: 79 41 62 6f 72 74 2e 20 4f 72 20 69 66 20 61 20  yAbort. Or if a 
2a30: 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f  malloc failure o
2a40: 63 63 75 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20  ccured..  ** If 
2a50: 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74  malloc failed, t
2a60: 68 65 6e 20 74 68 65 20 77 68 69 6c 65 28 29 20  hen the while() 
2a70: 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61 79 20 6e  loop above may n
2a80: 6f 74 20 68 61 76 65 20 69 74 65 72 61 74 65 64  ot have iterated
2a90: 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c  .  ** through al
2aa0: 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 68 61  l opcodes and ha
2ab0: 73 41 62 6f 72 74 20 6d 61 79 20 62 65 20 73 65  sAbort may be se
2ac0: 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52  t incorrectly. R
2ad0: 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20  eturn.  ** true 
2ae0: 66 6f 72 20 74 68 69 73 20 63 61 73 65 20 74 6f  for this case to
2af0: 20 70 72 65 76 65 6e 74 20 74 68 65 20 61 73 73   prevent the ass
2b00: 65 72 74 28 29 20 69 6e 20 74 68 65 20 63 61 6c  ert() in the cal
2b10: 6c 65 72 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20  lers frame.  ** 
2b20: 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a  from failing.  *
2b30: 2f 0a 20 20 72 65 74 75 72 6e 20 28 20 76 2d 3e  /.  return ( v->
2b40: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2b50: 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61   || hasAbort==ma
2b60: 79 41 62 6f 72 74 20 29 3b 0a 7d 0a 23 65 6e 64  yAbort );.}.#end
2b70: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
2b80: 55 47 20 2d 20 74 68 65 20 73 71 6c 69 74 65 33  UG - the sqlite3
2b90: 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29  AssertMayAbort()
2ba0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a   function */../*
2bb0: 0a 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68  .** Loop through
2bc0: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6c 6f 6f   the program loo
2bd0: 6b 69 6e 67 20 66 6f 72 20 50 32 20 76 61 6c 75  king for P2 valu
2be0: 65 73 20 74 68 61 74 20 61 72 65 20 6e 65 67 61  es that are nega
2bf0: 74 69 76 65 0a 2a 2a 20 6f 6e 20 6a 75 6d 70 20  tive.** on jump 
2c00: 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 20 45  instructions.  E
2c10: 61 63 68 20 73 75 63 68 20 76 61 6c 75 65 20 69  ach such value i
2c20: 73 20 61 20 6c 61 62 65 6c 2e 20 20 52 65 73 6f  s a label.  Reso
2c30: 6c 76 65 20 74 68 65 0a 2a 2a 20 6c 61 62 65 6c  lve the.** label
2c40: 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20   by setting the 
2c50: 50 32 20 76 61 6c 75 65 20 74 6f 20 69 74 73 20  P2 value to its 
2c60: 63 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f  correct non-zero
2c70: 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   value..**.** Th
2c80: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
2c90: 6c 6c 65 64 20 6f 6e 63 65 20 61 66 74 65 72 20  lled once after 
2ca0: 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65  all opcodes have
2cb0: 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a   been inserted..
2cc0: 2a 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20 2a  **.** Variable *
2cd0: 70 4d 61 78 46 75 6e 63 41 72 67 73 20 69 73 20  pMaxFuncArgs is 
2ce0: 73 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  set to the maxim
2cf0: 75 6d 20 76 61 6c 75 65 20 6f 66 20 61 6e 79 20  um value of any 
2d00: 50 32 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20  P2 argument .** 
2d10: 74 6f 20 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f  to an OP_Functio
2d20: 6e 2c 20 4f 50 5f 41 67 67 53 74 65 70 20 6f 72  n, OP_AggStep or
2d30: 20 4f 50 5f 56 46 69 6c 74 65 72 20 6f 70 63 6f   OP_VFilter opco
2d40: 64 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  de. This is used
2d50: 20 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56   by .** sqlite3V
2d60: 64 62 65 4d 61 6b 65 52 65 61 64 79 28 29 20 74  dbeMakeReady() t
2d70: 6f 20 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e  o size the Vdbe.
2d80: 61 70 41 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a  apArg[] array..*
2d90: 2a 0a 2a 2a 20 54 68 65 20 4f 70 2e 6f 70 66 6c  *.** The Op.opfl
2da0: 61 67 73 20 66 69 65 6c 64 20 69 73 20 73 65 74  ags field is set
2db0: 20 6f 6e 20 61 6c 6c 20 6f 70 63 6f 64 65 73 2e   on all opcodes.
2dc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2dd0: 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28  resolveP2Values(
2de0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d  Vdbe *p, int *pM
2df0: 61 78 46 75 6e 63 41 72 67 73 29 7b 0a 20 20 69  axFuncArgs){.  i
2e00: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78  nt i;.  int nMax
2e10: 41 72 67 73 20 3d 20 2a 70 4d 61 78 46 75 6e 63  Args = *pMaxFunc
2e20: 41 72 67 73 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b  Args;.  Op *pOp;
2e30: 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d  .  int *aLabel =
2e40: 20 70 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d   p->aLabel;.  p-
2e50: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20  >readOnly = 1;. 
2e60: 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c   for(pOp=p->aOp,
2e70: 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d   i=p->nOp-1; i>=
2e80: 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a  0; i--, pOp++){.
2e90: 20 20 20 20 75 38 20 6f 70 63 6f 64 65 20 3d 20      u8 opcode = 
2ea0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20  pOp->opcode;..  
2eb0: 20 20 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 3d    pOp->opflags =
2ec0: 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72   sqlite3OpcodePr
2ed0: 6f 70 65 72 74 79 5b 6f 70 63 6f 64 65 5d 3b 0a  operty[opcode];.
2ee0: 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d      if( opcode==
2ef0: 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f  OP_Function || o
2f00: 70 63 6f 64 65 3d 3d 4f 50 5f 41 67 67 53 74 65  pcode==OP_AggSte
2f10: 70 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  p ){.      if( p
2f20: 4f 70 2d 3e 70 35 3e 6e 4d 61 78 41 72 67 73 20  Op->p5>nMaxArgs 
2f30: 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70  ) nMaxArgs = pOp
2f40: 2d 3e 70 35 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ->p5;.    }else 
2f50: 69 66 28 20 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f  if( (opcode==OP_
2f60: 54 72 61 6e 73 61 63 74 69 6f 6e 20 26 26 20 70  Transaction && p
2f70: 4f 70 2d 3e 70 32 21 3d 30 29 20 7c 7c 20 6f 70  Op->p2!=0) || op
2f80: 63 6f 64 65 3d 3d 4f 50 5f 56 61 63 75 75 6d 20  code==OP_Vacuum 
2f90: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 65 61 64  ){.      p->read
2fa0: 4f 6e 6c 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65  Only = 0;.#ifnde
2fb0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
2fc0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d  RTUALTABLE.    }
2fd0: 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d  else if( opcode=
2fe0: 3d 4f 50 5f 56 55 70 64 61 74 65 20 29 7b 0a 20  =OP_VUpdate ){. 
2ff0: 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32       if( pOp->p2
3000: 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78  >nMaxArgs ) nMax
3010: 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a  Args = pOp->p2;.
3020: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
3030: 63 6f 64 65 3d 3d 4f 50 5f 56 46 69 6c 74 65 72  code==OP_VFilter
3040: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b   ){.      int n;
3050: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
3060: 2d 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29  ->nOp - i >= 3 )
3070: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
3080: 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d  pOp[-1].opcode==
3090: 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20 20  OP_Integer );.  
30a0: 20 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e      n = pOp[-1].
30b0: 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e  p1;.      if( n>
30c0: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
30d0: 72 67 73 20 3d 20 6e 3b 0a 23 65 6e 64 69 66 0a  rgs = n;.#endif.
30e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
30f0: 63 6f 64 65 3d 3d 4f 50 5f 4e 65 78 74 20 7c 7c  code==OP_Next ||
3100: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74   opcode==OP_Sort
3110: 65 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  erNext ){.      
3120: 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65  pOp->p4.xAdvance
3130: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e   = sqlite3BtreeN
3140: 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  ext;.      pOp->
3150: 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41  p4type = P4_ADVA
3160: 4e 43 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  NCE;.    }else i
3170: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 50 72  f( opcode==OP_Pr
3180: 65 76 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 2d  ev ){.      pOp-
3190: 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73  >p4.xAdvance = s
31a0: 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
31b0: 6f 75 73 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  ous;.      pOp->
31c0: 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41  p4type = P4_ADVA
31d0: 4e 43 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  NCE;.    }..    
31e0: 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c 61 67  if( (pOp->opflag
31f0: 73 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21  s & OPFLG_JUMP)!
3200: 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20  =0 && pOp->p2<0 
3210: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
3220: 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e   -1-pOp->p2<p->n
3230: 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20 20 70  Label );.      p
3240: 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b  Op->p2 = aLabel[
3250: 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20  -1-pOp->p2];.   
3260: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
3270: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  DbFree(p->db, p-
3280: 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 2d 3e 61  >aLabel);.  p->a
3290: 4c 61 62 65 6c 20 3d 20 30 3b 0a 0a 20 20 2a 70  Label = 0;..  *p
32a0: 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d  MaxFuncArgs = nM
32b0: 61 78 41 72 67 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  axArgs;.}../*.**
32c0: 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72   Return the addr
32d0: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
32e0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  instruction to b
32f0: 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69  e inserted..*/.i
3300: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  nt sqlite3VdbeCu
3310: 72 72 65 6e 74 41 64 64 72 28 56 64 62 65 20 2a  rrentAddr(Vdbe *
3320: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
3330: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
3340: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65 74  IC_INIT );.  ret
3350: 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f  urn p->nOp;.}../
3360: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
3370: 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  on returns a poi
3380: 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72 72 61  nter to the arra
3390: 79 20 6f 66 20 6f 70 63 6f 64 65 73 20 61 73 73  y of opcodes ass
33a0: 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
33b0: 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20  the Vdbe passed 
33c0: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
33d0: 75 6d 65 6e 74 2e 20 49 74 20 69 73 20 74 68 65  ument. It is the
33e0: 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73   callers respons
33f0: 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 72  ibility.** to ar
3400: 72 61 6e 67 65 20 66 6f 72 20 74 68 65 20 72 65  range for the re
3410: 74 75 72 6e 65 64 20 61 72 72 61 79 20 74 6f 20  turned array to 
3420: 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  be eventually fr
3430: 65 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a 2a  eed using the .*
3440: 2a 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61  * vdbeFreeOpArra
3450: 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  y() function..**
3460: 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72  .** Before retur
3470: 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20 73  ning, *pnOp is s
3480: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
3490: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
34a0: 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  he returned.** a
34b0: 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d  rray. Also, *pnM
34c0: 61 78 41 72 67 20 69 73 20 73 65 74 20 74 6f 20  axArg is set to 
34d0: 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 69 74  the larger of it
34e0: 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  s current value 
34f0: 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  and .** the numb
3500: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
3510: 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b   the Vdbe.apArg[
3520: 5d 20 61 72 72 61 79 20 72 65 71 75 69 72 65 64  ] array required
3530: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
3540: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 70 72 6f  .** returned pro
3550: 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20  gram..*/.VdbeOp 
3560: 2a 73 71 6c 69 74 65 33 56 64 62 65 54 61 6b 65  *sqlite3VdbeTake
3570: 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 70 2c  OpArray(Vdbe *p,
3580: 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 20   int *pnOp, int 
3590: 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56 64  *pnMaxArg){.  Vd
35a0: 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61  beOp *aOp = p->a
35b0: 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61 4f  Op;.  assert( aO
35c0: 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c  p && !p->db->mal
35d0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20  locFailed );..  
35e0: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 73 71  /* Check that sq
35f0: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
3600: 65 65 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c  ee() was not cal
3610: 6c 65 64 20 6f 6e 20 74 68 69 73 20 56 4d 20 2a  led on this VM *
3620: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62  /.  assert( p->b
3630: 74 72 65 65 4d 61 73 6b 3d 3d 30 20 29 3b 0a 0a  treeMask==0 );..
3640: 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65    resolveP2Value
3650: 73 28 70 2c 20 70 6e 4d 61 78 41 72 67 29 3b 0a  s(p, pnMaxArg);.
3660: 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70    *pnOp = p->nOp
3670: 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a  ;.  p->aOp = 0;.
3680: 20 20 72 65 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a    return aOp;.}.
3690: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68 6f  ./*.** Add a who
36a0: 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 72 61  le list of opera
36b0: 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70 65  tions to the ope
36c0: 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20 52  ration stack.  R
36d0: 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 64 64  eturn the.** add
36e0: 72 65 73 73 20 6f 66 20 74 68 65 20 66 69 72 73  ress of the firs
36f0: 74 20 6f 70 65 72 61 74 69 6f 6e 20 61 64 64 65  t operation adde
3700: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
3710: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 56  3VdbeAddOpList(V
3720: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c  dbe *p, int nOp,
3730: 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73   VdbeOpList cons
3740: 74 20 2a 61 4f 70 29 7b 0a 20 20 69 6e 74 20 61  t *aOp){.  int a
3750: 64 64 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ddr;.  assert( p
3760: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
3770: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
3780: 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e  ( p->nOp + nOp >
3790: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20   p->nOpAlloc && 
37a0: 67 72 6f 77 4f 70 41 72 72 61 79 28 70 29 20 29  growOpArray(p) )
37b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
37c0: 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e    }.  addr = p->
37d0: 6e 4f 70 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  nOp;.  if( ALWAY
37e0: 53 28 6e 4f 70 3e 30 29 20 29 7b 0a 20 20 20 20  S(nOp>0) ){.    
37f0: 69 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65 4f  int i;.    VdbeO
3800: 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 70 49 6e  pList const *pIn
3810: 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28   = aOp;.    for(
3820: 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c  i=0; i<nOp; i++,
3830: 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69   pIn++){.      i
3840: 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e 70 32 3b  nt p2 = pIn->p2;
3850: 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70  .      VdbeOp *p
3860: 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b  Out = &p->aOp[i+
3870: 61 64 64 72 5d 3b 0a 20 20 20 20 20 20 70 4f 75  addr];.      pOu
3880: 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70 49 6e 2d  t->opcode = pIn-
3890: 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 20 20 70  >opcode;.      p
38a0: 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e 70  Out->p1 = pIn->p
38b0: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 32 3c  1;.      if( p2<
38c0: 30 20 26 26 20 28 73 71 6c 69 74 65 33 4f 70 63  0 && (sqlite3Opc
38d0: 6f 64 65 50 72 6f 70 65 72 74 79 5b 70 4f 75 74  odeProperty[pOut
38e0: 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c  ->opcode] & OPFL
38f0: 47 5f 4a 55 4d 50 29 21 3d 30 20 29 7b 0a 20 20  G_JUMP)!=0 ){.  
3900: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d        pOut->p2 =
3910: 20 61 64 64 72 20 2b 20 41 44 44 52 28 70 32 29   addr + ADDR(p2)
3920: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
3930: 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20         pOut->p2 
3940: 3d 20 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = p2;.      }.  
3950: 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70      pOut->p3 = p
3960: 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f  In->p3;.      pO
3970: 75 74 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  ut->p4type = P4_
3980: 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 20 20 70  NOTUSED;.      p
3990: 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  Out->p4.p = 0;. 
39a0: 20 20 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20       pOut->p5 = 
39b0: 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
39c0: 5f 44 45 42 55 47 0a 20 20 20 20 20 20 70 4f 75  _DEBUG.      pOu
39d0: 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b  t->zComment = 0;
39e0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
39f0: 65 33 56 64 62 65 41 64 64 6f 70 54 72 61 63 65  e3VdbeAddopTrace
3a00: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
3a10: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30  te3VdbePrintOp(0
3a20: 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61 4f  , i+addr, &p->aO
3a30: 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20 20  p[i+addr]);.    
3a40: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
3a50: 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e  .    p->nOp += n
3a60: 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  Op;.  }.  return
3a70: 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
3a80: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
3a90: 20 6f 66 20 74 68 65 20 50 31 20 6f 70 65 72 61   of the P1 opera
3aa0: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
3ab0: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
3ac0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3ad0: 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20  s useful when a 
3ae0: 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73  large program is
3af0: 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a   loaded from a.*
3b00: 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75  * static array u
3b10: 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65  sing sqlite3Vdbe
3b20: 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65  AddOpList but we
3b30: 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a   want to make a.
3b40: 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61  ** few minor cha
3b50: 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67  nges to the prog
3b60: 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ram..*/.void sql
3b70: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
3b80: 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64  (Vdbe *p, u32 ad
3b90: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
3ba0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
3bb0: 20 20 69 66 28 20 28 28 75 33 32 29 70 2d 3e 6e    if( ((u32)p->n
3bc0: 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20 20 20  Op)>addr ){.    
3bd0: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 31 20  p->aOp[addr].p1 
3be0: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = val;.  }.}../*
3bf0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
3c00: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 32 20 6f  alue of the P2 o
3c10: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
3c20: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
3c30: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
3c40: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 66 6f 72  ne is useful for
3c50: 20 73 65 74 74 69 6e 67 20 61 20 6a 75 6d 70 20   setting a jump 
3c60: 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a  destination..*/.
3c70: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3c80: 43 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70  ChangeP2(Vdbe *p
3c90: 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20  , u32 addr, int 
3ca0: 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20  val){.  assert( 
3cb0: 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28  p!=0 );.  if( ((
3cc0: 75 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72  u32)p->nOp)>addr
3cd0: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61   ){.    p->aOp[a
3ce0: 64 64 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a 20  ddr].p2 = val;. 
3cf0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
3d00: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
3d10: 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 66  the P3 operand f
3d20: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
3d30: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
3d40: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
3d50: 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20  angeP3(Vdbe *p, 
3d60: 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61  u32 addr, int va
3d70: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21  l){.  assert( p!
3d80: 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33  =0 );.  if( ((u3
3d90: 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29  2)p->nOp)>addr )
3da0: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64  {.    p->aOp[add
3db0: 72 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a 20 20 7d  r].p3 = val;.  }
3dc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
3dd0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
3de0: 65 20 50 35 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P5 operand for
3df0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
3e00: 6c 79 0a 2a 2a 20 61 64 64 65 64 20 6f 70 65 72  ly.** added oper
3e10: 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
3e20: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
3e30: 50 35 28 56 64 62 65 20 2a 70 2c 20 75 38 20 76  P5(Vdbe *p, u8 v
3e40: 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  al){.  assert( p
3e50: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  !=0 );.  if( p->
3e60: 61 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  aOp ){.    asser
3e70: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20  t( p->nOp>0 );. 
3e80: 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70     p->aOp[p->nOp
3e90: 2d 31 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a 20 20  -1].p5 = val;.  
3ea0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
3eb0: 65 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64  e the P2 operand
3ec0: 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   of instruction 
3ed0: 61 64 64 72 20 73 6f 20 74 68 61 74 20 69 74 20  addr so that it 
3ee0: 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65  points to.** the
3ef0: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
3f00: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
3f10: 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f   to be coded..*/
3f20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
3f30: 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a  eJumpHere(Vdbe *
3f40: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
3f50: 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20  assert( addr>=0 
3f60: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
3f70: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
3f80: 61 64 64 72 3e 3d 30 20 29 20 73 71 6c 69 74 65  addr>=0 ) sqlite
3f90: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c  3VdbeChangeP2(p,
3fa0: 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a   addr, p->nOp);.
3fb0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  }.../*.** If the
3fc0: 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20 73   input FuncDef s
3fd0: 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68 65  tructure is ephe
3fe0: 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 65  meral, then free
3ff0: 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20   it.  If.** the 
4000: 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 65  FuncDef is not e
4010: 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f  phermal, then do
4020: 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61   nothing..*/.sta
4030: 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70 68  tic void freeEph
4040: 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 73  emeralFunction(s
4050: 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63  qlite3 *db, Func
4060: 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69 66  Def *pDef){.  if
4070: 28 20 41 4c 57 41 59 53 28 70 44 65 66 29 20 26  ( ALWAYS(pDef) &
4080: 26 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20 26  & (pDef->flags &
4090: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48   SQLITE_FUNC_EPH
40a0: 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  EM)!=0 ){.    sq
40b0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
40c0: 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  pDef);.  }.}..st
40d0: 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 72  atic void vdbeFr
40e0: 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65  eeOpArray(sqlite
40f0: 33 20 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b  3 *, Op *, int);
4100: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
4110: 20 50 34 20 76 61 6c 75 65 20 69 66 20 6e 65 63   P4 value if nec
4120: 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  essary..*/.stati
4130: 63 20 76 6f 69 64 20 66 72 65 65 50 34 28 73 71  c void freeP4(sq
4140: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 70  lite3 *db, int p
4150: 34 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 34 29  4type, void *p4)
4160: 7b 0a 20 20 69 66 28 20 70 34 20 29 7b 0a 20 20  {.  if( p4 ){.  
4170: 20 20 61 73 73 65 72 74 28 20 64 62 20 29 3b 0a    assert( db );.
4180: 20 20 20 20 73 77 69 74 63 68 28 20 70 34 74 79      switch( p4ty
4190: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
41a0: 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20 20 20   P4_REAL:.      
41b0: 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20  case P4_INT64:. 
41c0: 20 20 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e       case P4_DYN
41d0: 41 4d 49 43 3a 0a 20 20 20 20 20 20 63 61 73 65  AMIC:.      case
41e0: 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 0a 20 20 20   P4_KEYINFO:.   
41f0: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52     case P4_INTAR
4200: 52 41 59 3a 0a 20 20 20 20 20 20 63 61 73 65 20  RAY:.      case 
4210: 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
4220: 46 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  FF: {.        sq
4230: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4240: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
4250: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4260: 20 20 63 61 73 65 20 50 34 5f 4d 50 52 49 4e 54    case P4_MPRINT
4270: 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  F: {.        if(
4280: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
4290: 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 5f 66  d==0 ) sqlite3_f
42a0: 72 65 65 28 70 34 29 3b 0a 20 20 20 20 20 20 20  ree(p4);.       
42b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
42c0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 56 44        case P4_VD
42d0: 42 45 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20  BEFUNC: {.      
42e0: 20 20 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62    VdbeFunc *pVdb
42f0: 65 46 75 6e 63 20 3d 20 28 56 64 62 65 46 75 6e  eFunc = (VdbeFun
4300: 63 20 2a 29 70 34 3b 0a 20 20 20 20 20 20 20 20  c *)p4;.        
4310: 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e  freeEphemeralFun
4320: 63 74 69 6f 6e 28 64 62 2c 20 70 56 64 62 65 46  ction(db, pVdbeF
4330: 75 6e 63 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 20  unc->pFunc);.   
4340: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42       if( db->pnB
4350: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73  ytesFreed==0 ) s
4360: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
4370: 41 75 78 44 61 74 61 28 70 56 64 62 65 46 75 6e  AuxData(pVdbeFun
4380: 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  c, 0);.        s
4390: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
43a0: 20 70 56 64 62 65 46 75 6e 63 29 3b 0a 20 20 20   pVdbeFunc);.   
43b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
43c0: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
43d0: 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20  4_FUNCDEF: {.   
43e0: 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72       freeEphemer
43f0: 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28  alFunction(db, (
4400: 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20 20  FuncDef*)p4);.  
4410: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4420: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
4430: 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20  P4_MEM: {.      
4440: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
4450: 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20  sFreed==0 ){.   
4460: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61         sqlite3Va
4470: 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65 33  lueFree((sqlite3
4480: 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20  _value*)p4);.   
4490: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
44a0: 20 20 20 20 20 20 4d 65 6d 20 2a 70 20 3d 20 28        Mem *p = (
44b0: 4d 65 6d 2a 29 70 34 3b 0a 20 20 20 20 20 20 20  Mem*)p4;.       
44c0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
44d0: 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29  (db, p->zMalloc)
44e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
44f0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
4500: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4510: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4520: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34   }.      case P4
4530: 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20 20 20 20  _VTAB : {.      
4540: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
4550: 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69  sFreed==0 ) sqli
4560: 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 28 56  te3VtabUnlock((V
4570: 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20 20 20  Table *)p4);.   
4580: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4590: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
45a0: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
45b0: 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
45c0: 66 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e 79 20  for aOp and any 
45d0: 70 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61  p4 values alloca
45e0: 74 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f  ted for the.** o
45f0: 70 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65 64  pcodes contained
4600: 20 77 69 74 68 69 6e 2e 20 49 66 20 61 4f 70 20   within. If aOp 
4610: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69  is not NULL it i
4620: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e  s assumed to con
4630: 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74  tain .** nOp ent
4640: 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  ries. .*/.static
4650: 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70   void vdbeFreeOp
4660: 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64  Array(sqlite3 *d
4670: 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20  b, Op *aOp, int 
4680: 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f 70 20  nOp){.  if( aOp 
4690: 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a  ){.    Op *pOp;.
46a0: 20 20 20 20 66 6f 72 28 70 4f 70 3d 61 4f 70 3b      for(pOp=aOp;
46b0: 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20   pOp<&aOp[nOp]; 
46c0: 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66 72  pOp++){.      fr
46d0: 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34  eeP4(db, pOp->p4
46e0: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29  type, pOp->p4.p)
46f0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
4700: 44 45 42 55 47 0a 20 20 20 20 20 20 73 71 6c 69  DEBUG.      sqli
4710: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f  te3DbFree(db, pO
4720: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65  p->zComment);.#e
4730: 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d 0a  ndif     .    }.
4740: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
4750: 72 65 65 28 64 62 2c 20 61 4f 70 29 3b 0a 7d 0a  ree(db, aOp);.}.
4760: 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65 20  ./*.** Link the 
4770: 53 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a 65 63  SubProgram objec
4780: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
4790: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
47a0: 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 0a  into the linked.
47b0: 2a 2a 20 6c 69 73 74 20 61 74 20 56 64 62 65 2e  ** list at Vdbe.
47c0: 70 53 75 62 50 72 6f 67 72 61 6d 2e 20 54 68 69  pSubProgram. Thi
47d0: 73 20 6c 69 73 74 20 69 73 20 75 73 65 64 20 74  s list is used t
47e0: 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73 75 62  o delete all sub
47f0: 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65  -program.** obje
4800: 63 74 73 20 77 68 65 6e 20 74 68 65 20 56 4d 20  cts when the VM 
4810: 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71  is no longer req
4820: 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  uired..*/.void s
4830: 71 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b 53 75  qlite3VdbeLinkSu
4840: 62 50 72 6f 67 72 61 6d 28 56 64 62 65 20 2a 70  bProgram(Vdbe *p
4850: 56 64 62 65 2c 20 53 75 62 50 72 6f 67 72 61 6d  Vdbe, SubProgram
4860: 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65 78 74   *p){.  p->pNext
4870: 20 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72   = pVdbe->pProgr
4880: 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70 50 72  am;.  pVdbe->pPr
4890: 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a  ogram = p;.}../*
48a0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6f  .** Change the o
48b0: 70 63 6f 64 65 20 61 74 20 61 64 64 72 20 69 6e  pcode at addr in
48c0: 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a 76 6f  to OP_Noop.*/.vo
48d0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
48e0: 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20  angeToNoop(Vdbe 
48f0: 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20  *p, int addr){. 
4900: 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20   if( p->aOp ){. 
4910: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d     VdbeOp *pOp =
4920: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
4930: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
4940: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 66 72 65  = p->db;.    fre
4950: 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74  eP4(db, pOp->p4t
4960: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
4970: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c  .    memset(pOp,
4980: 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30   0, sizeof(pOp[0
4990: 5d 29 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 6f 70  ]));.    pOp->op
49a0: 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  code = OP_Noop;.
49b0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
49c0: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
49d0: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
49e0: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
49f0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
4a00: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
4a10: 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72  seful when a lar
4a20: 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f  ge program is lo
4a30: 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73  aded from a.** s
4a40: 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e  tatic array usin
4a50: 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  g sqlite3VdbeAdd
4a60: 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61  OpList but we wa
4a70: 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20  nt to make a.** 
4a80: 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65  few minor change
4a90: 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d  s to the program
4aa0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20  ..**.** If n>=0 
4ab0: 74 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72  then the P4 oper
4ac0: 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20  and is dynamic, 
4ad0: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63  meaning that a c
4ae0: 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74  opy of.** the st
4af0: 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74  ring is made int
4b00: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
4b10: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
4b20: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61  alloc()..** A va
4b30: 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e  lue of n==0 mean
4b40: 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20  s copy bytes of 
4b50: 7a 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e  zP4 up to and in
4b60: 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66  cluding the.** f
4b70: 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20  irst null byte. 
4b80: 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70   If n>0 then cop
4b90: 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a  y n+1 bytes of z
4ba0: 50 34 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d  P4..**.** If n==
4bb0: 50 34 5f 4b 45 59 49 4e 46 4f 20 69 74 20 6d 65  P4_KEYINFO it me
4bc0: 61 6e 73 20 74 68 61 74 20 7a 50 34 20 69 73 20  ans that zP4 is 
4bd0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b  a pointer to a K
4be0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
4bf0: 2e 0a 2a 2a 20 41 20 63 6f 70 79 20 69 73 20 6d  ..** A copy is m
4c00: 61 64 65 20 6f 66 20 74 68 65 20 4b 65 79 49 6e  ade of the KeyIn
4c10: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e 74  fo structure int
4c20: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
4c30: 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  d from.** sqlite
4c40: 33 5f 6d 61 6c 6c 6f 63 2c 20 74 6f 20 62 65 20  3_malloc, to be 
4c50: 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20 56  freed when the V
4c60: 64 62 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  dbe is finalized
4c70: 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e  ..** n==P4_KEYIN
4c80: 46 4f 5f 48 41 4e 44 4f 46 46 20 69 6e 64 69 63  FO_HANDOFF indic
4c90: 61 74 65 73 20 74 68 61 74 20 7a 50 34 20 70 6f  ates that zP4 po
4ca0: 69 6e 74 73 20 74 6f 20 61 20 4b 65 79 49 6e 66  ints to a KeyInf
4cb0: 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 73  o structure.** s
4cc0: 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  tored in memory 
4cd0: 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
4ce0: 68 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  has obtained fro
4cf0: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
4d00: 2e 20 54 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72  . The .** caller
4d10: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 66 72 65 65   should not free
4d20: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c   the allocation,
4d30: 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65   it will be free
4d40: 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20  d when the Vdbe 
4d50: 69 73 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 2e  is.** finalized.
4d60: 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61  .** .** Other va
4d70: 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54  lues of n (P4_ST
4d80: 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  ATIC, P4_COLLSEQ
4d90: 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20   etc.) indicate 
4da0: 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a  that zP4 points.
4db0: 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f  ** to a string o
4dc0: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
4dd0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
4de0: 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20  o exist for the 
4df0: 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74  lifetime of.** t
4e00: 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73  he Vdbe. In thes
4e10: 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a  e cases we can j
4e20: 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69  ust copy the poi
4e30: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nter..**.** If a
4e40: 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67  ddr<0 then chang
4e50: 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74  e P4 on the most
4e60: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
4e70: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ed instruction..
4e80: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
4e90: 64 62 65 43 68 61 6e 67 65 50 34 28 56 64 62 65  dbeChangeP4(Vdbe
4ea0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 63   *p, int addr, c
4eb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20  onst char *zP4, 
4ec0: 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f  int n){.  Op *pO
4ed0: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
4ee0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ;.  assert( p!=0
4ef0: 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62   );.  db = p->db
4f00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
4f10: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
4f20: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70  _INIT );.  if( p
4f30: 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->aOp==0 || db->
4f40: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
4f50: 20 20 20 20 69 66 20 28 20 6e 21 3d 50 34 5f 4b      if ( n!=P4_K
4f60: 45 59 49 4e 46 4f 20 26 26 20 6e 21 3d 50 34 5f  EYINFO && n!=P4_
4f70: 56 54 41 42 20 29 20 7b 0a 20 20 20 20 20 20 66  VTAB ) {.      f
4f80: 72 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f  reeP4(db, n, (vo
4f90: 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50  id*)*(char**)&zP
4fa0: 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  4);.    }.    re
4fb0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
4fc0: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
4fd0: 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3c 70    assert( addr<p
4fe0: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 61  ->nOp );.  if( a
4ff0: 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64  ddr<0 ){.    add
5000: 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a  r = p->nOp - 1;.
5010: 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e    }.  pOp = &p->
5020: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 61 73 73  aOp[addr];.  ass
5030: 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65  ert( pOp->p4type
5040: 3d 3d 50 34 5f 4e 4f 54 55 53 45 44 20 7c 7c 20  ==P4_NOTUSED || 
5050: 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
5060: 49 4e 54 33 32 20 29 3b 0a 20 20 66 72 65 65 50  INT32 );.  freeP
5070: 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70  4(db, pOp->p4typ
5080: 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20  e, pOp->p4.p);. 
5090: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a   pOp->p4.p = 0;.
50a0: 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33    if( n==P4_INT3
50b0: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65  2 ){.    /* Note
50c0: 3a 20 74 68 69 73 20 63 61 73 74 20 69 73 20 73  : this cast is s
50d0: 61 66 65 2c 20 62 65 63 61 75 73 65 20 74 68 65  afe, because the
50e0: 20 6f 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69   origin data poi
50f0: 6e 74 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20  nt was an int.  
5100: 20 20 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61    ** that was ca
5110: 73 74 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63  st to a (const c
5120: 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70  har *). */.    p
5130: 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54  Op->p4.i = SQLIT
5140: 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34  E_PTR_TO_INT(zP4
5150: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  );.    pOp->p4ty
5160: 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20  pe = P4_INT32;. 
5170: 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 34 3d 3d   }else if( zP4==
5180: 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  0 ){.    pOp->p4
5190: 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d  .p = 0;.    pOp-
51a0: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54  >p4type = P4_NOT
51b0: 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  USED;.  }else if
51c0: 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20  ( n==P4_KEYINFO 
51d0: 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  ){.    KeyInfo *
51e0: 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 6e  pKeyInfo;.    in
51f0: 74 20 6e 46 69 65 6c 64 2c 20 6e 42 79 74 65 3b  t nField, nByte;
5200: 0a 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 28  ..    nField = (
5210: 28 4b 65 79 49 6e 66 6f 2a 29 7a 50 34 29 2d 3e  (KeyInfo*)zP4)->
5220: 6e 46 69 65 6c 64 3b 0a 20 20 20 20 6e 42 79 74  nField;.    nByt
5230: 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79  e = sizeof(*pKey
5240: 49 6e 66 6f 29 20 2b 20 28 6e 46 69 65 6c 64 2d  Info) + (nField-
5250: 31 29 2a 73 69 7a 65 6f 66 28 70 4b 65 79 49 6e  1)*sizeof(pKeyIn
5260: 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 20 2b 20  fo->aColl[0]) + 
5270: 6e 46 69 65 6c 64 3b 0a 20 20 20 20 70 4b 65 79  nField;.    pKey
5280: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
5290: 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 42 79  MallocRaw(0, nBy
52a0: 74 65 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  te);.    pOp->p4
52b0: 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79  .pKeyInfo = pKey
52c0: 49 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 70 4b  Info;.    if( pK
52d0: 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
52e0: 75 38 20 2a 61 53 6f 72 74 4f 72 64 65 72 3b 0a  u8 *aSortOrder;.
52f0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 28 63 68        memcpy((ch
5300: 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 7a 50  ar*)pKeyInfo, zP
5310: 34 2c 20 6e 42 79 74 65 20 2d 20 6e 46 69 65 6c  4, nByte - nFiel
5320: 64 29 3b 0a 20 20 20 20 20 20 61 53 6f 72 74 4f  d);.      aSortO
5330: 72 64 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  rder = pKeyInfo-
5340: 3e 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  >aSortOrder;.   
5350: 20 20 20 61 73 73 65 72 74 28 20 61 53 6f 72 74     assert( aSort
5360: 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20  Order!=0 );.    
5370: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72    pKeyInfo->aSor
5380: 74 4f 72 64 65 72 20 3d 20 28 75 6e 73 69 67 6e  tOrder = (unsign
5390: 65 64 20 63 68 61 72 2a 29 26 70 4b 65 79 49 6e  ed char*)&pKeyIn
53a0: 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 46 69 65 6c 64  fo->aColl[nField
53b0: 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ];.      memcpy(
53c0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
53d0: 72 64 65 72 2c 20 61 53 6f 72 74 4f 72 64 65 72  rder, aSortOrder
53e0: 2c 20 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20  , nField);.     
53f0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
5400: 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20 7d  4_KEYINFO;.    }
5410: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 64  else{.      p->d
5420: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
5430: 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  = 1;.      pOp->
5440: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
5450: 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  SED;.    }.  }el
5460: 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59  se if( n==P4_KEY
5470: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 29 7b 0a  INFO_HANDOFF ){.
5480: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20      pOp->p4.p = 
5490: 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20  (void*)zP4;.    
54a0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
54b0: 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73  _KEYINFO;.  }els
54c0: 65 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42  e if( n==P4_VTAB
54d0: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   ){.    pOp->p4.
54e0: 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a  p = (void*)zP4;.
54f0: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
5500: 3d 20 50 34 5f 56 54 41 42 3b 0a 20 20 20 20 73  = P4_VTAB;.    s
5510: 71 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b 28 28  qlite3VtabLock((
5520: 56 54 61 62 6c 65 20 2a 29 7a 50 34 29 3b 0a 20  VTable *)zP4);. 
5530: 20 20 20 61 73 73 65 72 74 28 20 28 28 56 54 61     assert( ((VTa
5540: 62 6c 65 20 2a 29 7a 50 34 29 2d 3e 64 62 3d 3d  ble *)zP4)->db==
5550: 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 65 6c 73 65  p->db );.  }else
5560: 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20   if( n<0 ){.    
5570: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69  pOp->p4.p = (voi
5580: 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d  d*)zP4;.    pOp-
5590: 3e 70 34 74 79 70 65 20 3d 20 28 73 69 67 6e 65  >p4type = (signe
55a0: 64 20 63 68 61 72 29 6e 3b 0a 20 20 7d 65 6c 73  d char)n;.  }els
55b0: 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  e{.    if( n==0 
55c0: 29 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ) n = sqlite3Str
55d0: 6c 65 6e 33 30 28 7a 50 34 29 3b 0a 20 20 20 20  len30(zP4);.    
55e0: 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69  pOp->p4.z = sqli
55f0: 74 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e  te3DbStrNDup(p->
5600: 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20  db, zP4, n);.   
5610: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
5620: 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d  4_DYNAMIC;.  }.}
5630: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
5640: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
5650: 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65  e comment on the
5660: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
5670: 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  oded instruction
5680: 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20  .  Or.** insert 
5690: 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20  a No-op and add 
56a0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74  the comment to t
56b0: 68 61 74 20 6e 65 77 20 69 6e 73 74 72 75 63 74  hat new instruct
56c0: 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61  ion.  This.** ma
56d0: 6b 65 73 20 74 68 65 20 63 6f 64 65 20 65 61 73  kes the code eas
56e0: 69 65 72 20 74 6f 20 72 65 61 64 20 64 75 72 69  ier to read duri
56f0: 6e 67 20 64 65 62 75 67 67 69 6e 67 2e 20 20 4e  ng debugging.  N
5700: 6f 6e 65 20 6f 66 20 74 68 69 73 20 68 61 70 70  one of this happ
5710: 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64  ens.** in a prod
5720: 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f  uction build..*/
5730: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
5740: 65 56 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a  eVComment(Vdbe *
5750: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
5760: 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20  Format, va_list 
5770: 61 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ap){.  assert( p
5780: 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f  ->nOp>0 || p->aO
5790: 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p==0 );.  assert
57a0: 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70  ( p->aOp==0 || p
57b0: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
57c0: 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70  zComment==0 || p
57d0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
57e0: 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  ed );.  if( p->n
57f0: 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  Op ){.    assert
5800: 28 20 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20 20  ( p->aOp );.    
5810: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
5820: 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  >db, p->aOp[p->n
5830: 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 29 3b  Op-1].zComment);
5840: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  .    p->aOp[p->n
5850: 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 20 3d  Op-1].zComment =
5860: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
5870: 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c  (p->db, zFormat,
5880: 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64   ap);.  }.}.void
5890: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d   sqlite3VdbeComm
58a0: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
58b0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
58c0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
58d0: 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b  t ap;.  if( p ){
58e0: 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70  .    va_start(ap
58f0: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  , zFormat);.    
5900: 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20  vdbeVComment(p, 
5910: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
5920: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
5930: 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
5940: 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
5950: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
5960: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
5970: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
5980: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
5990: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
59a0: 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a  p0(p, OP_Noop);.
59b0: 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c      va_start(ap,
59c0: 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76   zFormat);.    v
59d0: 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a  dbeVComment(p, z
59e0: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20  Format, ap);.   
59f0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d   va_end(ap);.  }
5a00: 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44  .}.#endif  /* ND
5a10: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  EBUG */../*.** R
5a20: 65 74 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65  eturn the opcode
5a30: 20 66 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64   for a given add
5a40: 72 65 73 73 2e 20 20 49 66 20 74 68 65 20 61 64  ress.  If the ad
5a50: 64 72 65 73 73 20 69 73 20 2d 31 2c 20 74 68 65  dress is -1, the
5a60: 6e 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20  n.** return the 
5a70: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e  most recently in
5a80: 73 65 72 74 65 64 20 6f 70 63 6f 64 65 2e 0a 2a  serted opcode..*
5a90: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
5aa0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
5ab0: 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 70  r has occurred p
5ac0: 72 69 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c  rior to the call
5ad0: 69 6e 67 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72  ing of this.** r
5ae0: 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20 61 20 70  outine, then a p
5af0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 64 75 6d 6d  ointer to a dumm
5b00: 79 20 56 64 62 65 4f 70 20 77 69 6c 6c 20 62 65  y VdbeOp will be
5b10: 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68 61 74   returned.  That
5b20: 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65   opcode.** is re
5b30: 61 64 61 62 6c 65 20 62 75 74 20 6e 6f 74 20 77  adable but not w
5b40: 72 69 74 61 62 6c 65 2c 20 74 68 6f 75 67 68 20  ritable, though 
5b50: 69 74 20 69 73 20 63 61 73 74 20 74 6f 20 61 20  it is cast to a 
5b60: 77 72 69 74 61 62 6c 65 20 76 61 6c 75 65 2e 0a  writable value..
5b70: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 6f 66  ** The return of
5b80: 20 61 20 64 75 6d 6d 79 20 6f 70 63 6f 64 65 20   a dummy opcode 
5b90: 61 6c 6c 6f 77 73 20 74 68 65 20 63 61 6c 6c 20  allows the call 
5ba0: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 66 75 6e 63  to continue func
5bb0: 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61 66 74 65 72  tioning.** after
5bc0: 20 61 20 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74   a OOM fault wit
5bd0: 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 63  hout having to c
5be0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
5bf0: 68 65 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a  he return from .
5c00: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
5c10: 69 73 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74  is a valid point
5c20: 65 72 2e 20 20 42 75 74 20 62 65 63 61 75 73 65  er.  But because
5c30: 20 74 68 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64   the dummy.opcod
5c40: 65 20 69 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79  e is 0,.** dummy
5c50: 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 77   will never be w
5c60: 72 69 74 74 65 6e 20 74 6f 2e 20 20 54 68 69 73  ritten to.  This
5c70: 20 69 73 20 76 65 72 69 66 69 65 64 20 62 79 20   is verified by 
5c80: 63 6f 64 65 20 69 6e 73 70 65 63 74 69 6f 6e 20  code inspection 
5c90: 61 6e 64 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e  and.** by runnin
5ca0: 67 20 77 69 74 68 20 56 61 6c 67 72 69 6e 64 2e  g with Valgrind.
5cb0: 0a 2a 2a 0a 2a 2a 20 41 62 6f 75 74 20 74 68 65  .**.** About the
5cc0: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f   #ifdef SQLITE_O
5cd0: 4d 49 54 5f 54 52 41 43 45 3a 20 20 4e 6f 72 6d  MIT_TRACE:  Norm
5ce0: 61 6c 6c 79 2c 20 74 68 69 73 20 72 6f 75 74 69  ally, this routi
5cf0: 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
5d00: 65 64 0a 2a 2a 20 75 6e 6c 65 73 73 20 70 2d 3e  ed.** unless p->
5d10: 6e 4f 70 3e 30 2e 20 20 54 68 69 73 20 69 73 20  nOp>0.  This is 
5d20: 62 65 63 61 75 73 65 20 69 6e 20 74 68 65 20 61  because in the a
5d30: 62 73 65 6e 73 65 20 6f 66 20 53 51 4c 49 54 45  bsense of SQLITE
5d40: 5f 4f 4d 49 54 5f 54 52 41 43 45 2c 0a 2a 2a 20  _OMIT_TRACE,.** 
5d50: 61 6e 20 4f 50 5f 54 72 61 63 65 20 69 6e 73 74  an OP_Trace inst
5d60: 72 75 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79  ruction is alway
5d70: 73 20 69 6e 73 65 72 74 65 64 20 62 79 20 73 71  s inserted by sq
5d80: 6c 69 74 65 33 56 64 62 65 47 65 74 28 29 20 61  lite3VdbeGet() a
5d90: 73 20 73 6f 6f 6e 20 61 73 0a 2a 2a 20 61 20 6e  s soon as.** a n
5da0: 65 77 20 56 44 42 45 20 69 73 20 63 72 65 61 74  ew VDBE is creat
5db0: 65 64 2e 20 20 53 6f 20 77 65 20 61 72 65 20 66  ed.  So we are f
5dc0: 72 65 65 20 74 6f 20 73 65 74 20 61 64 64 72 20  ree to set addr 
5dd0: 74 6f 20 70 2d 3e 6e 4f 70 2d 31 20 77 69 74 68  to p->nOp-1 with
5de0: 6f 75 74 0a 2a 2a 20 68 61 76 69 6e 67 20 74 6f  out.** having to
5df0: 20 64 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74 6f   double-check to
5e00: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
5e10: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 6e 6f  the result is no
5e20: 6e 2d 6e 65 67 61 74 69 76 65 2e 20 42 75 74 0a  n-negative. But.
5e30: 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ** if SQLITE_OMI
5e40: 54 5f 54 52 41 43 45 20 69 73 20 64 65 66 69 6e  T_TRACE is defin
5e50: 65 64 2c 20 74 68 65 20 4f 50 5f 54 72 61 63 65  ed, the OP_Trace
5e60: 20 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20   is omitted and 
5e70: 77 65 20 64 6f 20 6e 65 65 64 20 74 6f 0a 2a 2a  we do need to.**
5e80: 20 63 68 65 63 6b 20 74 68 65 20 76 61 6c 75 65   check the value
5e90: 20 6f 66 20 70 2d 3e 6e 4f 70 2d 31 20 62 65 66   of p->nOp-1 bef
5ea0: 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 0a  ore continuing..
5eb0: 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74  */.VdbeOp *sqlit
5ec0: 65 33 56 64 62 65 47 65 74 4f 70 28 56 64 62 65  e3VdbeGetOp(Vdbe
5ed0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
5ee0: 20 20 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69    /* C89 specifi
5ef0: 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73  es that the cons
5f00: 74 61 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c  tant "dummy" wil
5f10: 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  l be initialized
5f20: 20 74 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72   to all.  ** zer
5f30: 6f 73 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72  os, which is cor
5f40: 72 65 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65  rect.  MSVC gene
5f50: 72 61 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c  rates a warning,
5f60: 20 6e 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a   nevertheless. *
5f70: 2f 0a 20 20 73 74 61 74 69 63 20 56 64 62 65 4f  /.  static VdbeO
5f80: 70 20 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e  p dummy;  /* Ign
5f90: 6f 72 65 20 74 68 65 20 4d 53 56 43 20 77 61 72  ore the MSVC war
5fa0: 6e 69 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e  ning about no in
5fb0: 69 74 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61  itializer */.  a
5fc0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
5fd0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
5fe0: 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30   );.  if( addr<0
5ff0: 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
6000: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20  E_OMIT_TRACE.   
6010: 20 69 66 28 20 70 2d 3e 6e 4f 70 3d 3d 30 20 29   if( p->nOp==0 )
6020: 20 72 65 74 75 72 6e 20 28 56 64 62 65 4f 70 2a   return (VdbeOp*
6030: 29 26 64 75 6d 6d 79 3b 0a 23 65 6e 64 69 66 0a  )&dummy;.#endif.
6040: 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f      addr = p->nO
6050: 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73  p - 1;.  }.  ass
6060: 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26  ert( (addr>=0 &&
6070: 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c   addr<p->nOp) ||
6080: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
6090: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d  iled );.  if( p-
60a0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
60b0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
60c0: 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b  (VdbeOp*)&dummy;
60d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
60e0: 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64  turn &p->aOp[add
60f0: 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21  r];.  }.}..#if !
6100: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
6110: 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 7c 7c 20  MIT_EXPLAIN) || 
6120: 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
6130: 20 5c 0a 20 20 20 20 20 7c 7c 20 64 65 66 69 6e   \.     || defin
6140: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
6150: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
6160: 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20  TE_DEBUG)./*.** 
6170: 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67  Compute a string
6180: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
6190: 74 68 65 20 50 34 20 70 61 72 61 6d 65 74 65 72  the P4 parameter
61a0: 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a   for an opcode..
61b0: 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72  ** Use zTemp for
61c0: 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 74 65   any required te
61d0: 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 73  mporary buffer s
61e0: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
61f0: 63 68 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28  char *displayP4(
6200: 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a  Op *pOp, char *z
6210: 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29  Temp, int nTemp)
6220: 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20  {.  char *zP4 = 
6230: 7a 54 65 6d 70 3b 0a 20 20 61 73 73 65 72 74 28  zTemp;.  assert(
6240: 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20   nTemp>=20 );.  
6250: 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70 34 74  switch( pOp->p4t
6260: 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
6270: 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49  P4_KEYINFO_STATI
6280: 43 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b  C:.    case P4_K
6290: 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20  EYINFO: {.      
62a0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20  int i, j;.      
62b0: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
62c0: 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79  o = pOp->p4.pKey
62d0: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65  Info;.      asse
62e0: 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  rt( pKeyInfo->aS
62f0: 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20  ortOrder!=0 );. 
6300: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
6310: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
6320: 6d 70 2c 20 22 6b 65 79 69 6e 66 6f 28 25 64 22  mp, "keyinfo(%d"
6330: 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  , pKeyInfo->nFie
6340: 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 73  ld);.      i = s
6350: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
6360: 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f 72  Temp);.      for
6370: 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f  (j=0; j<pKeyInfo
6380: 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a  ->nField; j++){.
6390: 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
63a0: 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66  *pColl = pKeyInf
63b0: 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20  o->aColl[j];.   
63c0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
63d0: 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 20 3f  *zColl = pColl ?
63e0: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20   pColl->zName : 
63f0: 22 6e 69 6c 22 3b 0a 20 20 20 20 20 20 20 20 69  "nil";.        i
6400: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
6410: 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 3b 0a 20  rlen30(zColl);. 
6420: 20 20 20 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e         if( i+n>n
6430: 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20  Temp-6 ){.      
6440: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d      memcpy(&zTem
6450: 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a  p[i],",...",4);.
6460: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
6470: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6480: 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20     zTemp[i++] = 
6490: 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ',';.        if(
64a0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
64b0: 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20  Order[j] ){.    
64c0: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
64d0: 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20   = '-';.        
64e0: 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  }.        memcpy
64f0: 28 26 7a 54 65 6d 70 5b 69 5d 2c 20 7a 43 6f 6c  (&zTemp[i], zCol
6500: 6c 2c 20 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20  l, n+1);.       
6510: 20 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d   i += n;.      }
6520: 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b  .      zTemp[i++
6530: 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a  ] = ')';.      z
6540: 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  Temp[i] = 0;.   
6550: 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65     assert( i<nTe
6560: 6d 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  mp );.      brea
6570: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
6580: 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a  e P4_COLLSEQ: {.
6590: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
65a0: 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Coll = pOp->p4.p
65b0: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69  Coll;.      sqli
65c0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
65d0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 63 6f 6c 6c  mp, zTemp, "coll
65e0: 73 65 71 28 25 2e 32 30 73 29 22 2c 20 70 43 6f  seq(%.20s)", pCo
65f0: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
6600: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6610: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44     case P4_FUNCD
6620: 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63  EF: {.      Func
6630: 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d  Def *pDef = pOp-
6640: 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20  >p4.pFunc;.     
6650: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
6660: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
6670: 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e  "%s(%d)", pDef->
6680: 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72  zName, pDef->nAr
6690: 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
66a0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
66b0: 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20  P4_INT64: {.    
66c0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
66d0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
66e0: 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70   "%lld", *pOp->p
66f0: 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62  4.pI64);.      b
6700: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6710: 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b  case P4_INT32: {
6720: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
6730: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
6740: 54 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d  Temp, "%d", pOp-
6750: 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72  >p4.i);.      br
6760: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
6770: 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20  ase P4_REAL: {. 
6780: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
6790: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
67a0: 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f  mp, "%.16g", *pO
67b0: 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20  p->p4.pReal);.  
67c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
67d0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d  .    case P4_MEM
67e0: 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70  : {.      Mem *p
67f0: 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d  Mem = pOp->p4.pM
6800: 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  em;.      if( pM
6810: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
6820: 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  Str ){.        z
6830: 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20  P4 = pMem->z;.  
6840: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
6850: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
6860: 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Int ){.        s
6870: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6880: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
6890: 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29  lld", pMem->u.i)
68a0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
68b0: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
68c0: 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
68d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
68e0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
68f0: 70 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d  p, "%.16g", pMem
6900: 2d 3e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ->r);.      }els
6910: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  e if( pMem->flag
6920: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  s & MEM_Null ){.
6930: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
6940: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
6950: 7a 54 65 6d 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a  zTemp, "NULL");.
6960: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6970: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65       assert( pMe
6980: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42  m->flags & MEM_B
6990: 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a  lob );.        z
69a0: 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20  P4 = "(blob)";. 
69b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
69c0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
69d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
69e0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63  RTUALTABLE.    c
69f0: 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20  ase P4_VTAB: {. 
6a00: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61       sqlite3_vta
6a10: 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e  b *pVtab = pOp->
6a20: 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b  p4.pVtab->pVtab;
6a30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
6a40: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
6a50: 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a 25  Temp, "vtab:%p:%
6a60: 70 22 2c 20 70 56 74 61 62 2c 20 70 56 74 61 62  p", pVtab, pVtab
6a70: 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20  ->pModule);.    
6a80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
6a90: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50  endif.    case P
6aa0: 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20  4_INTARRAY: {.  
6ab0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
6ac0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
6ad0: 70 2c 20 22 69 6e 74 61 72 72 61 79 22 29 3b 0a  p, "intarray");.
6ae0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6af0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53   }.    case P4_S
6b00: 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20  UBPROGRAM: {.   
6b10: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6b20: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
6b30: 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20  , "program");.  
6b40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6b50: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 41 44 56  .    case P4_ADV
6b60: 41 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a 54  ANCE: {.      zT
6b70: 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[0] = 0;.    
6b80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6b90: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
6ba0: 20 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70      zP4 = pOp->p
6bb0: 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  4.z;.      if( z
6bc0: 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  P4==0 ){.       
6bd0: 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20   zP4 = zTemp;.  
6be0: 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d        zTemp[0] =
6bf0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
6c00: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
6c10: 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  zP4!=0 );.  retu
6c20: 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66  rn zP4;.}.#endif
6c30: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20  ../*.** Declare 
6c40: 74 6f 20 74 68 65 20 56 64 62 65 20 74 68 61 74  to the Vdbe that
6c50: 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63   the BTree objec
6c60: 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20  t at db->aDb[i] 
6c70: 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  is used..**.** T
6c80: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
6c90: 65 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b  ements need to k
6ca0: 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74  now in advance t
6cb0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20  he complete set 
6cc0: 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64  of.** attached d
6cd0: 61 74 61 62 61 73 65 73 20 74 68 61 74 20 77 69  atabases that wi
6ce0: 6c 6c 20 62 65 20 75 73 65 2e 20 20 41 20 6d 61  ll be use.  A ma
6cf0: 73 6b 20 6f 66 20 74 68 65 73 65 20 64 61 74 61  sk of these data
6d00: 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e  bases.** is main
6d10: 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72  tained in p->btr
6d20: 65 65 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e  eeMask.  The p->
6d30: 6c 6f 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69  lockMask value i
6d40: 73 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 0a  s the subset of.
6d50: 2a 2a 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20  ** p->btreeMask 
6d60: 6f 66 20 64 61 74 61 62 61 73 65 73 20 74 68 61  of databases tha
6d70: 74 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61  t will require a
6d80: 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73   lock..*/.void s
6d90: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
6da0: 72 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ree(Vdbe *p, int
6db0: 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69   i){.  assert( i
6dc0: 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e  >=0 && i<p->db->
6dd0: 6e 44 62 20 26 26 20 69 3c 28 69 6e 74 29 73 69  nDb && i<(int)si
6de0: 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20  zeof(yDbMask)*8 
6df0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28  );.  assert( i<(
6e00: 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74  int)sizeof(p->bt
6e10: 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20  reeMask)*8 );.  
6e20: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 7c 3d 20  p->btreeMask |= 
6e30: 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 3b  ((yDbMask)1)<<i;
6e40: 0a 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 73  .  if( i!=1 && s
6e50: 71 6c 69 74 65 33 42 74 72 65 65 53 68 61 72 61  qlite3BtreeShara
6e60: 62 6c 65 28 70 2d 3e 64 62 2d 3e 61 44 62 5b 69  ble(p->db->aDb[i
6e70: 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20 20 70 2d  ].pBt) ){.    p-
6e80: 3e 6c 6f 63 6b 4d 61 73 6b 20 7c 3d 20 28 28 79  >lockMask |= ((y
6e90: 44 62 4d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20  DbMask)1)<<i;.  
6ea0: 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  }.}..#if !define
6eb0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
6ec0: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53  ARED_CACHE) && S
6ed0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
6ee0: 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  >0./*.** If SQLi
6ef0: 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74  te is compiled t
6f00: 6f 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  o support shared
6f10: 2d 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20  -cache mode and 
6f20: 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65  to be threadsafe
6f30: 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ,.** this routin
6f40: 65 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75  e obtains the mu
6f50: 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  tex associated w
6f60: 69 74 68 20 65 61 63 68 20 42 74 53 68 61 72 65  ith each BtShare
6f70: 64 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74  d structure.** t
6f80: 68 61 74 20 6d 61 79 20 62 65 20 61 63 63 65 73  hat may be acces
6f90: 73 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61  sed by the VM pa
6fa0: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
6fb0: 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f  ent. In doing so
6fc0: 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73   it also.** sets
6fd0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62   the BtShared.db
6fe0: 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20   member of each 
6ff0: 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 20  of the BtShared 
7000: 73 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75  structures, ensu
7010: 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65  ring.** that the
7020: 20 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61   correct busy-ha
7030: 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69  ndler callback i
7040: 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71  s invoked if req
7050: 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  uired..**.** If 
7060: 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68  SQLite is not th
7070: 72 65 61 64 73 61 66 65 20 62 75 74 20 64 6f 65  readsafe but doe
7080: 73 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  s support shared
7090: 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65  -cache mode, the
70a0: 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  n.** sqlite3Btre
70b0: 65 45 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f  eEnter() is invo
70c0: 6b 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 42  ked to set the B
70d0: 74 53 68 61 72 65 64 2e 64 62 20 76 61 72 69 61  tShared.db varia
70e0: 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f  bles.** of all o
70f0: 66 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  f BtShared struc
7100: 74 75 72 65 73 20 61 63 63 65 73 73 69 62 6c 65  tures accessible
7110: 20 76 69 61 20 74 68 65 20 64 61 74 61 62 61 73   via the databas
7120: 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73  e handle .** ass
7130: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
7140: 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51   VM..**.** If SQ
7150: 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65  Lite is not thre
7160: 61 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20  adsafe and does 
7170: 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 72  not support shar
7180: 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74  ed-cache mode, t
7190: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
71a0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
71b0: 2a 20 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61  * The p->btreeMa
71c0: 73 6b 20 66 69 65 6c 64 20 69 73 20 61 20 62 69  sk field is a bi
71d0: 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72  tmask of all btr
71e0: 65 65 73 20 74 68 61 74 20 74 68 65 20 70 72 65  ees that the pre
71f0: 70 61 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d  pared .** statem
7200: 65 6e 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20  ent p will ever 
7210: 75 73 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74  use.  Let N be t
7220: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  he number of bit
7230: 73 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73  s in p->btreeMas
7240: 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  k.** correspondi
7250: 6e 67 20 74 6f 20 62 74 72 65 65 73 20 74 68 61  ng to btrees tha
7260: 74 20 75 73 65 20 73 68 61 72 65 64 20 63 61 63  t use shared cac
7270: 68 65 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75  he.  Then the ru
7280: 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73  ntime of.** this
7290: 20 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e   routine is N*N.
72a0: 20 20 42 75 74 20 61 73 20 4e 20 69 73 20 72 61    But as N is ra
72b0: 72 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31  rely more than 1
72c0: 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f  , this should no
72d0: 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65  t.** be a proble
72e0: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
72f0: 65 33 56 64 62 65 45 6e 74 65 72 28 56 64 62 65  e3VdbeEnter(Vdbe
7300: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
7310: 20 79 44 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20   yDbMask mask;. 
7320: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
7330: 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e  Db *aDb;.  int n
7340: 44 62 3b 0a 20 20 69 66 28 20 70 2d 3e 6c 6f 63  Db;.  if( p->loc
7350: 6b 4d 61 73 6b 3d 3d 30 20 29 20 72 65 74 75 72  kMask==0 ) retur
7360: 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f  n;  /* The commo
7370: 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d  n case */.  db =
7380: 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20   p->db;.  aDb = 
7390: 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d  db->aDb;.  nDb =
73a0: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28   db->nDb;.  for(
73b0: 69 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 3c 6e  i=0, mask=1; i<n
73c0: 44 62 3b 20 69 2b 2b 2c 20 6d 61 73 6b 20 2b 3d  Db; i++, mask +=
73d0: 20 6d 61 73 6b 29 7b 0a 20 20 20 20 69 66 28 20   mask){.    if( 
73e0: 69 21 3d 31 20 26 26 20 28 6d 61 73 6b 20 26 20  i!=1 && (mask & 
73f0: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 21 3d 30 20  p->lockMask)!=0 
7400: 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d  && ALWAYS(aDb[i]
7410: 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  .pBt!=0) ){.    
7420: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
7430: 74 65 72 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b  ter(aDb[i].pBt);
7440: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
7450: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
7460: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
7470: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53  ARED_CACHE) && S
7480: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
7490: 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20  >0./*.** Unlock 
74a0: 61 6c 6c 20 6f 66 20 74 68 65 20 62 74 72 65 65  all of the btree
74b0: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63  s previously loc
74c0: 6b 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f  ked by a call to
74d0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65   sqlite3VdbeEnte
74e0: 72 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  r()..*/.void sql
74f0: 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 56 64  ite3VdbeLeave(Vd
7500: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
7510: 0a 20 20 79 44 62 4d 61 73 6b 20 6d 61 73 6b 3b  .  yDbMask mask;
7520: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
7530: 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74    Db *aDb;.  int
7540: 20 6e 44 62 3b 0a 20 20 69 66 28 20 70 2d 3e 6c   nDb;.  if( p->l
7550: 6f 63 6b 4d 61 73 6b 3d 3d 30 20 29 20 72 65 74  ockMask==0 ) ret
7560: 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d  urn;  /* The com
7570: 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62  mon case */.  db
7580: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20   = p->db;.  aDb 
7590: 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62  = db->aDb;.  nDb
75a0: 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f   = db->nDb;.  fo
75b0: 72 28 69 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69  r(i=0, mask=1; i
75c0: 3c 6e 44 62 3b 20 69 2b 2b 2c 20 6d 61 73 6b 20  <nDb; i++, mask 
75d0: 2b 3d 20 6d 61 73 6b 29 7b 0a 20 20 20 20 69 66  += mask){.    if
75e0: 28 20 69 21 3d 31 20 26 26 20 28 6d 61 73 6b 20  ( i!=1 && (mask 
75f0: 26 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 21 3d  & p->lockMask)!=
7600: 30 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b  0 && ALWAYS(aDb[
7610: 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20  i].pBt!=0) ){.  
7620: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
7630: 4c 65 61 76 65 28 61 44 62 5b 69 5d 2e 70 42 74  Leave(aDb[i].pBt
7640: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
7650: 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
7660: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
7670: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
7680: 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20  TE_DEBUG)./*.** 
7690: 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f  Print a single o
76a0: 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75  pcode.  This rou
76b0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
76c0: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
76d0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
76e0: 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45  VdbePrintOp(FILE
76f0: 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20   *pOut, int pc, 
7700: 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72  Op *pOp){.  char
7710: 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50   *zP4;.  char zP
7720: 74 72 5b 35 30 5d 3b 0a 20 20 73 74 61 74 69 63  tr[50];.  static
7730: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
7740: 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31  rmat1 = "%4d %-1
7750: 33 73 20 25 34 64 20 25 34 64 20 25 34 64 20 25  3s %4d %4d %4d %
7760: 2d 34 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a  -4s %.2X %s\n";.
7770: 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20    if( pOut==0 ) 
7780: 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20  pOut = stdout;. 
7790: 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34   zP4 = displayP4
77a0: 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65  (pOp, zPtr, size
77b0: 6f 66 28 7a 50 74 72 29 29 3b 0a 20 20 66 70 72  of(zPtr));.  fpr
77c0: 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d  intf(pOut, zForm
77d0: 61 74 31 2c 20 70 63 2c 20 0a 20 20 20 20 20 20  at1, pc, .      
77e0: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
77f0: 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20  e(pOp->opcode), 
7800: 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32  pOp->p1, pOp->p2
7810: 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20  , pOp->p3, zP4, 
7820: 70 4f 70 2d 3e 70 35 2c 0a 23 69 66 64 65 66 20  pOp->p5,.#ifdef 
7830: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
7840: 20 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74     pOp->zComment
7850: 20 3f 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74   ? pOp->zComment
7860: 20 3a 20 22 22 0a 23 65 6c 73 65 0a 20 20 20 20   : "".#else.    
7870: 20 20 22 22 0a 23 65 6e 64 69 66 0a 20 20 29 3b    "".#endif.  );
7880: 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b  .  fflush(pOut);
7890: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
78a0: 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61   Release an arra
78b0: 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65  y of N Mem eleme
78c0: 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nts.*/.static vo
78d0: 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  id releaseMemArr
78e0: 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e  ay(Mem *p, int N
78f0: 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20  ){.  if( p && N 
7900: 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64  ){.    Mem *pEnd
7910: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  ;.    sqlite3 *d
7920: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 75  b = p->db;.    u
7930: 38 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  8 malloc_failed 
7940: 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  = db->mallocFail
7950: 65 64 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  ed;.    if( db->
7960: 70 6e 42 79 74 65 73 46 72 65 65 64 20 29 7b 0a  pnBytesFreed ){.
7970: 20 20 20 20 20 20 66 6f 72 28 70 45 6e 64 3d 26        for(pEnd=&
7980: 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b  p[N]; p<pEnd; p+
7990: 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
79a0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
79b0: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  >zMalloc);.     
79c0: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b   }.      return;
79d0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
79e0: 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e  End=&p[N]; p<pEn
79f0: 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 61  d; p++){.      a
7a00: 73 73 65 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d  ssert( (&p[1])==
7a10: 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d  pEnd || p[0].db=
7a20: 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 0a 20 20 20  =p[1].db );..   
7a30: 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b     /* This block
7a40: 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e   is really an in
7a50: 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  lined version of
7a60: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
7a70: 65 6c 65 61 73 65 28 29 0a 20 20 20 20 20 20 2a  elease().      *
7a80: 2a 20 74 68 61 74 20 74 61 6b 65 73 20 61 64 76  * that takes adv
7a90: 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20 66 61  antage of the fa
7aa0: 63 74 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f  ct that the memo
7ab0: 72 79 20 63 65 6c 6c 20 76 61 6c 75 65 20 69 73  ry cell value is
7ac0: 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67   .      ** being
7ad0: 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74   set to NULL aft
7ae0: 65 72 20 72 65 6c 65 61 73 69 6e 67 20 61 6e 79  er releasing any
7af0: 20 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63   dynamic resourc
7b00: 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  es..      **.   
7b10: 20 20 20 2a 2a 20 54 68 65 20 6a 75 73 74 69 66     ** The justif
7b20: 69 63 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c  ication for dupl
7b30: 69 63 61 74 69 6e 67 20 63 6f 64 65 20 69 73 20  icating code is 
7b40: 74 68 61 74 20 61 63 63 6f 72 64 69 6e 67 20 74  that according t
7b50: 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  o .      ** call
7b60: 67 72 69 6e 64 2c 20 74 68 69 73 20 63 61 75 73  grind, this caus
7b70: 65 73 20 61 20 63 65 72 74 61 69 6e 20 74 65 73  es a certain tes
7b80: 74 20 63 61 73 65 20 74 6f 20 68 69 74 20 74 68  t case to hit th
7b90: 65 20 43 50 55 20 34 2e 37 20 0a 20 20 20 20 20  e CPU 4.7 .     
7ba0: 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65 73 73   ** percent less
7bb0: 20 28 78 38 36 20 6c 69 6e 75 78 2c 20 67 63 63   (x86 linux, gcc
7bc0: 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20   version 4.1.2, 
7bd0: 2d 4f 36 29 20 74 68 61 6e 20 69 66 20 0a 20 20  -O6) than if .  
7be0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65      ** sqlite3Me
7bf0: 6d 52 65 6c 65 61 73 65 28 29 20 77 65 72 65 20  mRelease() were 
7c00: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72 65  called from here
7c10: 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74 68 69 73  . With -O2, this
7c20: 20 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20   jumps.      ** 
7c30: 74 6f 20 36 2e 36 20 70 65 72 63 65 6e 74 2e 20  to 6.6 percent. 
7c40: 54 68 65 20 74 65 73 74 20 63 61 73 65 20 69 73  The test case is
7c50: 20 69 6e 73 65 72 74 69 6e 67 20 31 30 30 30 20   inserting 1000 
7c60: 72 6f 77 73 20 69 6e 74 6f 20 61 20 74 61 62 6c  rows into a tabl
7c70: 65 20 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68  e .      ** with
7c80: 20 6e 6f 20 69 6e 64 65 78 65 73 20 75 73 69 6e   no indexes usin
7c90: 67 20 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61  g a single prepa
7ca0: 72 65 64 20 49 4e 53 45 52 54 20 73 74 61 74 65  red INSERT state
7cb0: 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20 20  ment, bind() .  
7cc0: 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74      ** and reset
7cd0: 28 29 2e 20 49 6e 73 65 72 74 73 20 61 72 65 20  (). Inserts are 
7ce0: 67 72 6f 75 70 65 64 20 69 6e 74 6f 20 61 20 74  grouped into a t
7cf0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
7d00: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
7d10: 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67  ->flags&(MEM_Agg
7d20: 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61  |MEM_Dyn|MEM_Fra
7d30: 6d 65 7c 4d 45 4d 5f 52 6f 77 53 65 74 29 20 29  me|MEM_RowSet) )
7d40: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7d50: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
7d60: 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  p);.      }else 
7d70: 69 66 28 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 29  if( p->zMalloc )
7d80: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7d90: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
7da0: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20  Malloc);.       
7db0: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b   p->zMalloc = 0;
7dc0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
7dd0: 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  p->flags = MEM_I
7de0: 6e 76 61 6c 69 64 3b 0a 20 20 20 20 7d 0a 20 20  nvalid;.    }.  
7df0: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
7e00: 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ed = malloc_fail
7e10: 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ed;.  }.}../*.**
7e20: 20 44 65 6c 65 74 65 20 61 20 56 64 62 65 46 72   Delete a VdbeFr
7e30: 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69  ame object and i
7e40: 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62  ts contents. Vdb
7e50: 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61  eFrame objects a
7e60: 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  re.** allocated 
7e70: 62 79 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61  by the OP_Progra
7e80: 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69  m opcode in sqli
7e90: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a  te3VdbeExec()..*
7ea0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
7eb0: 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64  beFrameDelete(Vd
7ec0: 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69  beFrame *p){.  i
7ed0: 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65  nt i;.  Mem *aMe
7ee0: 6d 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d  m = VdbeFrameMem
7ef0: 28 70 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f  (p);.  VdbeCurso
7f00: 72 20 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62  r **apCsr = (Vdb
7f10: 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d  eCursor **)&aMem
7f20: 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a  [p->nChildMem];.
7f30: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
7f40: 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b  nChildCsr; i++){
7f50: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7f60: 46 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c  FreeCursor(p->v,
7f70: 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a   apCsr[i]);.  }.
7f80: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
7f90: 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c  y(aMem, p->nChil
7fa0: 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  dMem);.  sqlite3
7fb0: 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c  DbFree(p->v->db,
7fc0: 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   p);.}..#ifndef 
7fd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
7fe0: 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61  AIN./*.** Give a
7ff0: 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20   listing of the 
8000: 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76  program in the v
8010: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a  irtual machine..
8020: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66  **.** The interf
8030: 61 63 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ace is the same 
8040: 61 73 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  as sqlite3VdbeEx
8050: 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65  ec().  But inste
8060: 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67  ad of.** running
8070: 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e   the code, it in
8080: 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61  vokes the callba
8090: 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ck once for each
80a0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
80b0: 20 54 68 69 73 20 66 65 61 74 75 72 65 20 69 73   This feature is
80c0: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
80d0: 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a  nt "EXPLAIN"..**
80e0: 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c  .** When p->expl
80f0: 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73  ain==1, each ins
8100: 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74  truction is list
8110: 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e  ed.  When.** p->
8120: 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79  explain==2, only
8130: 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74   OP_Explain inst
8140: 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73  ructions are lis
8150: 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a  ted and these.**
8160: 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20   are shown in a 
8170: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74  different format
8180: 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  .  p->explain==2
8190: 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   is used to impl
81a0: 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e  ement.** EXPLAIN
81b0: 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a   QUERY PLAN..**.
81c0: 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61  ** When p->expla
81d0: 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74 68 65  in==1, first the
81e0: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 69 73   main program is
81f0: 20 6c 69 73 74 65 64 2c 20 74 68 65 6e 20 65 61   listed, then ea
8200: 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69  ch of.** the tri
8210: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
8220: 20 61 72 65 20 6c 69 73 74 65 64 20 6f 6e 65 20   are listed one 
8230: 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73  by one..*/.int s
8240: 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a  qlite3VdbeList(.
8250: 20 20 56 64 62 65 20 2a 70 20 20 20 20 20 20 20    Vdbe *p       
8260: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8270: 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20  he VDBE */.){.  
8280: 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20  int nRow;       
8290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82a0: 20 20 20 20 20 2f 2a 20 53 74 6f 70 20 77 68 65       /* Stop whe
82b0: 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72 65 61 63  n row count reac
82c0: 68 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e  hes this */.  in
82d0: 74 20 6e 53 75 62 20 3d 20 30 3b 20 20 20 20 20  t nSub = 0;     
82e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82f0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8300: 73 75 62 2d 76 64 62 65 73 20 73 65 65 6e 20 73  sub-vdbes seen s
8310: 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75 62 50 72  o far */.  SubPr
8320: 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20  ogram **apSub = 
8330: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
8340: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 2d  /* Array of sub-
8350: 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a  vdbes */.  Mem *
8360: 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  pSub = 0;       
8370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8380: 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68  /* Memory cell h
8390: 6f 6c 64 20 61 72 72 61 79 20 6f 66 20 73 75 62  old array of sub
83a0: 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74  progs */.  sqlit
83b0: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20  e3 *db = p->db; 
83c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83d0: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
83e0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
83f0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
8400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8410: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
8420: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
8430: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
8440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8450: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
8460: 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26  .  Mem *pMem = &
8470: 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 20 20  p->aMem[1];     
8480: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
8490: 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c 74 20 73   Mem of result s
84a0: 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  et */..  assert(
84b0: 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20   p->explain );. 
84c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
84d0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c==VDBE_MAGIC_RU
84e0: 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  N );.  assert( p
84f0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
8500: 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  || p->rc==SQLITE
8510: 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d  _BUSY || p->rc==
8520: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
8530: 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67  .  /* Even thoug
8540: 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f  h this opcode do
8550: 65 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d  es not use dynam
8560: 69 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20  ic strings for. 
8570: 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20   ** the result, 
8580: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d  result columns m
8590: 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69  ay become dynami
85a0: 63 20 69 66 20 74 68 65 20 75 73 65 72 20 63 61  c if the user ca
85b0: 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  lls.  ** sqlite3
85c0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29  _column_text16()
85d0: 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e  , causing a tran
85e0: 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31  slation to UTF-1
85f0: 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f  6 encoding..  */
8600: 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
8610: 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70  ay(pMem, 8);.  p
8620: 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30  ->pResultSet = 0
8630: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ;..  if( p->rc==
8640: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
8650: 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70      /* This happ
8660: 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  ens if a malloc(
8670: 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20  ) inside a call 
8680: 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  to sqlite3_colum
8690: 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20  n_text() or.    
86a0: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ** sqlite3_colum
86b0: 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c 65  n_text16() faile
86c0: 64 2e 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d  d.  */.    db->m
86d0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
86e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
86f0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
8700: 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d   /* When the num
8710: 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
8720: 77 73 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c  ws reaches nRow,
8730: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a   that means the.
8740: 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73    ** listing has
8750: 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71   finished and sq
8760: 6c 69 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f  lite3_step() sho
8770: 75 6c 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  uld return SQLIT
8780: 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f  E_DONE..  ** nRo
8790: 77 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  w is the sum of 
87a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
87b0: 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70  ws in the main p
87c0: 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a  rogram, plus.  *
87d0: 2a 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  * the sum of the
87e0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
87f0: 69 6e 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73  in all trigger s
8800: 75 62 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75  ubprograms encou
8810: 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66  ntered.  ** so f
8820: 61 72 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61  ar.  The nRow va
8830: 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73  lue will increas
8840: 65 20 61 73 20 6e 65 77 20 74 72 69 67 67 65 72  e as new trigger
8850: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65   subprograms are
8860: 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65  .  ** encountere
8870: 64 2c 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c  d, but p->pc wil
8880: 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74  l eventually cat
8890: 63 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20  ch up to nRow.. 
88a0: 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e   */.  nRow = p->
88b0: 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78  nOp;.  if( p->ex
88c0: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
88d0: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 38 20 6d  /* The first 8 m
88e0: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20  emory cells are 
88f0: 75 73 65 64 20 66 6f 72 20 74 68 65 20 72 65 73  used for the res
8900: 75 6c 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20  ult set.  So we 
8910: 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d  will.    ** comm
8920: 61 6e 64 65 65 72 20 74 68 65 20 39 74 68 20 63  andeer the 9th c
8930: 65 6c 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74  ell to use as st
8940: 6f 72 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72  orage for an arr
8950: 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20  ay of pointers. 
8960: 20 20 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72     ** to trigger
8970: 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54   subprograms.  T
8980: 68 65 20 56 44 42 45 20 69 73 20 67 75 61 72 61  he VDBE is guara
8990: 6e 74 65 65 64 20 74 6f 20 68 61 76 65 20 61 74  nteed to have at
89a0: 20 6c 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20   least 9.    ** 
89b0: 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61  cells.  */.    a
89c0: 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39  ssert( p->nMem>9
89d0: 20 29 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26   );.    pSub = &
89e0: 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20  p->aMem[9];.    
89f0: 69 66 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26  if( pSub->flags&
8a00: 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20  MEM_Blob ){.    
8a10: 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73    /* On the firs
8a20: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
8a30: 33 5f 73 74 65 70 28 29 2c 20 70 53 75 62 20 77  3_step(), pSub w
8a40: 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e  ill hold a NULL.
8a50: 20 20 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a    It is.      **
8a60: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
8a70: 61 20 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34  a BLOB by the P4
8a80: 5f 53 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63  _SUBPROGRAM proc
8a90: 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c  essing logic bel
8aa0: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62  ow */.      nSub
8ab0: 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f   = pSub->n/sizeo
8ac0: 66 28 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20  f(Vdbe*);.      
8ad0: 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67  apSub = (SubProg
8ae0: 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a  ram **)pSub->z;.
8af0: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
8b00: 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b  0; i<nSub; i++){
8b10: 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61  .      nRow += a
8b20: 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20  pSub[i]->nOp;.  
8b30: 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20    }.  }..  do{. 
8b40: 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a     i = p->pc++;.
8b50: 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77    }while( i<nRow
8b60: 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d   && p->explain==
8b70: 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  2 && p->aOp[i].o
8b80: 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69  pcode!=OP_Explai
8b90: 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52  n );.  if( i>=nR
8ba0: 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ow ){.    p->rc 
8bb0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
8bc0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
8bd0: 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64  E;.  }else if( d
8be0: 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70  b->u1.isInterrup
8bf0: 74 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  ted ){.    p->rc
8c00: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52   = SQLITE_INTERR
8c10: 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  UPT;.    rc = SQ
8c20: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
8c30: 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
8c40: 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62  (&p->zErrMsg, db
8c50: 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45  , "%s", sqlite3E
8c60: 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20  rrStr(p->rc));. 
8c70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
8c80: 20 2a 7a 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70   *z;.    Op *pOp
8c90: 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e  ;.    if( i<p->n
8ca0: 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  Op ){.      /* T
8cb0: 68 65 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e  he output line n
8cc0: 75 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65  umber is small e
8cd0: 6e 6f 75 67 68 20 74 68 61 74 20 77 65 20 61 72  nough that we ar
8ce0: 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20  e still in the. 
8cf0: 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f       ** main pro
8d00: 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70  gram. */.      p
8d10: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b  Op = &p->aOp[i];
8d20: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8d30: 20 20 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72    /* We are curr
8d40: 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75  ently listing su
8d50: 62 70 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75  bprograms.  Figu
8d60: 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65  re out which one
8d70: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69   and.      ** pi
8d80: 63 6b 20 75 70 20 74 68 65 20 61 70 70 72 6f 70  ck up the approp
8d90: 72 69 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f  riate opcode. */
8da0: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
8db0: 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b      i -= p->nOp;
8dc0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
8dd0: 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70  i>=apSub[j]->nOp
8de0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
8df0: 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e  i -= apSub[j]->n
8e00: 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Op;.      }.    
8e10: 20 20 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a    pOp = &apSub[j
8e20: 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d  ]->aOp[i];.    }
8e30: 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  .    if( p->expl
8e40: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ain==1 ){.      
8e50: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
8e60: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65  M_Int;.      pMe
8e70: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
8e80: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20  _INTEGER;.      
8e90: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20  pMem->u.i = i;  
8ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8ec0: 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72   Program counter
8ed0: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b   */.      pMem++
8ee0: 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d  ;.  .      pMem-
8ef0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61  >flags = MEM_Sta
8f00: 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  tic|MEM_Str|MEM_
8f10: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  Term;.      pMem
8f20: 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c  ->z = (char*)sql
8f30: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70  ite3OpcodeName(p
8f40: 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 20 2f 2a  Op->opcode);  /*
8f50: 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20   Opcode */.     
8f60: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a   assert( pMem->z
8f70: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65  !=0 );.      pMe
8f80: 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  m->n = sqlite3St
8f90: 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b  rlen30(pMem->z);
8fa0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  .      pMem->typ
8fb0: 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b  e = SQLITE_TEXT;
8fc0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  .      pMem->enc
8fd0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
8fe0: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20        pMem++;.. 
8ff0: 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20       /* When an 
9000: 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64  OP_Program opcod
9010: 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 28  e is encounter (
9020: 74 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20  the only opcode 
9030: 74 68 61 74 20 68 61 73 0a 20 20 20 20 20 20 2a  that has.      *
9040: 2a 20 61 20 50 34 5f 53 55 42 50 52 4f 47 52 41  * a P4_SUBPROGRA
9050: 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20 65 78 70  M argument), exp
9060: 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
9070: 74 68 65 20 61 72 72 61 79 20 6f 66 20 73 75 62  the array of sub
9080: 70 72 6f 67 72 61 6d 73 0a 20 20 20 20 20 20 2a  programs.      *
9090: 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65  * kept in p->aMe
90a0: 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74  m[9].z to hold t
90b0: 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d  he new program -
90c0: 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20 73   assuming this s
90d0: 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20 20 20  ubprogram.      
90e0: 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61  ** has not alrea
90f0: 64 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20  dy been seen..  
9100: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
9110: 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
9120: 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20  _SUBPROGRAM ){. 
9130: 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65         int nByte
9140: 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65   = (nSub+1)*size
9150: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b  of(SubProgram*);
9160: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
9170: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
9180: 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20   j<nSub; j++){. 
9190: 20 20 20 20 20 20 20 20 20 69 66 28 20 61 70 53           if( apS
91a0: 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70  ub[j]==pOp->p4.p
91b0: 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b  Program ) break;
91c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
91d0: 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 26     if( j==nSub &
91e0: 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c  & SQLITE_OK==sql
91f0: 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28  ite3VdbeMemGrow(
9200: 70 53 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53 75  pSub, nByte, nSu
9210: 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  b!=0) ){.       
9220: 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50     apSub = (SubP
9230: 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e  rogram **)pSub->
9240: 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70 53  z;.          apS
9250: 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70  ub[nSub++] = pOp
9260: 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20  ->p4.pProgram;. 
9270: 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 66           pSub->f
9280: 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62  lags |= MEM_Blob
9290: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 75 62  ;.          pSub
92a0: 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f  ->n = nSub*sizeo
92b0: 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a  f(SubProgram*);.
92c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
92d0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65  }.    }..    pMe
92e0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
92f0: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  nt;.    pMem->u.
9300: 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20  i = pOp->p1;    
9310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9320: 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20        /* P1 */. 
9330: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
9340: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a  SQLITE_INTEGER;.
9350: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
9360: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
9370: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
9380: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b  ->u.i = pOp->p2;
9390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20            /* P2 
93b0: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  */.    pMem->typ
93c0: 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  e = SQLITE_INTEG
93d0: 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ER;.    pMem++;.
93e0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
93f0: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
9400: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d  pMem->u.i = pOp-
9410: 3e 70 33 3b 20 20 20 20 20 20 20 20 20 20 20 20  >p3;            
9420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9430: 20 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d   P3 */.    pMem-
9440: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49  >type = SQLITE_I
9450: 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d  NTEGER;.    pMem
9460: 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 73 71 6c  ++;..    if( sql
9470: 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28  ite3VdbeMemGrow(
9480: 70 4d 65 6d 2c 20 33 32 2c 20 30 29 20 29 7b 20  pMem, 32, 0) ){ 
9490: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34             /* P4
94a0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
94b0: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
94c0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72  ailed );.      r
94d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
94e0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d  OR;.    }.    pM
94f0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
9500: 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  Dyn|MEM_Str|MEM_
9510: 54 65 72 6d 3b 0a 20 20 20 20 7a 20 3d 20 64 69  Term;.    z = di
9520: 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65  splayP4(pOp, pMe
9530: 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20 69  m->z, 32);.    i
9540: 66 28 20 7a 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b  f( z!=pMem->z ){
9550: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9560: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d  beMemSetStr(pMem
9570: 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  , z, -1, SQLITE_
9580: 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65  UTF8, 0);.    }e
9590: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
95a0: 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b  t( pMem->z!=0 );
95b0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
95c0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
95d0: 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20  (pMem->z);.     
95e0: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
95f0: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a  ITE_UTF8;.    }.
9600: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
9610: 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20   SQLITE_TEXT;.  
9620: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69    pMem++;..    i
9630: 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  f( p->explain==1
9640: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
9650: 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77  lite3VdbeMemGrow
9660: 28 70 4d 65 6d 2c 20 34 2c 20 30 29 20 29 7b 0a  (pMem, 4, 0) ){.
9670: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9680: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
9690: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72  led );.        r
96a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
96b0: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
96c0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
96d0: 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c  MEM_Dyn|MEM_Str|
96e0: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20  MEM_Term;.      
96f0: 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20  pMem->n = 2;.   
9700: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
9710: 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  ntf(3, pMem->z, 
9720: 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29  "%.2x", pOp->p5)
9730: 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20  ;   /* P5 */.   
9740: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
9750: 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20  SQLITE_TEXT;.   
9760: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53     pMem->enc = S
9770: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20  QLITE_UTF8;.    
9780: 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66    pMem++;.  .#if
9790: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
97a0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
97b0: 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20  zComment ){.    
97c0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
97d0: 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  = MEM_Str|MEM_Te
97e0: 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  rm;.        pMem
97f0: 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  ->z = pOp->zComm
9800: 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  ent;.        pMe
9810: 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  m->n = sqlite3St
9820: 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b  rlen30(pMem->z);
9830: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  .        pMem->e
9840: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
9850: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
9860: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45  type = SQLITE_TE
9870: 58 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a  XT;.      }else.
9880: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
9890: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
98a0: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20  gs = MEM_Null;  
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98c0: 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20       /* Comment 
98d0: 2a 2f 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  */.        pMem-
98e0: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 4e  >type = SQLITE_N
98f0: 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ULL;.      }.   
9900: 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43   }..    p->nResC
9910: 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70  olumn = 8 - 4*(p
9920: 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20  ->explain-1);.  
9930: 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20    p->pResultSet 
9940: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20  = &p->aMem[1];. 
9950: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
9960: 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53  E_OK;.    rc = S
9970: 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20  QLITE_ROW;.  }. 
9980: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
9990: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
99a0: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a  MIT_EXPLAIN */..
99b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
99c0: 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  BUG./*.** Print 
99d0: 74 68 65 20 53 51 4c 20 74 68 61 74 20 77 61 73  the SQL that was
99e0: 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74   used to generat
99f0: 65 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d  e a VDBE program
9a00: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9a10: 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64  3VdbePrintSql(Vd
9a20: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f  be *p){.  int nO
9a30: 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64  p = p->nOp;.  Vd
9a40: 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28  beOp *pOp;.  if(
9a50: 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b   nOp<1 ) return;
9a60: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
9a70: 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  [0];.  if( pOp->
9a80: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65  opcode==OP_Trace
9a90: 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30   && pOp->p4.z!=0
9aa0: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
9ab0: 61 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e  ar *z = pOp->p4.
9ac0: 7a 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71  z;.    while( sq
9ad0: 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a 29  lite3Isspace(*z)
9ae0: 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 70 72 69 6e   ) z++;.    prin
9af0: 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22  tf("SQL: [%s]\n"
9b00: 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , z);.  }.}.#end
9b10: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
9b20: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  (SQLITE_OMIT_TRA
9b30: 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  CE) && defined(S
9b40: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
9b50: 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  RACE)./*.** Prin
9b60: 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73  t an IOTRACE mes
9b70: 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c  sage showing SQL
9b80: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69   content..*/.voi
9b90: 64 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54  d sqlite3VdbeIOT
9ba0: 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29  raceSql(Vdbe *p)
9bb0: 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d  {.  int nOp = p-
9bc0: 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a  >nOp;.  VdbeOp *
9bd0: 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  pOp;.  if( sqlit
9be0: 65 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72  e3IoTrace==0 ) r
9bf0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70  eturn;.  if( nOp
9c00: 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <1 ) return;.  p
9c10: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b  Op = &p->aOp[0];
9c20: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  .  if( pOp->opco
9c30: 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26 20  de==OP_Trace && 
9c40: 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a  pOp->p4.z!=0 ){.
9c50: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
9c60: 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a    char z[1000];.
9c70: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
9c80: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20  intf(sizeof(z), 
9c90: 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34  z, "%s", pOp->p4
9ca0: 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  .z);.    for(i=0
9cb0: 3b 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ; sqlite3Isspace
9cc0: 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20  (z[i]); i++){}. 
9cd0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d     for(j=0; z[i]
9ce0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
9cf0: 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ( sqlite3Isspace
9d00: 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  (z[i]) ){.      
9d10: 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20    if( z[i-1]!=' 
9d20: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ' ){.          z
9d30: 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  [j++] = ' ';.   
9d40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
9d50: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b  se{.        z[j+
9d60: 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20  +] = z[i];.     
9d70: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a   }.    }.    z[j
9d80: 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
9d90: 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25  e3IoTrace("SQL %
9da0: 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a  s\n", z);.  }.}.
9db0: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
9dc0: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20  E_OMIT_TRACE && 
9dd0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
9de0: 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TRACE */../*.** 
9df0: 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
9e00: 72 6f 6d 20 61 20 66 69 78 65 64 20 73 69 7a 65  rom a fixed size
9e10: 20 62 75 66 66 65 72 20 61 6e 64 20 72 65 74 75   buffer and retu
9e20: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a  rn a pointer to.
9e30: 2a 2a 20 74 68 61 74 20 73 70 61 63 65 2e 20 20  ** that space.  
9e40: 49 66 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20  If insufficient 
9e50: 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62  space is availab
9e60: 6c 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  le, return NULL.
9e70: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 42 75 66 20  .**.** The pBuf 
9e80: 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
9e90: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f   initial value o
9ea0: 66 20 61 20 70 6f 69 6e 74 65 72 20 77 68 69 63  f a pointer whic
9eb0: 68 20 77 69 6c 6c 0a 2a 2a 20 72 65 63 65 69 76  h will.** receiv
9ec0: 65 20 74 68 65 20 6e 65 77 20 6d 65 6d 6f 72 79  e the new memory
9ed0: 2e 20 20 70 42 75 66 20 69 73 20 6e 6f 72 6d 61  .  pBuf is norma
9ee0: 6c 6c 79 20 4e 55 4c 4c 2e 20 20 49 66 20 70 42  lly NULL.  If pB
9ef0: 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c  uf is not.** NUL
9f00: 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  L, it means that
9f10: 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 68 61   memory space ha
9f20: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
9f30: 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 61  llocated and tha
9f40: 74 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  t.** this routin
9f50: 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 61 6c 6c  e should not all
9f60: 6f 63 61 74 65 20 61 6e 79 20 6e 65 77 20 6d 65  ocate any new me
9f70: 6d 6f 72 79 2e 20 20 57 68 65 6e 20 70 42 75 66  mory.  When pBuf
9f80: 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 20   is not.** NULL 
9f90: 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 70 42  simply return pB
9fa0: 75 66 2e 20 20 4f 6e 6c 79 20 61 6c 6c 6f 63 61  uf.  Only alloca
9fb0: 74 65 20 6e 65 77 20 6d 65 6d 6f 72 79 20 73 70  te new memory sp
9fc0: 61 63 65 20 77 68 65 6e 20 70 42 75 66 0a 2a 2a  ace when pBuf.**
9fd0: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   is NULL..**.** 
9fe0: 6e 42 79 74 65 20 69 73 20 74 68 65 20 6e 75 6d  nByte is the num
9ff0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
a000: 73 70 61 63 65 20 6e 65 65 64 65 64 2e 0a 2a 2a  space needed..**
a010: 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20 70 6f 69 6e  .** *ppFrom poin
a020: 74 73 20 74 6f 20 61 76 61 69 6c 61 62 6c 65 20  ts to available 
a030: 73 70 61 63 65 20 61 6e 64 20 70 45 6e 64 20 70  space and pEnd p
a040: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 65 6e 64  oints to the end
a050: 20 6f 66 20 74 68 65 0a 2a 2a 20 61 76 61 69 6c   of the.** avail
a060: 61 62 6c 65 20 73 70 61 63 65 2e 20 20 57 68 65  able space.  Whe
a070: 6e 20 73 70 61 63 65 20 69 73 20 61 6c 6c 6f 63  n space is alloc
a080: 61 74 65 64 2c 20 2a 70 70 46 72 6f 6d 20 69 73  ated, *ppFrom is
a090: 20 61 64 76 61 6e 63 65 64 20 70 61 73 74 0a 2a   advanced past.*
a0a0: 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  * the end of the
a0b0: 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65   allocated space
a0c0: 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42 79 74 65 20  ..**.** *pnByte 
a0d0: 69 73 20 61 20 63 6f 75 6e 74 65 72 20 6f 66 20  is a counter of 
a0e0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
a0f0: 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 68 61  tes of space tha
a100: 74 20 68 61 76 65 20 66 61 69 6c 65 64 0a 2a 2a  t have failed.**
a110: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2e 20 20 49   to allocate.  I
a120: 66 20 74 68 65 72 65 20 69 73 20 69 6e 73 75 66  f there is insuf
a130: 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 69 6e  ficient space in
a140: 20 2a 70 70 46 72 6f 6d 20 74 6f 20 73 61 74 69   *ppFrom to sati
a150: 73 66 79 20 74 68 65 0a 2a 2a 20 72 65 71 75 65  sfy the.** reque
a160: 73 74 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65  st, then increme
a170: 6e 74 20 2a 70 6e 42 79 74 65 20 62 79 20 74 68  nt *pnByte by th
a180: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20  e amount of the 
a190: 72 65 71 75 65 73 74 2e 0a 2a 2f 0a 73 74 61 74  request..*/.stat
a1a0: 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70  ic void *allocSp
a1b0: 61 63 65 28 0a 20 20 76 6f 69 64 20 2a 70 42 75  ace(.  void *pBu
a1c0: 66 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  f,          /* W
a1d0: 68 65 72 65 20 72 65 74 75 72 6e 20 70 6f 69 6e  here return poin
a1e0: 74 65 72 20 77 69 6c 6c 20 62 65 20 73 74 6f 72  ter will be stor
a1f0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  ed */.  int nByt
a200: 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
a210: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
a220: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
a230: 20 75 38 20 2a 2a 70 70 46 72 6f 6d 2c 20 20 20   u8 **ppFrom,   
a240: 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
a250: 20 41 6c 6c 6f 63 61 74 65 20 66 72 6f 6d 20 2a   Allocate from *
a260: 70 70 46 72 6f 6d 20 2a 2f 0a 20 20 75 38 20 2a  ppFrom */.  u8 *
a270: 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20  pEnd,           
a280: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31   /* Pointer to 1
a290: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 65   byte past the e
a2a0: 6e 64 20 6f 66 20 2a 70 70 46 72 6f 6d 20 62 75  nd of *ppFrom bu
a2b0: 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ffer */.  int *p
a2c0: 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20 2f  nByte          /
a2d0: 2a 20 49 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  * If allocation 
a2e0: 63 61 6e 6e 6f 74 20 62 65 20 6d 61 64 65 2c 20  cannot be made, 
a2f0: 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74  increment *pnByt
a300: 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  e */.){.  assert
a310: 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
a320: 47 4e 4d 45 4e 54 28 2a 70 70 46 72 6f 6d 29 20  GNMENT(*ppFrom) 
a330: 29 3b 0a 20 20 69 66 28 20 70 42 75 66 20 29 20  );.  if( pBuf ) 
a340: 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 20 20 6e  return pBuf;.  n
a350: 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42  Byte = ROUND8(nB
a360: 79 74 65 29 3b 0a 20 20 69 66 28 20 26 28 2a 70  yte);.  if( &(*p
a370: 70 46 72 6f 6d 29 5b 6e 42 79 74 65 5d 20 3c 3d  pFrom)[nByte] <=
a380: 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 70 42 75   pEnd ){.    pBu
a390: 66 20 3d 20 28 76 6f 69 64 2a 29 2a 70 70 46 72  f = (void*)*ppFr
a3a0: 6f 6d 3b 0a 20 20 20 20 2a 70 70 46 72 6f 6d 20  om;.    *ppFrom 
a3b0: 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 65 6c 73  += nByte;.  }els
a3c0: 65 7b 0a 20 20 20 20 2a 70 6e 42 79 74 65 20 2b  e{.    *pnByte +
a3d0: 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72  = nByte;.  }.  r
a3e0: 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f  eturn pBuf;.}../
a3f0: 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68 65 20  *.** Rewind the 
a400: 56 44 42 45 20 62 61 63 6b 20 74 6f 20 74 68 65  VDBE back to the
a410: 20 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72   beginning in pr
a420: 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a  eparation for.**
a430: 20 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a   running it..*/.
a440: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
a450: 52 65 77 69 6e 64 28 56 64 62 65 20 2a 70 29 7b  Rewind(Vdbe *p){
a460: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
a470: 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
a480: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
a490: 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e  LE).  int i;.#en
a4a0: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 21  dif.  assert( p!
a4b0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
a4c0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
a4d0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20  AGIC_INIT );..  
a4e0: 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20  /* There should 
a4f0: 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  be at least one 
a500: 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61  opcode..  */.  a
a510: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
a520: 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
a530: 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d   magic to VDBE_M
a540: 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20  AGIC_RUN sooner 
a550: 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65  rather than late
a560: 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63  r. */.  p->magic
a570: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55   = VDBE_MAGIC_RU
a580: 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  N;..#ifdef SQLIT
a590: 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d  E_DEBUG.  for(i=
a5a0: 31 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b  1; i<p->nMem; i+
a5b0: 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
a5c0: 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70  p->aMem[i].db==p
a5d0: 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  ->db );.  }.#end
a5e0: 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b  if.  p->pc = -1;
a5f0: 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
a600: 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72  E_OK;.  p->error
a610: 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72  Action = OE_Abor
a620: 74 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  t;.  p->magic = 
a630: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a  VDBE_MAGIC_RUN;.
a640: 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
a650: 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20  ;.  p->cacheCtr 
a660: 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69  = 1;.  p->minWri
a670: 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32  teFileFormat = 2
a680: 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d  55;.  p->iStatem
a690: 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46  ent = 0;.  p->nF
a6a0: 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b  kConstraint = 0;
a6b0: 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
a6c0: 46 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20  FILE.  for(i=0; 
a6d0: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
a6e0: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
a6f0: 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f  t = 0;.    p->aO
a700: 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b  p[i].cycles = 0;
a710: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
a720: 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76  *.** Prepare a v
a730: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
a740: 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 66 6f 72  or execution for
a750: 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
a760: 61 66 74 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e  after.** creatin
a770: 67 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  g the virtual ma
a780: 63 68 69 6e 65 2e 20 20 54 68 69 73 20 69 6e 76  chine.  This inv
a790: 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75 63  olves things suc
a7a0: 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69  h.** as allocati
a7b0: 6e 67 20 73 74 61 63 6b 20 73 70 61 63 65 20 61  ng stack space a
a7c0: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  nd initializing 
a7d0: 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e  the program coun
a7e0: 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68  ter..** After th
a7f0: 65 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72  e VDBE has be pr
a800: 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65  epped, it can be
a810: 20 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65   executed by one
a820: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c   or more.** call
a830: 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  s to sqlite3Vdbe
a840: 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20  Exec().  .**.** 
a850: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
a860: 79 20 62 65 20 63 61 6c 6c 65 64 20 65 78 61 63  y be called exac
a870: 74 20 6f 6e 63 65 20 6f 6e 20 61 20 65 61 63 68  t once on a each
a880: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
a890: 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20  ..** After this 
a8a0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
a8b0: 64 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65  d the VM has bee
a8c0: 6e 20 22 70 61 63 6b 61 67 65 64 22 20 61 6e 64  n "packaged" and
a8d0: 20 69 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20   is ready.** to 
a8e0: 72 75 6e 2e 20 20 41 66 74 65 72 20 74 68 69 73  run.  After this
a8f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
a900: 65 64 2c 20 66 75 74 68 65 72 20 63 61 6c 6c 73  ed, futher calls
a910: 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56   to .** sqlite3V
a920: 64 62 65 41 64 64 4f 70 28 29 20 66 75 6e 63 74  dbeAddOp() funct
a930: 69 6f 6e 73 20 61 72 65 20 70 72 6f 68 69 62 69  ions are prohibi
a940: 74 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ted.  This routi
a950: 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a  ne disconnects.*
a960: 2a 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20  * the Vdbe from 
a970: 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
a980: 20 74 68 61 74 20 68 65 6c 70 65 64 20 67 65 6e   that helped gen
a990: 65 72 61 74 65 20 69 74 20 73 6f 20 74 68 61 74  erate it so that
a9a0: 20 74 68 65 0a 2a 2a 20 74 68 65 20 56 64 62 65   the.** the Vdbe
a9b0: 20 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65   becomes an inde
a9c0: 70 65 6e 64 65 6e 74 20 65 6e 74 69 74 79 20 61  pendent entity a
a9d0: 6e 64 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  nd the Parse obj
a9e0: 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65  ect can be.** de
a9f0: 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55  stroyed..**.** U
aa00: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  se the sqlite3Vd
aa10: 62 65 52 65 77 69 6e 64 28 29 20 70 72 6f 63 65  beRewind() proce
aa20: 64 75 72 65 20 74 6f 20 72 65 73 74 6f 72 65 20  dure to restore 
aa30: 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  a virtual machin
aa40: 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73  e back.** to its
aa50: 20 69 6e 69 74 69 61 6c 20 73 74 61 74 65 20 61   initial state a
aa60: 66 74 65 72 20 69 74 20 68 61 73 20 62 65 65 6e  fter it has been
aa70: 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   run..*/.void sq
aa80: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
aa90: 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  dy(.  Vdbe *p,  
aaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aab0: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
aac0: 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
aad0: 72 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  rse             
aae0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
aaf0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20  context */.){.  
ab00: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
ab10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ab20: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
ab30: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
ab40: 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20  nt nVar;        
ab50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ab60: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 61 6d   Number of param
ab70: 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  eters */.  int n
ab80: 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mem;            
ab90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
aba0: 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79  ber of VM memory
abb0: 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20   registers */.  
abc0: 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20 20 20  int nCursor;    
abd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
abe0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  * Number of curs
abf0: 6f 72 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a  ors required */.
ac00: 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20    int nArg;     
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac20: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
ac30: 67 75 6d 65 6e 74 73 20 69 6e 20 73 75 62 70 72  guments in subpr
ac40: 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20  ograms */.  int 
ac50: 6e 4f 6e 63 65 3b 20 20 20 20 20 20 20 20 20 20  nOnce;          
ac60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
ac70: 6d 62 65 72 20 6f 66 20 4f 50 5f 4f 6e 63 65 20  mber of OP_Once 
ac80: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a  instructions */.
ac90: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
aca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acb0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
acc0: 20 2a 2f 0a 20 20 75 38 20 2a 7a 43 73 72 3b 20   */.  u8 *zCsr; 
acd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ace0: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61       /* Memory a
acf0: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c  vailable for all
ad00: 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  ocation */.  u8 
ad10: 2a 7a 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  *zEnd;          
ad20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
ad30: 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 61  irst byte past a
ad40: 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 20  llocated memory 
ad50: 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  */.  int nByte; 
ad60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad70: 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75 63 68 20      /* How much 
ad80: 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 69 73 20  extra memory is 
ad90: 6e 65 65 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73  needed */..  ass
ada0: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
adb0: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
adc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
add0: 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rse!=0 );.  asse
ade0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
adf0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
ae00: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
ae10: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
ae20: 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a  locFailed==0 );.
ae30: 20 20 6e 56 61 72 20 3d 20 70 50 61 72 73 65 2d    nVar = pParse-
ae40: 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20  >nVar;.  nMem = 
ae50: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
ae60: 6e 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65  nCursor = pParse
ae70: 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d  ->nTab;.  nArg =
ae80: 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67   pParse->nMaxArg
ae90: 3b 0a 20 20 6e 4f 6e 63 65 20 3d 20 70 50 61 72  ;.  nOnce = pPar
aea0: 73 65 2d 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66 28  se->nOnce;.  if(
aeb0: 20 6e 4f 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e 63   nOnce==0 ) nOnc
aec0: 65 20 3d 20 31 3b 20 2f 2a 20 45 6e 73 75 72 65  e = 1; /* Ensure
aed0: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 79   at least one by
aee0: 74 65 20 69 6e 20 70 2d 3e 61 4f 6e 63 65 46 6c  te in p->aOnceFl
aef0: 61 67 5b 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20  ag[] */.  .  /* 
af00: 46 6f 72 20 65 61 63 68 20 63 75 72 73 6f 72 20  For each cursor 
af10: 72 65 71 75 69 72 65 64 2c 20 61 6c 73 6f 20 61  required, also a
af20: 6c 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f 72 79  llocate a memory
af30: 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20   cell. Memory.  
af40: 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31  ** cells (nMem+1
af50: 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c  -nCursor)..nMem,
af60: 20 69 6e 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c   inclusive, will
af70: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 62   never be used b
af80: 79 0a 20 20 2a 2a 20 74 68 65 20 76 64 62 65 20  y.  ** the vdbe 
af90: 70 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65 61 64  program. Instead
afa0: 20 74 68 65 79 20 61 72 65 20 75 73 65 64 20 74   they are used t
afb0: 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  o allocate space
afc0: 20 66 6f 72 0a 20 20 2a 2a 20 56 64 62 65 43 75   for.  ** VdbeCu
afd0: 72 73 6f 72 2f 42 74 43 75 72 73 6f 72 20 73 74  rsor/BtCursor st
afe0: 72 75 63 74 75 72 65 73 2e 20 54 68 65 20 62 6c  ructures. The bl
aff0: 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73  ob of memory ass
b000: 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 20 20  ociated with .  
b010: 2a 2a 20 63 75 72 73 6f 72 20 30 20 69 73 20 73  ** cursor 0 is s
b020: 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  tored in memory 
b030: 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72  cell nMem. Memor
b040: 79 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a  y cell (nMem-1).
b050: 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20    ** stores the 
b060: 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61  blob of memory a
b070: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
b080: 75 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20  ursor 1, etc..  
b090: 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f  **.  ** See also
b0a0: 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72  : allocateCursor
b0b0: 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20  ()..  */.  nMem 
b0c0: 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f  += nCursor;..  /
b0d0: 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
b0e0: 20 66 6f 72 20 6d 65 6d 6f 72 79 20 72 65 67 69   for memory regi
b0f0: 73 74 65 72 73 2c 20 53 51 4c 20 76 61 72 69 61  sters, SQL varia
b100: 62 6c 65 73 2c 20 56 44 42 45 20 63 75 72 73 6f  bles, VDBE curso
b110: 72 73 20 61 6e 64 20 0a 20 20 2a 2a 20 61 6e 20  rs and .  ** an 
b120: 61 72 72 61 79 20 74 6f 20 6d 61 72 73 68 61 6c  array to marshal
b130: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72   SQL function ar
b140: 67 75 6d 65 6e 74 73 20 69 6e 2e 0a 20 20 2a 2f  guments in..  */
b150: 0a 20 20 7a 43 73 72 20 3d 20 28 75 38 2a 29 26  .  zCsr = (u8*)&
b160: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20  p->aOp[p->nOp]; 
b170: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
b180: 61 76 61 6c 69 61 62 6c 65 20 66 6f 72 20 61 6c  avaliable for al
b190: 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 7a 45  location */.  zE
b1a0: 6e 64 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 4f  nd = (u8*)&p->aO
b1b0: 70 5b 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 20  p[p->nOpAlloc]; 
b1c0: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70   /* First byte p
b1d0: 61 73 74 20 65 6e 64 20 6f 66 20 7a 43 73 72 5b  ast end of zCsr[
b1e0: 5d 20 2a 2f 0a 0a 20 20 72 65 73 6f 6c 76 65 50  ] */..  resolveP
b1f0: 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67  2Values(p, &nArg
b200: 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d 74  );.  p->usesStmt
b210: 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 28 70  Journal = (u8)(p
b220: 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72  Parse->isMultiWr
b230: 69 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6d  ite && pParse->m
b240: 61 79 41 62 6f 72 74 29 3b 0a 20 20 69 66 28 20  ayAbort);.  if( 
b250: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
b260: 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20  && nMem<10 ){.  
b270: 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d    nMem = 10;.  }
b280: 0a 20 20 6d 65 6d 73 65 74 28 7a 43 73 72 2c 20  .  memset(zCsr, 
b290: 30 2c 20 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a 20  0, zEnd-zCsr);. 
b2a0: 20 7a 43 73 72 20 2b 3d 20 28 7a 43 73 72 20 2d   zCsr += (zCsr -
b2b0: 20 28 75 38 2a 29 30 29 26 37 3b 0a 20 20 61 73   (u8*)0)&7;.  as
b2c0: 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
b2d0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 7a 43 73 72 29  _ALIGNMENT(zCsr)
b2e0: 20 29 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65 64   );.  p->expired
b2f0: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f   = 0;..  /* Memo
b300: 72 79 20 66 6f 72 20 72 65 67 69 73 74 65 72 73  ry for registers
b310: 2c 20 70 61 72 61 6d 65 74 65 72 73 2c 20 63 75  , parameters, cu
b320: 72 73 6f 72 2c 20 65 74 63 2c 20 69 73 20 61 6c  rsor, etc, is al
b330: 6c 6f 63 61 74 65 64 20 69 6e 20 74 77 6f 0a 20  located in two. 
b340: 20 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f 6e 20   ** passes.  On 
b350: 74 68 65 20 66 69 72 73 74 20 70 61 73 73 2c 20  the first pass, 
b360: 77 65 20 74 72 79 20 74 6f 20 72 65 75 73 65 20  we try to reuse 
b370: 75 6e 75 73 65 64 20 73 70 61 63 65 20 61 74 20  unused space at 
b380: 74 68 65 20 0a 20 20 2a 2a 20 65 6e 64 20 6f 66  the .  ** end of
b390: 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61   the opcode arra
b3a0: 79 2e 20 20 49 66 20 77 65 20 61 72 65 20 75 6e  y.  If we are un
b3b0: 61 62 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20  able to satisfy 
b3c0: 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20  all memory.  ** 
b3d0: 72 65 71 75 69 72 65 6d 65 6e 74 73 20 62 79 20  requirements by 
b3e0: 72 65 75 73 69 6e 67 20 74 68 65 20 6f 70 63 6f  reusing the opco
b3f0: 64 65 20 61 72 72 61 79 20 74 61 69 6c 2c 20 74  de array tail, t
b400: 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 20  hen the second. 
b410: 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20 66 69   ** pass will fi
b420: 6c 6c 20 69 6e 20 74 68 65 20 72 65 73 74 20 75  ll in the rest u
b430: 73 69 6e 67 20 61 20 66 72 65 73 68 20 61 6c 6c  sing a fresh all
b440: 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a  ocation.  .  **.
b450: 20 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70 61    ** This two-pa
b460: 73 73 20 61 70 70 72 6f 61 63 68 20 74 68 61 74  ss approach that
b470: 20 72 65 75 73 65 73 20 61 73 20 6d 75 63 68 20   reuses as much 
b480: 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62  memory as possib
b490: 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65  le from.  ** the
b4a0: 20 6c 65 66 74 6f 76 65 72 20 73 70 61 63 65 20   leftover space 
b4b0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
b4c0: 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20 63  e opcode array c
b4d0: 61 6e 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79  an significantly
b4e0: 0a 20 20 2a 2a 20 72 65 64 75 63 65 20 74 68 65  .  ** reduce the
b4f0: 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72   amount of memor
b500: 79 20 68 65 6c 64 20 62 79 20 61 20 70 72 65 70  y held by a prep
b510: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
b520: 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20 20 20    */.  do {.    
b530: 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 70  nByte = 0;.    p
b540: 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70  ->aMem = allocSp
b550: 61 63 65 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65  ace(p->aMem, nMe
b560: 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26  m*sizeof(Mem), &
b570: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
b580: 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 56 61 72  te);.    p->aVar
b590: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d   = allocSpace(p-
b5a0: 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65  >aVar, nVar*size
b5b0: 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20  of(Mem), &zCsr, 
b5c0: 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20  zEnd, &nByte);. 
b5d0: 20 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c     p->apArg = al
b5e0: 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70 41 72  locSpace(p->apAr
b5f0: 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d  g, nArg*sizeof(M
b600: 65 6d 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e  em*), &zCsr, zEn
b610: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
b620: 70 2d 3e 61 7a 56 61 72 20 3d 20 61 6c 6c 6f 63  p->azVar = alloc
b630: 53 70 61 63 65 28 70 2d 3e 61 7a 56 61 72 2c 20  Space(p->azVar, 
b640: 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63 68 61 72  nVar*sizeof(char
b650: 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c  *), &zCsr, zEnd,
b660: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d   &nByte);.    p-
b670: 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70  >apCsr = allocSp
b680: 61 63 65 28 70 2d 3e 61 70 43 73 72 2c 20 6e 43  ace(p->apCsr, nC
b690: 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62  ursor*sizeof(Vdb
b6a0: 65 43 75 72 73 6f 72 2a 29 2c 0a 20 20 20 20 20  eCursor*),.     
b6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6c0: 20 20 20 20 20 26 7a 43 73 72 2c 20 7a 45 6e 64       &zCsr, zEnd
b6d0: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70  , &nByte);.    p
b6e0: 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20 61 6c  ->aOnceFlag = al
b6f0: 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 4f 6e 63  locSpace(p->aOnc
b700: 65 46 6c 61 67 2c 20 6e 4f 6e 63 65 2c 20 26 7a  eFlag, nOnce, &z
b710: 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74  Csr, zEnd, &nByt
b720: 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74  e);.    if( nByt
b730: 65 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 46  e ){.      p->pF
b740: 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ree = sqlite3DbM
b750: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
b760: 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  yte);.    }.    
b770: 7a 43 73 72 20 3d 20 70 2d 3e 70 46 72 65 65 3b  zCsr = p->pFree;
b780: 0a 20 20 20 20 7a 45 6e 64 20 3d 20 26 7a 43 73  .    zEnd = &zCs
b790: 72 5b 6e 42 79 74 65 5d 3b 0a 20 20 7d 77 68 69  r[nByte];.  }whi
b7a0: 6c 65 28 20 6e 42 79 74 65 20 26 26 20 21 64 62  le( nByte && !db
b7b0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
b7c0: 3b 0a 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20  ;..  p->nCursor 
b7d0: 3d 20 28 75 31 36 29 6e 43 75 72 73 6f 72 3b 0a  = (u16)nCursor;.
b7e0: 20 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d    p->nOnceFlag =
b7f0: 20 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20 70 2d   nOnce;.  if( p-
b800: 3e 61 56 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e  >aVar ){.    p->
b810: 6e 56 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56  nVar = (ynVar)nV
b820: 61 72 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b  ar;.    for(n=0;
b830: 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20   n<nVar; n++){. 
b840: 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e       p->aVar[n].
b850: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
b860: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b  ;.      p->aVar[
b870: 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  n].db = db;.    
b880: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  }.  }.  if( p->a
b890: 7a 56 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  zVar ){.    p->n
b8a0: 7a 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  zVar = pParse->n
b8b0: 7a 56 61 72 3b 0a 20 20 20 20 6d 65 6d 63 70 79  zVar;.    memcpy
b8c0: 28 70 2d 3e 61 7a 56 61 72 2c 20 70 50 61 72 73  (p->azVar, pPars
b8d0: 65 2d 3e 61 7a 56 61 72 2c 20 70 2d 3e 6e 7a 56  e->azVar, p->nzV
b8e0: 61 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 7a 56  ar*sizeof(p->azV
b8f0: 61 72 5b 30 5d 29 29 3b 0a 20 20 20 20 6d 65 6d  ar[0]));.    mem
b900: 73 65 74 28 70 50 61 72 73 65 2d 3e 61 7a 56 61  set(pParse->azVa
b910: 72 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 7a  r, 0, pParse->nz
b920: 56 61 72 2a 73 69 7a 65 6f 66 28 70 50 61 72 73  Var*sizeof(pPars
b930: 65 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20  e->azVar[0]));. 
b940: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d   }.  if( p->aMem
b950: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 2d   ){.    p->aMem-
b960: 2d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  -;              
b970: 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b          /* aMem[
b980: 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e  ] goes from 1..n
b990: 4d 65 6d 20 2a 2f 0a 20 20 20 20 70 2d 3e 6e 4d  Mem */.    p->nM
b9a0: 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20  em = nMem;      
b9b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
b9c0: 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e      not from 0..
b9d0: 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 66 6f  nMem-1 */.    fo
b9e0: 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20  r(n=1; n<=nMem; 
b9f0: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  n++){.      p->a
ba00: 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d  Mem[n].flags = M
ba10: 45 4d 5f 49 6e 76 61 6c 69 64 3b 0a 20 20 20 20  EM_Invalid;.    
ba20: 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20    p->aMem[n].db 
ba30: 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = db;.    }.  }.
ba40: 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 70    p->explain = p
ba50: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a  Parse->explain;.
ba60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77    sqlite3VdbeRew
ba70: 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ind(p);.}../*.**
ba80: 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75   Close a VDBE cu
ba90: 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65  rsor and release
baa0: 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63   all the resourc
bab0: 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a  es that cursor .
bac0: 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f  ** happens to ho
bad0: 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ld..*/.void sqli
bae0: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
baf0: 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43  r(Vdbe *p, VdbeC
bb00: 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69  ursor *pCx){.  i
bb10: 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20  f( pCx==0 ){.   
bb20: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
bb30: 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72  qlite3VdbeSorter
bb40: 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20 70 43 78  Close(p->db, pCx
bb50: 29 3b 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 42  );.  if( pCx->pB
bb60: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
bb70: 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e  BtreeClose(pCx->
bb80: 70 42 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65  pBt);.    /* The
bb90: 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69   pCx->pCursor wi
bba0: 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f  ll be close auto
bbb0: 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74  matically, if it
bbc0: 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20   exists, by.    
bbd0: 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76  ** the call abov
bbe0: 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66  e. */.  }else if
bbf0: 28 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29  ( pCx->pCursor )
bc00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
bc10: 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43  eeCloseCursor(pC
bc20: 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d  x->pCursor);.  }
bc30: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
bc40: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
bc50: 45 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 56 74  E.  if( pCx->pVt
bc60: 61 62 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  abCursor ){.    
bc70: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
bc80: 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72  sor *pVtabCursor
bc90: 20 3d 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72   = pCx->pVtabCur
bca0: 73 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73  sor;.    const s
bcb0: 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70  qlite3_module *p
bcc0: 4d 6f 64 75 6c 65 20 3d 20 70 43 78 2d 3e 70 4d  Module = pCx->pM
bcd0: 6f 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 6e  odule;.    p->in
bce0: 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a  VtabMethod = 1;.
bcf0: 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c      pModule->xCl
bd00: 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f 72 29  ose(pVtabCursor)
bd10: 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d  ;.    p->inVtabM
bd20: 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a 23  ethod = 0;.  }.#
bd30: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  endif.}../*.** C
bd40: 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73 20 73  opy the values s
bd50: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64 62  tored in the Vdb
bd60: 65 46 72 61 6d 65 20 73 74 72 75 63 74 75 72 65  eFrame structure
bd70: 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20 54 68   to its Vdbe. Th
bd80: 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 66  is.** is used, f
bd90: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  or example, when
bda0: 20 61 20 74 72 69 67 67 65 72 20 73 75 62 2d 70   a trigger sub-p
bdb0: 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74 65 64  rogram is halted
bdc0: 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20 63   to restore.** c
bdd0: 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d 61  ontrol to the ma
bde0: 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69  in program..*/.i
bdf0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  nt sqlite3VdbeFr
be00: 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62 65 46  ameRestore(VdbeF
be10: 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20  rame *pFrame){. 
be20: 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72 61 6d   Vdbe *v = pFram
be30: 65 2d 3e 76 3b 0a 20 20 76 2d 3e 61 4f 6e 63 65  e->v;.  v->aOnce
be40: 46 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e 61  Flag = pFrame->a
be50: 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 6e  OnceFlag;.  v->n
be60: 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 72 61 6d  OnceFlag = pFram
be70: 65 2d 3e 6e 4f 6e 63 65 46 6c 61 67 3b 0a 20 20  e->nOnceFlag;.  
be80: 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d  v->aOp = pFrame-
be90: 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d  >aOp;.  v->nOp =
bea0: 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20   pFrame->nOp;.  
beb0: 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65  v->aMem = pFrame
bec0: 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65  ->aMem;.  v->nMe
bed0: 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d  m = pFrame->nMem
bee0: 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d 20 70  ;.  v->apCsr = p
bef0: 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20  Frame->apCsr;.  
bf00: 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46 72  v->nCursor = pFr
bf10: 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20  ame->nCursor;.  
bf20: 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64  v->db->lastRowid
bf30: 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52   = pFrame->lastR
bf40: 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e  owid;.  v->nChan
bf50: 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68  ge = pFrame->nCh
bf60: 61 6e 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 70  ange;.  return p
bf70: 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a  Frame->pc;.}../*
bf80: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75  .** Close all cu
bf90: 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  rsors..**.** Als
bfa0: 6f 20 72 65 6c 65 61 73 65 20 61 6e 79 20 64 79  o release any dy
bfb0: 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c  namic memory hel
bfc0: 64 20 62 79 20 74 68 65 20 56 4d 20 69 6e 20 74  d by the VM in t
bfd0: 68 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d  he Vdbe.aMem mem
bfe0: 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72  ory .** cell arr
bff0: 61 79 2e 20 54 68 69 73 20 69 73 20 6e 65 63 65  ay. This is nece
c000: 73 73 61 72 79 20 61 73 20 74 68 65 20 6d 65 6d  ssary as the mem
c010: 6f 72 79 20 63 65 6c 6c 20 61 72 72 61 79 20 6d  ory cell array m
c020: 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f  ay contain.** po
c030: 69 6e 74 65 72 73 20 74 6f 20 56 64 62 65 46 72  inters to VdbeFr
c040: 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77 68 69  ame objects, whi
c050: 63 68 20 6d 61 79 20 69 6e 20 74 75 72 6e 20 63  ch may in turn c
c060: 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20  ontain pointers 
c070: 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f  to.** open curso
c080: 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rs..*/.static vo
c090: 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f  id closeAllCurso
c0a0: 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  rs(Vdbe *p){.  i
c0b0: 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a  f( p->pFrame ){.
c0c0: 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70      VdbeFrame *p
c0d0: 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70  Frame;.    for(p
c0e0: 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b  Frame=p->pFrame;
c0f0: 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74   pFrame->pParent
c100: 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d  ; pFrame=pFrame-
c110: 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 73  >pParent);.    s
c120: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52  qlite3VdbeFrameR
c130: 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a  estore(pFrame);.
c140: 20 20 7d 0a 20 20 70 2d 3e 70 46 72 61 6d 65 20    }.  p->pFrame 
c150: 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 72 61 6d 65  = 0;.  p->nFrame
c160: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e   = 0;..  if( p->
c170: 61 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e 74  apCsr ){.    int
c180: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
c190: 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69   i<p->nCursor; i
c1a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64 62 65 43  ++){.      VdbeC
c1b0: 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61  ursor *pC = p->a
c1c0: 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69  pCsr[i];.      i
c1d0: 66 28 20 70 43 20 29 7b 0a 20 20 20 20 20 20 20  f( pC ){.       
c1e0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
c1f0: 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20  Cursor(p, pC);. 
c200: 20 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b         p->apCsr[
c210: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  i] = 0;.      }.
c220: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
c230: 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72  p->aMem ){.    r
c240: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 26  eleaseMemArray(&
c250: 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e  p->aMem[1], p->n
c260: 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  Mem);.  }.  whil
c270: 65 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20  e( p->pDelFrame 
c280: 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65  ){.    VdbeFrame
c290: 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c   *pDel = p->pDel
c2a0: 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44  Frame;.    p->pD
c2b0: 65 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e  elFrame = pDel->
c2c0: 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c  pParent;.    sql
c2d0: 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c  ite3VdbeFrameDel
c2e0: 65 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 7d  ete(pDel);.  }.}
c2f0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70  ../*.** Clean up
c300: 20 74 68 65 20 56 4d 20 61 66 74 65 72 20 65 78   the VM after ex
c310: 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ecution..**.** T
c320: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
c330: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
c340: 6c 6f 73 65 20 61 6e 79 20 63 75 72 73 6f 72 73  lose any cursors
c350: 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f 72 0a  , lists, and/or.
c360: 2a 2a 20 73 6f 72 74 65 72 73 20 74 68 61 74 20  ** sorters that 
c370: 77 65 72 65 20 6c 65 66 74 20 6f 70 65 6e 2e 20  were left open. 
c380: 20 49 74 20 61 6c 73 6f 20 64 65 6c 65 74 65 73   It also deletes
c390: 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a   the values of.*
c3a0: 2a 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74  * variables in t
c3b0: 68 65 20 61 56 61 72 5b 5d 20 61 72 72 61 79 2e  he aVar[] array.
c3c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c3d0: 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70 29  Cleanup(Vdbe *p)
c3e0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
c3f0: 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66  = p->db;..#ifdef
c400: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
c410: 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73 65 72  /* Execute asser
c420: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
c430: 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
c440: 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61  e Vdbe.apCsr[] a
c450: 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d  nd .  ** Vdbe.aM
c460: 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65  em[] arrays have
c470: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c   already been cl
c480: 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20  eaned up.  */.  
c490: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e  int i;.  if( p->
c4a0: 61 70 43 73 72 20 29 20 66 6f 72 28 69 3d 30 3b  apCsr ) for(i=0;
c4b0: 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69   i<p->nCursor; i
c4c0: 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ++) assert( p->a
c4d0: 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20  pCsr[i]==0 );.  
c4e0: 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20  if( p->aMem ){. 
c4f0: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70     for(i=1; i<=p
c500: 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73  ->nMem; i++) ass
c510: 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e  ert( p->aMem[i].
c520: 66 6c 61 67 73 3d 3d 4d 45 4d 5f 49 6e 76 61 6c  flags==MEM_Inval
c530: 69 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  id );.  }.#endif
c540: 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ..  sqlite3DbFre
c550: 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
c560: 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  );.  p->zErrMsg 
c570: 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c  = 0;.  p->pResul
c580: 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tSet = 0;.}../*.
c590: 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65  ** Set the numbe
c5a0: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
c5b0: 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  mns that will be
c5c0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
c5d0: 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65  s SQL.** stateme
c5e0: 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20  nt. This is now 
c5f0: 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  set at compile t
c600: 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e  ime, rather than
c610: 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75   during.** execu
c620: 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65  tion of the vdbe
c630: 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74   program so that
c640: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
c650: 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62  count() can.** b
c660: 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53  e called on an S
c670: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66  QL statement bef
c680: 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ore sqlite3_step
c690: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
c6a0: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
c6b0: 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e  s(Vdbe *p, int n
c6c0: 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65  ResColumn){.  Me
c6d0: 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69  m *pColName;.  i
c6e0: 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt n;.  sqlite3 
c6f0: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  *db = p->db;..  
c700: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
c710: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e  p->aColName, p->
c720: 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
c730: 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33  ME_N);.  sqlite3
c740: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43  DbFree(db, p->aC
c750: 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e  olName);.  n = n
c760: 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
c770: 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f  E_N;.  p->nResCo
c780: 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73  lumn = (u16)nRes
c790: 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f  Column;.  p->aCo
c7a0: 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65  lName = pColName
c7b0: 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33   = (Mem*)sqlite3
c7c0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
c7d0: 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29   sizeof(Mem)*n )
c7e0: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e  ;.  if( p->aColN
c7f0: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
c800: 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20  .  while( n-- > 
c810: 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  0 ){.    pColNam
c820: 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  e->flags = MEM_N
c830: 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  ull;.    pColNam
c840: 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  e->db = p->db;. 
c850: 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20     pColName++;. 
c860: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
c870: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
c880: 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f  idx'th column to
c890: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
c8a0: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
c8b0: 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74  t..** zName must
c8c0: 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
c8d0: 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65   a nul terminate
c8e0: 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  d string..**.** 
c8f0: 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62  This call must b
c900: 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63  e made after a c
c910: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64  all to sqlite3Vd
c920: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a  beSetNumCols()..
c930: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20  **.** The final 
c940: 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c  parameter, xDel,
c950: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
c960: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20  SQLITE_DYNAMIC, 
c970: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a  SQLITE_STATIC.**
c980: 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53   or SQLITE_TRANS
c990: 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53  IENT. If it is S
c9a0: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74  QLITE_DYNAMIC, t
c9b0: 68 65 6e 20 74 68 65 20 62 75 66 66 65 72 20 70  hen the buffer p
c9c0: 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20  ointed.** to by 
c9d0: 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72  zName will be fr
c9e0: 65 65 64 20 62 79 20 73 71 6c 69 74 65 33 44 62  eed by sqlite3Db
c9f0: 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20  Free() when the 
ca00: 76 64 62 65 20 69 73 20 64 65 73 74 72 6f 79 65  vdbe is destroye
ca10: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
ca20: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
ca30: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
ca40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca50: 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e      /* Vdbe bein
ca60: 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a  g configured */.
ca70: 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20    int idx,      
ca80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca90: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
caa0: 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c  olumn zName appl
cab0: 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  ies to */.  int 
cac0: 76 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  var,            
cad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cae0: 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41  One of the COLNA
caf0: 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a  ME_* constants *
cb00: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
cb10: 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  zName,          
cb20: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
cb30: 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  to buffer contai
cb40: 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76  ning name */.  v
cb50: 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64  oid (*xDel)(void
cb60: 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
cb70: 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65  /* Memory manage
cb80: 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f  ment strategy fo
cb90: 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20  r zName */.){.  
cba0: 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70  int rc;.  Mem *p
cbb0: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72  ColName;.  asser
cbc0: 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f  t( idx<p->nResCo
cbd0: 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74  lumn );.  assert
cbe0: 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20  ( var<COLNAME_N 
cbf0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
cc00: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
cc10: 20 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61      assert( !zNa
cc20: 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49  me || xDel!=SQLI
cc30: 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20  TE_DYNAMIC );.  
cc40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
cc50: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73  NOMEM;.  }.  ass
cc60: 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  ert( p->aColName
cc70: 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d  !=0 );.  pColNam
cc80: 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d  e = &(p->aColNam
cc90: 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65  e[idx+var*p->nRe
cca0: 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20  sColumn]);.  rc 
ccb0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
ccc0: 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c  SetStr(pColName,
ccd0: 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49   zName, -1, SQLI
cce0: 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a  TE_UTF8, xDel);.
ccf0: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 30 20    assert( rc!=0 
cd00: 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43  || !zName || (pC
cd10: 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45  olName->flags&ME
cd20: 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20  M_Term)!=0 );.  
cd30: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
cd40: 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72  .** A read or wr
cd50: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
cd60: 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
cd70: 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61  e active on data
cd80: 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
cd90: 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  b. If a transact
cda0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63  ion is active, c
cdb0: 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65  ommit it. If the
cdc0: 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65  re is a.** write
cdd0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61  -transaction spa
cde0: 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  nning more than 
cdf0: 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  one database fil
ce00: 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  e, this routine.
ce10: 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66  ** takes care of
ce20: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
ce30: 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f  nal trickery..*/
ce40: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
ce50: 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a  Commit(sqlite3 *
ce60: 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20  db, Vdbe *p){.  
ce70: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72  int i;.  int nTr
ce80: 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d  ans = 0;  /* Num
ce90: 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65 73  ber of databases
cea0: 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 65 20   with an active 
ceb0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
cec0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  n */.  int rc = 
ced0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
cee0: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30   needXcommit = 0
cef0: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
cf00: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
cf10: 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 68 69  LE.  /* With thi
cf20: 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65  s option, sqlite
cf30: 33 56 74 61 62 53 79 6e 63 28 29 20 69 73 20 64  3VtabSync() is d
cf40: 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73 69 6d  efined to be sim
cf50: 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45  ply .  ** SQLITE
cf60: 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74 20  _OK so p is not 
cf70: 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e  used. .  */.  UN
cf80: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
cf90: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
cfa0: 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79  Before doing any
cfb0: 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c  thing else, call
cfc0: 20 74 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c   the xSync() cal
cfd0: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20  lback for any.  
cfe0: 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c  ** virtual modul
cff0: 65 20 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e  e tables written
d000: 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63   in this transac
d010: 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74  tion. This has t
d020: 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62  o.  ** be done b
d030: 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e  efore determinin
d040: 67 20 77 68 65 74 68 65 72 20 61 20 6d 61 73 74  g whether a mast
d050: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
d060: 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  is .  ** require
d070: 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29  d, as an xSync()
d080: 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64   callback may ad
d090: 64 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61  d an attached da
d0a0: 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74  tabase.  ** to t
d0b0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
d0c0: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
d0d0: 74 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20  te3VtabSync(db, 
d0e0: 26 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 0a 20  &p->zErrMsg);.. 
d0f0: 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65   /* This loop de
d100: 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20  termines (a) if 
d110: 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  the commit hook 
d120: 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65  should be invoke
d130: 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68  d and.  ** (b) h
d140: 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65  ow many database
d150: 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e   files have open
d160: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
d170: 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69  ons, not .  ** i
d180: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d  ncluding the tem
d190: 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29 20  p database. (b) 
d1a0: 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63  is important bec
d1b0: 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61  ause if more tha
d1c0: 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61  n .  ** one data
d1d0: 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e  base file has an
d1e0: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
d1f0: 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65  saction, a maste
d200: 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  r journal.  ** f
d210: 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ile is required 
d220: 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f  for an atomic co
d230: 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  mmit..  */ .  fo
d240: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
d250: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
d260: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74  b; i++){ .    Bt
d270: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
d280: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
d290: 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
d2a0: 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
d2b0: 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d  .      needXcomm
d2c0: 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  it = 1;.      if
d2d0: 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b  ( i!=1 ) nTrans+
d2e0: 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  +;.      sqlite3
d2f0: 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b  BtreeEnter(pBt);
d300: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
d310: 74 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76  te3PagerExclusiv
d320: 65 4c 6f 63 6b 28 73 71 6c 69 74 65 33 42 74 72  eLock(sqlite3Btr
d330: 65 65 50 61 67 65 72 28 70 42 74 29 29 3b 0a 20  eePager(pBt));. 
d340: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
d350: 65 4c 65 61 76 65 28 70 42 74 29 3b 0a 20 20 20  eLeave(pBt);.   
d360: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21   }.  }.  if( rc!
d370: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d380: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
d390: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
d3a0: 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72  are any write-tr
d3b0: 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c  ansactions at al
d3c0: 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f  l, invoke the co
d3d0: 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69  mmit hook */.  i
d3e0: 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26  f( needXcommit &
d3f0: 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c  & db->xCommitCal
d400: 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 72 63 20  lback ){.    rc 
d410: 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c  = db->xCommitCal
d420: 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69  lback(db->pCommi
d430: 74 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 72  tArg);.    if( r
d440: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
d450: 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
d460: 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  INT;.    }.  }..
d470: 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20    /* The simple 
d480: 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74  case - no more t
d490: 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65  han one database
d4a0: 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74   file (not count
d4b0: 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d  ing the.  ** TEM
d4c0: 50 20 64 61 74 61 62 61 73 65 29 20 68 61 73 20  P database) has 
d4d0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63  a transaction ac
d4e0: 74 69 76 65 2e 20 20 20 54 68 65 72 65 20 69 73  tive.   There is
d4f0: 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65   no need for the
d500: 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75  .  ** master-jou
d510: 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rnal..  **.  ** 
d520: 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  If the return va
d530: 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74  lue of sqlite3Bt
d540: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29  reeGetFilename()
d550: 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74   is a zero lengt
d560: 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69  h.  ** string, i
d570: 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e  t means the main
d580: 20 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65   database is :me
d590: 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20  mory: or a temp 
d5a0: 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20  file.  In .  ** 
d5b0: 74 68 61 74 20 63 61 73 65 20 77 65 20 64 6f 20  that case we do 
d5c0: 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d  not support atom
d5d0: 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f  ic multi-file co
d5e0: 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68  mmits, so use th
d5f0: 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63  e .  ** simple c
d600: 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20  ase then too..  
d610: 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69  */.  if( 0==sqli
d620: 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69  te3Strlen30(sqli
d630: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
d640: 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
d650: 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e  Bt)).   || nTran
d660: 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f  s<=1.  ){.    fo
d670: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
d680: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
d690: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
d6a0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
d6b0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
d6c0: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
d6d0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d6e0: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
d6f0: 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20  eOne(pBt, 0);.  
d700: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
d710: 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69   /* Do the commi
d720: 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61  t only if all da
d730: 74 61 62 61 73 65 73 20 73 75 63 63 65 73 73 66  tabases successf
d740: 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68  ully complete ph
d750: 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49  ase 1. .    ** I
d760: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72  f one of the Btr
d770: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
d780: 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20  () calls fails, 
d790: 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 61  this indicates a
d7a0: 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f  n.    ** IO erro
d7b0: 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67  r while deleting
d7c0: 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61   or truncating a
d7d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
d7e0: 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20  t is unlikely,. 
d7f0: 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20     ** but could 
d800: 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20  happen. In this 
d810: 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f  case abandon pro
d820: 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75  cessing and retu
d830: 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20  rn the error..  
d840: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
d850: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
d860: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
d870: 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
d880: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
d890: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
d8a0: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
d8b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
d8c0: 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
d8d0: 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  pBt, 0);.      }
d8e0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
d8f0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
d900: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61        sqlite3Vta
d910: 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20  bCommit(db);.   
d920: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
d930: 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20   complex case - 
d940: 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69  There is a multi
d950: 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e  -file write-tran
d960: 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a  saction active..
d970: 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72    ** This requir
d980: 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  es a master jour
d990: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75  nal file to ensu
d9a0: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
d9b0: 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69  on is.  ** commi
d9c0: 74 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20  tted atomicly.. 
d9d0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
d9e0: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20  TE_OMIT_DISKIO. 
d9f0: 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74   else{.    sqlit
da00: 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64  e3_vfs *pVfs = d
da10: 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74  b->pVfs;.    int
da20: 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20   needSync = 0;. 
da30: 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72     char *zMaster
da40: 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d   = 0;   /* File-
da50: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73  name for the mas
da60: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ter journal */. 
da70: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
da80: 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74  MainFile = sqlit
da90: 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
daa0: 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  me(db->aDb[0].pB
dab0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
dac0: 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20  file *pMaster = 
dad0: 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  0;.    i64 offse
dae0: 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  t = 0;.    int r
daf0: 65 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 72  es;.    int retr
db00: 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20  yCount = 0;.    
db10: 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a  int nMainFile;..
db20: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20      /* Select a 
db30: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
db40: 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ile name */.    
db50: 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69  nMainFile = sqli
db60: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69  te3Strlen30(zMai
db70: 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73  nFile);.    zMas
db80: 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ter = sqlite3MPr
db90: 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58  intf(db, "%s-mjX
dba0: 58 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69  XXXXX9XXz", zMai
dbb0: 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  nFile);.    if( 
dbc0: 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20 72 65 74  zMaster==0 ) ret
dbd0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
dbe0: 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  ;.    do {.     
dbf0: 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20   u32 iRandom;.  
dc00: 20 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75      if( retryCou
dc10: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  nt ){.        if
dc20: 28 20 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 30  ( retryCount>100
dc30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
dc40: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
dc50: 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74  _FULL, "MJ delet
dc60: 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29  e: %s", zMaster)
dc70: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
dc80: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
dc90: 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
dca0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
dcb0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
dcc0: 28 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20  ( retryCount==1 
dcd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
dce0: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
dcf0: 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64  FULL, "MJ collid
dd00: 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29  e: %s", zMaster)
dd10: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
dd20: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 72 79 43    }.      retryC
dd30: 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71  ount++;.      sq
dd40: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
dd50: 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29  (sizeof(iRandom)
dd60: 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20  , &iRandom);.   
dd70: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
dd80: 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 72  ntf(13, &zMaster
dd90: 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d  [nMainFile], "-m
dda0: 6a 25 30 36 58 39 25 30 32 58 22 2c 0a 20 20 20  j%06X9%02X",.   
ddb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 52 61              (iRa
ddd0: 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 66  ndom>>8)&0xfffff
dde0: 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 29  f, iRandom&0xff)
ddf0: 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61  ;.      /* The a
de00: 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 63  ntipenultimate c
de10: 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20  haracter of the 
de20: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
de30: 61 6d 65 20 6d 75 73 74 0a 20 20 20 20 20 20 2a  ame must.      *
de40: 2a 20 62 65 20 22 39 22 20 74 6f 20 61 76 6f 69  * be "9" to avoi
de50: 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e  d name collision
de60: 73 20 77 68 65 6e 20 75 73 69 6e 67 20 38 2b 33  s when using 8+3
de70: 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20   filenames. */. 
de80: 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d 61       assert( zMa
de90: 73 74 65 72 5b 73 71 6c 69 74 65 33 53 74 72 6c  ster[sqlite3Strl
dea0: 65 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d  en30(zMaster)-3]
deb0: 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20 20 20 73  =='9' );.      s
dec0: 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78  qlite3FileSuffix
ded0: 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61  3(zMainFile, zMa
dee0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20  ster);.      rc 
def0: 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
df00: 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  s(pVfs, zMaster,
df10: 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
df20: 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20  XISTS, &res);.  
df30: 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
df40: 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29  LITE_OK && res )
df50: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
df60: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
df70: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73   /* Open the mas
df80: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  ter journal. */.
df90: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
dfa0: 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70  e3OsOpenMalloc(p
dfb0: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70  Vfs, zMaster, &p
dfc0: 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20  Master, .       
dfd0: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
dfe0: 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
dff0: 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20  OPEN_CREATE|.   
e000: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
e010: 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c  EN_EXCLUSIVE|SQL
e020: 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
e030: 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20  JOURNAL, 0.     
e040: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   );.    }.    if
e050: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e060: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
e070: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
e080: 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
e090: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20  n rc;.    }. .  
e0a0: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
e0b0: 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61  ame of each data
e0c0: 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65  base file in the
e0d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74   transaction int
e0e0: 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a  o the new.    **
e0f0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
e100: 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  file. If an erro
e110: 72 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73  r occurs at this
e120: 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20   point close.   
e130: 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74   ** and delete t
e140: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
e150: 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20  l file. All the 
e160: 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
e170: 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20  al files.    ** 
e180: 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c  still have 'null
e190: 27 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20  ' as the master 
e1a0: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c  journal pointer,
e1b0: 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f   so they will ro
e1c0: 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69  ll.    ** back i
e1d0: 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20  ndependently if 
e1e0: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  a failure occurs
e1f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
e200: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
e210: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
e220: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
e230: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
e240: 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
e250: 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
e260: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63  {.        char c
e270: 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71  onst *zFile = sq
e280: 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75  lite3BtreeGetJou
e290: 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20  rnalname(pBt);. 
e2a0: 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65         if( zFile
e2b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
e2c0: 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49   continue;  /* I
e2d0: 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a  gnore TEMP and :
e2e0: 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65  memory: database
e2f0: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  s */.        }. 
e300: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a         assert( z
e310: 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  File[0]!=0 );.  
e320: 20 20 20 20 20 20 69 66 28 20 21 6e 65 65 64 53        if( !needS
e330: 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33 42  ync && !sqlite3B
e340: 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64  treeSyncDisabled
e350: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
e360: 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b     needSync = 1;
e370: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e380: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
e390: 73 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20  sWrite(pMaster, 
e3a0: 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53 74  zFile, sqlite3St
e3b0: 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c  rlen30(zFile)+1,
e3c0: 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20   offset);.      
e3d0: 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c 69    offset += sqli
e3e0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
e3f0: 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66  e)+1;.        if
e400: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e410: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
e420: 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
e430: 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  pMaster);.      
e440: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
e450: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
e460: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 0);.         
e470: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
e480: 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
e490: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
e4a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e4b0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
e4c0: 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65  * Sync the maste
e4d0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
e4e0: 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51  If the IOCAP_SEQ
e4f0: 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20  UENTIAL device. 
e500: 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65     ** flag is se
e510: 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65  t this is not re
e520: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
e530: 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20     if( needSync 
e540: 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 73 71 6c  .     && 0==(sql
e550: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
e560: 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73  acteristics(pMas
e570: 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  ter)&SQLITE_IOCA
e580: 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20  P_SEQUENTIAL).  
e590: 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21     && SQLITE_OK!
e5a0: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
e5b0: 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51  Sync(pMaster, SQ
e5c0: 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
e5d0: 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
e5e0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
e5f0: 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
e600: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
e610: 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
e620: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
e630: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
e640: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
e650: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
e660: 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20      /* Sync all 
e670: 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76  the db files inv
e680: 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61  olved in the tra
e690: 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61  nsaction. The sa
e6a0: 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  me call.    ** s
e6b0: 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ets the master j
e6c0: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69  ournal pointer i
e6d0: 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61  n each individua
e6e0: 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  l journal. If.  
e6f0: 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63    ** an error oc
e700: 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f  curs here, do no
e710: 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
e720: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
e730: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
e740: 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63  If the error occ
e750: 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66  urs during the f
e760: 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20  irst call to.   
e770: 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65   ** sqlite3Btree
e780: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
e790: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
e7a0: 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  a chance that th
e7b0: 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20  e.    ** master 
e7c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
e7d0: 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42  l be orphaned. B
e7e0: 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c  ut we cannot del
e7f0: 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69  ete it,.    ** i
e800: 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65  n case the maste
e810: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
e820: 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ame was written 
e830: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
e840: 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66  .    ** file bef
e850: 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20  ore the failure 
e860: 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f  occurred..    */
e870: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
e880: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
e890: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
e8a0: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
e8b0: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
e8c0: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
e8d0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
e8e0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
e8f0: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
e900: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
e910: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
e920: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
e930: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61  (pMaster);.    a
e940: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
e950: 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66  E_BUSY );.    if
e960: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e970: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
e980: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
e990: 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
e9a0: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
e9b0: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d   /* Delete the m
e9c0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
e9d0: 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73  le. This commits
e9e0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
e9f0: 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64  . After.    ** d
ea00: 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69  oing this the di
ea10: 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65  rectory is synce
ea20: 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61  d again before a
ea30: 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20  ny individual.  
ea40: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
ea50: 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74   files are delet
ea60: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ed..    */.    r
ea70: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
ea80: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
ea90: 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 1);.    sqlit
eaa0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
eab0: 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74  ster);.    zMast
eac0: 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  er = 0;.    if( 
ead0: 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
eae0: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
eaf0: 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61    /* All files a
eb00: 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68  nd directories h
eb10: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
eb20: 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20   synced, so the 
eb30: 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a  following.    **
eb40: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
eb50: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
eb60: 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20  eTwo() are only 
eb70: 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e  closing files an
eb80: 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e  d.    ** deletin
eb90: 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
eba0: 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d  journals. If som
ebb0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
ebc0: 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74  g while.    ** t
ebd0: 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67  his is happening
ebe0: 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79   we don't really
ebf0: 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67   care. The integ
ec00: 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20  rity of the.    
ec10: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
ec20: 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e  s already guaran
ec30: 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73  teed, but some s
ec40: 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72  tray 'cold' jour
ec50: 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  nals.    ** may 
ec60: 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e  be lying around.
ec70: 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   Returning an er
ec80: 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68  ror code won't h
ec90: 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20  elp matters..   
eca0: 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f   */.    disable_
ecb0: 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
ecc0: 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  ors();.    sqlit
ecd0: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
ece0: 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69  loc();.    for(i
ecf0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
ed00: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
ed10: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
ed20: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
ed30: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
ed40: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f    sqlite3BtreeCo
ed50: 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
ed60: 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 1);.      }.  
ed70: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
ed80: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
ed90: 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d  ;.    enable_sim
eda0: 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
edb0: 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  ();..    sqlite3
edc0: 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
edd0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
ede0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
edf0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
ee00: 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20  checks that the 
ee10: 73 71 6c 69 74 65 33 2e 61 63 74 69 76 65 56 64  sqlite3.activeVd
ee20: 62 65 43 6e 74 20 63 6f 75 6e 74 20 76 61 72 69  beCnt count vari
ee30: 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20  able.** matches 
ee40: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64  the number of vd
ee50: 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74  be's in the list
ee60: 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74   sqlite3.pVdbe t
ee70: 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65  hat are.** curre
ee80: 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20  ntly active. An 
ee90: 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20  assertion fails 
eea0: 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74  if the two count
eeb0: 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a  s do not match..
eec0: 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e  ** This is an in
eed0: 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63  ternal self-chec
eee0: 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e  k only - it is n
eef0: 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20  ot an essential 
ef00: 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74  processing.** st
ef10: 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ep..**.** This i
ef20: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45  s a no-op if NDE
ef30: 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  BUG is defined..
ef40: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
ef50: 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  G.static void ch
ef60: 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
ef70: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
ef80: 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20   Vdbe *p;.  int 
ef90: 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  cnt = 0;.  int n
efa0: 57 72 69 74 65 20 3d 20 30 3b 0a 20 20 70 20 3d  Write = 0;.  p =
efb0: 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68   db->pVdbe;.  wh
efc0: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66  ile( p ){.    if
efd0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
efe0: 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d  _MAGIC_RUN && p-
eff0: 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  >pc>=0 ){.      
f000: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  cnt++;.      if(
f010: 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20   p->readOnly==0 
f020: 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20  ) nWrite++;.    
f030: 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  }.    p = p->pNe
f040: 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  xt;.  }.  assert
f050: 28 20 63 6e 74 3d 3d 64 62 2d 3e 61 63 74 69 76  ( cnt==db->activ
f060: 65 56 64 62 65 43 6e 74 20 29 3b 0a 20 20 61 73  eVdbeCnt );.  as
f070: 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62  sert( nWrite==db
f080: 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 20 29  ->writeVdbeCnt )
f090: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
f0a0: 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62  e checkActiveVdb
f0b0: 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a  eCnt(x).#endif..
f0c0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62  /*.** If the Vdb
f0d0: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
f0e0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f  first argument o
f0f0: 70 65 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e  pened a statemen
f100: 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a  t-transaction,.*
f110: 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20  * close it now. 
f120: 41 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73  Argument eOp mus
f130: 74 20 62 65 20 65 69 74 68 65 72 20 53 41 56 45  t be either SAVE
f140: 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f  POINT_ROLLBACK o
f150: 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52  r.** SAVEPOINT_R
f160: 45 4c 45 41 53 45 2e 20 49 66 20 69 74 20 69 73  ELEASE. If it is
f170: 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
f180: 41 43 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74  ACK, then the st
f190: 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  atement.** trans
f1a0: 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
f1b0: 20 62 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73   back. If eOp is
f1c0: 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
f1d0: 53 45 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a  SE, then the .**
f1e0: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
f1f0: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 74 74  action is commtt
f200: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
f210: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
f220: 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   an SQLITE_IOERR
f230: 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20  _XXX error code 
f240: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  is returned. .**
f250: 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54   Otherwise SQLIT
f260: 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
f270: 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61  ite3VdbeCloseSta
f280: 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  tement(Vdbe *p, 
f290: 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69  int eOp){.  sqli
f2a0: 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20  te3 *const db = 
f2b0: 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20  p->db;.  int rc 
f2c0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
f2d0: 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61 74 65 6d  /* If p->iStatem
f2e0: 65 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74  ent is greater t
f2f0: 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
f300: 68 69 73 20 56 64 62 65 20 6f 70 65 6e 65 64 20  his Vdbe opened 
f310: 61 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  a .  ** statemen
f320: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  t transaction th
f330: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f  at should be clo
f340: 73 65 64 20 68 65 72 65 2e 20 54 68 65 20 6f 6e  sed here. The on
f350: 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 2a  ly exception.  *
f360: 2a 20 69 73 20 74 68 61 74 20 61 6e 20 49 4f 20  * is that an IO 
f370: 65 72 72 6f 72 20 6d 61 79 20 68 61 76 65 20 6f  error may have o
f380: 63 63 75 72 65 64 2c 20 63 61 75 73 69 6e 67 20  ccured, causing 
f390: 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c  an emergency rol
f3a0: 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74  lback..  ** In t
f3b0: 68 69 73 20 63 61 73 65 20 28 64 62 2d 3e 6e 53  his case (db->nS
f3c0: 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e  tatement==0), an
f3d0: 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69  d there is nothi
f3e0: 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20  ng to do..  */. 
f3f0: 20 69 66 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d   if( db->nStatem
f400: 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65  ent && p->iState
f410: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  ment ){.    int 
f420: 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  i;.    const int
f430: 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d   iSavepoint = p-
f440: 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a  >iStatement-1;..
f450: 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d      assert( eOp=
f460: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
f470: 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45  ACK || eOp==SAVE
f480: 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a  POINT_RELEASE);.
f490: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
f4a0: 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a  nStatement>0 );.
f4b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
f4c0: 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e  Statement==(db->
f4d0: 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e  nStatement+db->n
f4e0: 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20  Savepoint) );.. 
f4f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
f500: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
f510: 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51      int rc2 = SQ
f520: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 42  LITE_OK;.      B
f530: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
f540: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
f550: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
f560: 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41       if( eOp==SA
f570: 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
f580: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
f590: 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  2 = sqlite3Btree
f5a0: 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53  Savepoint(pBt, S
f5b0: 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
f5c0: 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  K, iSavepoint);.
f5d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f5e0: 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54    if( rc2==SQLIT
f5f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
f600: 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42    rc2 = sqlite3B
f610: 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42  treeSavepoint(pB
f620: 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  t, SAVEPOINT_REL
f630: 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74  EASE, iSavepoint
f640: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
f650: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
f660: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f670: 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
f680: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
f690: 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6e 53      }.    db->nS
f6a0: 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20  tatement--;.    
f6b0: 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20  p->iStatement = 
f6c0: 30 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0;..    if( rc==
f6d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f6e0: 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45     if( eOp==SAVE
f6f0: 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
f700: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
f710: 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f  qlite3VtabSavepo
f720: 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e  int(db, SAVEPOIN
f730: 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76  T_ROLLBACK, iSav
f740: 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d  epoint);.      }
f750: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
f760: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f770: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f780: 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62  VtabSavepoint(db
f790: 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  , SAVEPOINT_RELE
f7a0: 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ASE, iSavepoint)
f7b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
f7c0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
f7d0: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
f7e0: 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f  tion is being ro
f7f0: 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20  lled back, also 
f800: 72 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20 20  restore the .   
f810: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e   ** database han
f820: 64 6c 65 73 20 64 65 66 65 72 72 65 64 20 63 6f  dles deferred co
f830: 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72  nstraint counter
f840: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74   to the value it
f850: 20 68 61 64 20 77 68 65 6e 20 0a 20 20 20 20 2a   had when .    *
f860: 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
f870: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
f880: 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 20 20  opened.  */.    
f890: 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  if( eOp==SAVEPOI
f8a0: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
f8b0: 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
f8c0: 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d  edCons = p->nStm
f8d0: 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a  tDefCons;.    }.
f8e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
f8f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
f900: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
f910: 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  d when a transac
f920: 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20 74  tion opened by t
f930: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
f940: 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65  handle associate
f950: 64 20 77 69 74 68 20 74 68 65 20 56 4d 20 70 61  d with the VM pa
f960: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
f970: 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20  ent is about to 
f980: 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64  be .** committed
f990: 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  . If there are o
f9a0: 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66 65 72  utstanding defer
f9b0: 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  red foreign key 
f9c0: 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69  constraint.** vi
f9d0: 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e  olations, return
f9e0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f   SQLITE_ERROR. O
f9f0: 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
fa00: 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  _OK..**.** If th
fa10: 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
fa20: 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e  ing FK violation
fa30: 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  s and this funct
fa40: 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  ion returns .** 
fa50: 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73 65  SQLITE_ERROR, se
fa60: 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  t the result of 
fa70: 74 68 65 20 56 4d 20 74 6f 20 53 51 4c 49 54 45  the VM to SQLITE
fa80: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20  _CONSTRAINT and 
fa90: 77 72 69 74 65 0a 2a 2a 20 61 6e 20 65 72 72 6f  write.** an erro
faa0: 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69 74 2e  r message to it.
fab0: 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c   Then return SQL
fac0: 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69  ITE_ERROR..*/.#i
fad0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
fae0: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69 6e  T_FOREIGN_KEY.in
faf0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  t sqlite3VdbeChe
fb00: 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20 69 6e  ckFk(Vdbe *p, in
fb10: 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20 20 73  t deferred){.  s
fb20: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
fb30: 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66 65 72  db;.  if( (defer
fb40: 72 65 64 20 26 26 20 64 62 2d 3e 6e 44 65 66 65  red && db->nDefe
fb50: 72 72 65 64 43 6f 6e 73 3e 30 29 20 7c 7c 20 28  rredCons>0) || (
fb60: 21 64 65 66 65 72 72 65 64 20 26 26 20 70 2d 3e  !deferred && p->
fb70: 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30 29  nFkConstraint>0)
fb80: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
fb90: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
fba0: 54 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41  T;.    p->errorA
fbb0: 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74  ction = OE_Abort
fbc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  ;.    sqlite3Set
fbd0: 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d  String(&p->zErrM
fbe0: 73 67 2c 20 64 62 2c 20 22 66 6f 72 65 69 67 6e  sg, db, "foreign
fbf0: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
fc00: 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 72 65  failed");.    re
fc10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
fc20: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
fc30: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
fc40: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
fc50: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
fc60: 64 20 74 68 65 20 77 68 65 6e 20 61 20 56 44 42  d the when a VDB
fc70: 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74 2e  E tries to halt.
fc80: 20 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a 2a    If the VDBE.**
fc90: 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67 65   has made change
fca0: 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74 6f  s and is in auto
fcb0: 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65  commit mode, the
fcc0: 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a  n commit those.*
fcd0: 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20 61  * changes.  If a
fce0: 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65   rollback is nee
fcf0: 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65  ded, then do the
fd00: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
fd10: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
fd20: 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f   the only way to
fd30: 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65 20   move the state 
fd40: 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20  of a VM from.** 
fd50: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e  SQLITE_MAGIC_RUN
fd60: 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43   to SQLITE_MAGIC
fd70: 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68 61  _HALT.  It is ha
fd80: 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c  rmless to.** cal
fd90: 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20 74  l this on a VM t
fda0: 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 53 51  hat is in the SQ
fdb0: 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  LITE_MAGIC_HALT 
fdc0: 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  state..**.** Ret
fdd0: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
fde0: 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69  e.  If the commi
fdf0: 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70  t could not comp
fe00: 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f 66 0a  lete because of.
fe10: 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  ** lock contenti
fe20: 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  on, return SQLIT
fe30: 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c 49  E_BUSY.  If SQLI
fe40: 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
fe50: 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73  ned, it.** means
fe60: 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20 6e   the close did n
fe70: 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e 65  ot happen and ne
fe80: 65 64 73 20 74 6f 20 62 65 20 72 65 70 65 61 74  eds to be repeat
fe90: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
fea0: 65 33 56 64 62 65 48 61 6c 74 28 56 64 62 65 20  e3VdbeHalt(Vdbe 
feb0: 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  *p){.  int rc;  
fec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fed0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
fee0: 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69 65 6e  o store transien
fef0: 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20 2a  t return codes *
ff00: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
ff10: 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54  = p->db;..  /* T
ff20: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e  his function con
ff30: 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20  tains the logic 
ff40: 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20  that determines 
ff50: 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  if a statement o
ff60: 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  r.  ** transacti
ff70: 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69  on will be commi
ff80: 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
ff90: 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20  ack as a result 
ffa0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63  of the.  ** exec
ffb0: 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69  ution of this vi
ffc0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a  rtual machine. .
ffd0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79    **.  ** If any
ffe0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
fff0: 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a  g errors occur:.
10000 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51    **.  **     SQ
10010 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20  LITE_NOMEM.  ** 
10020 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52      SQLITE_IOERR
10030 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
10040 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  _FULL.  **     S
10050 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 0a  QLITE_INTERRUPT.
10060 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74    **.  ** Then t
10070 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68  he internal cach
10080 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65  e might have bee
10090 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  n left in an inc
100a0 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73  onsistent.  ** s
100b0 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20 74  tate.  We need t
100c0 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73  o rollback the s
100d0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
100e0 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 69  tion, if there i
100f0 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74  s.  ** one, or t
10100 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e  he complete tran
10110 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65  saction if there
10120 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74   is no statement
10130 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
10140 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d  */..  if( p->db-
10150 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
10160 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
10170 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
10180 20 69 66 28 20 70 2d 3e 61 4f 6e 63 65 46 6c 61   if( p->aOnceFla
10190 67 20 29 20 6d 65 6d 73 65 74 28 70 2d 3e 61 4f  g ) memset(p->aO
101a0 6e 63 65 46 6c 61 67 2c 20 30 2c 20 70 2d 3e 6e  nceFlag, 0, p->n
101b0 4f 6e 63 65 46 6c 61 67 29 3b 0a 20 20 63 6c 6f  OnceFlag);.  clo
101c0 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b  seAllCursors(p);
101d0 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  .  if( p->magic!
101e0 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
101f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
10200 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63  LITE_OK;.  }.  c
10210 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
10220 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  t(db);..  /* No 
10230 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
10240 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68 65  ck needed if the
10250 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73   program never s
10260 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 66 28 20  tarted */.  if( 
10270 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
10280 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72  int mrc;   /* Pr
10290 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65  imary error code
102a0 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20   from p->rc */. 
102b0 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d 65 6e     int eStatemen
102c0 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  tOp = 0;.    int
102d0 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b   isSpecialError;
102e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
102f0 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 20  et to true if a 
10300 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f 72 20  'special' error 
10310 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20  */..    /* Lock 
10320 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64 20  all btrees used 
10330 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  by the statement
10340 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
10350 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20  dbeEnter(p);..  
10360 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f    /* Check for o
10370 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  ne of the specia
10380 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20  l errors */.    
10390 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78  mrc = p->rc & 0x
103a0 66 66 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ff;.    assert( 
103b0 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  p->rc!=SQLITE_IO
103c0 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 20 20  ERR_BLOCKED );  
103d0 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20 6e 6f  /* This error no
103e0 20 6c 6f 6e 67 65 72 20 65 78 69 73 74 73 20 2a   longer exists *
103f0 2f 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c 45  /.    isSpecialE
10400 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49  rror = mrc==SQLI
10410 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d  TE_NOMEM || mrc=
10420 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
10430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10440 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54     || mrc==SQLIT
10450 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d  E_INTERRUPT || m
10460 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  rc==SQLITE_FULL;
10470 0a 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69  .    if( isSpeci
10480 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20  alError ){.     
10490 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79   /* If the query
104a0 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61   was read-only a
104b0 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  nd the error cod
104c0 65 20 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45  e is SQLITE_INTE
104d0 52 52 55 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a  RRUPT, .      **
104e0 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20   no rollback is 
104f0 6e 65 63 65 73 73 61 72 79 2e 20 4f 74 68 65 72  necessary. Other
10500 77 69 73 65 2c 20 61 74 20 6c 65 61 73 74 20 61  wise, at least a
10510 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20   savepoint .    
10520 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
10530 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20   must be rolled 
10540 62 61 63 6b 20 74 6f 20 72 65 73 74 6f 72 65 20  back to restore 
10550 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
10560 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73  a .      ** cons
10570 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20  istent state..  
10580 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
10590 45 76 65 6e 20 69 66 20 74 68 65 20 73 74 61 74  Even if the stat
105a0 65 6d 65 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e  ement is read-on
105b0 6c 79 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74  ly, it is import
105c0 61 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20  ant to perform. 
105d0 20 20 20 20 20 2a 2a 20 61 20 73 74 61 74 65 6d       ** a statem
105e0 65 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69  ent or transacti
105f0 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72  on rollback oper
10600 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72  ation. If the er
10610 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63  ror .      ** oc
10620 63 75 72 65 64 20 77 68 69 6c 65 20 77 72 69 74  cured while writ
10630 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ing to the journ
10640 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  al, sub-journal 
10650 6f 72 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  or database.    
10660 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 70 61 72    ** file as par
10670 74 20 6f 66 20 61 6e 20 65 66 66 6f 72 74 20 74  t of an effort t
10680 6f 20 66 72 65 65 20 75 70 20 63 61 63 68 65 20  o free up cache 
10690 73 70 61 63 65 20 28 73 65 65 20 66 75 6e 63 74  space (see funct
106a0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  ion.      ** pag
106b0 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 70 61  erStress() in pa
106c0 67 65 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c  ger.c), the roll
106d0 62 61 63 6b 20 69 73 20 72 65 71 75 69 72 65 64  back is required
106e0 20 74 6f 20 72 65 73 74 6f 72 65 20 0a 20 20 20   to restore .   
106f0 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20     ** the pager 
10700 74 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20  to a consistent 
10710 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  state..      */.
10720 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65        if( !p->re
10730 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53  adOnly || mrc!=S
10740 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
10750 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
10760 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  mrc==SQLITE_NOME
10770 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  M || mrc==SQLITE
10780 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65  _FULL) && p->use
10790 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a  sStmtJournal ){.
107a0 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65            eState
107b0 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49  mentOp = SAVEPOI
107c0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  NT_ROLLBACK;.   
107d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
107e0 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20        /* We are 
107f0 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62  forced to roll b
10800 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74  ack the active t
10810 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f  ransaction. Befo
10820 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20  re doing.       
10830 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20     ** so, abort 
10840 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d  any other statem
10850 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65  ents this handle
10860 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61   currently has a
10870 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20  ctive..         
10880 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
10890 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
108a0 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52  (db, SQLITE_ABOR
108b0 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20  T_ROLLBACK);.   
108c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c         sqlite3Cl
108d0 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
108e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  );.          db-
108f0 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
10900 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10910 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
10920 20 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64   Check for immed
10930 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  iate foreign key
10940 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a   violations. */.
10950 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
10960 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10970 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65    sqlite3VdbeChe
10980 63 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20  ckFk(p, 0);.    
10990 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
109a0 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66  he auto-commit f
109b0 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74  lag is set and t
109c0 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  his is the only 
109d0 61 63 74 69 76 65 20 77 72 69 74 65 72 20 0a 20  active writer . 
109e0 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77     ** VM, then w
109f0 65 20 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f  e do either a co
10a00 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  mmit or rollback
10a10 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
10a20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20  transaction. .  
10a30 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65    **.    ** Note
10a40 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73  : This block als
10a50 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66  o runs if one of
10a60 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72   the special err
10a70 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20  ors handled .   
10a80 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63   ** above has oc
10a90 63 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a  curred. .    */.
10aa0 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
10ab0 56 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a  VtabInSync(db) .
10ac0 20 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f       && db->auto
10ad0 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20  Commit .     && 
10ae0 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74  db->writeVdbeCnt
10af0 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d  ==(p->readOnly==
10b00 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  0) .    ){.     
10b10 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
10b20 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72  TE_OK || (p->err
10b30 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69  orAction==OE_Fai
10b40 6c 20 26 26 20 21 69 73 53 70 65 63 69 61 6c 45  l && !isSpecialE
10b50 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 20  rror) ){.       
10b60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
10b70 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 3b 0a  eCheckFk(p, 1);.
10b80 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
10b90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10ba0 20 20 20 20 20 20 20 69 66 28 20 4e 45 56 45 52         if( NEVER
10bb0 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b  (p->readOnly) ){
10bc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
10bd0 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29  ite3VdbeLeave(p)
10be0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
10bf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
10c00 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  R;.          }. 
10c10 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
10c20 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b  LITE_CONSTRAINT;
10c30 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20  .        }else{ 
10c40 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
10c50 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
10c60 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 20  ag is true, the 
10c70 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73  vdbe program was
10c80 20 73 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20   successful .   
10c90 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74         ** or hit
10ca0 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f   an 'OR FAIL' co
10cb0 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65  nstraint and the
10cc0 72 65 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72  re are no deferr
10cd0 65 64 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20  ed foreign.     
10ce0 20 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73       ** key cons
10cf0 74 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20  traints to hold 
10d00 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  up the transacti
10d10 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61  on. This means a
10d20 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20   commit .       
10d30 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65     ** is require
10d40 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  d. */.          
10d50 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28  rc = vdbeCommit(
10d60 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  db, p);.        
10d70 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
10d80 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
10d90 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a   p->readOnly ){.
10da0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10db0 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
10dc0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
10dd0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
10de0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
10df0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
10e00 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
10e10 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  = rc;.          
10e20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
10e30 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  ll(db, SQLITE_OK
10e40 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
10e50 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  {.          db->
10e60 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20  nDeferredCons = 
10e70 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  0;.          sql
10e80 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e  ite3CommitIntern
10e90 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20  alChanges(db);. 
10ea0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
10eb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
10ec0 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
10ed0 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
10ee0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
10ef0 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20  b->nStatement = 
10f00 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
10f10 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30   eStatementOp==0
10f20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
10f30 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
10f40 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  | p->errorAction
10f50 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20  ==OE_Fail ){.   
10f60 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f       eStatementO
10f70 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  p = SAVEPOINT_RE
10f80 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c  LEASE;.      }el
10f90 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41  se if( p->errorA
10fa0 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20  ction==OE_Abort 
10fb0 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74  ){.        eStat
10fc0 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f  ementOp = SAVEPO
10fd0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  INT_ROLLBACK;.  
10fe0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10ff0 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
11000 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
11010 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29  _ABORT_ROLLBACK)
11020 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
11030 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
11040 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62  (db);.        db
11050 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
11060 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11070 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74    .    /* If eSt
11080 61 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e  atementOp is non
11090 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74  -zero, then a st
110a0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
110b0 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20  ion needs to.   
110c0 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64   ** be committed
110d0 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   or rolled back.
110e0 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62   Call sqlite3Vdb
110f0 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
11100 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73  ) to.    ** do s
11110 6f 2e 20 49 66 20 74 68 69 73 20 6f 70 65 72 61  o. If this opera
11120 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20  tion returns an 
11130 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63  error, and the c
11140 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  urrent statement
11150 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f  .    ** error co
11160 64 65 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20  de is SQLITE_OK 
11170 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  or SQLITE_CONSTR
11180 41 49 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f  AINT, then promo
11190 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75  te the.    ** cu
111a0 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20  rrent statement 
111b0 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20  error code..    
111c0 2a 2f 0a 20 20 20 20 69 66 28 20 65 53 74 61 74  */.    if( eStat
111d0 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20  ementOp ){.     
111e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
111f0 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
11200 70 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29  p, eStatementOp)
11210 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
11220 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
11230 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
11240 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
11250 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20 20  CONSTRAINT ){.  
11260 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
11270 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  rc;.          sq
11280 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
11290 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
112a0 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73         p->zErrMs
112b0 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  g = 0;.        }
112c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
112d0 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
112e0 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
112f0 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  LBACK);.        
11300 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
11310 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  points(db);.    
11320 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
11330 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  it = 1;.      }.
11340 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
11350 49 66 20 74 68 69 73 20 77 61 73 20 61 6e 20 49  If this was an I
11360 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72  NSERT, UPDATE or
11370 20 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73   DELETE and no s
11380 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
11390 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20  tion.    ** has 
113a0 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
113b0 2c 20 75 70 64 61 74 65 20 74 68 65 20 64 61 74  , update the dat
113c0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
113d0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e   change-counter.
113e0 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
113f0 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20   p->changeCntOn 
11400 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 53 74  ){.      if( eSt
11410 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50  atementOp!=SAVEP
11420 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
11430 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11440 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64  VdbeSetChanges(d
11450 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a  b, p->nChange);.
11460 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11470 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11480 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30  SetChanges(db, 0
11490 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
114a0 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
114b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
114c0 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 73  elease the locks
114d0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
114e0 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  dbeLeave(p);.  }
114f0 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73  ..  /* We have s
11500 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74  uccessfully halt
11510 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68  ed and closed th
11520 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68  e VM.  Record th
11530 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66  is fact. */.  if
11540 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  ( p->pc>=0 ){.  
11550 20 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65    db->activeVdbe
11560 43 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20 21  Cnt--;.    if( !
11570 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  p->readOnly ){. 
11580 20 20 20 20 20 64 62 2d 3e 77 72 69 74 65 56 64       db->writeVd
11590 62 65 43 6e 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20  beCnt--;.    }. 
115a0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61     assert( db->a
115b0 63 74 69 76 65 56 64 62 65 43 6e 74 3e 3d 64 62  ctiveVdbeCnt>=db
115c0 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 20 29  ->writeVdbeCnt )
115d0 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63  ;.  }.  p->magic
115e0 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41   = VDBE_MAGIC_HA
115f0 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76  LT;.  checkActiv
11600 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20  eVdbeCnt(db);.  
11610 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
11620 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70  cFailed ){.    p
11630 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
11640 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  MEM;.  }..  /* I
11650 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  f the auto-commi
11660 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f  t flag is set to
11670 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20   true, then any 
11680 6c 6f 63 6b 73 20 74 68 61 74 20 77 65 72 65 20  locks that were 
11690 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e  held.  ** by con
116a0 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 76 65 20  nection db have 
116b0 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65 61 73 65  now been release
116c0 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43  d. Call sqlite3C
116d0 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65  onnectionUnlocke
116e0 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76  d() .  ** to inv
116f0 6f 6b 65 20 61 6e 79 20 72 65 71 75 69 72 65 64  oke any required
11700 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63   unlock-notify c
11710 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20  allbacks..  */. 
11720 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d   if( db->autoCom
11730 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
11740 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f  e3ConnectionUnlo
11750 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20  cked(db);.  }.. 
11760 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 63 74   assert( db->act
11770 69 76 65 56 64 62 65 43 6e 74 3e 30 20 7c 7c 20  iveVdbeCnt>0 || 
11780 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d  db->autoCommit==
11790 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d  0 || db->nStatem
117a0 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ent==0 );.  retu
117b0 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rn (p->rc==SQLIT
117c0 45 5f 42 55 53 59 20 3f 20 53 51 4c 49 54 45 5f  E_BUSY ? SQLITE_
117d0 42 55 53 59 20 3a 20 53 51 4c 49 54 45 5f 4f 4b  BUSY : SQLITE_OK
117e0 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  );.}.../*.** Eac
117f0 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65  h VDBE holds the
11800 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d   result of the m
11810 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74  ost recent sqlit
11820 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a  e3_step() call.*
11830 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69  * in p->rc.  Thi
11840 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
11850 68 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20  hat result back 
11860 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  to SQLITE_OK..*/
11870 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
11880 65 52 65 73 65 74 53 74 65 70 52 65 73 75 6c 74  eResetStepResult
11890 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e  (Vdbe *p){.  p->
118a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
118b0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68  }../*.** Copy th
118c0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  e error code and
118d0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 62   error message b
118e0 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20  elonging to the 
118f0 56 44 42 45 20 70 61 73 73 65 64 0a 2a 2a 20 61  VDBE passed.** a
11900 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
11910 6d 65 6e 74 20 74 6f 20 69 74 73 20 64 61 74 61  ment to its data
11920 62 61 73 65 20 68 61 6e 64 6c 65 20 28 73 6f 20  base handle (so 
11930 74 68 61 74 20 74 68 65 79 20 77 69 6c 6c 20 62  that they will b
11940 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 62  e .** returned b
11950 79 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  y calls to sqlit
11960 65 33 5f 65 72 72 63 6f 64 65 28 29 20 61 6e 64  e3_errcode() and
11970 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
11980 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ))..**.** This f
11990 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
119a0 20 63 6c 65 61 72 20 74 68 65 20 56 44 42 45 20   clear the VDBE 
119b0 65 72 72 6f 72 20 63 6f 64 65 20 6f 72 20 6d 65  error code or me
119c0 73 73 61 67 65 2c 20 6a 75 73 74 0a 2a 2a 20 63  ssage, just.** c
119d0 6f 70 69 65 73 20 74 68 65 6d 20 74 6f 20 74 68  opies them to th
119e0 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
119f0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
11a00 33 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72  3VdbeTransferErr
11a10 6f 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  or(Vdbe *p){.  s
11a20 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
11a30 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  db;.  int rc = p
11a40 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a  ->rc;.  if( p->z
11a50 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 75 38  ErrMsg ){.    u8
11a60 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20   mallocFailed = 
11a70 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
11a80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
11a90 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
11aa0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  ;.    sqlite3Val
11ab0 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72  ueSetStr(db->pEr
11ac0 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73  r, -1, p->zErrMs
11ad0 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  g, SQLITE_UTF8, 
11ae0 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
11af0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e  );.    sqlite3En
11b00 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
11b10 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
11b20 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 46 61  ailed = mallocFa
11b30 69 6c 65 64 3b 0a 20 20 20 20 64 62 2d 3e 65 72  iled;.    db->er
11b40 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 65  rCode = rc;.  }e
11b50 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
11b60 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29  Error(db, rc, 0)
11b70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
11b80 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
11b90 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f  ITE_ENABLE_SQLLO
11ba0 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 53 51  G./*.** If an SQ
11bb0 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c  LITE_CONFIG_SQLL
11bc0 4f 47 20 68 6f 6f 6b 20 69 73 20 72 65 67 69 73  OG hook is regis
11bd0 74 65 72 65 64 20 61 6e 64 20 74 68 65 20 56 4d  tered and the VM
11be0 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2c 20 0a   has been run, .
11bf0 2a 2a 20 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f  ** invoke it..*/
11c00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
11c10 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 56 64  eInvokeSqllog(Vd
11c20 62 65 20 2a 76 29 7b 0a 20 20 69 66 28 20 73 71  be *v){.  if( sq
11c30 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
11c40 67 2e 78 53 71 6c 6c 6f 67 20 26 26 20 76 2d 3e  g.xSqllog && v->
11c50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
11c60 20 76 2d 3e 7a 53 71 6c 20 26 26 20 76 2d 3e 70   v->zSql && v->p
11c70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  c>=0 ){.    char
11c80 20 2a 7a 45 78 70 61 6e 64 65 64 20 3d 20 73 71   *zExpanded = sq
11c90 6c 69 74 65 33 56 64 62 65 45 78 70 61 6e 64 53  lite3VdbeExpandS
11ca0 71 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a  ql(v, v->zSql);.
11cb0 20 20 20 20 61 73 73 65 72 74 28 20 76 2d 3e 64      assert( v->d
11cc0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20  b->init.busy==0 
11cd0 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 78 70 61  );.    if( zExpa
11ce0 6e 64 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71  nded ){.      sq
11cf0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
11d00 67 2e 78 53 71 6c 6c 6f 67 28 0a 20 20 20 20 20  g.xSqllog(.     
11d10 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
11d20 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67  alConfig.pSqllog
11d30 41 72 67 2c 20 76 2d 3e 64 62 2c 20 7a 45 78 70  Arg, v->db, zExp
11d40 61 6e 64 65 64 2c 20 31 0a 20 20 20 20 20 20 29  anded, 1.      )
11d50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
11d60 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 7a 45 78  bFree(v->db, zEx
11d70 70 61 6e 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20  panded);.    }. 
11d80 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
11d90 69 6e 65 20 76 64 62 65 49 6e 76 6f 6b 65 53 71  ine vdbeInvokeSq
11da0 6c 6c 6f 67 28 78 29 0a 23 65 6e 64 69 66 0a 0a  llog(x).#endif..
11db0 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61  /*.** Clean up a
11dc0 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63   VDBE after exec
11dd0 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74  ution but do not
11de0 20 64 65 6c 65 74 65 20 74 68 65 20 56 44 42 45   delete the VDBE
11df0 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72   just yet..** Wr
11e00 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ite any error me
11e10 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45  ssages into *pzE
11e20 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74  rrMsg.  Return t
11e30 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a  he result code..
11e40 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73  **.** After this
11e50 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c   routine is run,
11e60 20 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64   the VDBE should
11e70 20 62 65 20 72 65 61 64 79 20 74 6f 20 62 65 20   be ready to be 
11e80 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69  executed.** agai
11e90 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b  n..**.** To look
11ea0 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77   at it another w
11eb0 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ay, this routine
11ec0 20 72 65 73 65 74 73 20 74 68 65 20 73 74 61 74   resets the stat
11ed0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74  e of the.** virt
11ee0 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d  ual machine from
11ef0 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20   VDBE_MAGIC_RUN 
11f00 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41  or VDBE_MAGIC_HA
11f10 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44  LT back to.** VD
11f20 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a  BE_MAGIC_INIT..*
11f30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
11f40 65 52 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b  eReset(Vdbe *p){
11f50 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
11f60 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20    db = p->db;.. 
11f70 20 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69   /* If the VM di
11f80 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d  d not run to com
11f90 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74  pletion or if it
11fa0 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a   encountered an.
11fb0 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e    ** error, then
11fc0 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61   it might not ha
11fd0 76 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70  ve been halted p
11fe0 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c  roperly.  So hal
11ff0 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20  t.  ** it now.. 
12000 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
12010 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20  eHalt(p);..  /* 
12020 49 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  If the VDBE has 
12030 62 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74  be run even part
12040 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e  ially, then tran
12050 73 66 65 72 20 74 68 65 20 65 72 72 6f 72 20 63  sfer the error c
12060 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72  ode.  ** and err
12070 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20  or message from 
12080 74 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68  the VDBE into th
12090 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
120a0 73 74 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a  structure.  But.
120b0 20 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45    ** if the VDBE
120c0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73   has just been s
120d0 65 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61  et to run but ha
120e0 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65  s not actually e
120f0 78 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a  xecuted any.  **
12100 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65   instructions ye
12110 74 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69  t, leave the mai
12120 6e 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72  n database error
12130 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63   information unc
12140 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  hanged..  */.  i
12150 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  f( p->pc>=0 ){. 
12160 20 20 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c     vdbeInvokeSql
12170 6c 6f 67 28 70 29 3b 0a 20 20 20 20 73 71 6c 69  log(p);.    sqli
12180 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72 45  te3VdbeTransferE
12190 72 72 6f 72 28 70 29 3b 0a 20 20 20 20 73 71 6c  rror(p);.    sql
121a0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
121b0 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
121c0 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
121d0 20 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e      if( p->runOn
121e0 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 69  lyOnce ) p->expi
121f0 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  red = 1;.  }else
12200 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d   if( p->rc && p-
12210 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20  >expired ){.    
12220 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 66  /* The expired f
12230 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74  lag was set on t
12240 68 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 74  he VDBE before t
12250 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20  he first call.  
12260 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f    ** to sqlite3_
12270 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73  step(). For cons
12280 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73  istency (since s
12290 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 61  qlite3_step() wa
122a0 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29  s.    ** called)
122b0 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61  , set the databa
122c0 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73  se error in this
122d0 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20   case as well.. 
122e0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
122f0 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63  3Error(db, p->rc
12300 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
12310 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d  3ValueSetStr(db-
12320 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45  >pErr, -1, p->zE
12330 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54  rrMsg, SQLITE_UT
12340 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  F8, SQLITE_TRANS
12350 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
12360 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
12370 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d  zErrMsg);.    p-
12380 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
12390 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20  }..  /* Reclaim 
123a0 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  all memory used 
123b0 62 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f  by the VDBE.  */
123c0 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a  .  Cleanup(p);..
123d0 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c    /* Save profil
123e0 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
123f0 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72  from this VDBE r
12400 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  un..  */.#ifdef 
12410 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b  VDBE_PROFILE.  {
12420 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d  .    FILE *out =
12430 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f   fopen("vdbe_pro
12440 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b  file.out", "a");
12450 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a  .    if( out ){.
12460 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
12470 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
12480 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20  "---- ");.      
12490 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
124a0 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
124b0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
124c0 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e  02x", p->aOp[i].
124d0 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d  opcode);.      }
124e0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
124f0 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ut, "\n");.     
12500 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
12510 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
12520 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
12530 25 36 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64  %6d %10lld %8lld
12540 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70   ",.           p
12550 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20  ->aOp[i].cnt,.  
12560 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b           p->aOp[
12570 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20  i].cycles,.     
12580 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
12590 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69  cnt>0 ? p->aOp[i
125a0 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b  ].cycles/p->aOp[
125b0 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20  i].cnt : 0.     
125c0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71     );.        sq
125d0 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
125e0 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70  (out, i, &p->aOp
125f0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
12600 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b      fclose(out);
12610 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
12620 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  f.  p->magic = V
12630 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a  DBE_MAGIC_INIT;.
12640 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26    return p->rc &
12650 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a   db->errMask;.}.
12660 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70   ./*.** Clean up
12670 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44   and delete a VD
12680 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69  BE after executi
12690 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69  on.  Return an i
126a0 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a  nteger which is.
126b0 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  ** the result co
126c0 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65  de.  Write any e
126d0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78  rror message tex
126e0 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67  t into *pzErrMsg
126f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12700 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62  VdbeFinalize(Vdb
12710 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20  e *p){.  int rc 
12720 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
12730 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  f( p->magic==VDB
12740 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70  E_MAGIC_RUN || p
12750 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
12760 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20  GIC_HALT ){.    
12770 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
12780 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73  Reset(p);.    as
12790 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64  sert( (rc & p->d
127a0 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20  b->errMask)==rc 
127b0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
127c0 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20  VdbeDelete(p);. 
127d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
127e0 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 64 65  *.** Call the de
127f0 73 74 72 75 63 74 6f 72 20 66 6f 72 20 65 61 63  structor for eac
12800 68 20 61 75 78 64 61 74 61 20 65 6e 74 72 79 20  h auxdata entry 
12810 69 6e 20 70 56 64 62 65 46 75 6e 63 20 66 6f 72  in pVdbeFunc for
12820 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 63 6f   which.** the co
12830 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
12840 69 6e 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72  in mask is clear
12850 2e 20 20 41 75 78 64 61 74 61 20 65 6e 74 72 69  .  Auxdata entri
12860 65 73 20 62 65 79 6f 6e 64 20 33 31 0a 2a 2a 20  es beyond 31.** 
12870 61 72 65 20 61 6c 77 61 79 73 20 64 65 73 74 72  are always destr
12880 6f 79 65 64 2e 20 20 54 6f 20 64 65 73 74 72 6f  oyed.  To destro
12890 79 20 61 6c 6c 20 61 75 78 64 61 74 61 20 65 6e  y all auxdata en
128a0 74 72 69 65 73 2c 20 63 61 6c 6c 20 74 68 69 73  tries, call this
128b0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 74 68  .** routine with
128c0 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69   mask==0..*/.voi
128d0 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
128e0 65 74 65 41 75 78 44 61 74 61 28 56 64 62 65 46  eteAuxData(VdbeF
128f0 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 2c 20  unc *pVdbeFunc, 
12900 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 69 6e 74  int mask){.  int
12910 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
12920 3c 70 56 64 62 65 46 75 6e 63 2d 3e 6e 41 75 78  <pVdbeFunc->nAux
12930 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
12940 63 74 20 41 75 78 44 61 74 61 20 2a 70 41 75 78  ct AuxData *pAux
12950 20 3d 20 26 70 56 64 62 65 46 75 6e 63 2d 3e 61   = &pVdbeFunc->a
12960 70 41 75 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28  pAux[i];.    if(
12970 20 28 69 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b   (i>31 || !(mask
12980 26 28 28 28 75 33 32 29 31 29 3c 3c 69 29 29 29  &(((u32)1)<<i)))
12990 20 26 26 20 70 41 75 78 2d 3e 70 41 75 78 20 29   && pAux->pAux )
129a0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 75 78  {.      if( pAux
129b0 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ->xDelete ){.   
129c0 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65       pAux->xDele
129d0 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a  te(pAux->pAux);.
129e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41        }.      pA
129f0 75 78 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20  ux->pAux = 0;.  
12a00 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
12a10 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   Free all memory
12a20 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
12a30 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64   the Vdbe passed
12a40 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
12a50 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78 63 65  rgument,.** exce
12a60 70 74 20 66 6f 72 20 6f 62 6a 65 63 74 20 69 74  pt for object it
12a70 73 65 6c 66 2c 20 77 68 69 63 68 20 69 73 20 70  self, which is p
12a80 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20  reserved..**.** 
12a90 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
12aa0 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63  etween this func
12ab0 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74 65 33  tion and sqlite3
12ac0 56 64 62 65 44 65 6c 65 74 65 28 29 20 69 73 20  VdbeDelete() is 
12ad0 74 68 61 74 0a 2a 2a 20 56 64 62 65 44 65 6c 65  that.** VdbeDele
12ae0 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b  te() also unlink
12af0 73 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20  s the Vdbe from 
12b00 74 68 65 20 6c 69 73 74 20 6f 66 20 56 4d 73 20  the list of VMs 
12b10 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
12b20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
12b30 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20 66  connection and f
12b40 72 65 65 73 20 74 68 65 20 6f 62 6a 65 63 74 20  rees the object 
12b50 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20  itself..*/.void 
12b60 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72  sqlite3VdbeClear
12b70 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a  Object(sqlite3 *
12b80 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20  db, Vdbe *p){.  
12b90 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53 75 62  SubProgram *pSub
12ba0 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 6e 74 20  , *pNext;.  int 
12bb0 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  i;.  assert( p->
12bc0 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d  db==0 || p->db==
12bd0 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d  db );.  releaseM
12be0 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c  emArray(p->aVar,
12bf0 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 72 65 6c   p->nVar);.  rel
12c00 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
12c10 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65  aColName, p->nRe
12c20 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f  sColumn*COLNAME_
12c30 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d 70  N);.  for(pSub=p
12c40 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53 75 62  ->pProgram; pSub
12c50 3b 20 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a 20  ; pSub=pNext){. 
12c60 20 20 20 70 4e 65 78 74 20 3d 20 70 53 75 62 2d     pNext = pSub-
12c70 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76 64 62 65  >pNext;.    vdbe
12c80 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20  FreeOpArray(db, 
12c90 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62 2d  pSub->aOp, pSub-
12ca0 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  >nOp);.    sqlit
12cb0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75  e3DbFree(db, pSu
12cc0 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  b);.  }.  for(i=
12cd0 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20 69 3e 3d 30  p->nzVar-1; i>=0
12ce0 3b 20 69 2d 2d 29 20 73 71 6c 69 74 65 33 44 62  ; i--) sqlite3Db
12cf0 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a 56 61  Free(db, p->azVa
12d00 72 5b 69 5d 29 3b 0a 20 20 76 64 62 65 46 72 65  r[i]);.  vdbeFre
12d10 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e  eOpArray(db, p->
12d20 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20  aOp, p->nOp);.  
12d30 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
12d40 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20  , p->aLabel);.  
12d50 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
12d60 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  , p->aColName);.
12d70 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
12d80 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20  db, p->zSql);.  
12d90 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
12da0 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 23 69 66  , p->pFree);.#if
12db0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
12dc0 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c  ENABLE_TREE_EXPL
12dd0 41 49 4e 29 0a 20 20 73 71 6c 69 74 65 33 5f 66  AIN).  sqlite3_f
12de0 72 65 65 28 70 2d 3e 7a 45 78 70 6c 61 69 6e 29  ree(p->zExplain)
12df0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
12e00 65 28 64 62 2c 20 70 2d 3e 70 45 78 70 6c 61 69  e(db, p->pExplai
12e10 6e 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  n);.#endif.}../*
12e20 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
12e30 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f  tire VDBE..*/.vo
12e40 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  id sqlite3VdbeDe
12e50 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  lete(Vdbe *p){. 
12e60 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20   sqlite3 *db;.. 
12e70 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29   if( NEVER(p==0)
12e80 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20   ) return;.  db 
12e90 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  = p->db;.  asser
12ea0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12eb0 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
12ec0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
12ed0 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 64 62 2c  eClearObject(db,
12ee0 20 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50   p);.  if( p->pP
12ef0 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50  rev ){.    p->pP
12f00 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e  rev->pNext = p->
12f10 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNext;.  }else{.
12f20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
12f30 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20  pVdbe==p );.    
12f40 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70  db->pVdbe = p->p
12f50 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Next;.  }.  if( 
12f60 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
12f70 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
12f80 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a  = p->pPrev;.  }.
12f90 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
12fa0 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20  E_MAGIC_DEAD;.  
12fb0 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c  p->db = 0;.  sql
12fc0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
12fd0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  );.}../*.** Make
12fe0 20 73 75 72 65 20 74 68 65 20 63 75 72 73 6f 72   sure the cursor
12ff0 20 70 20 69 73 20 72 65 61 64 79 20 74 6f 20 72   p is ready to r
13000 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65  ead or write the
13010 20 72 6f 77 20 74 6f 20 77 68 69 63 68 20 69 74   row to which it
13020 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6f 73  .** was last pos
13030 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e  itioned.  Return
13040 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
13050 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f  f an OOM fault o
13060 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70  r I/O error.** p
13070 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20  revents us from 
13080 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68 65 20  positioning the 
13090 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20 63 6f  cursor to its co
130a0 72 72 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a  rrect position..
130b0 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54  **.** If a MoveT
130c0 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70  o operation is p
130d0 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69  ending on the gi
130e0 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  ven cursor, then
130f0 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65   do that.** Move
13100 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d  To now.  If no m
13110 6f 76 65 20 69 73 20 70 65 6e 64 69 6e 67 2c 20  ove is pending, 
13120 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
13130 74 68 65 20 72 6f 77 20 68 61 73 20 62 65 65 6e  the row has been
13140 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75 74 20  .** deleted out 
13150 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63  from under the c
13160 75 72 73 6f 72 20 61 6e 64 20 69 66 20 69 74 20  ursor and if it 
13170 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f  has, mark the ro
13180 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72  w as.** a NULL r
13190 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ow..**.** If the
131a0 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
131b0 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
131c0 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77 20 61  he correct row a
131d0 6e 64 20 74 68 61 74 20 72 6f 77 20 68 61 73 0a  nd that row has.
131e0 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65  ** not been dele
131f0 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
13200 65 72 20 74 68 65 20 63 75 72 73 6f 72 2c 20 74  er the cursor, t
13210 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
13220 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
13230 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
13240 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65  ursorMoveto(Vdbe
13250 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66  Cursor *p){.  if
13260 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76  ( p->deferredMov
13270 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  eto ){.    int r
13280 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66 20 53  es, rc;.#ifdef S
13290 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 65  QLITE_TEST.    e
132a0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
132b0 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a  3_search_count;.
132c0 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72  #endif.    asser
132d0 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b  t( p->isTable );
132e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
132f0 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
13300 63 6b 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c  cked(p->pCursor,
13310 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72   0, p->movetoTar
13320 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20  get, 0, &res);. 
13330 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
13340 72 6e 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6c 61  rn rc;.    p->la
13350 73 74 52 6f 77 69 64 20 3d 20 70 2d 3e 6d 6f 76  stRowid = p->mov
13360 65 74 6f 54 61 72 67 65 74 3b 0a 20 20 20 20 69  etoTarget;.    i
13370 66 28 20 72 65 73 21 3d 30 20 29 20 72 65 74 75  f( res!=0 ) retu
13380 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
13390 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70 2d 3e 72  T_BKPT;.    p->r
133a0 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 31 3b  owidIsValid = 1;
133b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
133c0 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  EST.    sqlite3_
133d0 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a  search_count++;.
133e0 23 65 6e 64 69 66 0a 20 20 20 20 70 2d 3e 64 65  #endif.    p->de
133f0 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30  ferredMoveto = 0
13400 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74  ;.    p->cacheSt
13410 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
13420 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  LE;.  }else if( 
13430 41 4c 57 41 59 53 28 70 2d 3e 70 43 75 72 73 6f  ALWAYS(p->pCurso
13440 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 68 61  r) ){.    int ha
13450 73 4d 6f 76 65 64 3b 0a 20 20 20 20 69 6e 74 20  sMoved;.    int 
13460 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
13470 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
13480 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 68 61 73  p->pCursor, &has
13490 4d 6f 76 65 64 29 3b 0a 20 20 20 20 69 66 28 20  Moved);.    if( 
134a0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
134b0 20 20 20 20 69 66 28 20 68 61 73 4d 6f 76 65 64      if( hasMoved
134c0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63 61 63   ){.      p->cac
134d0 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
134e0 5f 53 54 41 4c 45 3b 0a 20 20 20 20 20 20 70 2d  _STALE;.      p-
134f0 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20  >nullRow = 1;.  
13500 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
13510 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
13520 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
13530 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a  ng functions:.**
13540 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
13550 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73  erialType().** s
13560 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
13570 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c  TypeLen().** sql
13580 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65  ite3VdbeSerialLe
13590 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
135a0 62 65 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a  beSerialPut().**
135b0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
135c0 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e  alGet().**.** en
135d0 63 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f  capsulate the co
135e0 64 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a  de that serializ
135f0 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74  es values for st
13600 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a  orage in SQLite.
13610 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65  ** data and inde
13620 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20  x records. Each 
13630 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65  serialized value
13640 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a   consists of a.*
13650 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20  * 'serial-type' 
13660 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61  and a blob of da
13670 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74  ta. The serial t
13680 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65  ype is an 8-byte
13690 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74   unsigned.** int
136a0 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20  eger, stored as 
136b0 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  a varint..**.** 
136c0 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64  In an SQLite ind
136d0 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73  ex record, the s
136e0 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74  erial type is st
136f0 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65  ored directly be
13700 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62  fore.** the blob
13710 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74   of data that it
13720 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e   corresponds to.
13730 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f   In a table reco
13740 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a  rd, all serial.*
13750 2a 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72  * types are stor
13760 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
13770 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61  of the record, a
13780 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20  nd the blobs of 
13790 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65  data at.** the e
137a0 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20  nd. Hence these 
137b0 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20  functions allow 
137c0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61  the caller to ha
137d0 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69  ndle the.** seri
137e0 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61  al-type and data
137f0 20 62 6c 6f 62 20 73 65 70 65 72 61 74 65 6c 79   blob seperately
13800 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
13810 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63  owing table desc
13820 72 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75  ribes the variou
13830 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65  s storage classe
13840 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a  s for data:.**.*
13850 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20  *   serial type 
13860 20 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20         bytes of 
13870 64 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a  data      type.*
13880 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
13890 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
138a0 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d  ------    ------
138b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20  ---------.**    
138c0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
138d0 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
138e0 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20       NULL.**    
138f0 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
13900 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
13910 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
13920 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20  ger.**      2   
13930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13940 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73    2            s
13950 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
13960 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20        3         
13970 20 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20              3   
13980 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
13990 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
139a0 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4               
139b0 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
139c0 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
139d0 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20  r.**      5     
139e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139f0 36 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  6            sig
13a00 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
13a10 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
13a20 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
13a30 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
13a40 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20  teger.**      7 
13a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a60 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
13a70 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20   IEEE float.**  
13a80 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
13a90 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
13aa0 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63         Integer c
13ab0 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20  onstant 0.**    
13ac0 20 20 39 20 20 20 20 20 20 20 20 20 20 20 20 20    9             
13ad0 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
13ae0 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e       Integer con
13af0 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31  stant 1.**     1
13b00 30 2c 31 31 20 20 20 20 20 20 20 20 20 20 20 20  0,11            
13b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b20 20 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20     reserved for 
13b30 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20  expansion.**    
13b40 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20  N>=12 and even  
13b50 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20       (N-12)/2   
13b60 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20       BLOB.**    
13b70 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20  N>=13 and odd   
13b80 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20       (N-13)/2   
13b90 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20       text.**.** 
13ba0 54 68 65 20 38 20 61 6e 64 20 39 20 74 79 70 65  The 8 and 9 type
13bb0 73 20 77 65 72 65 20 61 64 64 65 64 20 69 6e 20  s were added in 
13bc0 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d  3.3.0, file form
13bd0 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72  at 4.  Prior ver
13be0 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69  sions.** of SQLi
13bf0 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65  te will not unde
13c00 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72  rstand those ser
13c10 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f  ial types..*/../
13c20 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
13c30 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20  serial-type for 
13c40 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
13c50 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32   in pMem..*/.u32
13c60 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
13c70 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d  alType(Mem *pMem
13c80 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61  , int file_forma
13c90 74 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20  t){.  int flags 
13ca0 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20  = pMem->flags;. 
13cb0 20 69 6e 74 20 6e 3b 0a 0a 20 20 69 66 28 20 66   int n;..  if( f
13cc0 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  lags&MEM_Null ){
13cd0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
13ce0 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d   }.  if( flags&M
13cf0 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a  EM_Int ){.    /*
13d00 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74   Figure out whet
13d10 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c  her to use 1, 2,
13d20 20 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73   4, 6 or 8 bytes
13d30 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20  . */.#   define 
13d40 4d 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 36  MAX_6BYTE ((((i6
13d50 34 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33  4)0x00008000)<<3
13d60 32 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20  2)-1).    i64 i 
13d70 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  = pMem->u.i;.   
13d80 20 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20   u64 u;.    if( 
13d90 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  i<0 ){.      if(
13da0 20 69 3c 28 2d 4d 41 58 5f 36 42 59 54 45 29 20   i<(-MAX_6BYTE) 
13db0 29 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20  ) return 6;.    
13dc0 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 74 65    /* Previous te
13dd0 73 74 20 70 72 65 76 65 6e 74 73 3a 20 20 75 20  st prevents:  u 
13de0 3d 20 2d 28 2d 39 32 32 33 33 37 32 30 33 36 38  = -(-92233720368
13df0 35 34 37 37 35 38 30 38 29 20 2a 2f 0a 20 20 20  54775808) */.   
13e00 20 20 20 75 20 3d 20 2d 69 3b 0a 20 20 20 20 7d     u = -i;.    }
13e10 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d 20  else{.      u = 
13e20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  i;.    }.    if(
13e30 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 20   u<=127 ){.     
13e40 20 72 65 74 75 72 6e 20 28 28 69 26 31 29 3d 3d   return ((i&1)==
13e50 69 20 26 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74  i && file_format
13e60 3e 3d 34 29 20 3f 20 38 2b 28 75 33 32 29 75 20  >=4) ? 8+(u32)u 
13e70 3a 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  : 1;.    }.    i
13e80 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20 72 65  f( u<=32767 ) re
13e90 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
13ea0 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72 65 74  u<=8388607 ) ret
13eb0 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28 20 75  urn 3;.    if( u
13ec0 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 20 72  <=2147483647 ) r
13ed0 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69 66 28  eturn 4;.    if(
13ee0 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 20   u<=MAX_6BYTE ) 
13ef0 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20 72 65  return 5;.    re
13f00 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66  turn 6;.  }.  if
13f10 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c  ( flags&MEM_Real
13f20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 37   ){.    return 7
13f30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
13f40 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  pMem->db->malloc
13f50 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26  Failed || flags&
13f60 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f  (MEM_Str|MEM_Blo
13f70 62 29 20 29 3b 0a 20 20 6e 20 3d 20 70 4d 65 6d  b) );.  n = pMem
13f80 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  ->n;.  if( flags
13f90 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
13fa0 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e     n += pMem->u.
13fb0 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 61 73 73  nZero;.  }.  ass
13fc0 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 72  ert( n>=0 );.  r
13fd0 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31  eturn ((n*2) + 1
13fe0 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f  2 + ((flags&MEM_
13ff0 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a  Str)!=0));.}../*
14000 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c  .** Return the l
14010 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61 74  ength of the dat
14020 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  a corresponding 
14030 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
14040 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a  serial-type..*/.
14050 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
14060 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32  erialTypeLen(u32
14070 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20   serial_type){. 
14080 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
14090 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72 65 74 75  >=12 ){.    retu
140a0 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d  rn (serial_type-
140b0 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a  12)/2;.  }else{.
140c0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
140d0 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b 20   u8 aSize[] = { 
140e0 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36  0, 1, 2, 3, 4, 6
140f0 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c  , 8, 8, 0, 0, 0,
14100 20 30 20 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e   0 };.    return
14110 20 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74 79   aSize[serial_ty
14120 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  pe];.  }.}../*.*
14130 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61  * If we are on a
14140 6e 20 61 72 63 68 69 74 65 63 74 75 72 65 20 77  n architecture w
14150 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e  ith mixed-endian
14160 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f   floating .** po
14170 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20  ints (ex: ARM7) 
14180 74 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f  then swap the lo
14190 77 65 72 20 34 20 62 79 74 65 73 20 77 69 74 68  wer 4 bytes with
141a0 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34   the .** upper 4
141b0 20 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20   bytes.  Return 
141c0 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  the result..**.*
141d0 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69  * For most archi
141e0 74 65 63 74 75 72 65 73 2c 20 74 68 69 73 20 69  tectures, this i
141f0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
14200 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73   (later):  It is
14210 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20   reported to me 
14220 74 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65  that the mixed-e
14230 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a  ndian problem.**
14240 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69   on ARM7 is an i
14250 73 73 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e  ssue with GCC, n
14260 6f 74 20 77 69 74 68 20 74 68 65 20 41 52 4d 37  ot with the ARM7
14270 20 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73   chip.  It seems
14280 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76  .** that early v
14290 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73  ersions of GCC s
142a0 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f  tored the two wo
142b0 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a  rds of a 64-bit.
142c0 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20  ** float in the 
142d0 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e  wrong order.  An
142e0 64 20 74 68 61 74 20 65 72 72 6f 72 20 68 61 73  d that error has
142f0 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64   been propagated
14300 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20  .** ever since. 
14310 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f   The blame is no
14320 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69  t necessarily wi
14330 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a  th GCC, though..
14340 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61 76  ** GCC might hav
14350 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74  e just copying t
14360 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20  he problem from 
14370 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72  a prior compiler
14380 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74  ..** I am also t
14390 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20 76  old that newer v
143a0 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74  ersions of GCC t
143b0 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66  hat follow a dif
143c0 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65  ferent.** ABI ge
143d0 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72  t the byte order
143e0 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65   right..**.** De
143f0 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53  velopers using S
14400 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37  QLite on an ARM7
14410 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20   should compile 
14420 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a  and run their.**
14430 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69   application usi
14440 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55  ng -DSQLITE_DEBU
14450 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63  G=1 at least onc
14460 65 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a  e.  With DEBUG.*
14470 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20  * enabled, some 
14480 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69  asserts below wi
14490 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  ll ensure that t
144a0 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66  he byte order of
144b0 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  .** floating poi
144c0 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72  nt values is cor
144d0 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30  rect..**.** (200
144e0 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20  7-08-30)  Frank 
144f0 76 61 6e 20 56 75 67 74 20 68 61 73 20 73 74 75  van Vugt has stu
14500 64 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65  died this proble
14510 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64  m closely.** and
14520 20 68 61 73 20 73 65 6e 64 20 68 69 73 20 66 69   has send his fi
14530 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51  ndings to the SQ
14540 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e  Lite developers.
14550 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65    Frank.** write
14560 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75  s that some Linu
14570 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20  x kernels offer 
14580 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68  floating point h
14590 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61  ardware.** emula
145a0 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f  tion that uses o
145b0 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69  nly 32-bit manti
145c0 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20  ssas instead of 
145d0 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69  a full .** 48-bi
145e0 74 73 20 61 73 20 72 65 71 75 69 72 65 64 20 62  ts as required b
145f0 79 20 74 68 65 20 49 45 45 45 20 73 74 61 6e 64  y the IEEE stand
14600 61 72 64 2e 20 20 28 54 68 69 73 20 69 73 20 74  ard.  (This is t
14610 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45  he.** CONFIG_FPE
14620 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e  _FASTFPE option.
14630 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65  )  On such syste
14640 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  ms, floating poi
14650 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70  nt.** byte swapp
14660 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79  ing becomes very
14670 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54   complicated.  T
14680 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73  o avoid problems
14690 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61  ,.** the necessa
146a0 72 79 20 62 79 74 65 20 73 77 61 70 70 69 6e 67  ry byte swapping
146b0 20 69 73 20 63 61 72 72 69 65 64 20 6f 75 74 20   is carried out 
146c0 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69  using a 64-bit i
146d0 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72  nteger.** rather
146e0 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66   than a 64-bit f
146f0 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73  loat.  Frank ass
14700 75 72 65 73 20 75 73 20 74 68 61 74 20 74 68 65  ures us that the
14710 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f   code here.** wo
14720 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65  rks for him.  We
14730 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73  , the developers
14740 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f  , have no way to
14750 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a   independently.*
14760 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c 20 62  * verify this, b
14770 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74  ut Frank seems t
14780 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69  o know what he i
14790 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a  s talking about.
147a0 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20 68  ** so we trust h
147b0 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  im..*/.#ifdef SQ
147c0 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41  LITE_MIXED_ENDIA
147d0 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74  N_64BIT_FLOAT.st
147e0 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77  atic u64 floatSw
147f0 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e  ap(u64 in){.  un
14800 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b  ion {.    u64 r;
14810 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20  .    u32 i[2];. 
14820 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a   } u;.  u32 t;..
14830 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20    u.r = in;.  t 
14840 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b  = u.i[0];.  u.i[
14850 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75  0] = u.i[1];.  u
14860 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74  .i[1] = t;.  ret
14870 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66  urn u.r;.}.# def
14880 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64  ine swapMixedEnd
14890 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d  ianFloat(X)  X =
148a0 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65   floatSwap(X).#e
148b0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61  lse.# define swa
148c0 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
148d0 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t(X).#endif../*.
148e0 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 72  ** Write the ser
148f0 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f  ialized data blo
14900 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  b for the value 
14910 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69  stored in pMem i
14920 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20  nto .** buf. It 
14930 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
14940 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  the caller has a
14950 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63 69  llocated suffici
14960 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65  ent space..** Re
14970 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
14980 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e  of bytes written
14990 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20  ..**.** nBuf is 
149a0 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70  the amount of sp
149b0 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b  ace left in buf[
149c0 5d 2e 20 20 6e 42 75 66 20 6d 75 73 74 20 61 6c  ].  nBuf must al
149d0 77 61 79 73 20 62 65 0a 2a 2a 20 6c 61 72 67 65  ways be.** large
149e0 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
149f0 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64  the entire field
14a00 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20 74 68  .  Except, if th
14a10 65 20 66 69 65 6c 64 20 69 73 0a 2a 2a 20 61 20  e field is.** a 
14a20 62 6c 6f 62 20 77 69 74 68 20 61 20 7a 65 72 6f  blob with a zero
14a30 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2c 20 74 68  -filled tail, th
14a40 65 6e 20 62 75 66 5b 5d 20 6d 69 67 68 74 20 62  en buf[] might b
14a50 65 20 6a 75 73 74 20 74 68 65 20 72 69 67 68 74  e just the right
14a60 0a 2a 2a 20 73 69 7a 65 20 74 6f 20 68 6f 6c 64  .** size to hold
14a70 20 65 76 65 72 79 74 68 69 6e 67 20 65 78 63 65   everything exce
14a80 70 74 20 66 6f 72 20 74 68 65 20 7a 65 72 6f 2d  pt for the zero-
14a90 66 69 6c 6c 65 64 20 74 61 69 6c 2e 20 20 49 66  filled tail.  If
14aa0 20 62 75 66 5b 5d 0a 2a 2a 20 69 73 20 6f 6e 6c   buf[].** is onl
14ab0 79 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  y big enough to 
14ac0 68 6f 6c 64 20 74 68 65 20 6e 6f 6e 2d 7a 65 72  hold the non-zer
14ad0 6f 20 70 72 65 66 69 78 2c 20 74 68 65 6e 20 6f  o prefix, then o
14ae0 6e 6c 79 20 77 72 69 74 65 20 74 68 61 74 0a 2a  nly write that.*
14af0 2a 20 70 72 65 66 69 78 20 69 6e 74 6f 20 62 75  * prefix into bu
14b00 66 5b 5d 2e 20 20 42 75 74 20 69 66 20 62 75 66  f[].  But if buf
14b10 5b 5d 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  [] is large enou
14b20 67 68 20 74 6f 20 68 6f 6c 64 20 62 6f 74 68 20  gh to hold both 
14b30 74 68 65 0a 2a 2a 20 70 72 65 66 69 78 20 61 6e  the.** prefix an
14b40 64 20 74 68 65 20 74 61 69 6c 20 74 68 65 6e 20  d the tail then 
14b50 77 72 69 74 65 20 74 68 65 20 70 72 65 66 69 78  write the prefix
14b60 20 61 6e 64 20 73 65 74 20 74 68 65 20 74 61 69   and set the tai
14b70 6c 20 74 6f 20 61 6c 6c 0a 2a 2a 20 7a 65 72 6f  l to all.** zero
14b80 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
14b90 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
14ba0 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69  tes actually wri
14bb0 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e  tten into buf[].
14bc0 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20    The number.** 
14bd0 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
14be0 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c  zero-filled tail
14bf0 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20   is included in 
14c00 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
14c10 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73   only.** if thos
14c20 65 20 62 79 74 65 73 20 77 65 72 65 20 7a 65 72  e bytes were zer
14c30 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f  oed in buf[]..*/
14c40 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62   .u32 sqlite3Vdb
14c50 65 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62  eSerialPut(u8 *b
14c60 75 66 2c 20 69 6e 74 20 6e 42 75 66 2c 20 4d 65  uf, int nBuf, Me
14c70 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c  m *pMem, int fil
14c80 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 75 33 32  e_format){.  u32
14c90 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 73   serial_type = s
14ca0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
14cb0 54 79 70 65 28 70 4d 65 6d 2c 20 66 69 6c 65 5f  Type(pMem, file_
14cc0 66 6f 72 6d 61 74 29 3b 0a 20 20 75 33 32 20 6c  format);.  u32 l
14cd0 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65  en;..  /* Intege
14ce0 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20  r and Real */.  
14cf0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
14d00 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70  =7 && serial_typ
14d10 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76  e>0 ){.    u64 v
14d20 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20  ;.    u32 i;.   
14d30 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
14d40 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==7 ){.      ass
14d50 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d  ert( sizeof(v)==
14d60 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 20  sizeof(pMem->r) 
14d70 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
14d80 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c 20 73 69  &v, &pMem->r, si
14d90 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20 20 20  zeof(v));.      
14da0 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
14db0 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c  loat(v);.    }el
14dc0 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 4d  se{.      v = pM
14dd0 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20  em->u.i;.    }. 
14de0 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c     len = i = sql
14df0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
14e00 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
14e10 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
14e20 6c 65 6e 3c 3d 28 75 33 32 29 6e 42 75 66 20 29  len<=(u32)nBuf )
14e30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 2d 2d  ;.    while( i--
14e40 20 29 7b 0a 20 20 20 20 20 20 62 75 66 5b 69 5d   ){.      buf[i]
14e50 20 3d 20 28 75 38 29 28 76 26 30 78 46 46 29 3b   = (u8)(v&0xFF);
14e60 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a  .      v >>= 8;.
14e70 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
14e80 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   len;.  }..  /* 
14e90 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a  String or blob *
14ea0 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  /.  if( serial_t
14eb0 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61  ype>=12 ){.    a
14ec0 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b  ssert( pMem->n +
14ed0 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26   ((pMem->flags &
14ee0 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d   MEM_Zero)?pMem-
14ef0 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20  >u.nZero:0).    
14f00 20 20 20 20 20 20 20 20 20 3d 3d 20 28 69 6e 74           == (int
14f10 29 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69  )sqlite3VdbeSeri
14f20 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
14f30 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20 61 73  _type) );.    as
14f40 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e  sert( pMem->n<=n
14f50 42 75 66 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d  Buf );.    len =
14f60 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65   pMem->n;.    me
14f70 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e  mcpy(buf, pMem->
14f80 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 69 66 28  z, len);.    if(
14f90 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
14fa0 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20  EM_Zero ){.     
14fb0 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e   len += pMem->u.
14fc0 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20 61 73 73  nZero;.      ass
14fd0 65 72 74 28 20 6e 42 75 66 3e 3d 30 20 29 3b 0a  ert( nBuf>=0 );.
14fe0 20 20 20 20 20 20 69 66 28 20 6c 65 6e 20 3e 20        if( len > 
14ff0 28 75 33 32 29 6e 42 75 66 20 29 7b 0a 20 20 20  (u32)nBuf ){.   
15000 20 20 20 20 20 6c 65 6e 20 3d 20 28 75 33 32 29       len = (u32)
15010 6e 42 75 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nBuf;.      }.  
15020 20 20 20 20 6d 65 6d 73 65 74 28 26 62 75 66 5b      memset(&buf[
15030 70 4d 65 6d 2d 3e 6e 5d 2c 20 30 2c 20 6c 65 6e  pMem->n], 0, len
15040 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7d  -pMem->n);.    }
15050 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b  .    return len;
15060 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20  .  }..  /* NULL 
15070 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f  or constants 0 o
15080 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  r 1 */.  return 
15090 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65  0;.}../*.** Dese
150a0 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61  rialize the data
150b0 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f   blob pointed to
150c0 20 62 79 20 62 75 66 20 61 73 20 73 65 72 69 61   by buf as seria
150d0 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79  l type serial_ty
150e0 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20  pe.** and store 
150f0 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d  the result in pM
15100 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  em.  Return the 
15110 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
15120 72 65 61 64 2e 0a 2a 2f 20 0a 75 33 32 20 73 71  read..*/ .u32 sq
15130 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
15140 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  et(.  const unsi
15150 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
15160 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
15170 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f   deserialize fro
15180 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61  m */.  u32 seria
15190 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20 20  l_type,         
151a0 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74       /* Serial t
151b0 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69  ype to deseriali
151c0 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65  ze */.  Mem *pMe
151d0 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
151e0 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
151f0 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61  cell to write va
15200 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20  lue into */.){. 
15210 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f   switch( serial_
15220 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
15230 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65 72 76   10:   /* Reserv
15240 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73  ed for future us
15250 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 31  e */.    case 11
15260 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20  :   /* Reserved 
15270 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a  for future use *
15280 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20  /.    case 0: { 
15290 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20   /* NULL */.    
152a0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
152b0 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20  MEM_Null;.      
152c0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
152d0 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d   case 1: { /* 1-
152e0 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
152f0 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
15300 6d 2d 3e 75 2e 69 20 3d 20 28 73 69 67 6e 65 64  m->u.i = (signed
15310 20 63 68 61 72 29 62 75 66 5b 30 5d 3b 0a 20 20   char)buf[0];.  
15320 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
15330 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
15340 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
15350 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f  .    case 2: { /
15360 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 2-byte signed 
15370 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
15380 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28   pMem->u.i = (((
15390 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
153a0 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d  0])<<8) | buf[1]
153b0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
153c0 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
153d0 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20       return 2;. 
153e0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a     }.    case 3:
153f0 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67   { /* 3-byte sig
15400 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
15410 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
15420 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29   (((signed char)
15430 62 75 66 5b 30 5d 29 3c 3c 31 36 29 20 7c 20 28  buf[0])<<16) | (
15440 62 75 66 5b 31 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[1]<<8) | buf
15450 5b 32 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  [2];.      pMem-
15460 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
15470 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 33  ;.      return 3
15480 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
15490 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20   4: { /* 4-byte 
154a0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
154b0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
154c0 69 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29  i = (buf[0]<<24)
154d0 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20   | (buf[1]<<16) 
154e0 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20  | (buf[2]<<8) | 
154f0 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 70 4d  buf[3];.      pM
15500 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
15510 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
15520 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 4;.    }.    c
15530 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79  ase 5: { /* 6-by
15540 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
15550 72 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78  r */.      u64 x
15560 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61   = (((signed cha
15570 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20  r)buf[0])<<8) | 
15580 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 75 33  buf[1];.      u3
15590 32 20 79 20 3d 20 28 62 75 66 5b 32 5d 3c 3c 32  2 y = (buf[2]<<2
155a0 34 29 20 7c 20 28 62 75 66 5b 33 5d 3c 3c 31 36  4) | (buf[3]<<16
155b0 29 20 7c 20 28 62 75 66 5b 34 5d 3c 3c 38 29 20  ) | (buf[4]<<8) 
155c0 7c 20 62 75 66 5b 35 5d 3b 0a 20 20 20 20 20 20  | buf[5];.      
155d0 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b  x = (x<<32) | y;
155e0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
155f0 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20   = *(i64*)&x;.  
15600 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
15610 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
15620 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d   return 6;.    }
15630 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f  .    case 6:   /
15640 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 8-byte signed 
15650 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63  integer */.    c
15660 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45  ase 7: { /* IEEE
15670 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
15680 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78 3b 0a  */.      u64 x;.
15690 20 20 20 20 20 20 75 33 32 20 79 3b 0a 23 69 66        u32 y;.#if
156a0 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
156b0 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
156c0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
156d0 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20 20  NG_POINT).      
156e0 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 69  /* Verify that i
156f0 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61  ntegers and floa
15700 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
15710 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20  s use the same. 
15720 20 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64       ** byte ord
15730 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20 69 66  er.  Or, that if
15740 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e   SQLITE_MIXED_EN
15750 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54  DIAN_64BIT_FLOAT
15760 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 66   is.      ** def
15770 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69 74  ined that 64-bit
15780 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
15790 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61 72  values really ar
157a0 65 20 6d 69 78 65 64 0a 20 20 20 20 20 20 2a 2a  e mixed.      **
157b0 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 20 20 2a   endian..      *
157c0 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  /.      static c
157d0 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28 28  onst u64 t1 = ((
157e0 75 36 34 29 30 78 33 66 66 30 30 30 30 30 29 3c  u64)0x3ff00000)<
157f0 3c 33 32 3b 0a 20 20 20 20 20 20 73 74 61 74 69  <32;.      stati
15800 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72  c const double r
15810 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 20 20 75  1 = 1.0;.      u
15820 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 20 20 20  64 t2 = t1;.    
15830 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
15840 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20 20  nFloat(t2);.    
15850 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
15860 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29  (r1)==sizeof(t2)
15870 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20   && memcmp(&r1, 
15880 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31 29 29  &t2, sizeof(r1))
15890 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ==0 );.#endif.. 
158a0 20 20 20 20 20 78 20 3d 20 28 62 75 66 5b 30 5d       x = (buf[0]
158b0 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c  <<24) | (buf[1]<
158c0 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c  <16) | (buf[2]<<
158d0 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20  8) | buf[3];.   
158e0 20 20 20 79 20 3d 20 28 62 75 66 5b 34 5d 3c 3c     y = (buf[4]<<
158f0 32 34 29 20 7c 20 28 62 75 66 5b 35 5d 3c 3c 31  24) | (buf[5]<<1
15900 36 29 20 7c 20 28 62 75 66 5b 36 5d 3c 3c 38 29  6) | (buf[6]<<8)
15910 20 7c 20 62 75 66 5b 37 5d 3b 0a 20 20 20 20 20   | buf[7];.     
15920 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79   x = (x<<32) | y
15930 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69  ;.      if( seri
15940 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20  al_type==6 ){.  
15950 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
15960 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20  = *(i64*)&x;.   
15970 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
15980 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
15990 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
159a0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
159b0 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28  x)==8 && sizeof(
159c0 70 4d 65 6d 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20  pMem->r)==8 );. 
159d0 20 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64         swapMixed
159e0 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a  EndianFloat(x);.
159f0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
15a00 70 4d 65 6d 2d 3e 72 2c 20 26 78 2c 20 73 69 7a  pMem->r, &x, siz
15a10 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 20 20 20  eof(x));.       
15a20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73   pMem->flags = s
15a30 71 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d  qlite3IsNaN(pMem
15a40 2d 3e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20  ->r) ? MEM_Null 
15a50 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20  : MEM_Real;.    
15a60 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
15a70 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   8;.    }.    ca
15a80 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65  se 8:    /* Inte
15a90 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73  ger 0 */.    cas
15aa0 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67  e 9: {  /* Integ
15ab0 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d  er 1 */.      pM
15ac0 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c  em->u.i = serial
15ad0 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70  _type-8;.      p
15ae0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
15af0 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
15b00 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
15b10 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
15b20 20 75 33 32 20 6c 65 6e 20 3d 20 28 73 65 72 69   u32 len = (seri
15b30 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20  al_type-12)/2;. 
15b40 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28       pMem->z = (
15b50 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20 20  char *)buf;.    
15b60 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b    pMem->n = len;
15b70 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 78 44 65  .      pMem->xDe
15b80 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  l = 0;.      if(
15b90 20 73 65 72 69 61 6c 5f 74 79 70 65 26 30 78 30   serial_type&0x0
15ba0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  1 ){.        pMe
15bb0 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
15bc0 74 72 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a  tr | MEM_Ephem;.
15bd0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15be0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
15bf0 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45   = MEM_Blob | ME
15c00 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d  M_Ephem;.      }
15c10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c 65  .      return le
15c20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  n;.    }.  }.  r
15c30 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
15c40 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
15c50 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  s used to alloca
15c60 74 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  te sufficient sp
15c70 61 63 65 20 66 6f 72 20 61 6e 20 55 6e 70 61 63  ace for an Unpac
15c80 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72  kedRecord.** str
15c90 75 63 74 75 72 65 20 6c 61 72 67 65 20 65 6e 6f  ucture large eno
15ca0 75 67 68 20 74 6f 20 62 65 20 75 73 65 64 20 77  ugh to be used w
15cb0 69 74 68 20 73 71 6c 69 74 65 33 56 64 62 65 52  ith sqlite3VdbeR
15cc0 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20 69 66  ecordUnpack() if
15cd0 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72  .** the first ar
15ce0 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
15cf0 74 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20 73  ter to KeyInfo s
15d00 74 72 75 63 74 75 72 65 20 70 4b 65 79 49 6e 66  tructure pKeyInf
15d10 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70 61  o..**.** The spa
15d20 63 65 20 69 73 20 65 69 74 68 65 72 20 61 6c 6c  ce is either all
15d30 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c  ocated using sql
15d40 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
15d50 29 20 6f 72 20 66 72 6f 6d 20 77 69 74 68 69 6e  ) or from within
15d60 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e 65  .** the unaligne
15d70 64 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20  d buffer passed 
15d80 76 69 61 20 74 68 65 20 73 65 63 6f 6e 64 20 61  via the second a
15d90 6e 64 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  nd third argumen
15da0 74 73 20 28 70 72 65 73 75 6d 61 62 6c 79 0a 2a  ts (presumably.*
15db0 2a 20 73 74 61 63 6b 20 73 70 61 63 65 29 2e 20  * stack space). 
15dc0 49 66 20 74 68 65 20 66 6f 72 6d 65 72 2c 20 74  If the former, t
15dd0 68 65 6e 20 2a 70 70 46 72 65 65 20 69 73 20 73  hen *ppFree is s
15de0 65 74 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20  et to a pointer 
15df0 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  that should.** b
15e00 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  e eventually fre
15e10 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
15e20 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62   using sqlite3Db
15e30 46 72 65 65 28 29 2e 20 4f 72 2c 20 69 66 20 74  Free(). Or, if t
15e40 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  he .** allocatio
15e50 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65  n comes from the
15e60 20 70 53 70 61 63 65 2f 73 7a 53 70 61 63 65 20   pSpace/szSpace 
15e70 62 75 66 66 65 72 2c 20 2a 70 70 46 72 65 65 20  buffer, *ppFree 
15e80 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a  is set to NULL.*
15e90 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * before returni
15ea0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
15eb0 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
15ec0 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
15ed0 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64 52  ed..*/.UnpackedR
15ee0 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56 64  ecord *sqlite3Vd
15ef0 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52  beAllocUnpackedR
15f00 65 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66 6f  ecord(.  KeyInfo
15f10 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
15f20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 63           /* Desc
15f30 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 72  ription of the r
15f40 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72 20  ecord */.  char 
15f50 2a 70 53 70 61 63 65 2c 20 20 20 20 20 20 20 20  *pSpace,        
15f60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
15f70 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61 76  aligned space av
15f80 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ailable */.  int
15f90 20 73 7a 53 70 61 63 65 2c 20 20 20 20 20 20 20   szSpace,       
15fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15fb0 53 69 7a 65 20 6f 66 20 70 53 70 61 63 65 5b 5d  Size of pSpace[]
15fc0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63   in bytes */.  c
15fd0 68 61 72 20 2a 2a 70 70 46 72 65 65 20 20 20 20  har **ppFree    
15fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15ff0 2a 20 4f 55 54 3a 20 43 61 6c 6c 65 72 20 73 68  * OUT: Caller sh
16000 6f 75 6c 64 20 66 72 65 65 20 74 68 69 73 20 70  ould free this p
16010 6f 69 6e 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 55  ointer */.){.  U
16020 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
16030 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
16040 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63 6f 72  * Unpacked recor
16050 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  d to return */. 
16060 20 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20 20   int nOff;      
16070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16080 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 70 53   /* Increment pS
16090 70 61 63 65 20 62 79 20 6e 4f 66 66 20 74 6f 20  pace by nOff to 
160a0 61 6c 69 67 6e 20 69 74 20 2a 2f 0a 20 20 69 6e  align it */.  in
160b0 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
160c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
160d0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
160e0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 2a 70   required for *p
160f0 20 2a 2f 0a 0a 20 20 2f 2a 20 57 65 20 77 61 6e   */..  /* We wan
16100 74 20 74 6f 20 73 68 69 66 74 20 74 68 65 20 70  t to shift the p
16110 6f 69 6e 74 65 72 20 70 53 70 61 63 65 20 75 70  ointer pSpace up
16120 20 73 75 63 68 20 74 68 61 74 20 69 74 20 69 73   such that it is
16130 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2e   8-byte aligned.
16140 0a 20 20 2a 2a 20 54 68 75 73 2c 20 77 65 20 6e  .  ** Thus, we n
16150 65 65 64 20 74 6f 20 63 61 6c 63 75 6c 61 74 65  eed to calculate
16160 20 61 20 76 61 6c 75 65 2c 20 6e 4f 66 66 2c 20   a value, nOff, 
16170 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 37 2c  between 0 and 7,
16180 20 74 6f 20 73 68 69 66 74 20 0a 20 20 2a 2a 20   to shift .  ** 
16190 69 74 20 62 79 2e 20 20 49 66 20 70 53 70 61 63  it by.  If pSpac
161a0 65 20 69 73 20 61 6c 72 65 61 64 79 20 38 2d 62  e is already 8-b
161b0 79 74 65 20 61 6c 69 67 6e 65 64 2c 20 6e 4f 66  yte aligned, nOf
161c0 66 20 73 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f  f should be zero
161d0 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20  ..  */.  nOff = 
161e0 28 38 20 2d 20 28 53 51 4c 49 54 45 5f 50 54 52  (8 - (SQLITE_PTR
161f0 5f 54 4f 5f 49 4e 54 28 70 53 70 61 63 65 29 20  _TO_INT(pSpace) 
16200 26 20 37 29 29 20 26 20 37 3b 0a 20 20 6e 42 79  & 7)) & 7;.  nBy
16210 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  te = ROUND8(size
16220 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  of(UnpackedRecor
16230 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d  d)) + sizeof(Mem
16240 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  )*(pKeyInfo->nFi
16250 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42  eld+1);.  if( nB
16260 79 74 65 3e 73 7a 53 70 61 63 65 2b 6e 4f 66 66  yte>szSpace+nOff
16270 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70   ){.    p = (Unp
16280 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 29 73 71  ackedRecord *)sq
16290 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
162a0 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e  (pKeyInfo->db, n
162b0 42 79 74 65 29 3b 0a 20 20 20 20 2a 70 70 46 72  Byte);.    *ppFr
162c0 65 65 20 3d 20 28 63 68 61 72 20 2a 29 70 3b 0a  ee = (char *)p;.
162d0 20 20 20 20 69 66 28 20 21 70 20 29 20 72 65 74      if( !p ) ret
162e0 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 0;.  }else{.
162f0 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65      p = (Unpacke
16300 64 52 65 63 6f 72 64 2a 29 26 70 53 70 61 63 65  dRecord*)&pSpace
16310 5b 6e 4f 66 66 5d 3b 0a 20 20 20 20 2a 70 70 46  [nOff];.    *ppF
16320 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ree = 0;.  }..  
16330 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29  p->aMem = (Mem*)
16340 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e  &((char*)p)[ROUN
16350 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b  D8(sizeof(Unpack
16360 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61  edRecord))];.  a
16370 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
16380 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
16390 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20  ;.  p->pKeyInfo 
163a0 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d  = pKeyInfo;.  p-
163b0 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e  >nField = pKeyIn
163c0 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a  fo->nField + 1;.
163d0 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
163e0 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e  *.** Given the n
163f0 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e  Key-byte encodin
16400 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20 69 6e  g of a record in
16410 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c 61 74   pKey[], populat
16420 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70 61 63 6b  e the .** Unpack
16430 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75  edRecord structu
16440 72 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20  re indicated by 
16450 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d  the fourth argum
16460 65 6e 74 20 77 69 74 68 20 74 68 65 0a 2a 2a 20  ent with the.** 
16470 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
16480 64 65 63 6f 64 65 64 20 72 65 63 6f 72 64 2e 0a  decoded record..
16490 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  */ .void sqlite3
164a0 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b  VdbeRecordUnpack
164b0 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  (.  KeyInfo *pKe
164c0 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e  yInfo,     /* In
164d0 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
164e0 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61  the record forma
164f0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c  t */.  int nKey,
16500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16510 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e   Size of the bin
16520 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ary record */.  
16530 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
16540 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69  ,      /* The bi
16550 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20  nary record */. 
16560 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
16570 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c  *p      /* Popul
16580 61 74 65 20 74 68 69 73 20 73 74 72 75 63 74 75  ate this structu
16590 72 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  re before return
165a0 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ing. */.){.  con
165b0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
165c0 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20   *aKey = (const 
165d0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
165e0 70 4b 65 79 3b 0a 20 20 69 6e 74 20 64 3b 20 0a  pKey;.  int d; .
165f0 20 20 75 33 32 20 69 64 78 3b 20 20 20 20 20 20    u32 idx;      
16600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16610 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 61    /* Offset in a
16620 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64 20 66 72  Key[] to read fr
16630 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75 3b 20 20  om */.  u16 u;  
16640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16650 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
16660 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
16670 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b   */.  u32 szHdr;
16680 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70  .  Mem *pMem = p
16690 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 66 6c  ->aMem;..  p->fl
166a0 61 67 73 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ags = 0;.  asser
166b0 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
166c0 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b  IGNMENT(pMem) );
166d0 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 72 69  .  idx = getVari
166e0 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72  nt32(aKey, szHdr
166f0 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a  );.  d = szHdr;.
16700 20 20 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65    u = 0;.  while
16710 28 20 69 64 78 3c 73 7a 48 64 72 20 26 26 20 75  ( idx<szHdr && u
16720 3c 70 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64 3c  <p->nField && d<
16730 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75 33 32  =nKey ){.    u32
16740 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20   serial_type;.. 
16750 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72     idx += getVar
16760 69 6e 74 33 32 28 26 61 4b 65 79 5b 69 64 78 5d  int32(&aKey[idx]
16770 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
16780 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
16790 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
167a0 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b     pMem->db = pK
167b0 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20  eyInfo->db;.    
167c0 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d  /* pMem->flags =
167d0 20 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33 56 64   0; // sqlite3Vd
167e0 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 77 69  beSerialGet() wi
167f0 6c 6c 20 73 65 74 20 74 68 69 73 20 66 6f 72 20  ll set this for 
16800 75 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  us */.    pMem->
16810 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20  zMalloc = 0;.   
16820 20 70 4d 65 6d 2d 3e 7a 20 3d 20 30 3b 0a 20 20   pMem->z = 0;.  
16830 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64    d += sqlite3Vd
16840 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
16850 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  y[d], serial_typ
16860 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d  e, pMem);.    pM
16870 65 6d 2b 2b 3b 0a 20 20 20 20 75 2b 2b 3b 0a 20  em++;.    u++;. 
16880 20 7d 0a 20 20 61 73 73 65 72 74 28 20 75 3c 3d   }.  assert( u<=
16890 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
168a0 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69   + 1 );.  p->nFi
168b0 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 2f 2a 0a 2a  eld = u;.}../*.*
168c0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
168d0 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f  compares the two
168e0 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69   table rows or i
168f0 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20  ndex records.** 
16900 73 70 65 63 69 66 69 65 64 20 62 79 20 7b 6e 4b  specified by {nK
16910 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20  ey1, pKey1} and 
16920 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65 74 75  pPKey2.  It retu
16930 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65 2c 20  rns a negative, 
16940 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74  zero.** or posit
16950 69 76 65 20 69 6e 74 65 67 65 72 20 69 66 20 6b  ive integer if k
16960 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ey1 is less than
16970 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a  , equal to or .*
16980 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6b  * greater than k
16990 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31  ey2.  The {nKey1
169a0 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73  , pKey1} key mus
169b0 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63  t be a blob.** c
169c0 72 65 61 74 65 64 20 62 79 20 74 68 20 4f 50 5f  reated by th OP_
169d0 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
169e0 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20  e of the VDBE.  
169f0 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65  The pPKey2.** ke
16a00 79 20 6d 75 73 74 20 62 65 20 61 20 70 61 72 73  y must be a pars
16a10 65 64 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f  ed key such as o
16a20 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
16a30 73 71 6c 69 74 65 33 56 64 62 65 50 61 72 73 65  sqlite3VdbeParse
16a40 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65  Record..**.** Ke
16a50 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e  y1 and Key2 do n
16a60 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61  ot have to conta
16a70 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  in the same numb
16a80 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 0a 2a 2a  er of fields..**
16a90 20 54 68 65 20 6b 65 79 20 77 69 74 68 20 66 65   The key with fe
16aa0 77 65 72 20 66 69 65 6c 64 73 20 69 73 20 75 73  wer fields is us
16ab0 75 61 6c 6c 79 20 63 6f 6d 70 61 72 65 73 20 6c  ually compares l
16ac0 65 73 73 20 74 68 61 6e 20 74 68 65 20 0a 2a 2a  ess than the .**
16ad0 20 6c 6f 6e 67 65 72 20 6b 65 79 2e 20 20 48 6f   longer key.  Ho
16ae0 77 65 76 65 72 20 69 66 20 74 68 65 20 55 4e 50  wever if the UNP
16af0 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20 66 6c  ACKED_INCRKEY fl
16b00 61 67 73 20 69 6e 20 70 50 4b 65 79 32 20 69 73  ags in pPKey2 is
16b10 20 73 65 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20   set.** and the 
16b20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73 20  common prefixes 
16b30 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20  are equal, then 
16b40 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 61  key1 is less tha
16b50 6e 20 6b 65 79 32 2e 0a 2a 2a 20 4f 72 20 69 66  n key2..** Or if
16b60 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 4d 41   the UNPACKED_MA
16b70 54 43 48 5f 50 52 45 46 49 58 20 66 6c 61 67 20  TCH_PREFIX flag 
16b80 69 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 70  is set and the p
16b90 72 65 66 69 78 65 73 20 61 72 65 0a 2a 2a 20 65  refixes are.** e
16ba0 71 75 61 6c 2c 20 74 68 65 6e 20 74 68 65 20 6b  qual, then the k
16bb0 65 79 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  eys are consider
16bc0 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c 20 61  ed to be equal a
16bd0 6e 64 0a 2a 2a 20 74 68 65 20 70 61 72 74 73 20  nd.** the parts 
16be0 62 65 79 6f 6e 64 20 74 68 65 20 63 6f 6d 6d 6f  beyond the commo
16bf0 6e 20 70 72 65 66 69 78 20 61 72 65 20 69 67 6e  n prefix are ign
16c00 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ored..*/.int sql
16c10 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
16c20 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65  mpare(.  int nKe
16c30 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
16c40 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b  pKey1, /* Left k
16c50 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ey */.  Unpacked
16c60 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20  Record *pPKey2  
16c70 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b        /* Right k
16c80 65 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 64  ey */.){.  int d
16c90 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
16ca0 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65   Offset into aKe
16cb0 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61  y[] of next data
16cc0 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33   element */.  u3
16cd0 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20  2 idx1;         
16ce0 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
16cf0 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68  aKey[] of next h
16d00 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f  eader element */
16d10 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20  .  u32 szHdr1;  
16d20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
16d30 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64  of bytes in head
16d40 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  er */.  int i = 
16d50 30 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b  0;.  int nField;
16d60 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20  .  int rc = 0;. 
16d70 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
16d80 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63  char *aKey1 = (c
16d90 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
16da0 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65  ar *)pKey1;.  Ke
16db0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
16dc0 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20  .  Mem mem1;..  
16dd0 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79  pKeyInfo = pPKey
16de0 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 6d  2->pKeyInfo;.  m
16df0 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e  em1.enc = pKeyIn
16e00 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e  fo->enc;.  mem1.
16e10 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64  db = pKeyInfo->d
16e20 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61  b;.  /* mem1.fla
16e30 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c  gs = 0;  // Will
16e40 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   be initialized 
16e50 62 79 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  by sqlite3VdbeSe
16e60 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56  rialGet() */.  V
16e70 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 7a 4d  VA_ONLY( mem1.zM
16e80 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20  alloc = 0; ) /* 
16e90 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61  Only needed by a
16ea0 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
16eb0 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ts */..  /* Comp
16ec0 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61  ilers may compla
16ed0 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69  in that mem1.u.i
16ee0 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20   is potentially 
16ef0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  uninitialized.. 
16f00 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e 69   ** We could ini
16f10 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 73 20 73  tialize it, as s
16f20 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20 73 69  hown here, to si
16f30 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d 70  lence those comp
16f40 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74  laints..  ** But
16f50 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75   in fact, mem1.u
16f60 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 63  .i will never ac
16f70 74 75 61 6c 6c 79 20 62 65 20 75 73 65 64 20 75  tually be used u
16f80 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e  ninitialized, an
16f90 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68  d doing .  ** th
16fa0 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69 6e  e unnecessary in
16fb0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73  itialization has
16fc0 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20 6e 65   a measurable ne
16fd0 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d 61 6e  gative performan
16fe0 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20  ce.  ** impact, 
16ff0 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69  since this routi
17000 6e 65 20 69 73 20 61 20 76 65 72 79 20 68 69 67  ne is a very hig
17010 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73  h runner.  And s
17020 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a  o, we choose.  *
17030 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20  * to ignore the 
17040 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67  compiler warning
17050 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68 69 73  s and leave this
17060 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e 69 74   variable uninit
17070 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  ialized..  */.  
17080 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30  /*  mem1.u.i = 0
17090 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64  ;  // not needed
170a0 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e 63  , here to silenc
170b0 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69  e compiler warni
170c0 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20  ng */.  .  idx1 
170d0 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b  = getVarint32(aK
170e0 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20  ey1, szHdr1);.  
170f0 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 6e  d1 = szHdr1;.  n
17100 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f  Field = pKeyInfo
17110 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 61 73 73 65  ->nField;.  asse
17120 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  rt( pKeyInfo->aS
17130 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20  ortOrder!=0 );. 
17140 20 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48   while( idx1<szH
17150 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d  dr1 && i<pPKey2-
17160 3e 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 75  >nField ){.    u
17170 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b  32 serial_type1;
17180 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
17190 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66  e serial types f
171a0 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d  or the next elem
171b0 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e  ent in each key.
171c0 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20   */.    idx1 += 
171d0 67 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65  getVarint32( aKe
171e0 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f  y1+idx1, serial_
171f0 74 79 70 65 31 20 29 3b 0a 20 20 20 20 69 66 28  type1 );.    if(
17200 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71   d1>=nKey1 && sq
17210 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
17220 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
17230 70 65 31 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a  pe1)>0 ) break;.
17240 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20  .    /* Extract 
17250 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65  the values to be
17260 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a   compared..    *
17270 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69  /.    d1 += sqli
17280 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
17290 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72  (&aKey1[d1], ser
172a0 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31  ial_type1, &mem1
172b0 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68  );..    /* Do th
172c0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20  e comparison.   
172d0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
172e0 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26  ite3MemCompare(&
172f0 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61  mem1, &pPKey2->a
17300 4d 65 6d 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20  Mem[i],.        
17310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17320 20 20 20 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b     i<nField ? pK
17330 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
17340 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72   : 0);.    if( r
17350 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  c!=0 ){.      as
17360 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c  sert( mem1.zMall
17370 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65  oc==0 );  /* See
17380 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a   comment below *
17390 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 76 65  /..      /* Inve
173a0 72 74 20 74 68 65 20 72 65 73 75 6c 74 20 69 66  rt the result if
173b0 20 77 65 20 61 72 65 20 75 73 69 6e 67 20 44 45   we are using DE
173c0 53 43 20 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a  SC sort order. *
173d0 2f 0a 20 20 20 20 20 20 69 66 28 20 69 3c 6e 46  /.      if( i<nF
173e0 69 65 6c 64 20 26 26 20 70 4b 65 79 49 6e 66 6f  ield && pKeyInfo
173f0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
17400 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
17410 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -rc;.      }.   
17420 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68   .      /* If th
17430 65 20 50 52 45 46 49 58 5f 53 45 41 52 43 48 20  e PREFIX_SEARCH 
17440 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20  flag is set and 
17450 61 6c 6c 20 66 69 65 6c 64 73 20 65 78 63 65 70  all fields excep
17460 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 20 20  t the final.    
17470 20 20 2a 2a 20 72 6f 77 69 64 20 66 69 65 6c 64    ** rowid field
17480 20 77 65 72 65 20 65 71 75 61 6c 2c 20 74 68 65   were equal, the
17490 6e 20 63 6c 65 61 72 20 74 68 65 20 50 52 45 46  n clear the PREF
174a0 49 58 5f 53 45 41 52 43 48 20 66 6c 61 67 20 61  IX_SEARCH flag a
174b0 6e 64 20 73 65 74 20 0a 20 20 20 20 20 20 2a 2a  nd set .      **
174c0 20 70 50 4b 65 79 32 2d 3e 72 6f 77 69 64 20 74   pPKey2->rowid t
174d0 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  o the value of t
174e0 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64 20 69  he rowid field i
174f0 6e 20 28 70 4b 65 79 31 2c 20 6e 4b 65 79 31 29  n (pKey1, nKey1)
17500 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  ..      ** This 
17510 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 4f  is used by the O
17520 50 5f 49 73 55 6e 69 71 75 65 20 6f 70 63 6f 64  P_IsUnique opcod
17530 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
17540 20 20 69 66 28 20 28 70 50 4b 65 79 32 2d 3e 66    if( (pPKey2->f
17550 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f  lags & UNPACKED_
17560 50 52 45 46 49 58 5f 53 45 41 52 43 48 29 20 26  PREFIX_SEARCH) &
17570 26 20 69 3d 3d 28 70 50 4b 65 79 32 2d 3e 6e 46  & i==(pPKey2->nF
17580 69 65 6c 64 2d 31 29 20 29 7b 0a 20 20 20 20 20  ield-1) ){.     
17590 20 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3d     assert( idx1=
175a0 3d 73 7a 48 64 72 31 20 26 26 20 72 63 20 29 3b  =szHdr1 && rc );
175b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
175c0 20 6d 65 6d 31 2e 66 6c 61 67 73 20 26 20 4d 45   mem1.flags & ME
175d0 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 20  M_Int );.       
175e0 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26   pPKey2->flags &
175f0 3d 20 7e 55 4e 50 41 43 4b 45 44 5f 50 52 45 46  = ~UNPACKED_PREF
17600 49 58 5f 53 45 41 52 43 48 3b 0a 20 20 20 20 20  IX_SEARCH;.     
17610 20 20 20 70 50 4b 65 79 32 2d 3e 72 6f 77 69 64     pPKey2->rowid
17620 20 3d 20 6d 65 6d 31 2e 75 2e 69 3b 0a 20 20 20   = mem1.u.i;.   
17630 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 20 20     }.    .      
17640 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
17650 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20  .    i++;.  }.. 
17660 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c   /* No memory al
17670 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72  location is ever
17680 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20   used on mem1.  
17690 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67  Prove this using
176a0 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77  .  ** the follow
176b0 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49  ing assert().  I
176c0 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66  f the assert() f
176d0 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74  ails, it indicat
176e0 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79  es a.  ** memory
176f0 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64   leak and a need
17700 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   to call sqlite3
17710 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
17720 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  mem1)..  */.  as
17730 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c  sert( mem1.zMall
17740 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72  oc==0 );..  /* r
17750 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20  c==0 here means 
17760 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  that one of the 
17770 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20  keys ran out of 
17780 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20  fields and.  ** 
17790 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75  all the fields u
177a0 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20  p to that point 
177b0 77 65 72 65 20 65 71 75 61 6c 2e 20 49 66 20 74  were equal. If t
177c0 68 65 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52  he UNPACKED_INCR
177d0 4b 45 59 0a 20 20 2a 2a 20 66 6c 61 67 20 69 73  KEY.  ** flag is
177e0 20 73 65 74 2c 20 74 68 65 6e 20 62 72 65 61 6b   set, then break
177f0 20 74 68 65 20 74 69 65 20 62 79 20 74 72 65 61   the tie by trea
17800 74 69 6e 67 20 6b 65 79 32 20 61 73 20 6c 61 72  ting key2 as lar
17810 67 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65  ger..  ** If the
17820 20 55 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f   UPACKED_PREFIX_
17830 4d 41 54 43 48 20 66 6c 61 67 20 69 73 20 73 65  MATCH flag is se
17840 74 2c 20 74 68 65 6e 20 6b 65 79 73 20 77 69 74  t, then keys wit
17850 68 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65  h common prefixe
17860 73 0a 20 20 2a 2a 20 61 72 65 20 63 6f 6e 73 69  s.  ** are consi
17870 64 65 72 65 64 20 74 6f 20 62 65 20 65 71 75 61  dered to be equa
17880 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 74  l.  Otherwise, t
17890 68 65 20 6c 6f 6e 67 65 72 20 6b 65 79 20 69 73  he longer key is
178a0 20 74 68 65 20 0a 20 20 2a 2a 20 6c 61 72 67 65   the .  ** large
178b0 72 2e 20 20 41 73 20 69 74 20 68 61 70 70 65 6e  r.  As it happen
178c0 73 2c 20 74 68 65 20 70 50 4b 65 79 32 20 77 69  s, the pPKey2 wi
178d0 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 74 68 65  ll always be the
178e0 20 6c 6f 6e 67 65 72 0a 20 20 2a 2a 20 69 66 20   longer.  ** if 
178f0 74 68 65 72 65 20 69 73 20 61 20 64 69 66 66 65  there is a diffe
17900 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  rence..  */.  as
17910 73 65 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a 20  sert( rc==0 );. 
17920 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61   if( pPKey2->fla
17930 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 4e  gs & UNPACKED_IN
17940 43 52 4b 45 59 20 29 7b 0a 20 20 20 20 72 63 20  CRKEY ){.    rc 
17950 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66  = -1;.  }else if
17960 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20  ( pPKey2->flags 
17970 26 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49  & UNPACKED_PREFI
17980 58 5f 4d 41 54 43 48 20 29 7b 0a 20 20 20 20 2f  X_MATCH ){.    /
17990 2a 20 4c 65 61 76 65 20 72 63 3d 3d 30 20 2a 2f  * Leave rc==0 */
179a0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 64 78  .  }else if( idx
179b0 31 3c 73 7a 48 64 72 31 20 29 7b 0a 20 20 20 20  1<szHdr1 ){.    
179c0 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  rc = 1;.  }.  re
179d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 0a 0a 2f 2a  turn rc;.}. ../*
179e0 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20  .** pCur points 
179f0 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72  at an index entr
17a00 79 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20  y created using 
17a10 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
17a20 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61  d opcode..** Rea
17a30 64 20 74 68 65 20 72 6f 77 69 64 20 28 74 68 65  d the rowid (the
17a40 20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74   last field in t
17a50 68 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73  he record) and s
17a60 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69  tore it in *rowi
17a70 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  d..** Return SQL
17a80 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
17a90 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61  hing works, or a
17aa0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  n error code oth
17ab0 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43  erwise..**.** pC
17ac0 75 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69 6e  ur might be poin
17ad0 74 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62 74  ting to text obt
17ae0 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f 72  ained from a cor
17af0 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
17b00 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f  le..** So the co
17b10 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20  ntent cannot be 
17b20 74 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70 70  trusted.  Do app
17b30 72 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73 20  ropriate checks 
17b40 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a  on the content..
17b50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
17b60 62 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74  beIdxRowid(sqlit
17b70 65 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72  e3 *db, BtCursor
17b80 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77   *pCur, i64 *row
17b90 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c  id){.  i64 nCell
17ba0 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Key = 0;.  int r
17bb0 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20  c;.  u32 szHdr; 
17bc0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
17bd0 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  f the header */.
17be0 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b    u32 typeRowid;
17bf0 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
17c00 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  pe of the rowid 
17c10 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69  */.  u32 lenRowi
17c20 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  d;     /* Size o
17c30 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20  f the rowid */. 
17c40 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 55 4e   Mem m, v;..  UN
17c50 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
17c60 62 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68  b);..  /* Get th
17c70 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e  e size of the in
17c80 64 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79  dex entry.  Only
17c90 20 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73   indices entries
17ca0 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68   of less.  ** th
17cb0 61 6e 20 32 47 69 42 20 61 72 65 20 73 75 70 70  an 2GiB are supp
17cc0 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c  ort - anything l
17cd0 61 72 67 65 20 6d 75 73 74 20 62 65 20 64 61 74  arge must be dat
17ce0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
17cf0 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75  ..  ** Any corru
17d00 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65  ption is detecte
17d10 64 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65  d in sqlite3Btre
17d20 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c  eParseCellPtr(),
17d30 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a   though, so.  **
17d40 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73   this code can s
17d50 61 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61  afely assume tha
17d60 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32  t nCellKey is 32
17d70 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61  -bits  .  */.  a
17d80 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
17d90 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
17da0 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56 41 5f  (pCur) );.  VVA_
17db0 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74  ONLY(rc =) sqlit
17dc0 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
17dd0 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b  Cur, &nCellKey);
17de0 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
17df0 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 20  QLITE_OK );     
17e00 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61 79  /* pCur is alway
17e10 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69  s valid so KeySi
17e20 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a  ze cannot fail *
17e30 2f 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43 65  /.  assert( (nCe
17e40 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f 4d  llKey & SQLITE_M
17e50 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e 43  AX_U32)==(u64)nC
17e60 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20  ellKey );..  /* 
17e70 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d 70  Read in the comp
17e80 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  lete content of 
17e90 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20  the index entry 
17ea0 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20  */.  memset(&m, 
17eb0 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 20  0, sizeof(m));. 
17ec0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
17ed0 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43  eMemFromBtree(pC
17ee0 75 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65 6c  ur, 0, (int)nCel
17ef0 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20  lKey, 1, &m);.  
17f00 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
17f10 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
17f20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65 6e 74  /* The index ent
17f30 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20 77 69  ry must begin wi
17f40 74 68 20 61 20 68 65 61 64 65 72 20 73 69 7a 65  th a header size
17f50 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56   */.  (void)getV
17f60 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a  arint32((u8*)m.z
17f70 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65 73 74  , szHdr);.  test
17f80 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33 20 29  case( szHdr==3 )
17f90 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a  ;.  testcase( sz
17fa0 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66  Hdr==m.n );.  if
17fb0 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48 64 72  ( unlikely(szHdr
17fc0 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48 64 72  <3 || (int)szHdr
17fd0 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f 74  >m.n) ){.    got
17fe0 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  o idx_rowid_corr
17ff0 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  uption;.  }..  /
18000 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65 6c 64  * The last field
18010 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 73 68   of the index sh
18020 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67  ould be an integ
18030 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44 2e 0a  er - the ROWID..
18040 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74    ** Verify that
18050 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
18060 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e 74  really is an int
18070 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69 64  eger. */.  (void
18080 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38  )getVarint32((u8
18090 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c  *)&m.z[szHdr-1],
180a0 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74   typeRowid);.  t
180b0 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
180c0 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74 63  id==1 );.  testc
180d0 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
180e0 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  2 );.  testcase(
180f0 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20 29 3b   typeRowid==3 );
18100 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
18110 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20 74  eRowid==4 );.  t
18120 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
18130 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74 63  id==5 );.  testc
18140 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
18150 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  6 );.  testcase(
18160 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20 29 3b   typeRowid==8 );
18170 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
18180 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20 69  eRowid==9 );.  i
18190 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70 65  f( unlikely(type
181a0 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70 65 52  Rowid<1 || typeR
181b0 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65 52 6f  owid>9 || typeRo
181c0 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20 67  wid==7) ){.    g
181d0 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f  oto idx_rowid_co
181e0 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20  rruption;.  }.  
181f0 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74  lenRowid = sqlit
18200 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
18210 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b 0a  Len(typeRowid);.
18220 20 20 74 65 73 74 63 61 73 65 28 20 28 75 33 32    testcase( (u32
18230 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52  )m.n==szHdr+lenR
18240 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20 75 6e  owid );.  if( un
18250 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e 6e 3c  likely((u32)m.n<
18260 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29 20  szHdr+lenRowid) 
18270 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f  ){.    goto idx_
18280 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e  rowid_corruption
18290 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 63  ;.  }..  /* Fetc
182a0 68 20 74 68 65 20 69 6e 74 65 67 65 72 20 6f 66  h the integer of
182b0 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
182c0 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f   index record */
182d0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  .  sqlite3VdbeSe
182e0 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e  rialGet((u8*)&m.
182f0 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c  z[m.n-lenRowid],
18300 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76 29 3b   typeRowid, &v);
18310 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e  .  *rowid = v.u.
18320 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  i;.  sqlite3Vdbe
18330 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a  MemRelease(&m);.
18340 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18350 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  OK;..  /* Jump h
18360 65 72 65 20 69 66 20 64 61 74 61 62 61 73 65 20  ere if database 
18370 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65  corruption is de
18380 74 65 63 74 65 64 20 61 66 74 65 72 20 6d 20 68  tected after m h
18390 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c  as been.  ** all
183a0 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20 74 68  ocated.  Free th
183b0 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20 72  e m object and r
183c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
183d0 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77  RUPT. */.idx_row
183e0 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a 20  id_corruption:. 
183f0 20 74 65 73 74 63 61 73 65 28 20 6d 2e 7a 4d 61   testcase( m.zMa
18400 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c  lloc!=0 );.  sql
18410 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
18420 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
18430 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
18440 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  BKPT;.}../*.** C
18450 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f  ompare the key o
18460 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
18470 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  y that cursor pC
18480 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   is pointing to 
18490 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b  against.** the k
184a0 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70 55 6e  ey string in pUn
184b0 70 61 63 6b 65 64 2e 20 20 57 72 69 74 65 20 69  packed.  Write i
184c0 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d 62  nto *pRes a numb
184d0 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e 65  er.** that is ne
184e0 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72  gative, zero, or
184f0 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 43 20   positive if pC 
18500 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
18510 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72  ual to,.** or gr
18520 65 61 74 65 72 20 74 68 61 6e 20 70 55 6e 70 61  eater than pUnpa
18530 63 6b 65 64 2e 20 20 52 65 74 75 72 6e 20 53 51  cked.  Return SQ
18540 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
18550 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63  ss..**.** pUnpac
18560 6b 65 64 20 69 73 20 65 69 74 68 65 72 20 63 72  ked is either cr
18570 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 20  eated without a 
18580 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e  rowid or is trun
18590 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 69 74  cated so that it
185a0 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f  .** omits the ro
185b0 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20  wid at the end. 
185c0 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   The rowid at th
185d0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64  e end of the ind
185e0 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69  ex entry.** is i
185f0 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 20  gnored as well. 
18600 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72 6f 75   Hence, this rou
18610 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72  tine only compar
18620 65 73 20 74 68 65 20 70 72 65 66 69 78 65 73 20  es the prefixes 
18630 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79 73 20  .** of the keys 
18640 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69 6e  prior to the fin
18650 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68  al rowid, not th
18660 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2f  e entire key..*/
18670 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
18680 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20  IdxKeyCompare(. 
18690 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 2c   VdbeCursor *pC,
186a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
186b0 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f  The cursor to co
186c0 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f  mpare against */
186d0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
186e0 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20 2f  d *pUnpacked,  /
186f0 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69  * Unpacked versi
18700 6f 6e 20 6f 66 20 6b 65 79 20 74 6f 20 63 6f 6d  on of key to com
18710 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a  pare against */.
18720 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20    int *res      
18730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18740 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61   Write the compa
18750 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72  rison result her
18760 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43  e */.){.  i64 nC
18770 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  ellKey = 0;.  in
18780 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72  t rc;.  BtCursor
18790 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43 75   *pCur = pC->pCu
187a0 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a  rsor;.  Mem m;..
187b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
187c0 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
187d0 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56  lid(pCur) );.  V
187e0 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71  VA_ONLY(rc =) sq
187f0 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
18800 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65  e(pCur, &nCellKe
18810 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  y);.  assert( rc
18820 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20  ==SQLITE_OK );  
18830 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77    /* pCur is alw
18840 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79  ays valid so Key
18850 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  Size cannot fail
18860 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65   */.  /* nCellKe
18870 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  y will always be
18880 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 30   between 0 and 0
18890 78 66 66 66 66 66 66 66 66 20 62 65 63 61 75 73  xffffffff becaus
188a0 65 20 6f 66 20 74 68 65 20 73 61 79 0a 20 20 2a  e of the say.  *
188b0 2a 20 74 68 61 74 20 62 74 72 65 65 50 61 72 73  * that btreePars
188c0 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 20 73  eCellPtr() and s
188d0 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33  qlite3GetVarint3
188e0 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e  2() are implemen
188f0 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65  ted */.  if( nCe
18900 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c  llKey<=0 || nCel
18910 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66 20  lKey>0x7fffffff 
18920 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b  ){.    *res = 0;
18930 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
18940 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
18950 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 6d  .  }.  memset(&m
18960 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b  , 0, sizeof(m));
18970 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
18980 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28  dbeMemFromBtree(
18990 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20  pC->pCursor, 0, 
189a0 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 31  (int)nCellKey, 1
189b0 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20  , &m);.  if( rc 
189c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
189d0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
189e0 70 55 6e 70 61 63 6b 65 64 2d 3e 66 6c 61 67 73  pUnpacked->flags
189f0 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46   & UNPACKED_PREF
18a00 49 58 5f 4d 41 54 43 48 20 29 3b 0a 20 20 2a 72  IX_MATCH );.  *r
18a10 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  es = sqlite3Vdbe
18a20 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d 2e  RecordCompare(m.
18a30 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65  n, m.z, pUnpacke
18a40 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
18a50 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
18a60 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18a70 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
18a80 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
18a90 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20  the value to be 
18aa0 72 65 74 75 72 6e 65 64 20 62 79 20 73 75 62 73  returned by subs
18ab0 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a  equent calls to.
18ac0 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  ** sqlite3_chang
18ad0 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61  es() on the data
18ae0 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27  base handle 'db'
18af0 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  . .*/.void sqlit
18b00 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
18b10 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
18b20 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73  t nChange){.  as
18b30 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
18b40 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
18b50 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68  ex) );.  db->nCh
18b60 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a  ange = nChange;.
18b70 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e    db->nTotalChan
18b80 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d  ge += nChange;.}
18b90 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c  ../*.** Set a fl
18ba0 61 67 20 69 6e 20 74 68 65 20 76 64 62 65 20 74  ag in the vdbe t
18bb0 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
18bc0 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e  nge counter when
18bd0 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64   it is finalised
18be0 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f  .** or reset..*/
18bf0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
18c00 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64  eCountChanges(Vd
18c10 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61  be *v){.  v->cha
18c20 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a  ngeCntOn = 1;.}.
18c30 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72  ./*.** Mark ever
18c40 79 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  y prepared state
18c50 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20  ment associated 
18c60 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20  with a database 
18c70 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73  connection.** as
18c80 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   expired..**.** 
18c90 41 6e 20 65 78 70 69 72 65 64 20 73 74 61 74 65  An expired state
18ca0 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20  ment means that 
18cb0 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66  recompilation of
18cc0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
18cd0 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20  s.** recommend. 
18ce0 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69   Statements expi
18cf0 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68  re when things h
18d00 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20  appen that make 
18d10 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d  their.** program
18d20 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d  s obsolete.  Rem
18d30 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e  oving user-defin
18d40 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20  ed functions or 
18d50 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
18d60 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67  uences, or chang
18d70 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61  ing an authoriza
18d80 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72  tion function ar
18d90 65 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a  e the types of.*
18da0 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61  * things that ma
18db0 6b 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  ke prepared stat
18dc0 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e  ements obsolete.
18dd0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
18de0 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
18df0 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33  atements(sqlite3
18e00 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70   *db){.  Vdbe *p
18e10 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e  ;.  for(p = db->
18e20 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70  pVdbe; p; p=p->p
18e30 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78  Next){.    p->ex
18e40 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d  pired = 1;.  }.}
18e50 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
18e60 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73 6f  he database asso
18e70 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
18e80 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  Vdbe..*/.sqlite3
18e90 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62 28   *sqlite3VdbeDb(
18ea0 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75  Vdbe *v){.  retu
18eb0 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a  rn v->db;.}../*.
18ec0 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
18ed0 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  ter to an sqlite
18ee0 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72  3_value structur
18ef0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
18f00 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a 20   value bound.** 
18f10 70 61 72 61 6d 65 74 65 72 20 69 56 61 72 20 6f  parameter iVar o
18f20 66 20 56 4d 20 76 2e 20 45 78 63 65 70 74 2c 20  f VM v. Except, 
18f30 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  if the value is 
18f40 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65 74  an SQL NULL, ret
18f50 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65 61  urn .** 0 instea
18f60 64 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20  d. Unless it is 
18f70 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66 69  NULL, apply affi
18f80 6e 69 74 79 20 61 66 66 20 28 6f 6e 65 20 6f 66  nity aff (one of
18f90 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f   the SQLITE_AFF_
18fa0 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29 20  *.** constants) 
18fb0 74 6f 20 74 68 65 20 76 61 6c 75 65 20 62 65 66  to the value bef
18fc0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 74  ore returning it
18fd0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
18fe0 72 6e 65 64 20 76 61 6c 75 65 20 6d 75 73 74 20  rned value must 
18ff0 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
19000 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c  caller using sql
19010 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e  ite3ValueFree().
19020 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75  .*/.sqlite3_valu
19030 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65  e *sqlite3VdbeGe
19040 74 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c 20  tValue(Vdbe *v, 
19050 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66 66  int iVar, u8 aff
19060 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61  ){.  assert( iVa
19070 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20 29  r>0 );.  if( v )
19080 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20  {.    Mem *pMem 
19090 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d  = &v->aVar[iVar-
190a0 31 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28  1];.    if( 0==(
190b0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
190c0 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20  M_Null) ){.     
190d0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
190e0 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56 61  pRet = sqlite3Va
190f0 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20  lueNew(v->db);. 
19100 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b       if( pRet ){
19110 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
19120 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d  VdbeMemCopy((Mem
19130 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a   *)pRet, pMem);.
19140 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
19150 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74  alueApplyAffinit
19160 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51 4c  y(pRet, aff, SQL
19170 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20  ITE_UTF8);.     
19180 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
19190 6d 53 74 6f 72 65 54 79 70 65 28 28 4d 65 6d 20  mStoreType((Mem 
191a0 2a 29 70 52 65 74 29 3b 0a 20 20 20 20 20 20 7d  *)pRet);.      }
191b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 52  .      return pR
191c0 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  et;.    }.  }.  
191d0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
191e0 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51 4c  ** Configure SQL
191f0 20 76 61 72 69 61 62 6c 65 20 69 56 61 72 20 73   variable iVar s
19200 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20 61  o that binding a
19210 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69 74   new value to it
19220 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73   signals.** to s
19230 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a  qlite3_reoptimiz
19240 65 28 29 20 74 68 61 74 20 72 65 2d 70 72 65 70  e() that re-prep
19250 61 72 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d  aring the statem
19260 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a  ent may result.*
19270 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20 71 75  * in a better qu
19280 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69  ery plan..*/.voi
19290 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
192a0 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c  Varmask(Vdbe *v,
192b0 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61 73   int iVar){.  as
192c0 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a  sert( iVar>0 );.
192d0 20 20 69 66 28 20 69 56 61 72 3e 33 32 20 29 7b    if( iVar>32 ){
192e0 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20  .    v->expmask 
192f0 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20  = 0xffffffff;.  
19300 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e 65 78  }else{.    v->ex
19310 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32 29 31  pmask |= ((u32)1
19320 20 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b 0a 20   << (iVar-1));. 
19330 20 7d 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c   }.}..#ifdef SQL
19340 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50  ITE_ENABLE_PREUP
19350 44 41 54 45 5f 48 4f 4f 4b 0a 0a 2f 2a 0a 2a 2a  DATE_HOOK../*.**
19360 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
19370 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e  rgument is not N
19380 55 4c 4c 2c 20 72 65 6c 65 61 73 65 20 61 6e 79  ULL, release any
19390 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73   allocations ass
193a0 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77 69 74 68  ociated .** with
193b0 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
193c0 73 20 69 6e 20 74 68 65 20 70 2d 3e 61 4d 65 6d  s in the p->aMem
193d0 5b 5d 20 61 72 72 61 79 2e 20 41 6c 73 6f 20 66  [] array. Also f
193e0 72 65 65 20 74 68 65 20 55 6e 70 61 63 6b 65 64  ree the Unpacked
193f0 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74  Record.** struct
19400 75 72 65 20 69 74 73 65 6c 66 2c 20 75 73 69 6e  ure itself, usin
19410 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  g sqlite3DbFree(
19420 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  )..**.** This fu
19430 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
19440 6f 20 66 72 65 65 20 55 6e 70 61 63 6b 65 64 52  o free UnpackedR
19450 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 73  ecord structures
19460 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a   allocated by.**
19470 20 74 68 65 20 76 64 62 65 55 6e 70 61 63 6b 52   the vdbeUnpackR
19480 65 63 6f 72 64 28 29 20 66 75 6e 63 74 69 6f 6e  ecord() function
19490 20 66 6f 75 6e 64 20 69 6e 20 76 64 62 65 61 70   found in vdbeap
194a0 69 2e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  i.c..*/.static v
194b0 6f 69 64 20 76 64 62 65 46 72 65 65 55 6e 70 61  oid vdbeFreeUnpa
194c0 63 6b 65 64 28 73 71 6c 69 74 65 33 20 2a 64 62  cked(sqlite3 *db
194d0 2c 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  , UnpackedRecord
194e0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b   *p){.  if( p ){
194f0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
19500 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 46  for(i=0; i<p->nF
19510 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ield; i++){.    
19520 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70    Mem *pMem = &p
19530 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20 20 20 20  ->aMem[i];.     
19540 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c   if( pMem->zMall
19550 6f 63 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  oc ) sqlite3Vdbe
19560 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29  MemRelease(pMem)
19570 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
19580 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
19590 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
195a0 6e 76 6f 6b 65 20 74 68 65 20 70 72 65 2d 75 70  nvoke the pre-up
195b0 64 61 74 65 20 68 6f 6f 6b 2e 20 49 66 20 74 68  date hook. If th
195c0 69 73 20 69 73 20 61 6e 20 55 50 44 41 54 45 20  is is an UPDATE 
195d0 6f 72 20 44 45 4c 45 54 45 20 70 72 65 2d 75 70  or DELETE pre-up
195e0 64 61 74 65 20 63 61 6c 6c 2c 0a 2a 2a 20 74 68  date call,.** th
195f0 65 6e 20 63 75 72 73 6f 72 20 70 61 73 73 65 64  en cursor passed
19600 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
19610 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 70  rgument should p
19620 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 77 20  oint to the row 
19630 61 62 6f 75 74 0a 2a 2a 20 74 6f 20 62 65 20 75  about.** to be u
19640 70 64 61 74 65 20 6f 72 20 64 65 6c 65 74 65 64  pdate or deleted
19650 2e 20 49 66 20 74 68 65 20 61 70 70 6c 69 63 61  . If the applica
19660 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74  tion calls sqlit
19670 65 33 5f 70 72 65 75 70 64 61 74 65 5f 6f 6c 64  e3_preupdate_old
19680 28 29 2c 0a 2a 2a 20 74 68 65 20 72 65 71 75 69  (),.** the requi
19690 72 65 64 20 76 61 6c 75 65 20 77 69 6c 6c 20 62  red value will b
196a0 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
196b0 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72 20 70  row the cursor p
196c0 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 76 6f 69  oints to..*/.voi
196d0 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 65  d sqlite3VdbePre
196e0 55 70 64 61 74 65 48 6f 6f 6b 28 0a 20 20 56 64  UpdateHook(.  Vd
196f0 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
19700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19710 20 56 64 62 65 20 70 72 65 2d 75 70 64 61 74 65   Vdbe pre-update
19720 20 68 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b 65 64   hook is invoked
19730 20 62 79 20 2a 2f 0a 20 20 56 64 62 65 43 75 72   by */.  VdbeCur
19740 73 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20  sor *pCsr,      
19750 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
19760 6f 72 20 74 6f 20 67 72 61 62 20 6f 6c 64 2e 2a  or to grab old.*
19770 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 2a 2f 0a   values from */.
19780 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
19790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197a0 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 53 45    /* SQLITE_INSE
197b0 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45  RT, UPDATE or DE
197c0 4c 45 54 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  LETE */.  const 
197d0 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20  char *zDb,      
197e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
197f0 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  abase name */.  
19800 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
19810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19820 2f 2a 20 4d 6f 64 69 66 69 65 64 20 74 61 62 6c  /* Modified tabl
19830 65 20 2a 2f 0a 20 20 69 36 34 20 69 4b 65 79 31  e */.  i64 iKey1
19840 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
19850 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
19860 6c 20 6b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 20  l key value */. 
19870 20 69 6e 74 20 69 52 65 67 20 20 20 20 20 20 20   int iReg       
19880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19890 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72   /* Register for
198a0 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64 20 2a 2f   new.* record */
198b0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
198c0 62 20 3d 20 76 2d 3e 64 62 3b 0a 20 20 69 36 34  b = v->db;.  i64
198d0 20 69 4b 65 79 32 3b 0a 20 20 50 72 65 55 70 64   iKey2;.  PreUpd
198e0 61 74 65 20 70 72 65 75 70 64 61 74 65 3b 0a 20  ate preupdate;. 
198f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62   const char *zTb
19900 6c 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  l = pTab->zName;
19910 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
19920 75 38 20 66 61 6b 65 53 6f 72 74 4f 72 64 65 72  u8 fakeSortOrder
19930 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
19940 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 3d   db->pPreUpdate=
19950 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  =0 );.  memset(&
19960 70 72 65 75 70 64 61 74 65 2c 20 30 2c 20 73 69  preupdate, 0, si
19970 7a 65 6f 66 28 50 72 65 55 70 64 61 74 65 29 29  zeof(PreUpdate))
19980 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49  ;.  if( op==SQLI
19990 54 45 5f 55 50 44 41 54 45 20 29 7b 0a 20 20 20  TE_UPDATE ){.   
199a0 20 69 4b 65 79 32 20 3d 20 76 2d 3e 61 4d 65 6d   iKey2 = v->aMem
199b0 5b 69 52 65 67 5d 2e 75 2e 69 3b 0a 20 20 7d 65  [iReg].u.i;.  }e
199c0 6c 73 65 7b 0a 20 20 20 20 69 4b 65 79 32 20 3d  lse{.    iKey2 =
199d0 20 69 4b 65 79 31 3b 0a 20 20 7d 0a 0a 20 20 61   iKey1;.  }..  a
199e0 73 73 65 72 74 28 20 70 43 73 72 2d 3e 6e 46 69  ssert( pCsr->nFi
199f0 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  eld==pTab->nCol 
19a00 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 43 73 72  .       || (pCsr
19a10 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e  ->nField==pTab->
19a20 6e 43 6f 6c 2b 31 20 26 26 20 6f 70 3d 3d 53 51  nCol+1 && op==SQ
19a30 4c 49 54 45 5f 44 45 4c 45 54 45 20 26 26 20 69  LITE_DELETE && i
19a40 52 65 67 3d 3d 2d 31 29 0a 20 20 29 3b 0a 0a 20  Reg==-1).  );.. 
19a50 20 70 72 65 75 70 64 61 74 65 2e 76 20 3d 20 76   preupdate.v = v
19a60 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 70 43  ;.  preupdate.pC
19a70 73 72 20 3d 20 70 43 73 72 3b 0a 20 20 70 72 65  sr = pCsr;.  pre
19a80 75 70 64 61 74 65 2e 6f 70 20 3d 20 6f 70 3b 0a  update.op = op;.
19a90 20 20 70 72 65 75 70 64 61 74 65 2e 69 4e 65 77    preupdate.iNew
19aa0 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 70 72  Reg = iReg;.  pr
19ab0 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e  eupdate.keyinfo.
19ac0 64 62 20 3d 20 64 62 3b 0a 20 20 70 72 65 75 70  db = db;.  preup
19ad0 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 65 6e 63  date.keyinfo.enc
19ae0 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 70 72   = ENC(db);.  pr
19af0 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e  eupdate.keyinfo.
19b00 6e 46 69 65 6c 64 20 3d 20 70 54 61 62 2d 3e 6e  nField = pTab->n
19b10 43 6f 6c 3b 0a 20 20 70 72 65 75 70 64 61 74 65  Col;.  preupdate
19b20 2e 6b 65 79 69 6e 66 6f 2e 61 53 6f 72 74 4f 72  .keyinfo.aSortOr
19b30 64 65 72 20 3d 20 26 66 61 6b 65 53 6f 72 74 4f  der = &fakeSortO
19b40 72 64 65 72 3b 0a 20 20 70 72 65 75 70 64 61 74  rder;.  preupdat
19b50 65 2e 69 4b 65 79 31 20 3d 20 69 4b 65 79 31 3b  e.iKey1 = iKey1;
19b60 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69 4b 65  .  preupdate.iKe
19b70 79 32 20 3d 20 69 4b 65 79 32 3b 0a 20 20 70 72  y2 = iKey2;.  pr
19b80 65 75 70 64 61 74 65 2e 69 50 4b 65 79 20 3d 20  eupdate.iPKey = 
19b90 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 0a 20 20  pTab->iPKey;..  
19ba0 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 20 3d  db->pPreUpdate =
19bb0 20 26 70 72 65 75 70 64 61 74 65 3b 0a 20 20 64   &preupdate;.  d
19bc0 62 2d 3e 78 50 72 65 55 70 64 61 74 65 43 61 6c  b->xPreUpdateCal
19bd0 6c 62 61 63 6b 28 64 62 2d 3e 70 50 72 65 55 70  lback(db->pPreUp
19be0 64 61 74 65 41 72 67 2c 20 64 62 2c 20 6f 70 2c  dateArg, db, op,
19bf0 20 7a 44 62 2c 20 7a 54 62 6c 2c 20 69 4b 65 79   zDb, zTbl, iKey
19c00 31 2c 20 69 4b 65 79 32 29 3b 0a 20 20 64 62 2d  1, iKey2);.  db-
19c10 3e 70 50 72 65 55 70 64 61 74 65 20 3d 20 30 3b  >pPreUpdate = 0;
19c20 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
19c30 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e 61  (db, preupdate.a
19c40 52 65 63 6f 72 64 29 3b 0a 20 20 76 64 62 65 46  Record);.  vdbeF
19c50 72 65 65 55 6e 70 61 63 6b 65 64 28 64 62 2c 20  reeUnpacked(db, 
19c60 70 72 65 75 70 64 61 74 65 2e 70 55 6e 70 61 63  preupdate.pUnpac
19c70 6b 65 64 29 3b 0a 20 20 76 64 62 65 46 72 65 65  ked);.  vdbeFree
19c80 55 6e 70 61 63 6b 65 64 28 64 62 2c 20 70 72 65  Unpacked(db, pre
19c90 75 70 64 61 74 65 2e 70 4e 65 77 55 6e 70 61 63  update.pNewUnpac
19ca0 6b 65 64 29 3b 0a 20 20 69 66 28 20 70 72 65 75  ked);.  if( preu
19cb0 70 64 61 74 65 2e 61 4e 65 77 20 29 7b 0a 20 20  pdate.aNew ){.  
19cc0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
19cd0 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 46  (i=0; i<pCsr->nF
19ce0 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ield; i++){.    
19cf0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
19d00 52 65 6c 65 61 73 65 28 26 70 72 65 75 70 64 61  Release(&preupda
19d10 74 65 2e 61 4e 65 77 5b 69 5d 29 3b 0a 20 20 20  te.aNew[i]);.   
19d20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
19d30 46 72 65 65 28 64 62 2c 20 70 72 65 75 70 64 61  Free(db, preupda
19d40 74 65 2e 61 4e 65 77 29 3b 0a 20 20 7d 0a 7d 0a  te.aNew);.  }.}.
19d50 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
19d60 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54  _ENABLE_PREUPDAT
19d70 45 5f 48 4f 4f 4b 20 2a 2f 0a                    E_HOOK */.